CMS 3D CMS Logo

IgQtTreeBrowser.cc

Go to the documentation of this file.
00001 //<<<<<< INCLUDES                                                       >>>>>>
00002 
00003 #include "Iguana/Studio/interface/IgQtTreeBrowser.h"
00004 #include "Iguana/Studio/interface/IgQtTreeRep.h"
00005 #include "Iguana/Studio/interface/xtypeinfo.h"
00006 #include "Iguana/Studio/interface/IgQtSite.h"
00007 #include "Iguana/Studio/interface/IgQtObjectMenuService.h"
00008 #include "Iguana/Framework/interface/IgRepSet.h"
00009 #include "Iguana/Framework/interface/IgRepContext.h"
00010 #include "Iguana/Framework/interface/IgSelectionService.h"
00011 #include "Iguana/Framework/interface/IgSelectionMessage.h"
00012 #include "Iguana/Framework/interface/IgBrowserMethods.h"
00013 #include "Iguana/Framework/interface/xtypeinfo.h"
00014 #include <qheader.h>
00015 #include <qevent.h>
00016 #include <qlist.h>
00017 #include <qpopupmenu.h>
00018 #include <algorithm>
00019 
00020 //<<<<<< PRIVATE DEFINES                                                >>>>>>
00021 //<<<<<< PRIVATE CONSTANTS                                              >>>>>>
00022 //<<<<<< PRIVATE TYPES                                                  >>>>>>
00023 //<<<<<< PRIVATE VARIABLE DEFINITIONS                                   >>>>>>
00024 //<<<<<< PUBLIC VARIABLE DEFINITIONS                                    >>>>>>
00025 //<<<<<< CLASS STRUCTURE INITIALIZATION                                 >>>>>>
00026 //<<<<<< PRIVATE FUNCTION DEFINITIONS                                   >>>>>>
00027 //<<<<<< PUBLIC FUNCTION DEFINITIONS                                    >>>>>>
00028 //<<<<<< MEMBER FUNCTION DEFINITIONS                                    >>>>>>
00029 
00030 const char *
00031 IgQtTreeBrowser::catalogLabel (void)
00032 { return "Tree"; }
00033 
00034 IgQtTreeBrowser::IgQtTreeBrowser (IgState *state, 
00035                                   IgSite *site)
00036     : QListView (IgQtSite::hostFrom (site)),
00037       m_state (state),
00038       m_discardRelease (false)
00039 {
00040     ASSERT (IgSelectionService::get (m_state));
00041     ASSERT (IgQtObjectMenuService::get (m_state));
00042     IgQtSite::host (site, this);
00043     IgSelectionService::get (m_state)
00044         ->add (lat::CreateCallback (this, &IgQtTreeBrowser::selectMessage));
00045 
00046     //header ()->setResizeEnabled (false);
00047     header ()->setMovingEnabled (false);
00048 
00049     // FIXME: enable sorting, but default to off!
00050     setSorting (-1, false);
00051 
00052     addColumn ("Object", visibleWidth () - 20);
00053     setVScrollBarMode (QScrollView::AlwaysOn);
00054     resize (200, height ());
00055     
00056     // addColumn ("Type");
00057     setRootIsDecorated (true);
00058     setMultiSelection (false);
00059     connect (this,SIGNAL(selectionChanged()), this,SLOT(onSelectionChange()));
00060     connect (this,SIGNAL(selectionChanged()), this,SLOT(slotItemChanged()));
00061     connect (this,SIGNAL(contextMenuRequested(QListViewItem *,
00062                                               const QPoint &, int)),
00063              this,SLOT(contextMenu(QListViewItem *, const QPoint &, int)));
00064 
00065     this->header ()->hide ();
00066     show ();
00067 }
00068 
00069 IgQtTreeBrowser::~IgQtTreeBrowser (void)
00070 {
00071     IgSelectionService::get (m_state)
00072         ->remove (lat::CreateCallback (this, &IgQtTreeBrowser::selectMessage));
00073 }
00074 
00075 
00076 void
00077 IgQtTreeBrowser::browse (IgRepresentable *object)
00078 {
00079     // FIXME: This was stateless, no rep created, need to change that.
00080     // FIXME: broadcast selection message
00081     /* IgRepContext *context =*/ IgRepSet::lookup (object, this, true);
00082     // FIXME: model change event?
00083     // FIXME: select?
00084     // if (context)
00085     //     IgSelectionService::get (m_state)
00086     //          ->broadcast (IgSelectionMessage (context));
00087 }
00088 
00089 void
00090 IgQtTreeBrowser::select (IgQtTreeRep *rep)
00091 {
00092     // FIXME: protect against looping from signals?
00093     if (! rep)
00094     {
00095         QList<IgQtTreeRep> *selected = getSelectedItems ();
00096         for (IgQtTreeRep *rep = selected->first(); rep; rep = selected->next())
00097             setSelected (rep, false);
00098         delete selected;
00099     }
00100     else
00101     {
00102         // Select the item and make sure it is cascaded out and visible
00103         for (QListViewItem *item = rep->parent (); item; item = item->parent())
00104             if (! item->isOpen ())
00105                 item->setOpen (true);
00106 
00107         if (! isSelected (rep))
00108             setSelected (rep, true);
00109 
00110         ensureItemVisible (rep);
00111     }
00112 }
00113 
00115 void
00116 IgQtTreeBrowser::selectMessage (IgSelectionMessage message)
00117 {
00118     // FIXME: avoid re-emitting the signal?
00119     if (! message.context ())
00120         select (0);
00121     else if (IgQtTreeRep *rep = dynamic_cast<IgQtTreeRep *>
00122              (IgRepSet::lookup (message.context (), this, true)))
00123         // FIXME: update display
00124         select (rep);
00125 }
00126 
00128 void
00129 IgQtTreeBrowser::onSelectionChange (void)
00130 {
00131     // FIXME: broadcast a single message for multiple / single selection?
00132     QList<IgQtTreeRep> *selected = getSelectedItems ();
00133     for (IgQtTreeRep *rep = selected->first (); rep; rep = selected->next ())
00134         IgSelectionService::get (m_state)
00135             ->broadcast (IgSelectionMessage (rep->context ()));
00136 }
00137 
00138 void
00139 IgQtTreeBrowser::resizeEvent (QResizeEvent *event)
00140 {
00141     QListView::resizeEvent (event);
00142   
00143     int diff = event->size().width () - event->oldSize().width ();
00144     if (diff != 0)
00145     {
00146         diff = 0;
00147         for (int i = 1; i < columns (); i++)
00148             diff += columnWidth (i);
00149         setColumnWidth (0, visibleWidth () - diff);
00150         updateContents ();
00151     }
00152 }
00153 
00154 void
00155 IgQtTreeBrowser::contentsMouseDoubleClickEvent (QMouseEvent *event)
00156 {
00157     ASSERT (event);
00158 
00159     QPoint              pos = contentsToViewport (event->pos ());
00160     QListViewItem       *item = itemAt (pos);
00161     IgQtTreeRep         *rep = static_cast<IgQtTreeRep *> (item);
00162 
00163     ASSERT (!item || dynamic_cast<IgQtTreeRep *> (item));
00164 
00165     if (rep && rep->magic ())
00166         // Prevent the item from opening on double click
00167         /* emit */ doubleClicked (rep);
00168     else
00169         QListView::contentsMouseDoubleClickEvent (event);
00170 }
00171 
00172 void
00173 IgQtTreeBrowser::contentsMousePressEvent (QMouseEvent *event)
00174 {
00175     ASSERT (event);
00176 
00177     m_discardRelease = false;
00178     QListView::contentsMousePressEvent (event);
00179 }
00180 
00181 void
00182 IgQtTreeBrowser::contentsMouseReleaseEvent (QMouseEvent *event)
00183 {
00184     if (m_discardRelease)
00185         m_discardRelease = false;
00186     else
00187         QListView::contentsMouseReleaseEvent (event);
00188 }
00189 
00191 void
00192 IgQtTreeBrowser::contextMenu (QListViewItem *item, const QPoint &pos, int)
00193 {
00194     ASSERT (!item || dynamic_cast<IgQtTreeRep *> (item));
00195     if (! item)
00196         return;
00197 
00198     IgQtObjectMenuService *svc = IgQtObjectMenuService::get (m_state);
00199     IgRepresentable       *object = static_cast<IgQtTreeRep *> (item)
00200                                     ->context ()->object ();
00201 
00202     // Pop up the menu and update it in case it was torn off.
00203     svc->request (object)->exec (pos);
00204     svc->postUpdate (object);
00205 }
00206 
00209 QListViewItem *
00210 IgQtTreeBrowser::getNextUpItem (QListViewItem *item)
00211 {
00212     if (QListViewItem *parent = item->parent ())
00213         if (QListViewItem *next = parent->nextSibling ())
00214             return next;
00215         else
00216             return getNextUpItem (parent);
00217 
00218     return 0;
00219 }
00220 
00222 QListViewItem *
00223 IgQtTreeBrowser::getNextItem (QListViewItem *item)
00224 {
00225     if (QListViewItem *next = item->firstChild ())
00226         return next;
00227     else if ((next = item->nextSibling ()))
00228         return next;
00229     else
00230         return getNextUpItem (item);
00231 }
00232 
00234 QList<IgQtTreeRep> *
00235 IgQtTreeBrowser::getSelectedItems (void)
00236 {
00237     QList<IgQtTreeRep> *selected = new QList<IgQtTreeRep>;
00238     selected->setAutoDelete (false);
00239 
00240     for (QListViewItem *item = firstChild (); item; item = getNextItem (item))
00241         if (item->isSelected ())
00242         {
00243             ASSERT (dynamic_cast<IgQtTreeRep *> (item));
00244             IgQtTreeRep *rep = static_cast<IgQtTreeRep *> (item);
00245             selected->append (rep);
00246         }
00247 
00248     return selected;
00249 }
00250 
00252 void
00253 IgQtTreeBrowser::slotItemChanged (void)
00254 {
00255     // LOG(..., "slot item changed" << std::endl);
00256 }
00257 
00258 void
00259 IgQtTreeBrowser::slotItemRMClicked (void)
00260 {
00261     // LOG(..., "slot item right mouse clicked" << std::endl);
00262 }

Generated on Tue Jun 9 17:38:49 2009 for CMSSW by  doxygen 1.5.4