]> SALOME platform Git repositories - modules/hydro.git/blob - src/HYDROGUI/HYDROGUI_ImportLandCoverMapDlg.cxx
Salome HOME
bug #702
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ImportLandCoverMapDlg.cxx
1 // Copyright (C) 2014-2015  EDF-R&D
2 // This library is free software; you can redistribute it and/or
3 // modify it under the terms of the GNU Lesser General Public
4 // License as published by the Free Software Foundation; either
5 // version 2.1 of the License, or (at your option) any later version.
6 //
7 // This library is distributed in the hope that it will be useful,
8 // but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10 // Lesser General Public License for more details.
11 //
12 // You should have received a copy of the GNU Lesser General Public
13 // License along with this library; if not, write to the Free Software
14 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
15 //
16 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
17 //
18
19 #include "HYDROGUI_ImportLandCoverMapDlg.h"
20
21 #include <QGroupBox>
22 #include <QLabel>
23 #include <QLineEdit>
24 #include <QListWidget>
25 #include <QVBoxLayout>
26 #include <QToolButton>
27 #include <QCheckBox>
28 #include <SUIT_ResourceMgr.h>
29 #include <SUIT_Session.h>
30 #include <SUIT_FileDlg.h>
31 #include <HYDROGUI_Module.h>
32 #include <SUIT_MessageBox.h>
33 #include <LightApp_Application.h>
34 #include <QTableWidget>
35 #include <QHeaderView>
36 #include <QComboBox>
37 #include <QStackedWidget>
38 #include <SUIT_MessageBox.h>
39 #include <SUIT_Desktop.h>
40 #include <QSignalMapper>
41
42 HYDROGUI_ImportLandCoverMapDlg::HYDROGUI_ImportLandCoverMapDlg( HYDROGUI_Module* theModule, const QString& theTitle )
43 : HYDROGUI_Wizard( theModule, theTitle )
44 {
45   addPage( createPage1() );
46   addPage( createPage2() );
47   addPage( createPage3() );
48   myFirstPageState = false;
49   myDbfState = false;
50 }
51
52 QWizardPage* HYDROGUI_ImportLandCoverMapDlg::createPage1() {
53   QWizardPage* aPage = new QWizardPage( mainFrame() );
54   QFrame* aFrame = new QFrame( aPage );
55
56   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
57
58   myFileNameGroup = new QGroupBox( tr( "IMPORT_LANDCOVER_MAP_FROM_FILE" ) );
59
60   QLabel* aFileNameLabel = new QLabel( tr( "FILE_NAME" ), myFileNameGroup );
61
62   myFileName = new QLineEdit( myFileNameGroup );
63   myFileName->setReadOnly( true );
64
65   QToolButton* aBrowseBtn = new QToolButton( myFileNameGroup );
66   aBrowseBtn->setIcon( aResMgr->loadPixmap( "HYDRO", tr( "BROWSE_ICO" ) ) );
67
68   QBoxLayout* aFileNameLayout = new QHBoxLayout( myFileNameGroup );
69   aFileNameLayout->setMargin( 5 );
70   aFileNameLayout->setSpacing( 5 );
71   aFileNameLayout->addWidget( aFileNameLabel );
72   aFileNameLayout->addWidget( myFileName );
73   aFileNameLayout->addWidget( aBrowseBtn );
74     
75   myObjectNameGroup = new QGroupBox( tr( "LANDCOVERMAP_NAME" ) );
76
77   QLabel* aLandcoverNameLabel = new QLabel( tr( "NAME" ), myObjectNameGroup );
78   myObjectName = new QLineEdit( myObjectNameGroup );
79
80   QBoxLayout* aLandcoverNameLayout = new QHBoxLayout( myObjectNameGroup );
81   aLandcoverNameLayout->setMargin( 5 );
82   aLandcoverNameLayout->setSpacing( 5 );
83   aLandcoverNameLayout->addWidget( aLandcoverNameLabel );
84   aLandcoverNameLayout->addWidget( myObjectName );
85
86   QGroupBox* aPolygonsGroup = new QGroupBox( tr( "FOUND_POLYGONS" ) );
87   myPolygonsListWidget = new QListWidget( aPolygonsGroup );
88   myPolygonsListWidget->setSelectionMode( QListWidget::ExtendedSelection );
89   myPolygonsListWidget->setEditTriggers( QListWidget::NoEditTriggers );
90   myPolygonsListWidget->setViewMode( QListWidget::ListMode );
91   myPolygonsListWidget->setSortingEnabled( false );
92
93   QBoxLayout* aPolygonsLayout = new QVBoxLayout;
94   aPolygonsLayout->addWidget( myPolygonsListWidget );
95   aPolygonsGroup->setLayout( aPolygonsLayout );
96
97   QVBoxLayout* aPageLayout = new QVBoxLayout;
98   myAttrCheckBox = new QCheckBox( tr("USE_DBF_AS_ST") );
99   myAttrCheckBox->setChecked(true);
100
101   // Layout
102   aPageLayout->setMargin( 5 );
103   aPageLayout->setSpacing( 5 );
104   aPageLayout->addWidget( myFileNameGroup );
105   aPageLayout->addWidget( myAttrCheckBox );
106   aPageLayout->addWidget( myObjectNameGroup );
107   aPageLayout->addWidget( aPolygonsGroup );
108   aPage->setLayout( aPageLayout );
109
110   // Conections
111   connect( myPolygonsListWidget, SIGNAL( itemSelectionChanged() ), this, SLOT( onItemSelectionChanged() ) );
112   connect( aBrowseBtn, SIGNAL( clicked() ), this, SLOT( onBrowse() ) ); 
113   connect( myAttrCheckBox, SIGNAL(clicked(bool)), this, SLOT(onAttrCBChecked(bool)));
114
115   return aPage;
116 }
117
118 QWizardPage* HYDROGUI_ImportLandCoverMapDlg::createPage2() {
119   QWizardPage* aPage = new QWizardPage( mainFrame() );
120   QFrame* aFrame = new QFrame( aPage );
121
122   myAvAttrLabel = new QLabel();
123   myAvAttrLabel->setText(tr("AV_ATTRS"));
124   
125   myDBFAttrListWidget = new QListWidget( );
126   myDBFAttrListWidget->setSelectionMode( QListWidget::SingleSelection );
127   myDBFAttrListWidget->setEditTriggers( QListWidget::NoEditTriggers );
128   myDBFAttrListWidget->setViewMode( QListWidget::ListMode );
129   myDBFAttrListWidget->setSortingEnabled( false );
130
131   // Layout
132   QVBoxLayout* aPageLayout = new QVBoxLayout;
133   aPageLayout->setMargin( 5 );
134   aPageLayout->setSpacing( 5 );
135   aPageLayout->addWidget( myAvAttrLabel );
136   aPageLayout->addWidget( myDBFAttrListWidget );
137   aPage->setLayout( aPageLayout );
138
139   return aPage;
140 }
141
142 QWizardPage* HYDROGUI_ImportLandCoverMapDlg::createPage3() {
143
144   QWizardPage* aPage = new QWizardPage( mainFrame() );
145   QFrame* aFrame = new QFrame( aPage );
146   myCorrLabel = new QLabel();
147   myCorrLabel->setText(tr ("CORR"));
148   
149   myCorrTableWidget = new QTableWidget();
150
151   // Layout
152   QVBoxLayout* aPageLayout = new QVBoxLayout;
153   aPageLayout->setMargin( 5 );
154   aPageLayout->setSpacing( 5 );
155   aPageLayout->addWidget( myCorrLabel );
156   aPageLayout->addWidget( myCorrTableWidget );
157   aPage->setLayout( aPageLayout );
158   return aPage;
159 }
160
161
162 HYDROGUI_ImportLandCoverMapDlg::~HYDROGUI_ImportLandCoverMapDlg()
163 {
164   myPolygonsListWidget->clear();
165   myDBFAttrListWidget->clear();
166 }
167
168 void HYDROGUI_ImportLandCoverMapDlg::reset()
169 {
170   myPolygonsListWidget->clear();
171   myDBFAttrListWidget->clear();
172 }
173
174 void HYDROGUI_ImportLandCoverMapDlg::setPolygonNames( const QStringList& theNames )
175 {
176   myPolygonsListWidget->clear();
177   myPolygonsListWidget->addItems( theNames );
178 }
179
180 void HYDROGUI_ImportLandCoverMapDlg::setAttributeNames( const QStringList& theAttrNames )
181 {
182   myDBFAttrListWidget->clear();
183   myDBFAttrListWidget->addItems( theAttrNames );
184 }
185
186 void HYDROGUI_ImportLandCoverMapDlg::setSelectedPolygonNames( const QStringList& theNames )
187 {
188   myPolygonsListWidget->clearSelection();
189
190   foreach( const QString aName, theNames ) {
191     QList<QListWidgetItem*> anItems = myPolygonsListWidget->findItems( aName, Qt::MatchExactly );
192     if ( anItems.count() == 1 ) {
193       anItems.first()->setSelected( true );
194     }
195   }
196 }
197
198 void HYDROGUI_ImportLandCoverMapDlg::onItemSelectionChanged()
199
200   int aCurIndex = GetCurrentWizardIndex();
201   if (aCurIndex == 0)
202     emit selectionChanged( getSelectedPolygonNames() );
203 }
204
205 QStringList HYDROGUI_ImportLandCoverMapDlg::getSelectedPolygonNames() const
206 {
207   QStringList aSelectedNames;
208
209   QList<QListWidgetItem*> aSelectedItems = myPolygonsListWidget->selectedItems();
210   foreach( const QListWidgetItem* anItem, aSelectedItems )
211     aSelectedNames << anItem->text();
212
213   return aSelectedNames;
214 }
215
216 void HYDROGUI_ImportLandCoverMapDlg::onBrowse()
217 {
218   QString aFilter( tr( "LANDCOVERMAP_FILTER" ) );
219   QString aFileName = SUIT_FileDlg::getFileName( this, "", aFilter, tr( "IMPORT_LANDCOVER_MAP_FROM_FILE" ), true );
220
221   if( !aFileName.isEmpty() )
222   {
223     setFileName( aFileName );
224     emit FileSelected( aFileName );
225   }
226 }
227
228 void HYDROGUI_ImportLandCoverMapDlg::setObjectName( const QString& theName )
229 {
230   myObjectName->setText( theName );
231   myObjectNameGroup->setEnabled( !theName.isEmpty() || !myFileName->text().isEmpty() );
232 }
233
234 QString HYDROGUI_ImportLandCoverMapDlg::getObjectName() const
235 {
236   return myObjectName->text();
237 }
238
239 void HYDROGUI_ImportLandCoverMapDlg::setFileName( const QString& theFileName )
240 {
241   myFileName->setText( theFileName );
242
243   if ( !myObjectNameGroup->isEnabled() )
244     myObjectNameGroup->setEnabled( !theFileName.isEmpty() );
245 }
246
247 QString HYDROGUI_ImportLandCoverMapDlg::getFileName() const
248 {
249   return myFileName->text();
250 }
251
252
253 void HYDROGUI_ImportLandCoverMapDlg::FillCorrespondenceTable(const QStringList& theFirstColumn, 
254                                                    const QStringList& theSecondColumn,
255                                                    const QVector<int> theDefCBIndices,
256                                                    const QVector<QColor> theColors)
257 {
258   int aFCSize = theFirstColumn.size();  // == theDefCBIndices.size() !
259   int aSCSize = theSecondColumn.size(); 
260
261   myStrColors = theColors;
262
263   myCorrTableWidget->setRowCount(aFCSize);
264   myCorrTableWidget->setColumnCount(3);
265   QTableWidgetItem* aHeader_1 = new QTableWidgetItem(QString(tr("TABLE_H1")), QTableWidgetItem::Type);
266   QTableWidgetItem* aHeader_2 = new QTableWidgetItem(QString(tr("TABLE_H2")), QTableWidgetItem::Type);
267   QTableWidgetItem* aHeader_3 = new QTableWidgetItem(QString(tr("TABLE_H3")), QTableWidgetItem::Type);
268   myCorrTableWidget->setHorizontalHeaderItem(0, aHeader_1);
269   myCorrTableWidget->setHorizontalHeaderItem(1, aHeader_2);
270   myCorrTableWidget->setHorizontalHeaderItem(2, aHeader_3);
271   myCorrTableWidget->horizontalHeader()->setResizeMode( QHeaderView::ResizeToContents );
272   //
273   for (int i = 0; i < aFCSize; i++)
274   {
275     QTableWidgetItem* aTWI = new QTableWidgetItem();
276     aTWI->setText(theFirstColumn.at(i));
277     aTWI->setFlags(Qt::ItemIsUserCheckable);
278     myCorrTableWidget->setItem(i, 0, aTWI);
279   }
280   //
281   QSignalMapper* signalMap = new QSignalMapper();
282   for (int i = 0; i < aFCSize; i++)
283   {
284     QComboBox* aCB = new QComboBox();
285     connect(aCB, SIGNAL(currentIndexChanged(int)), signalMap, SLOT(map()));
286     signalMap->setMapping(aCB, i);
287     aCB->addItems(theSecondColumn);
288     aCB->setCurrentIndex(theDefCBIndices[i]);
289     myCorrTableWidget->setCellWidget(i, 1, aCB);
290   }
291   connect(signalMap, SIGNAL(mapped(int)), this, SLOT(onComboBoxColorChanged(int)));
292
293   //
294   for (int i = 0; i < aFCSize; i++)
295   {
296     myCorrTableWidget->setItem(i, 2, new QTableWidgetItem);
297     myCorrTableWidget->item(i, 2)->setBackground(myStrColors[theDefCBIndices[i]]);
298   }
299
300 }
301
302 QString HYDROGUI_ImportLandCoverMapDlg::getSelectedFieldName() const
303 {
304   return myDBFAttrListWidget->selectedItems().first()->text();
305 }
306
307 void HYDROGUI_ImportLandCoverMapDlg::setFirstPageState(bool theState)
308 {
309   myFirstPageState = theState;
310 }
311
312 bool HYDROGUI_ImportLandCoverMapDlg::acceptCurrent() const
313 {
314   //Check the state of the current page
315   int aCurrPage = GetCurrentWizardIndex();
316   switch ( aCurrPage )
317   {
318     case 0:
319     {
320       if (!myFirstPageState)
321       {
322         SUIT_MessageBox::warning( module()->getApp()->desktop(), tr( "LCM_IMPORT_WARNING" ), tr("FILE_ISNT_CHOSEN"));
323         return false;
324       }
325       if (myPolygonsListWidget->selectedItems().empty())
326       {
327         SUIT_MessageBox::warning( module()->getApp()->desktop(), tr( "LCM_IMPORT_WARNING" ), tr("POLYGONS_ISNT_SELECTED"));
328         return false;
329       }
330       if (getAttrCheckBoxState() && !getDbfState())
331       {
332          SUIT_MessageBox::critical( module()->getApp()->desktop(), tr( "DBF_LOAD_ERROR" ), tr("DBF_LOAD_ERR_MESS"));
333          return false;
334       }
335       break;
336     }
337     case 1:
338     {
339       if (myDBFAttrListWidget->selectedItems().empty())
340       {
341         SUIT_MessageBox::warning( module()->getApp()->desktop(), tr( "LCM_IMPORT_WARNING" ), "Attribute isn't selected");
342         return false;
343       }
344       break;
345     }
346     case 2: //last page
347     {
348       if (myPolygonsListWidget->selectedItems().empty())
349       {
350         SUIT_MessageBox::warning( module()->getApp()->desktop(), tr( "LCM_IMPORT_WARNING" ), tr("POLYGONS_ISNT_SELECTED"));
351         return false;
352       }
353       break;
354     }
355     default:
356      return false;
357   }
358   return true;
359 }
360
361 void HYDROGUI_ImportLandCoverMapDlg::getValAttr2StricklerTypeCorr(QStringList& theAttrValues, QStringList& theST)
362 {
363   int aRowCount = myCorrTableWidget->rowCount();
364   for (int i = 0; i < aRowCount; i++)
365   {
366     QTableWidgetItem* aTWI = myCorrTableWidget->item(i, 0);
367     theAttrValues.push_back(aTWI->text());
368   }
369
370   for (int i = 0; i < aRowCount; i++)
371   {
372     QWidget* aW = myCorrTableWidget->cellWidget(i, 1);
373     QComboBox* aCB = dynamic_cast<QComboBox*> (aW);
374     theST.push_back(aCB->currentText());
375   }
376 }
377
378
379 QVector<int> HYDROGUI_ImportLandCoverMapDlg::getSelectedPolygonIndices() const
380 {
381   QVector<int> aSelectedIndices;
382
383   QModelIndexList aSelectedItems = myPolygonsListWidget->selectionModel()->selectedIndexes();
384   foreach( QModelIndex index, aSelectedItems ) {
385     aSelectedIndices << index.row();
386   }
387
388   return aSelectedIndices;
389 }
390
391 void HYDROGUI_ImportLandCoverMapDlg::onAttrCBChecked( bool theState )
392 {
393   if (theState)
394     SetButtonsState ( false );
395   else
396     SetButtonsState ( true );
397 }
398
399 bool HYDROGUI_ImportLandCoverMapDlg::getAttrCheckBoxState() const
400 {
401   return myAttrCheckBox->isChecked();
402 }
403
404 void HYDROGUI_ImportLandCoverMapDlg::onComboBoxColorChanged(int theInd)
405 {
406   QComboBox* CB = qobject_cast<QComboBox*> (myCorrTableWidget->cellWidget(theInd, 1));
407   int aCurIndOfCB = CB->currentIndex();
408   myCorrTableWidget->item(theInd, 2)->setBackground(myStrColors[aCurIndOfCB]);
409 }
410
411 void HYDROGUI_ImportLandCoverMapDlg::setDbfState(bool theState)
412 {
413   myDbfState = theState;
414 }
415
416 bool HYDROGUI_ImportLandCoverMapDlg::getDbfState() const
417 {
418   return myDbfState;
419 }
420
421 int HYDROGUI_ImportLandCoverMapDlg::GetCurrentWizardIndex() const
422 {
423   return wizard()->currentIndex();
424 }