Main Page | Modules | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members | Related Pages

omglayersetmanager.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2005 by Peter Brewer   *
00003  *   peter@pembshideaway.co.uk   *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program is distributed in the hope that it will be useful,       *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00019  ***************************************************************************/
00020 
00021 //local includes
00022 #include "omglayersetmanager.h"
00023 #include <omglayerset.h>
00024 #include <omglayerselector.h>
00025 
00026 //qt includes
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   //required by Qt4 to initialise the ui
00044   setupUi(this);
00045   connect(tblLayerSets, SIGNAL(cellClicked( int,int)), this, SLOT(cellClicked( int,int)));
00046   refreshLayerSetTable();
00047   //disable these buttons unless experimental is allowed
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   //we do this in two passes
00067   //in the first pass we populate a qmap with all the layersets
00068   //we find....
00069   mLayerSetMap = Omgui::getAvailableLayerSets();
00070 
00071   //the second pass populates the table
00072   //doing it from the map ensures that the rows
00073   //are sorted by layerset name
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     // Insert new row ready to fill with details
00091     tblLayerSets->insertRow(myCurrentRow); 
00092     QString myGuid = myLayerSet.guid();
00093     // Add details to the new row
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     //display an icon indicating if the layerset is local or remote (e.g. terralib)
00099     //OmgLayerSet::Origin myOrigin = myLayerSet.origin();
00100     //if (myOrigin==OmgLayerSet::USERPROFILE)
00101     //{
00102     QIcon myIcon;
00103     myIcon.addFile(":/localdata.png");
00104     mypNameItem->setIcon(myIcon);
00105     //}
00106     //else if (myOrigin==OmgLayerSet::ADAPTERPROFILE)
00107     //{
00108     //QIcon myIcon;
00109     //myIcon.addFile(":/remotedata.png");
00110     //mypNameItem->setIcon(myIcon);
00111     //}
00112     //else if (myOrigin==OmgLayerSet::UNDEFINED)
00113     //{
00114     //  mypNameItem->setTextColor(Qt::yellow);
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   //note we use the alg name not the id becuase user may have customised params
00150   //qDebug("OmgLayerSetManager::cellClicked");
00151   QString myGuid = tblLayerSets->item(tblLayerSets->currentRow(),0)->text();
00152   //qDebug("Guid is: " + myGuid.toLocal8Bit());
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   //qDebug("Clearing Layers and mask");
00164   lstLayers->clear();
00165   cboMask->clear();
00166   //qDebug("Layers and mask cleared");
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       //qDebug("Mask match found: " + myLayer.name().toLocal8Bit() +  " == " + myLayerSet.mask().name().toLocal8Bit());
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   //qDebug("Setting current item for mask to: " + QString::number(myMaskItemNo).toLocal8Bit());
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   //to clone, we get the algorithm guid that is currently selected
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   int myCount = 1;
00268   while (mLayerSet.contains(myProfileName))
00269   {
00270     myProfileName = tr("Copy ") + QString::number(myCount++) + " of " + myLayerSet.name();
00271   }
00272   */
00273   //assign this layerset its own guid
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     //user said no
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   // first check if the user is creating a layerset that duplicates anothers name
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   //work on temp copy & replace mLayerSet at last minute only !! (following mayer effective c++ tip here..)
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     // if the item is selected...
00364     if ( lstLayers->isItemSelected(myItem) )
00365     {
00366       //remove the item if it is selected
00367       //this method is described in the qt docs but gives a compile errror saying the error is non existant!
00368       //lstLayers->removeItem(myInt);
00369       //so we kludge it for now!
00370       lstLayers->takeItem(myInt);
00371       //also remove the item from the mask layer combo
00372       //cboInputMaskLayer->removeItem(myInt);
00373       myInt--;
00374       myLayersCount--;
00375     }
00376   }
00377   lblLayers->setText(tr("Layers: ") + "("+QString::number(lstLayers->count())+")");
00378 } //on_toolDeleteLayers_clicked
00379 void OmgLayerSetManager::on_toolAddLayers_clicked()
00380 {
00381   QSettings mySettings;
00382   QString myBaseDir = mySettings.value("openModeller/layerSetManager/modelLayersDirectory","c:/tmp").toString(); //initial dir
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     //sort on descending alphabetical order
00393     myList = Omgui::sortList(myList);
00394     QStringList::Iterator myIterator= myList.begin();
00395     while( myIterator!= myList.end() )
00396     {
00397       //make sure this layer is not already in the list
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 }//tool_addLayers_clicked
00411 
00412 void OmgLayerSetManager::on_toolNewMaskLayer_clicked()
00413 {
00414   QSettings mySettings;
00415   QString myBaseDir = mySettings.value("openModeller/layerSetManager/modelMasksDirectory","c:/tmp").toString(); //initial dir
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 }//on_toolNewMaskLayer_clicked()

Generated on Mon Apr 28 15:07:25 2008 for openModellerDesktop by  doxygen 1.4.1-20050210