00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "omglayersetmanager.h"
00023 #include <omglayerset.h>
00024 #include <omglayerselector.h>
00025
00026
00027 #include <QSettings>
00028 #include <QTextEdit>
00029 #include <QTextStream>
00030 #include <QFile>
00031 #include <QFileInfo>
00032 #include <QDir>
00033 #include <QString>
00034 #include <QMessageBox>
00035 #include <QHeaderView>
00036 #include <QTableWidget>
00037 #include <QTableWidgetItem>
00038 #include <QFileDialog>
00039 #include <QListWidgetItem>
00040 OmgLayerSetManager::OmgLayerSetManager(QWidget* parent, Qt::WFlags fl)
00041 : QDialog(parent,fl)
00042 {
00043
00044 setupUi(this);
00045 connect(tblLayerSets, SIGNAL(cellClicked( int,int)), this, SLOT(cellClicked( int,int)));
00046 refreshLayerSetTable();
00047
00048 #ifdef OMG_NO_EXPERIMENTAL
00049 pbnImport->setVisible(false);
00050 pbnExport->setVisible(false);
00051 #endif
00052 }
00053
00054 OmgLayerSetManager::~OmgLayerSetManager()
00055 {}
00056
00057 void OmgLayerSetManager::refreshLayerSetTable(QString theGuid)
00058 {
00059
00060 mLayerSetMap.clear();
00061 tblLayerSets->clear();
00062 tblLayerSets->setRowCount(0);
00063 tblLayerSets->setColumnCount(2);
00064
00065
00066
00067
00068
00069 mLayerSetMap = Omgui::getAvailableLayerSets();
00070
00071
00072
00073
00074
00075 int mySelectedRow=0;
00076 int myCurrentRow=0;
00077 QMapIterator<QString, OmgLayerSet> myIterator(mLayerSetMap);
00078 while (myIterator.hasNext())
00079 {
00080 myIterator.next();
00081 OmgLayerSet myLayerSet = myIterator.value();
00082 if (theGuid.isEmpty())
00083 {
00084 theGuid=myLayerSet.guid();
00085 }
00086 if (myLayerSet.guid()==theGuid)
00087 {
00088 mySelectedRow=myCurrentRow;
00089 }
00090
00091 tblLayerSets->insertRow(myCurrentRow);
00092 QString myGuid = myLayerSet.guid();
00093
00094 QTableWidgetItem *mypFileNameItem= new QTableWidgetItem(myGuid);
00095 tblLayerSets->setItem(myCurrentRow, 0, mypFileNameItem);
00096 QTableWidgetItem *mypNameItem = new QTableWidgetItem(myLayerSet.name());
00097 tblLayerSets->setItem(myCurrentRow, 1, mypNameItem);
00098
00099
00100
00101
00102 QIcon myIcon;
00103 myIcon.addFile(":/localdata.png");
00104 mypNameItem->setIcon(myIcon);
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 myCurrentRow++;
00117 }
00118
00119 if (myCurrentRow>0)
00120 {
00121 tblLayerSets->setCurrentCell(mySelectedRow,1);
00122 cellClicked(mySelectedRow,1);
00123 }
00124 QStringList headerLabels;
00125 headerLabels << "File Name" << "Name";
00126 tblLayerSets->setHorizontalHeaderLabels(headerLabels);
00127 tblLayerSets->setColumnWidth(0,0);
00128 tblLayerSets->setColumnWidth(1,tblLayerSets->width());
00129 tblLayerSets->horizontalHeader()->hide();
00130 tblLayerSets->verticalHeader()->hide();
00131 tblLayerSets->horizontalHeader()->setResizeMode(1,QHeaderView::Stretch);
00132 if (mLayerSetMap.count()<1)
00133 {
00134 grpLayerset->setEnabled(false);
00135 leName->setText("");
00136 leDescription->setText("");
00137 lstLayers->clear();
00138 cboMask->clear();
00139 }
00140 else
00141 {
00142 grpLayerset->setEnabled(true);
00143 }
00144 lblLayers->setText(tr("Layers: ") + "("+QString::number(lstLayers->count())+")");
00145 }
00146
00147 void OmgLayerSetManager::cellClicked(int theRow, int theColumn)
00148 {
00149
00150
00151 QString myGuid = tblLayerSets->item(tblLayerSets->currentRow(),0)->text();
00152
00153 QString myFileName = myGuid + ".xml";
00154 selectLayerSet(myFileName);
00155 }
00156 void OmgLayerSetManager::selectLayerSet(QString theFileName)
00157 {
00158 QString myLayerSetDir = Omgui::userLayersetDirPath();
00159 OmgLayerSet myLayerSet;
00160 myLayerSet.fromXmlFile(myLayerSetDir + QDir::separator() + theFileName);
00161 leName->setText(myLayerSet.name());
00162 leDescription->setText(myLayerSet.description());
00163
00164 lstLayers->clear();
00165 cboMask->clear();
00166
00167 int myMaskItemNo = -1;
00168 OmgLayerSet::LayersMap::iterator myIterator;
00169 OmgLayerSet::LayersMap myLayers = myLayerSet.layers();
00170 for (myIterator = myLayers.begin(); myIterator != myLayers.end(); ++myIterator)
00171 {
00172 OmgLayer myLayer = myIterator.value();
00173 QListWidgetItem *mypItem = new QListWidgetItem(myLayer.name(),lstLayers);
00174 if (myLayer.isCategorical())
00175 {
00176 QIcon myIcon;
00177 myIcon.addFile(":/categorical.png");
00178 mypItem->setIcon(myIcon);
00179 }
00180 else
00181 {
00182 QIcon myIcon;
00183 myIcon.addFile(":/non-categorical.png");
00184 mypItem->setIcon(myIcon);
00185 }
00186 lstLayers->addItem(mypItem);
00187 cboMask->addItem(myLayer.name());
00188 if (myLayer.name()==myLayerSet.mask().name())
00189 {
00190
00191 myMaskItemNo=cboMask->count();
00192 }
00193 }
00194 if (!myLayerSet.mask().name().isEmpty() && myMaskItemNo < 0 )
00195 {
00196 cboMask->addItem(myLayerSet.mask().name());
00197 myMaskItemNo=cboMask->count();
00198 }
00199
00200 cboMask->setCurrentItem(myMaskItemNo-1);
00201 mLayerSet=myLayerSet;
00202 lblLayers->setText(tr("Layers: ") + "("+QString::number(lstLayers->count())+")");
00203 }
00204
00205 void OmgLayerSetManager::on_pbnImport_clicked()
00206 {
00207 QString myFileName = QFileDialog::getOpenFileName(
00208 this,
00209 "Choose a file",
00210 ".",
00211 "Models and Environments (*.xml)");
00212 if (!myFileName.isEmpty())
00213 {
00214 OmgLayerSet myLayerSet;
00215 if (myLayerSet.fromXmlFile(myFileName))
00216 {
00217 myLayerSet.setGuid();
00218 if (myLayerSet.name().isEmpty())
00219 {
00220 myLayerSet.setName(tr("Unnamed layerset"));
00221 }
00222 if (myLayerSet.description().isEmpty())
00223 {
00224 myLayerSet.setDescription(tr("No description"));
00225 }
00226 myLayerSet.save();
00227 refreshLayerSetTable();
00228 }
00229 }
00230 }
00231
00232 void OmgLayerSetManager::on_toolNew_clicked()
00233 {
00234 OmgLayerSet myLayerSet;
00235 leName->clear();
00236 leDescription->clear();
00237 lstLayers->clear();
00238 cboMask->clear();
00239 myLayerSet.setGuid();
00240 mLayerSet = myLayerSet;
00241 lblLayers->setText(tr("Layers: ") + "(0)");
00242 }
00243
00244 void OmgLayerSetManager::resizeEvent ( QResizeEvent * theEvent )
00245 {
00246 tblLayerSets->setColumnWidth(0,0);
00247 tblLayerSets->setColumnWidth(1,tblLayerSets->width());
00248 tblLayerSets->horizontalHeader()->setResizeMode(1,QHeaderView::Stretch);
00249 }
00250
00251 void OmgLayerSetManager::on_toolCopy_clicked()
00252 {
00253 if (tblLayerSets->currentRow() < 0)
00254 {
00255 return;
00256 }
00257
00258 QString myGuid = tblLayerSets->item(tblLayerSets->currentRow(),0)->text();
00259 if (myGuid.isEmpty())
00260 {
00261 return;
00262 }
00263 QString myOriginalFileName = Omgui::userLayersetDirPath() + QDir::separator() + myGuid + ".xml";
00264 OmgLayerSet myLayerSet;
00265 myLayerSet.fromXmlFile(myOriginalFileName);
00266
00267
00268
00269
00270
00271
00272
00273
00274 myLayerSet.setGuid();
00275 myLayerSet.setName(tr("Copy of ") + myLayerSet.name());
00276 myLayerSet.save();
00277 refreshLayerSetTable(myLayerSet.guid());
00278 }
00279 void OmgLayerSetManager::on_toolDelete_clicked()
00280 {
00281 if (tblLayerSets->currentRow() < 0)
00282 {
00283 return;
00284 }
00285 if ( QMessageBox::warning(this, "openModeller Desktop",
00286 tr("Deleting a layer set is non-reversable.\n"
00287 "Do you really want to delete it?"),
00288 QMessageBox::Yes | QMessageBox::No,
00289 QMessageBox::No) == QMessageBox::No)
00290 {
00291
00292 return;
00293 }
00294 QString myGuid = tblLayerSets->item(tblLayerSets->currentRow(),0)->text();
00295 if (!myGuid.isEmpty())
00296 {
00297 QFile myFile(Omgui::userLayersetDirPath() + QDir::separator() + myGuid + ".xml");
00298 if (!myFile.remove())
00299 {
00300 QMessageBox::warning(this, tr("openModeller Desktop"),
00301 tr("Unable to delete file \n") + myFile.fileName());
00302 }
00303 refreshLayerSetTable();
00304 }
00305 }
00306 void OmgLayerSetManager::on_pbnApply_clicked()
00307 {
00308 if (lstLayers->count()==0)
00309 {
00310 QMessageBox::warning( this,tr("openModeller Desktop"),tr("There are no layers in your layerset. Please add some layers before pressing apply."));
00311 return;
00312 }
00313 if (leName->text().isEmpty())
00314 {
00315 QMessageBox::warning( this,tr("openModeller Desktop"),
00316 tr("Please specify a layerset name before pressing apply."));
00317 return;
00318 }
00319
00320
00321
00322 QMapIterator<QString, OmgLayerSet> myIterator(mLayerSetMap);
00323 while (myIterator.hasNext())
00324 {
00325 myIterator.next();
00326 OmgLayerSet myLayerSet = myIterator.value();
00327 if ((myLayerSet.name()==leName->text()) && (myLayerSet.guid()!=mLayerSet.guid()))
00328 {
00329 QMessageBox::warning( this,tr("openModeller Desktop"),tr("The name you choose for your layerset must be unique.\n Update it and try again."));
00330 return;
00331 }
00332 }
00333
00334 OmgLayerSet myLayerSet;
00335 myLayerSet.setGuid(mLayerSet.guid());
00336 myLayerSet.setName(leName->text());
00337 myLayerSet.setDescription(leDescription->text());
00338 OmgLayer myMask;
00339 myMask.setName(cboMask->currentText());
00340 myLayerSet.setMask(myMask);
00341
00343 for ( int myCounter = 0; myCounter < lstLayers->count(); myCounter++ )
00344 {
00345 QString myLayerName=lstLayers->item(myCounter)->text();
00346 OmgLayer myLayer;
00347 myLayer.setName(myLayerName);
00348 myLayer.setType(OmgLayer::MAP);
00349 myLayer.setCategorical(false);
00350 myLayerSet.addLayer(myLayer);
00351 }
00352 myLayerSet.save();
00353 mLayerSet=myLayerSet;
00354 refreshLayerSetTable(mLayerSet.guid());
00355 }
00356
00357 void OmgLayerSetManager::on_toolDeleteLayers_clicked()
00358 {
00359 unsigned int myLayersCount = static_cast<unsigned int>(lstLayers->count());
00360 for ( unsigned int myInt = 0; myInt < myLayersCount; myInt++ )
00361 {
00362 QListWidgetItem *myItem = lstLayers->item( myInt );
00363
00364 if ( lstLayers->isItemSelected(myItem) )
00365 {
00366
00367
00368
00369
00370 lstLayers->takeItem(myInt);
00371
00372
00373 myInt--;
00374 myLayersCount--;
00375 }
00376 }
00377 lblLayers->setText(tr("Layers: ") + "("+QString::number(lstLayers->count())+")");
00378 }
00379 void OmgLayerSetManager::on_toolAddLayers_clicked()
00380 {
00381 QSettings mySettings;
00382 QString myBaseDir = mySettings.value("openModeller/layerSetManager/modelLayersDirectory","c:/tmp").toString();
00383 OmgLayerSelector myOmgLayerSelector(myBaseDir, this);
00384 if(myOmgLayerSelector.exec())
00385 {
00386 QStringList myList=myOmgLayerSelector.getSelectedLayers();
00387 if (myList.size()<1)
00388 {
00389 return;
00390 }
00391
00392
00393 myList = Omgui::sortList(myList);
00394 QStringList::Iterator myIterator= myList.begin();
00395 while( myIterator!= myList.end() )
00396 {
00397
00398 QString myString = *myIterator;
00399 QList<QListWidgetItem*> myList = lstLayers->findItems(myString, Qt::MatchExactly);
00400 if (myList.size()<1)
00401 {
00402 lstLayers->insertItem( 0, myString );
00403 cboMask->addItem(myString);
00404 }
00405 ++myIterator;
00406 }
00407 mySettings.setValue("openModeller/layerSetManager/modelLayersDirectory",myOmgLayerSelector.getBaseDir());
00408 lblLayers->setText(tr("Layers: ") + "("+QString::number(lstLayers->count())+")");
00409 }
00410 }
00411
00412 void OmgLayerSetManager::on_toolNewMaskLayer_clicked()
00413 {
00414 QSettings mySettings;
00415 QString myBaseDir = mySettings.value("openModeller/layerSetManager/modelMasksDirectory","c:/tmp").toString();
00416 OmgLayerSelector myOmgLayerSelector(myBaseDir, this);
00417 myOmgLayerSelector.setSelectionMode(QAbstractItemView::SingleSelection);
00418 if(myOmgLayerSelector.exec())
00419 {
00420 QStringList myList=myOmgLayerSelector.getSelectedLayers();
00421 if (myList.size()<1)
00422 {
00423 return;
00424 }
00425 cboMask->addItem(myList[0]);
00426 int myNewIndex = cboMask->count()-1;
00427 if (myNewIndex >= 0)
00428 {
00429 cboMask->setCurrentIndex(myNewIndex);
00430 }
00431 mySettings.setValue("openModeller/layerSetManager/modelMasksDirectory",myOmgLayerSelector.getBaseDir());
00432 }
00433 }