00001
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
00021
00022
00023
00024
00025
00026
00027
00028
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
00047 header ()->setMovingEnabled (false);
00048
00049
00050 setSorting (-1, false);
00051
00052 addColumn ("Object", visibleWidth () - 20);
00053 setVScrollBarMode (QScrollView::AlwaysOn);
00054 resize (200, height ());
00055
00056
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
00080
00081 IgRepSet::lookup (object, this, true);
00082
00083
00084
00085
00086
00087 }
00088
00089 void
00090 IgQtTreeBrowser::select (IgQtTreeRep *rep)
00091 {
00092
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
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
00119 if (! message.context ())
00120 select (0);
00121 else if (IgQtTreeRep *rep = dynamic_cast<IgQtTreeRep *>
00122 (IgRepSet::lookup (message.context (), this, true)))
00123
00124 select (rep);
00125 }
00126
00128 void
00129 IgQtTreeBrowser::onSelectionChange (void)
00130 {
00131
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
00167 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
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
00256 }
00257
00258 void
00259 IgQtTreeBrowser::slotItemRMClicked (void)
00260 {
00261
00262 }