CMS 3D CMS Logo

IgPage.cc

Go to the documentation of this file.
00001 //<<<<<< INCLUDES                                                       >>>>>>
00002 
00003 #include "Iguana/Studio/interface/IgPage.h"
00004 #include "Iguana/Studio/interface/IgDocument.h"
00005 #include "Iguana/Studio/interface/IgView.h"
00006 #include "Iguana/Studio/interface/IgViewDB.h"
00007 #include "Iguana/Studio/interface/IgViewCreator.h"
00008 #include "Iguana/Studio/interface/IgQtFocusManager.h"
00009 #include "Iguana/Studio/interface/IgQDockAreaSite.h"
00010 #include "Iguana/Studio/interface/IgQDockWindowSite.h"
00011 #include "Iguana/Studio/interface/IgQVSplitterSite.h"
00012 #include "Iguana/Studio/interface/IgQWorkspaceSite.h"
00013 #include "Iguana/Studio/interface/IgQWidgetSite.h"
00014 #include "Iguana/Studio/interface/IgQWidgetStackSite.h"
00015 #include "Iguana/Studio/interface/IgQtAppMenuService.h"
00016 #include "Iguana/Studio/interface/IgQtAppToolBarService.h"
00017 #include "Iguana/Studio/interface/IgQtAppWindowService.h"
00018 #include "Iguana/Studio/interface/IgQtSite.h"
00019 #include "Iguana/Studio/interface/IgQtSiteStack.h"
00020 #include <qaccel.h>
00021 #include <qwidget.h>
00022 #include <qlayout.h>
00023 #include <qpopupmenu.h>
00024 #include <qmenubar.h>
00025 #include <qtoolbar.h>
00026 #include <classlib/utils/DebugAids.h>
00027 #include <iostream>
00028 
00029 //<<<<<< PRIVATE DEFINES                                                >>>>>>
00030 //<<<<<< PRIVATE CONSTANTS                                              >>>>>>
00031 //<<<<<< PRIVATE TYPES                                                  >>>>>>
00032 //<<<<<< PRIVATE VARIABLE DEFINITIONS                                   >>>>>>
00033 //<<<<<< PUBLIC VARIABLE DEFINITIONS                                    >>>>>>
00034 //<<<<<< CLASS STRUCTURE INITIALIZATION                                 >>>>>>
00035 //<<<<<< PRIVATE FUNCTION DEFINITIONS                                   >>>>>>
00036 //<<<<<< PUBLIC FUNCTION DEFINITIONS                                    >>>>>>
00037 //<<<<<< MEMBER FUNCTION DEFINITIONS                                    >>>>>>
00038 
00039 
00040 IgQtSiteStack *
00041 createWorkspace (IgState *state, IgSite *site)
00042 {
00043     return new IgQWorkspaceSite (state, site);    
00044 }
00045 
00046 
00047 IgPage::IgPage (IgDocument *doc)
00048     : IgQHSplitterSite (doc->state (), doc->window ()),
00049       m_document (doc),
00050       m_leftDockArea (new IgQDockAreaSite (doc->state (), this)),
00051       m_stackArea (new IgQWidgetStackSite (doc->state (), new IgQDockWindowSite (doc->state (), m_leftDockArea))),
00052       m_centralSplitter (new IgQVSplitterSite (doc->state (), this)),
00053       m_workspace (createWorkspace (doc->state (), m_centralSplitter)),
00054       m_bottomDockArea (new IgQDockAreaSite (doc->state (), m_centralSplitter)),
00055       m_rightDockArea (new IgQDockAreaSite (doc->state (), this)),
00056       m_numRegisteredWindows (0)
00057 {
00058     // Construct a grid layout for holding contents
00059     // m_layout = new QGridLayout (self ());
00060     // m_layout->setAutoAdd (true);
00061 
00062     // FIXME: register in document
00063     // FIXME: read, write support
00064     ASSERT (doc);    
00065     doc->addPage (this);    
00066     
00067     IgQtAppMenuService *service = IgQtAppMenuService::get (doc->state ());
00068     
00069     QMenuBar *bar = service->menuBar ();    
00070     QAccel *a = new QAccel (IgQtSite::selfFrom (m_workspace));  // create accels for main Window
00071     a->connectItem (a->insertItem (Qt::Key_Escape),     // adds Esc accelerator
00072                     this,                               // connected to IgPage's
00073                     SLOT (showFullScreen ()));          // showFullScreen() slot
00074     
00075     // Here we populate the file menu with the "New" entry to allow user to
00076     // create new views of the different models
00077     QPopupMenu *fileMenu = service->subMenu (IgQtAppMenuService::MENU_ID_FILE);
00078     
00079     ASSERT (fileMenu);
00080     
00081     QPopupMenu *newViewMenu = new QPopupMenu (bar);
00082     newViewMenu->setCaption ("New");
00083     fileMenu->insertItem ("&New", newViewMenu, MENU_ID_FILE_NEW,
00084                           IgQtAppMenuService::index (fileMenu, MENU_ID_FILE_NEW));
00085     fileMenu->insertSeparator (IgQtAppMenuService::index (fileMenu, MENU_ID_FILE_NEW) + 1 );
00086     newViewMenu->insertTearOffHandle ();
00087     
00088     IgViewDB *viewDB = IgViewDB::get ();
00089     ASSERT (viewDB);
00090     
00091     // FIXME: sometimes, especially after rebuilding, viewDB is
00092     // empty...We need to find some better way to get notified when a
00093     // new IgView plugin is loaded.
00094     for (IgViewDB::Iterator i = viewDB->begin ();
00095          i != viewDB->end ();
00096          i++)
00097     {   
00098         IgViewCreator *viewCreator = new IgViewCreator (i, this);
00099         newViewMenu->insertItem ((*i)->name (), 
00100                                  viewCreator,
00101                                  SLOT (createView ()),
00102                                  0,
00103                                  IgQtAppMenuService::index (newViewMenu,
00104                                                             MENU_ID_FILE_NEW));
00105     }
00106     
00107     // Here we create the "Window" menu in which the user can decide
00108     // to hide/show some utility views (for example the python shell
00109     // should go here...)
00110     //
00111     // FIXME: how do we distinguish between different kind of Views?
00112     // By having two, separate, plugin categories?
00113     
00114     QPopupMenu *windowMenu = new QPopupMenu (bar);
00115     windowMenu->setCaption ("Window");
00116     bar->insertItem ("&Window", windowMenu, MENU_ID_WINDOW,
00117                      IgQtAppMenuService::index (bar, MENU_ID_WINDOW));
00118 
00119     windowMenu->insertTearOffHandle ();
00120     windowMenu->insertItem ("&Tile", 
00121                             IgQtSite::selfFrom (m_workspace),
00122                             SLOT (tile ()),
00123                             0,
00124                             MENU_ID_WINDOW_TILE,
00125                             IgQtAppMenuService::index (bar, MENU_ID_WINDOW));
00126     windowMenu->insertItem ("&Cascade", 
00127                             IgQtSite::selfFrom (m_workspace),
00128                             SLOT (cascade ()),
00129                             0,
00130                             MENU_ID_WINDOW_CASCADE,
00131                             IgQtAppMenuService::index (bar, MENU_ID_WINDOW));
00132 
00133     windowMenu->insertItem ("Show &Maximized", 
00134                             this,
00135                             SLOT (showMaximized ()),
00136                             0,
00137                             MENU_ID_WINDOW_MAXIMIZE,
00138                             IgQtAppMenuService::index (bar, MENU_ID_WINDOW));
00139 
00140     windowMenu->insertItem ("&Full screen", 
00141                             this,
00142                             SLOT (showFullScreen ()),
00143                             Qt::CTRL+Qt::Key_F,
00144                             MENU_ID_WINDOW_FULLSCREEN,
00145                             IgQtAppMenuService::index (bar, MENU_ID_WINDOW));
00146 
00147     windowMenu->insertSeparator ();
00148     // Get notified by window selection changes
00149     //    connect (IgQtSite::selfFrom (m_workspace), SIGNAL (windowActivated (QWidget *)),
00150     //       this, SLOT (windowActivated (QWidget *)));
00151     IgQtFocusManager *focusManager = new IgQtFocusManager (state (), &m_views);
00152     
00153     QObject::connect (IgQtSite::selfFrom (m_workspace),
00154                       SIGNAL (windowActivated (QWidget *)),
00155                       focusManager,
00156                       SLOT (windowActivated (QWidget *)));
00157     
00158     self ()->show ();
00159 }
00160 
00164 IgState *
00165 IgPage::state (void) const
00166 { return m_document->state (); }
00167 
00171 IgQtSiteStack *
00172 IgPage::workspace (void)
00173 {
00174     return m_workspace;
00175 }
00176 
00177 IgQtSite *
00178 IgPage::leftDockArea (void)
00179 {
00180     return m_leftDockArea;
00181 }
00182 
00183 IgQtSite *
00184 IgPage::rightDockArea (void)
00185 {
00186     return m_rightDockArea;
00187 }
00188 
00189 IgQtSite *
00190 IgPage::bottomDockArea (void)
00191 {
00192     return m_bottomDockArea;
00193 }
00194 
00195 IgQtSiteStack *
00196 IgPage::stackArea (void)
00197 {
00198     return m_stackArea;
00199 }
00200 
00201 void
00202 IgPage::registerView (IgView *view, QWidget *selectableWidget)
00203 {
00204     ASSERT (m_views[selectableWidget] == 0);
00205     m_views[selectableWidget] = view;
00206     
00207     // FIXME: maybe we should also introduce different kind of views,
00208     // so that a view can have a title, without having to be
00209     // registered in the window menu.
00210     if (view->title () != "")
00211     {
00212         IgQtAppMenuService *ms = IgQtAppMenuService::get (state ());
00213     
00214         QPopupMenu *menu = ms->subMenu (MENU_ID_WINDOW);
00215         int itemID = MENU_ID_WINDOW_LIST_OFFSET + m_numRegisteredWindows++;
00216     
00217         menu->insertItem (view->title (), 
00218                           selectableWidget,
00219                           SLOT (show ()),
00220                           0,
00221                           itemID,
00222                           IgQtAppMenuService::index (menu,
00223                                                      MENU_ID_WINDOW_LIST_OFFSET));
00224         menu->connectItem (itemID, selectableWidget, SLOT (setFocus()));
00225     }
00226 }
00227 
00228 void
00229 IgPage::showMaximized (void)
00230 {    
00231     QMenuBar *menu = IgQtAppMenuService::get (m_document->state ())->menuBar ();
00232     ASSERT (menu);
00233     QWidget *mainWindow = IgQtAppWindowService::get (m_document->state ())->mainWindow ();
00234     if (mainWindow->isMaximized ())
00235     {
00236         menu->changeItem (MENU_ID_WINDOW_MAXIMIZE, "Show &Maximized");
00237         menu->setItemEnabled (MENU_ID_WINDOW_FULLSCREEN, true);
00238         mainWindow->showNormal ();
00239     } 
00240     else 
00241     { 
00242         menu->changeItem (MENU_ID_WINDOW_MAXIMIZE, "Show &Normal");
00243         menu->setItemEnabled (MENU_ID_WINDOW_FULLSCREEN, false);
00244         mainWindow->showMaximized ();
00245     }
00246 }
00247 
00248 void            
00249 IgPage::showFullScreen (void)
00250 {    
00251     QMenuBar *menu = IgQtAppMenuService::get (m_document->state ())->menuBar ();
00252     ASSERT (menu);
00253     QToolBar *toolBar = IgQtAppToolBarService::get (m_document->state ())->toolBar (3000, "General graphics ops");
00254     ASSERT (toolBar);
00255     QWidget *mainWindow = IgQtAppWindowService::get (m_document->state ())->mainWindow ();
00256     if (mainWindow->isFullScreen ())
00257     {
00258         menu->setItemEnabled (MENU_ID_WINDOW_MAXIMIZE, true);
00259         menu->show ();
00260         toolBar->show ();
00261         IgQtSite::selfFrom (leftDockArea ())->show ();
00262         IgQtSite::selfFrom (bottomDockArea ())->show ();
00263         mainWindow->showNormal ();
00264     } 
00265     else 
00266     { 
00267         menu->hide ();
00268         toolBar->hide ();
00269         IgQtSite::selfFrom (leftDockArea ())->hide ();
00270         IgQtSite::selfFrom (rightDockArea ())->hide ();
00271         IgQtSite::selfFrom (bottomDockArea ())->hide ();
00272         menu->setItemEnabled (MENU_ID_WINDOW_MAXIMIZE, false);
00273         mainWindow->showFullScreen ();
00274     }
00275 }
00276 
00277 void
00278 IgPage::printViews (const QString &text) 
00279 {
00280     emit autoPrint (text);    
00281 }

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