Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members

showmodesdlg.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002  *                                                                             *
00003  *   Copyright (C) 2003  Erik Sjolund,  (<html>Erik Sj&ouml;lund</html>)       *
00004  *                       Center for Genomics and Bioinformatics,               *
00005  *                       Karolinska Institutet,                                *
00006  *                       Stockholm,                                            *
00007  *                       Sweden                                                *
00008  *                                                                             *
00009  *  Author: Erik Sjolund                                                       *
00010  *  Email: erik.sjolund@adivo.se                                               *
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 /** \brief Used in view modes edit dialog. Is there to reuse some code for the QListView.
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     //    void remove(  ) {  delete item; }
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 /** \brief Used in view modes edit dialog. Is there to reuse some code for the QListView.
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 /** \brief Used in view modes edit dialog. Is there to reuse some code for the QListView.
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     // QPopupMenu * popupMenu() { return m_popupMenu; }
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 /** \brief Used in view modes edit dialog. Is there to reuse some code for the QListView.
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 /** \brief Used in view modes edit dialog. Is there to reuse some code for the QListView.
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         /* not used */
00311         return QString( "rootItem" );
00312     }
00313 
00314     void setAttributes( QDomElement )
00315     {
00316         /* not used */
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         //   if ( itemAbove1  ) {
00397         //   QListViewItem * itemAbove2 = itemAbove1->itemAbove();
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 /* modal */ )
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     //modeMenu = new QPopupMenu(  uiWidget->listView );
00460     /*
00461     modeMenu->insertItem( "add layer", this , SLOT(addLayer()) );
00462     modeMenu->insertItem( "edit this view mode", this , SLOT(editMode()) );    
00463     modeMenu->insertItem( "remove this view mode", this , SLOT(removeMode()) );
00464     layerMenu = new QPopupMenu(  uiWidget->listView );
00465     layerMenu->insertItem( "add feature", this , SLOT(addFeature()) );
00466     layerMenu->insertItem( "remove this layer", this , SLOT(removeLayer()) );    
00467     layerMenu->insertItem( "edit this layer", this , SLOT(editLayer()) );      
00468     featureMenu = new QPopupMenu( uiWidget->listView );
00469     featureMenu->insertItem("remove this feature", this, SLOT(removeFeature()));
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         //QDomNode child = rootItem->removeChild ( n );
00506 
00507   
00508     }
00509     rootItem->createDom( confElem );
00510 
00511     conf->save();
00512 
00513     // maybe use this
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     // todo: check name is unique
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     // todo: check name is unique
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 }

Generated on Fri Mar 17 17:44:24 2006 for trapper by  doxygen 1.4.4