00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <qlayout.h>
00015 #include <qlistview.h>
00016 #include <qpushbutton.h>
00017 #include <qinputdialog.h>
00018 #include <qpopupmenu.h>
00019 #include <qdom.h>
00020 #include "showmodesdlg.h"
00021 #include "ui_addremovewidget.h"
00022 #include "layereditdlg.h"
00023 #include "modeeditdlg.h"
00024 #include "trapperconf.h"
00025 #include "generalmaker.h"
00026
00027 #include <iostream>
00028 #include <string>
00029 #include <list>
00030 using namespace std;
00031
00032
00033
00034
00035
00036 class Item : public QListViewItem
00037 {
00038 public:
00039 Item( QListView * listView, ShowModesDlg * _dlg ): QListViewItem( listView ), showModesDlg(_dlg)
00040 { moveToEnd(); }
00041 Item( QListViewItem * item, ShowModesDlg * _dlg ): QListViewItem( item ), showModesDlg(_dlg)
00042 { moveToEnd(); }
00043 ~Item()
00044 {
00045 if ( menu )
00046 {
00047 delete menu;
00048 menu = NULL;
00049 }
00050 }
00051 void moveToEnd() {
00052 QListViewItem *lastChild = this;
00053 if ( lastChild ) {
00054 while ( lastChild->nextSibling() )
00055 lastChild = lastChild->nextSibling();
00056 }
00057
00058
00059 moveItem( lastChild );
00060 }
00061 virtual QString name() = 0;
00062
00063 virtual bool deletable() = 0;
00064 void popup( const QPoint & pos )
00065 {
00066 if ( menu )
00067 {
00068 menu->popup( pos );
00069 }
00070 return;
00071 }
00072 virtual void setAttributes( QDomElement elem ) = 0;
00073 void createDom( QDomElement elem )
00074 {
00075
00076 setAttributes( elem );
00077 QListViewItem *child = firstChild();
00078 while ( child )
00079 {
00080 QDomDocument doc = elem.ownerDocument();
00081
00082 Item * it = dynamic_cast<Item *> ( child );
00083
00084
00085 Q_ASSERT( it );
00086 if ( it )
00087 {
00088
00089 QDomElement childElem = doc.createElement( it->name() );
00090 elem.appendChild( childElem );
00091
00092 it->createDom( childElem );
00093 }
00094 child = child->nextSibling();
00095 }
00096 }
00097 public slots:
00098
00099 virtual void edit()
00100 {
00101 return;
00102 }
00103 virtual void add
00104 ()
00105 {
00106 return;
00107 }
00108 protected:
00109 QPopupMenu * menu;
00110 ShowModesDlg * showModesDlg;
00111 };
00112
00113
00114
00115
00116
00117
00118 class FeatureItem : public Item
00119 {
00120 public:
00121 FeatureItem( QListViewItem * item, ShowModesDlg * dlg, QString featureName ):
00122 Item( item ,dlg), m_featureName( featureName )
00123 {
00124 setTextInListView();
00125 }
00126 ~FeatureItem()
00127 {}
00128 void setAttributes( QDomElement elem )
00129 {
00130 elem.setAttribute( "name", m_featureName );
00131 return;
00132
00133 }
00134 QString name()
00135 {
00136 return QString( "feature" );
00137 }
00138 void setTextInListView()
00139 {
00140 setText(0,"feature");
00141 setText(4,m_featureName);
00142 }
00143 bool deletable()
00144 {
00145 return true;
00146 }
00147 protected:
00148 QString m_featureName;
00149 };
00150
00151
00152
00153
00154
00155 class LayerItem : public Item
00156 {
00157 public:
00158 LayerItem( QListViewItem * item, ShowModesDlg * dlg, int height,
00159 QString allowOverlapStr): Item( item , dlg), m_height( height ), m_allowOverlapStr( allowOverlapStr)
00160 {
00161 menu = new QPopupMenu( dlg );
00162 menu->insertItem( "add feature",dlg , SLOT(add
00163 ()) );
00164 menu->insertItem( "remove this layer", dlg , SLOT(remove
00165 ()) );
00166 menu->insertItem( "edit this layer", dlg , SLOT(edit()) );
00167 setTextInListView();
00168 }
00169 QString name()
00170 {
00171 return QString( "layer" );
00172 }
00173 void setAttributes( QDomElement elem )
00174 {
00175 elem.setAttribute( "height", QString("%1").arg(m_height) );
00176 elem.setAttribute( "allowOverlapStr", m_allowOverlapStr );
00177 return;
00178
00179 }
00180 ~LayerItem()
00181 {}
00182 void parseDom( QDomElement elem )
00183 {
00184
00185 QDomNode node = elem.firstChild();
00186
00187 while ( !node.isNull() )
00188 {
00189
00190 if ( node.isElement() && node.nodeName() == "feature" )
00191 {
00192
00193 QDomElement elem = node.toElement();
00194
00195 Q_ASSERT((elem.hasAttribute("name")));
00196
00197 QString name = elem.attribute( "name" ,"");
00198
00199
00200 new FeatureItem( this, showModesDlg , name );
00201
00202 }
00203 node = node.nextSibling();
00204 }
00205 }
00206
00207 void edit();
00208 bool deletable()
00209 {
00210 return true;
00211 }
00212
00213 void add
00214 ();
00215 void setTextInListView()
00216 {
00217 setText(0,"layer");
00218 setText(2, QString("%1").arg( m_height ));
00219 setText(3, m_allowOverlapStr );
00220 }
00221
00222 protected:
00223 int m_height;
00224 QString m_allowOverlapStr;
00225 };
00226
00227
00228
00229
00230 class ModeItem : public Item
00231 {
00232 public:
00233 ModeItem( QListViewItem * listViewItem, ShowModesDlg * dlg, QString name, int zoom )
00234 : Item( listViewItem,dlg ), m_name( name ), m_zoom( zoom )
00235 {
00236 menu = new QPopupMenu( dlg );
00237 menu->insertItem( "add layer", dlg , SLOT(add
00238 ()) );
00239 menu->insertItem( "remove this mode", dlg , SLOT(remove
00240 ()) );
00241 menu->insertItem( "edit this mode", dlg , SLOT(edit()) );
00242 setTextInListView();
00243 }
00244 QString name()
00245 {
00246 return QString( "modeView" );
00247 }
00248
00249 void setAttributes( QDomElement elem )
00250 {
00251
00252 elem.setAttribute( "zoom", QString("%1").arg(m_zoom) );
00253 elem.setAttribute( "name", m_name );
00254 return;
00255
00256 }
00257 void parseDom( QDomElement elem )
00258 {
00259 QDomNode node = elem.firstChild();
00260 while ( !node.isNull() )
00261 {
00262 if ( node.isElement() && node.nodeName() == "layer" )
00263 {
00264 QDomElement elem = node.toElement();
00265 Q_ASSERT((elem.hasAttribute("allowOverlapStr") && elem.hasAttribute("height")));
00266 QString allowOverlapStr = elem.attribute( "allowOverlapStr" ,"");
00267 QString height = elem.attribute( "height","");
00268 LayerItem * layerItem = new LayerItem( this, showModesDlg , height.toInt() , allowOverlapStr );
00269 layerItem->parseDom( elem );
00270 }
00271 node = node.nextSibling();
00272 }
00273 }
00274
00275 ~ModeItem()
00276 {}
00277 void edit();
00278 bool deletable()
00279 {
00280 return true;
00281 }
00282 void add
00283 ();
00284 void setTextInListView()
00285 {
00286 setText(0,m_name);
00287 setText(1, QString("%1").arg(m_zoom));
00288 }
00289 protected:
00290
00291 QString m_name;
00292 int m_zoom;
00293 };
00294
00295
00296
00297
00298 class RootItem : public Item
00299 {
00300 public:
00301 RootItem( QListView * view, ShowModesDlg * dlg): Item( view, dlg )
00302 {
00303 menu = new QPopupMenu( dlg );
00304 menu->insertItem( "add view mode", dlg, SLOT(add
00305 () ));
00306 setText( 0, "modes" );
00307 }
00308 QString name()
00309 {
00310
00311 return QString( "rootItem" );
00312 }
00313
00314 void setAttributes( QDomElement )
00315 {
00316
00317 return;
00318 }
00319 void parseDom( QDomElement elem )
00320 {
00321 QDomNode node = elem.firstChild();
00322
00323 while ( !node.isNull() )
00324 {
00325 if ( node.isElement() && node.nodeName() == "modeView" )
00326 {
00327 QDomElement elem = node.toElement();
00328
00329 Q_ASSERT((elem.hasAttribute("name") && elem.hasAttribute("zoom")));
00330
00331 QString name = elem.attribute( "name" ,"");
00332 QString zoom = elem.attribute( "zoom","");
00333
00334 ModeItem * modeItem = new ModeItem( this, showModesDlg , name, zoom.toInt() );
00335 modeItem->parseDom( elem );
00336 }
00337 node = node.nextSibling();
00338 }
00339 }
00340 ~RootItem()
00341 {}
00342
00343
00344
00345 void add
00346 ();
00347 bool deletable()
00348 {
00349 return false;
00350 }
00351 };
00352
00353 void ShowModesDlg::add
00354 ()
00355 {
00356 QListViewItem * current = uiWidget->listView->currentItem() ;
00357 Item * item = dynamic_cast< Item * > ( current );
00358 if ( item )
00359 {
00360 item->add
00361 ();
00362 }
00363 }
00364
00365 void ShowModesDlg::remove
00366 ()
00367 {
00368 QListViewItem * current = uiWidget->listView->currentItem() ;
00369 Item * item = dynamic_cast< Item * > ( current );
00370 if ( item )
00371 {
00372 if ( item->deletable() )
00373 {
00374 delete item;
00375 item = NULL;
00376 }
00377 }
00378 }
00379
00380 void ShowModesDlg::edit()
00381 {
00382 QListViewItem * current = uiWidget->listView->currentItem() ;
00383 Item * item = dynamic_cast< Item * > ( current );
00384 if ( item )
00385 {
00386 item->edit();
00387 }
00388 }
00389
00390 void ShowModesDlg::up()
00391 {
00392 QListViewItem * current = uiWidget->listView->currentItem() ;
00393 if ( current )
00394 {
00395 QListViewItem * item = current->itemAbove();
00396
00397
00398 if ( item && current->parent() == item->parent() )
00399 {
00400 item->moveItem( current );
00401 }
00402 }
00403 }
00404
00405 void ShowModesDlg::down()
00406 {
00407 QListViewItem * current = uiWidget->listView->currentItem() ;
00408 if ( current )
00409 {
00410 QListViewItem * item = current->itemBelow();
00411 if ( item && current->parent() == item->parent() )
00412 {
00413
00414
00415 current->moveItem( item );
00416
00417 }
00418 }
00419 }
00420
00421 void ShowModesDlg::contextMenu(QListViewItem * listViewItem, const QPoint &p, int)
00422 {
00423 Item * item = dynamic_cast< Item * >( listViewItem );
00424 if( item )
00425 {
00426 item->popup( p );
00427 return;
00428 }
00429 }
00430
00431 ShowModesDlg::ShowModesDlg( QWidget * parent, const char * name )
00432 : QDialog( parent, name, TRUE )
00433 {
00434 uiWidget = new UI_AddRemoveWidget( this );
00435 setCaption("Edit show modes");
00436 QBoxLayout * l = new QVBoxLayout( this );
00437 l->addWidget( uiWidget );
00438 TrapperConf * conf = TrapperConf::instance();
00439 QDomElement confElem = conf->viewModeConf();
00440
00441
00442 rootItem = new RootItem( uiWidget->listView, this );
00443 uiWidget->listView->setSorting( -1 );
00444 rootItem->parseDom( confElem );
00445
00446
00447 connect( uiWidget->buttonAdd, SIGNAL( clicked() ), this, SLOT( add
00448 () ) );
00449 connect( uiWidget->buttonUp, SIGNAL( clicked() ), this, SLOT( up() ) );
00450 connect( uiWidget->buttonDown, SIGNAL( clicked() ), this, SLOT( down() ) );
00451 connect( uiWidget->buttonEdit, SIGNAL( clicked() ), this, SLOT( edit() ) );
00452 connect( uiWidget->buttonRemove, SIGNAL( clicked() ), this, SLOT( remove
00453 () ) );
00454 connect( uiWidget->listView, SIGNAL( contextMenuRequested( QListViewItem *, const QPoint& , int ) ),
00455 this, SLOT( contextMenu( QListViewItem *, const QPoint &, int ) ) );
00456 rootMenu = new QPopupMenu( uiWidget->listView );
00457 rootMenu->insertItem( "add view mode", this, SLOT(add
00458 () ));
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471 uiWidget->listView->setRootIsDecorated( true );
00472 for ( int i = 0; i < 4; ++i )
00473 {
00474 uiWidget->listView->setColumnWidthMode( i, QListView::Maximum );
00475 }
00476
00477 connect( uiWidget->buttonOk, SIGNAL( clicked() ), this, SLOT( accept() ) );
00478 connect( uiWidget->buttonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) );
00479 connect ( uiWidget->listView, SIGNAL(doubleClicked( QListViewItem * )), this,
00480 SLOT( clicked( QListViewItem * )));
00481
00482 }
00483 void ShowModesDlg::clicked(QListViewItem * listViewItem)
00484 {
00485 Item * item = dynamic_cast< Item * >( listViewItem );
00486 if( item )
00487 {
00488 item->edit();
00489 return;
00490 }
00491 }
00492
00493 void ShowModesDlg::accept()
00494 {
00495 TrapperConf * conf = TrapperConf::instance();
00496 QDomElement confElem = conf->viewModeConf();
00497
00498 QDomNode n = confElem.firstChild();
00499 while ( !n.isNull() )
00500 {
00501 QDomNode removeNode = n;
00502 n = n.nextSibling();
00503 confElem.removeChild( removeNode );
00504
00505
00506
00507
00508 }
00509 rootItem->createDom( confElem );
00510
00511 conf->save();
00512
00513
00514 QDialog::accept();
00515 }
00516
00517 void RootItem::add()
00518 {
00519 QString name = "";
00520 int zoom = 100;
00521 ModeEditDlg * dlg = new ModeEditDlg( name, zoom, showModesDlg , "add mode" );
00522 if ( dlg->exec() == QDialog::Accepted )
00523 {
00524 ModeItem *item = new ModeItem( this,showModesDlg, name, zoom );
00525 item->setTextInListView();
00526 setOpen( true );
00527 }
00528
00529 else
00530 {
00531 return;
00532 }
00533 }
00534
00535 void ModeItem::edit()
00536 {
00537 QString name = m_name;
00538 int zoom = m_zoom;
00539 ModeEditDlg * dlg = new ModeEditDlg( name, zoom, showModesDlg, "edit mode" );
00540 if ( dlg->exec() == QDialog::Accepted )
00541 {
00542 m_name = name;
00543 m_zoom = zoom;
00544 parent()->setOpen( true );
00545 setTextInListView();
00546 }
00547
00548 else
00549 {
00550 return;
00551 }
00552 }
00553
00554 void ModeItem::add()
00555 {
00556 int height = 1;
00557 QString allowOverlapStr = "true";
00558 LayerEditDlg * dlg = new LayerEditDlg( height, allowOverlapStr, showModesDlg, "add layer" );
00559 if ( dlg->exec() == QDialog::Accepted )
00560 {
00561 LayerItem *item = new LayerItem( this, showModesDlg, height, allowOverlapStr );
00562 setOpen( true );
00563 }
00564 return;
00565 }
00566
00567 void LayerItem::edit()
00568 {
00569 QString allowOverlapString = m_allowOverlapStr;
00570 int height = m_height;
00571 LayerEditDlg * dlg = new LayerEditDlg( height, allowOverlapString, showModesDlg, "edit layer" );
00572 if ( dlg->exec() == QDialog::Accepted )
00573 {
00574 m_height = height;
00575 m_allowOverlapStr = allowOverlapString;
00576 setTextInListView();
00577 }
00578 return;
00579 }
00580
00581 void LayerItem::add
00582 ()
00583 {
00584 QStringList lst;
00585 std::list< std::string > aList = GeneralMaker::listRegistered();
00586 for ( std::list< std::string >::iterator it = aList.begin(); it != aList.end(); ++it )
00587 {
00588 lst << it->c_str();
00589 }
00590 bool ok;
00591 QString res = QInputDialog::getItem(
00592 "MyApp 3000", "Select an feature:", lst, 1, false, &ok,
00593 showModesDlg );
00594 if ( ok )
00595 {
00596 FeatureItem *item = new FeatureItem( this, showModesDlg, res );
00597 setOpen( true );
00598 }
00599 else
00600 {
00601 return;
00602 }
00603 }