Salome HOME
Merge branch 'V7_5_BR'
[modules/paravis.git] / src / Plugins / MEDReader / ParaViewPlugin / pqMEDReaderPanel.cxx
1 // Copyright (C) 2010-2014  CEA/DEN, EDF R&D
2 //
3 // This library is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU Lesser General Public
5 // License as published by the Free Software Foundation; either
6 // version 2.1 of the License, or (at your option) any later version.
7 //
8 // This library is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 // Lesser General Public License for more details.
12 //
13 // You should have received a copy of the GNU Lesser General Public
14 // License along with this library; if not, write to the Free Software
15 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 //
17 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 //
19 // Author : Anthony Geay
20
21 #include "pqMEDReaderPanel.h"
22 #include "ui_MEDReaderPanel.h"
23 #include "VectBoolWidget.h"
24
25 #include "vtkProcessModule.h"
26 #include "vtkMultiBlockDataSet.h"
27 #include "vtkInformation.h"
28 #include "vtkIntArray.h"
29 #include "vtkSMDoubleVectorProperty.h"
30 #include "vtkSMIntVectorProperty.h"
31 #include "vtkSMStringVectorProperty.h"
32 #include "vtkSMProxy.h"
33 #include "vtkEventQtSlotConnect.h"
34 #include "vtkPVSILInformation.h"
35 #include "vtkGraph.h"
36 #include "vtkMutableDirectedGraph.h"
37 #include "vtkAdjacentVertexIterator.h"
38 #include "vtkSMPropertyHelper.h"
39 #include "vtkStringArray.h"
40 #include "vtkDataSetAttributes.h"
41 #include "vtkMEDReader.h"
42 #include "vtkSMSourceProxy.h"
43
44 #include "pqTreeWidgetItemObject.h"
45 #include "pqSMAdaptor.h"
46 #include "pqProxy.h"
47 #include "pqPropertyManager.h"
48 #include "pqSILModel.h"
49 #include "pqProxySILModel.h"
50 #include "pqTreeViewSelectionHelper.h"
51 #include "pqTreeWidgetSelectionHelper.h"
52
53 #include <QHeaderView>
54
55 #include <sstream>
56
57 static const char ZE_SEP[]="@@][@@";
58
59 class PixSingle
60 {
61 public:
62   static const PixSingle &GetInstance();
63   QPixmap getPixFromStr(const std::string& st) const;
64   QPixmap getWholeMeshPix() const;
65   PixSingle();
66 private:
67   static const int NB_OF_DISCR=4;
68   static PixSingle *UNIQUE_PIX_SINGLE;
69   QPixmap _pixmaps[NB_OF_DISCR];
70   std::map<std::string,int> _ze_map;
71   QPixmap _whole_mesh;
72 };
73
74 PixSingle *PixSingle::UNIQUE_PIX_SINGLE=0;
75
76 const PixSingle &PixSingle::GetInstance()
77 {
78   if(!UNIQUE_PIX_SINGLE)
79     UNIQUE_PIX_SINGLE=new PixSingle;
80   return *UNIQUE_PIX_SINGLE;
81 }
82
83 PixSingle::PixSingle()
84 {
85   _pixmaps[0]=QPixmap(":/ParaViewResources/Icons/pqCellData16.png");
86   _pixmaps[1]=QPixmap(":/ParaViewResources/Icons/pqPointData16.png");
87   _pixmaps[2]=QPixmap(":/ParaViewResources/Icons/pqQuadratureData16.png");
88   _pixmaps[3]=QPixmap(":/ParaViewResources/Icons/pqElnoData16.png");
89   _ze_map[std::string("P0")]=0;
90   _ze_map[std::string("P1")]=1;
91   _ze_map[std::string("GAUSS")]=2;
92   _ze_map[std::string("GSSNE")]=3;
93   _whole_mesh=QPixmap(":/ParaViewResources/Icons/pqCellDataForWholeMesh16.png");
94 }
95
96 QPixmap PixSingle::getPixFromStr(const std::string& st) const
97 {
98   std::map<std::string,int>::const_iterator it(_ze_map.find(st));
99   if(it!=_ze_map.end())
100     return _pixmaps[(*it).second];
101   else
102     return QPixmap();
103 }
104
105 QPixmap PixSingle::getWholeMeshPix() const
106 {
107   return _whole_mesh;
108 }
109
110 class pqMEDReaderPanel::pqUI: public QObject, public Ui::MEDReaderPanel
111 {
112 public:
113   pqUI(pqMEDReaderPanel *p):QObject(p)
114   {
115     this->VTKConnect = vtkSmartPointer<vtkEventQtSlotConnect>::New();
116   }
117
118   ~pqUI() { }
119   
120   vtkSmartPointer<vtkEventQtSlotConnect> VTKConnect;
121   QMap<QTreeWidgetItem*, QString> TreeItemToPropMap;
122 };
123
124 pqMEDReaderPanel::pqMEDReaderPanel(pqProxy *object_proxy, QWidget *p):Superclass(object_proxy,p),_reload_req(false),_is_fields_status_changed(false),_optional_widget(0)
125 {
126   initAll();
127 }
128
129 void pqMEDReaderPanel::initAll()
130 {
131   _all_lev4.clear();
132   this->UI=new pqUI(this);
133   this->UI->setupUi(this);
134   this->UI->Fields->setHeaderHidden(true);
135   this->updateSIL();
136   ////////////////////
137   vtkSMProxy *reader(this->referenceProxy()->getProxy());
138   vtkPVSILInformation *info(vtkPVSILInformation::New());
139   reader->GatherInformation(info);
140   vtkGraph *g(info->GetSIL());
141   if(!g)//something wrong server side...
142     return ;
143   //vtkMutableDirectedGraph *g2(vtkMutableDirectedGraph::SafeDownCast(g));// agy: this line does not work in client/server mode ! but it works in standard mode ! Don't know why. ParaView bug ?
144   vtkMutableDirectedGraph *g2(static_cast<vtkMutableDirectedGraph *>(g));
145   int idNames(0);
146   vtkAbstractArray *verticesNames(g2->GetVertexData()->GetAbstractArray("Names",idNames));
147   vtkStringArray *verticesNames2(vtkStringArray::SafeDownCast(verticesNames));
148   vtkIdType id0;
149   bool found(false);
150   for(int i=0;i<verticesNames2->GetNumberOfValues();i++)
151     {
152       vtkStdString &st(verticesNames2->GetValue(i));
153       if(st=="FieldsStatusTree")
154         {
155           id0=i;
156           found=true;
157         }
158     }
159   if(!found)
160     std::cerr << "There is an internal error ! The tree on server side has not the expected look !" << std::endl;
161   vtkAdjacentVertexIterator *it0(vtkAdjacentVertexIterator::New());
162   g2->GetAdjacentVertices(id0,it0);
163   int kk(0),ll(0);
164   while(it0->HasNext())
165     {
166       vtkIdType idToolTipForTS(it0->Next());
167       QString toolTipName0(QString::fromStdString((const char *)verticesNames2->GetValue(idToolTipForTS)));
168       QString nbTS;
169       QList<QString> dts,its,tts;
170       {
171         vtkAdjacentVertexIterator *itForTS(vtkAdjacentVertexIterator::New());
172         g2->GetAdjacentVertices(idToolTipForTS,itForTS);
173         vtkIdType idForNbTS(itForTS->Next());
174         nbTS=QString::fromStdString((const char *)verticesNames2->GetValue(idForNbTS));
175         itForTS->Delete();
176         int nbTSInt(nbTS.toInt());
177         for(int ii=0;ii<nbTSInt;ii++)
178           {
179             dts.push_back(QString::fromStdString((const char *)verticesNames2->GetValue(idForNbTS+3*ii+1)));
180             its.push_back(QString::fromStdString((const char *)verticesNames2->GetValue(idForNbTS+3*ii+2)));
181             tts.push_back(QString::fromStdString((const char *)verticesNames2->GetValue(idForNbTS+3*ii+3)));
182           }
183       }
184       vtkIdType id1(it0->Next());
185       //
186       vtkSMProperty *SMProperty(this->proxy()->GetProperty("FieldsStatus"));
187       SMProperty->ResetToDefault();//this line is very important !
188       //
189       QString name0(QString::fromStdString((const char *)verticesNames2->GetValue(id1))); QList<QString> strs0; strs0.append(name0);
190       pqTreeWidgetItemObject *item0(new pqTreeWidgetItemObject(this->UI->Fields,strs0));
191       item0->setData(0,Qt::UserRole,name0);
192       item0->setData(0,Qt::ToolTipRole,toolTipName0);
193       //
194       QList<QVariant> modulesAct;
195       for(int i=0;i<nbTS.toInt();i++)
196         modulesAct.push_back(QVariant(true));
197       item0->setProperty("NbOfTS",nbTS);
198       item0->setProperty("DTS",QVariant(dts));
199       item0->setProperty("ITS",QVariant(its));
200       item0->setProperty("TTS",QVariant(tts));
201       item0->setProperty("ChosenTS",QVariant(modulesAct));
202       //
203       vtkAdjacentVertexIterator *it1(vtkAdjacentVertexIterator::New());//mesh
204       g2->GetAdjacentVertices(id1,it1);
205       while(it1->HasNext())
206         {
207           vtkIdType id2(it1->Next());
208           QString name1(QString::fromStdString((const char *)verticesNames2->GetValue(id2))); QList<QString> strs1; strs1.append(name1);
209           QString toolTipName1(name1);
210           pqTreeWidgetItemObject *item1(new pqTreeWidgetItemObject(item0,strs1));
211           item1->setData(0,Qt::UserRole,name1);
212           item1->setData(0,Qt::ToolTipRole,toolTipName1);
213           vtkAdjacentVertexIterator *it2(vtkAdjacentVertexIterator::New());//common support
214           g2->GetAdjacentVertices(id2,it2);
215           while(it2->HasNext())
216             {
217               vtkIdType id3(it2->Next());
218               QString name2(QString::fromStdString((const char *)verticesNames2->GetValue(id3))); QList<QString> strs2; strs2.append(name2);
219               pqTreeWidgetItemObject *item2(new pqTreeWidgetItemObject(item1,strs2));
220               item2->setData(0,Qt::UserRole,name2);
221               item2->setChecked(false);
222               vtkAdjacentVertexIterator *it3(vtkAdjacentVertexIterator::New());//fields !
223               g2->GetAdjacentVertices(id3,it3);
224               vtkIdType id3Arrs(it3->Next());
225               vtkAdjacentVertexIterator *it3Arrs(vtkAdjacentVertexIterator::New());//arrs in fields !
226               g2->GetAdjacentVertices(id3Arrs,it3Arrs);
227               while(it3Arrs->HasNext())
228                 {
229                   vtkIdType id4(it3Arrs->Next());
230                   std::string name3CppFull((const char *)verticesNames2->GetValue(id4));
231                   std::size_t pos(name3CppFull.find(ZE_SEP));
232                   std::string name3Only(name3CppFull.substr(0,pos)); std::string spatialDiscr(name3CppFull.substr(pos+sizeof(ZE_SEP)-1));
233                   QString name3(QString::fromStdString(name3Only)); QList<QString> strs3; strs3.append(name3);
234                   QString toolTipName3(name3+QString(" (")+spatialDiscr.c_str()+QString(")"));
235                   //
236                   vtkAdjacentVertexIterator *it4(vtkAdjacentVertexIterator::New());// is it a special field ? A field mesh ?
237                   g2->GetAdjacentVertices(id4,it4);
238                   bool isSpecial(it4->HasNext());
239                   it4->Delete();
240                   //
241                   pqTreeWidgetItemObject *item3(new pqTreeWidgetItemObject(item2,strs3));
242                   _all_lev4.push_back(item3);
243                   item3->setData(0,Qt::UserRole,name3);
244                   item3->setChecked(false);
245                   if(isSpecial)
246                     {
247                       QFont font; font.setItalic(true); font.setUnderline(true);
248                       item3->setData(0,Qt::FontRole,QVariant(font));
249                       item3->setData(0,Qt::ToolTipRole,QString("Whole \"%1\" mesh").arg(name3));
250                       item3->setData(0,Qt::DecorationRole,PixSingle::GetInstance().getWholeMeshPix());
251                     }
252                   else
253                     {
254                       item3->setData(0,Qt::ToolTipRole,toolTipName3);
255                       item3->setData(0,Qt::DecorationRole,PixSingle::GetInstance().getPixFromStr(spatialDiscr));
256                     }
257                   _leaves.insert(std::pair<pqTreeWidgetItemObject *,int>(item3,ll));
258                   std::ostringstream pdm; pdm << name0.toStdString() << "/" << name1.toStdString() << "/" << name2.toStdString() << "/" << name3CppFull;
259                   (static_cast<vtkSMStringVectorProperty *>(SMProperty))->SetElement(2*ll,pdm.str().c_str());
260                   char tmp2[2]; tmp2[0]=(kk==0?'1':'0'); tmp2[1]='\0';
261                   std::string tmp(tmp2);
262                   (static_cast<vtkSMStringVectorProperty *>(SMProperty))->SetElement(2*ll+1,tmp.c_str());
263                   //SMProperty->ResetToDefault();
264                   item2->setChecked(kk==0);
265                   item3->setChecked(kk==0);
266                   item3->setProperty("PosInStringVector",QVariant(ll));
267                   connect(item3,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
268                   ll++;
269                 }
270                 connect(item2,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev3HasBeenFired(bool)));
271                 vtkIdType id3Gts(it3->Next());
272                 vtkAdjacentVertexIterator *it3Gts(vtkAdjacentVertexIterator::New());//geo types in fields !
273                 g2->GetAdjacentVertices(id3Gts,it3Gts);
274                 QString toolTipName2(name2);
275                 while(it3Gts->HasNext())
276                   {
277                     vtkIdType idGt(it3Gts->Next());
278                     std::string gtName((const char *)verticesNames2->GetValue(idGt));
279                     toolTipName2=QString("%1\n- %2").arg(toolTipName2).arg(QString(gtName.c_str()));
280                   }
281                 item2->setData(0,Qt::ToolTipRole,toolTipName2);
282                 it3Gts->Delete();
283                 it3->Delete();
284                 it3Arrs->Delete();
285                 kk++;
286               }
287             it2->Delete();
288           }
289         it1->Delete();
290       }
291   it0->Delete();
292   this->UI->Fields->header()->setStretchLastSection(true);
293   this->UI->Fields->expandAll();
294   info->Delete();
295   this->UI->stdMode->setChecked(true);
296   this->UI->VTKConnect->Connect(this->proxy(),vtkCommand::UpdateInformationEvent, this, SLOT(updateSIL()));
297   ///
298   this->UI->Reload->setProperty("NbOfReloadDynProp",QVariant(1));
299   vtkSMProperty *SMProperty(this->proxy()->GetProperty("ReloadReq"));
300   connect(this->UI->Reload,SIGNAL(pressed()),this,SLOT(reloadFired()));
301   this->propertyManager()->registerLink(this->UI->Reload,"NbOfReloadDynProp",SIGNAL(pressed()),this->proxy(),SMProperty);
302   ///
303   vtkSMProperty *SMProperty0(this->proxy()->GetProperty("GenerateVectors"));
304   this->propertyManager()->registerLink(this->UI->GenerateVects,"checked",SIGNAL(stateChanged(int)),this->proxy(),SMProperty0);
305   ///
306   vtkSMProperty *SMProperty2(this->proxy()->GetProperty("TimeOrModal"));
307   SMProperty2->ResetToDefault();//this line is very important !
308   this->propertyManager()->registerLink(this->UI->modeMode,"checked",SIGNAL(toggled(bool)),this->proxy(),SMProperty2);
309   ///
310   delete _optional_widget;
311   _optional_widget=new VectBoolWidget(this->UI->timeStepsInspector,getMaxNumberOfTS());
312   _optional_widget->hide();
313   this->UI->timeStepsInspector->setMinimumSize(QSize(0,0));
314   connect(this->UI->modeMode,SIGNAL(toggled(bool)),this,SLOT(vectOfBoolWidgetRequested(bool)));
315   vtkSMProperty *SMProperty3(this->proxy()->GetProperty("TimesFlagsStatus"));
316   SMProperty3->ResetToDefault();
317   const QVector<VectBoolItem *>& items(_optional_widget->getItems());
318   int itt(0);
319   foreach(VectBoolItem *item,items)
320     {
321       this->propertyManager()->registerLink(item,"activated",SIGNAL(changed()),this->proxy(),SMProperty3,itt++);
322     }
323 }
324
325 pqMEDReaderPanel::~pqMEDReaderPanel()
326 {
327   delete _optional_widget;
328 }
329
330 void pqMEDReaderPanel::linkServerManagerProperties()
331 {
332   this->Superclass::linkServerManagerProperties();
333 }
334
335 void pqMEDReaderPanel::updateSIL()
336 {
337   if(_reload_req)
338     {
339       _reload_req=false;
340       this->UI->geometryGroupBox->hide();
341       delete this->UI;
342       foreach(QObject *child,children())
343         {
344           QLayout *layout(qobject_cast<QLayout *>(child));
345           if(layout)
346             delete layout;
347         }
348       initAll();
349     }
350 }
351
352 void pqMEDReaderPanel::aLev3HasBeenFired(bool v)
353 {
354   pqTreeWidgetItemObject *zeItem(qobject_cast<pqTreeWidgetItemObject *>(sender()));
355   if(!zeItem)
356     return;
357   for(int i=0;i<zeItem->childCount();i++)
358     {
359       QTreeWidgetItem *elt(zeItem->child(i));
360       pqTreeWidgetItemObject *eltC(dynamic_cast<pqTreeWidgetItemObject *>(elt));
361       if(eltC)
362         {
363           eltC->setChecked(v);
364           aLev4HasBeenFiredBy(eltC);
365         }
366     }
367   putLev3InOrder();
368   somethingChangedInFieldRepr();
369 }
370
371 void pqMEDReaderPanel::aLev4HasBeenFired()
372 {
373   pqTreeWidgetItemObject *zeItem(qobject_cast<pqTreeWidgetItemObject *>(sender()));
374   if(zeItem)
375     aLev4HasBeenFiredBy(zeItem);
376   putLev3InOrder();
377   somethingChangedInFieldRepr();
378 }
379
380 void pqMEDReaderPanel::aLev4HasBeenFiredBy(pqTreeWidgetItemObject *zeItem)
381 {
382   pqTreeWidgetItemObject *father(dynamic_cast<pqTreeWidgetItemObject *>(zeItem->QTreeWidgetItem::parent()));
383   QTreeWidgetItem *godFather(father->QTreeWidgetItem::parent()->parent());
384   if(!father)
385     return ;
386   if(zeItem->isChecked())
387     {
388       bool isActivatedTSChanged(false);
389       // This part garantees that all leaves having not the same father than zeItem are desactivated
390       foreach(pqTreeWidgetItemObject* elt,this->_all_lev4)
391       {
392         QTreeWidgetItem *testFath(elt->QTreeWidgetItem::parent());
393         if(testFath!=father)
394           if(elt->isChecked())
395             {
396               {
397                 disconnect(elt,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
398                 elt->setChecked(false);
399                 connect(elt,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
400               }
401               if(godFather!=testFath->parent()->parent())
402                 isActivatedTSChanged=true;
403             }
404       }
405       // the user by clicking to a new entry has changed of TimeStepSeries -> notify it to thee time step selector widget
406       if(isActivatedTSChanged)
407         {
408           QStringList its,dts,tts;
409           getCurrentTS(its,dts,tts);
410           _optional_widget->setItems(its,dts,tts);
411         }
412     }
413   else
414     {
415       // if all are unchecked - check it again
416       bool allItemsAreUnChked(true);
417       foreach(pqTreeWidgetItemObject* elt,this->_all_lev4)
418         {
419           if(elt && elt->isChecked())
420             allItemsAreUnChked=false;
421         }
422       if(allItemsAreUnChked)
423         {
424           disconnect(zeItem,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
425           zeItem->setChecked(true);// OK zeItem was required to be unchecked but as it is the last one. Recheck it !
426           connect(zeItem,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev4HasBeenFired()));
427         }
428     }
429 }
430
431 void pqMEDReaderPanel::putLev3InOrder()
432 {
433   std::vector<pqTreeWidgetItemObject *>::iterator it0(_all_lev4.begin()),it1;
434   while(it0!=_all_lev4.end())
435     {
436       QTreeWidgetItem *curFather((*it0)->QTreeWidgetItem::parent());
437       for(it1=it0+1;it1!=_all_lev4.end() && (*it1)->QTreeWidgetItem::parent()==curFather;it1++);
438       bool isAllFalse(true),isAllTrue(true);
439       for(std::vector<pqTreeWidgetItemObject *>::iterator it=it0;it!=it1;it++)
440         {
441           if((*it)->isChecked())
442             isAllFalse=false;
443           else
444             isAllTrue=false;
445         }
446       if(isAllFalse || isAllTrue)
447         {
448           pqTreeWidgetItemObject *father(dynamic_cast<pqTreeWidgetItemObject *>(curFather));
449           if(father)
450             {
451               disconnect(father,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev3HasBeenFired(bool)));
452               father->setChecked(isAllTrue);
453               connect(father,SIGNAL(checkedStateChanged(bool)),this,SLOT(aLev3HasBeenFired(bool)));
454             }
455         }
456       it0=it1;
457     }
458 }
459
460 void pqMEDReaderPanel::reloadFired()
461 {
462   static int iii(1);
463   QVariant v(iii++);
464   this->UI->Reload->setProperty("NbOfReloadDynProp",v);
465   _reload_req=true;
466   for(std::set<std::pair<pqTreeWidgetItemObject *,int> >::const_iterator it=_leaves.begin();it!=_leaves.end();it++)
467     ((*it).first)->disconnect(SIGNAL(checkedStateChanged(bool)));
468   //
469   vtkSMProperty *SMProperty(this->proxy()->GetProperty("FieldsStatus"));
470   for(std::set<std::pair<pqTreeWidgetItemObject *,int> >::const_iterator it=_leaves.begin();it!=_leaves.end();it++)
471     this->propertyManager()->unregisterLink((*it).first,"checked",SIGNAL(checkedStateChanged(bool)),this->proxy(),SMProperty,(*it).second);
472   this->propertyManager()->propertyChanged();
473   vtkSMProperty *SMProperty3(this->proxy()->GetProperty("TimeOrModal"));
474   this->propertyManager()->unregisterLink(this->UI->modeMode,"checked",SIGNAL(toggled(bool)),this->proxy(),SMProperty3);
475 }
476
477 void pqMEDReaderPanel::vectOfBoolWidgetRequested(bool isMode)
478 {
479   if(isMode)
480     {
481       this->UI->timeStepsInspector->setMinimumSize(QSize(200,250));
482       _optional_widget->show();
483       QStringList its,dts,tts;
484       getCurrentTS(its,dts,tts);
485       _optional_widget->setItems(its,dts,tts);
486     }
487   else
488     {
489       _optional_widget->hide();
490       this->UI->timeStepsInspector->setMinimumSize(QSize(0,0));
491     }
492 }
493
494 void pqMEDReaderPanel::getCurrentTS(QStringList& its, QStringList& dts, QStringList& tts) const
495 {
496   
497   for(std::vector<pqTreeWidgetItemObject *>::const_iterator it=_all_lev4.begin();it!=_all_lev4.end();it++)
498     {
499       if((*it)->property("checked").toInt())
500         {
501           QTreeWidgetItem *obj((*it)->QTreeWidgetItem::parent()->QTreeWidgetItem::parent()->QTreeWidgetItem::parent());
502           pqTreeWidgetItemObject *objC(dynamic_cast<pqTreeWidgetItemObject *>(obj));
503           its=objC->property("ITS").toStringList();
504           dts=objC->property("DTS").toStringList();
505           tts=objC->property("TTS").toStringList();
506           return;
507         }
508     }
509   std::cerr << "pqMEDReaderPanel::getCurrentTS : internal error ! Something is going wrong !" << std::endl;
510 }
511
512 int pqMEDReaderPanel::getMaxNumberOfTS() const
513 {
514   int ret(0);
515   for(std::vector<pqTreeWidgetItemObject *>::const_iterator it=_all_lev4.begin();it!=_all_lev4.end();it++)
516     {
517       QTreeWidgetItem *obj((*it)->QTreeWidgetItem::parent()->QTreeWidgetItem::parent()->QTreeWidgetItem::parent());
518       pqTreeWidgetItemObject *objC(dynamic_cast<pqTreeWidgetItemObject *>(obj));
519       ret=std::max(ret,objC->property("NbOfTS").toInt());
520     }
521   return ret;
522 }
523
524 void pqMEDReaderPanel::updateInformationAndDomains()
525 {
526   pqNamedObjectPanel::updateInformationAndDomains();
527   if(_is_fields_status_changed)
528     {
529       vtkSMProxy *proxy(this->proxy());
530       vtkSMProperty *SMProperty(proxy->GetProperty("FieldsStatus"));
531       SMProperty->Modified();// agy : THE LINE FOR 7.5.1 !
532       _is_fields_status_changed=false;
533     }
534 }
535
536 /*!
537  * This slot is called by this->UI->Fields when one/several leaves have been modified.
538  */
539 void pqMEDReaderPanel::somethingChangedInFieldRepr()
540 {
541   ///
542   vtkSMProxy *proxy(this->proxy());
543   vtkSMProperty *SMProperty(proxy->GetProperty("FieldsStatus"));
544   vtkSMStringVectorProperty *sm(dynamic_cast<vtkSMStringVectorProperty *>(SMProperty));
545   unsigned int nb(sm->GetNumberOfElements());
546   std::vector<std::string> sts(nb);
547   for(unsigned int i=0;i<nb;i++)
548     sts[i]=sm->GetElement(i);
549   ///
550   pqExodusIIVariableSelectionWidget *sc(this->UI->Fields);
551   for(int i0=0;i0<sc->topLevelItemCount();i0++)
552     {
553       QTreeWidgetItem *lev0(sc->topLevelItem(i0));//TS
554       for(int i1=0;i1<lev0->childCount();i1++)
555         {
556           QTreeWidgetItem *lev1(lev0->child(i1));//Mesh
557           for(int i2=0;i2<lev1->childCount();i2++)
558             {
559               QTreeWidgetItem *lev2(lev1->child(i2));//Comp
560               for(int i3=0;i3<lev2->childCount();i3++)
561                 {
562                   QTreeWidgetItem *lev3(lev2->child(i3));
563                   pqTreeWidgetItemObject *scc(dynamic_cast<pqTreeWidgetItemObject *>(lev3));
564                   int ll(scc->property("PosInStringVector").toInt());
565                   int v(scc->isChecked());
566                   std::ostringstream oss; oss << v;
567                   sts[2*ll+1]=oss.str();
568                 }
569             }
570         }
571     }
572   ///
573   const char **args=new const char *[nb];
574   for(unsigned int i=0;i<nb;i++)
575     {
576       args[i]=sts[i].c_str();
577     }
578   {//agy : let's go to put info in property FieldsStatus
579     int iup(sm->GetImmediateUpdate());
580     //sm->SetNumberOfElements(0);
581     sm->SetElements(args,nb);
582     proxy->UpdateVTKObjects(); // push properties states abroad
583     sm->SetImmediateUpdate(iup);
584   }
585   delete [] args;
586   //
587   ((vtkSMSourceProxy *)proxy)->UpdatePipelineInformation();//performs an update of all properties of proxy and proxy itself
588   // here wonderful proxy is declared modified right after FieldsStatus and FieldsTreeInfo -> IMPORTANT : The updated MTime of proxy will be the ref
589   // to detect modified properties.
590   _is_fields_status_changed=true;
591   setModified();
592 }
593