itom 1.3.0
D:/git-itom/sources/itom/Qitom/widgets/abstractDockWidget.h
00001 /* ********************************************************************
00002     itom software
00003     URL: http://www.uni-stuttgart.de/ito
00004     Copyright (C) 2013, Institut für Technische Optik (ITO),
00005     Universität Stuttgart, Germany
00006 
00007     This file is part of itom.
00008   
00009     itom is free software; you can redistribute it and/or modify it
00010     under the terms of the GNU Library General Public Licence as published by
00011     the Free Software Foundation; either version 2 of the Licence, or (at
00012     your option) any later version.
00013 
00014     itom is distributed in the hope that it will be useful, but
00015     WITHOUT ANY WARRANTY; without even the implied warranty of
00016     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library
00017     General Public Licence for more details.
00018 
00019     You should have received a copy of the GNU Library General Public License
00020     along with itom. If not, see <http://www.gnu.org/licenses/>.
00021 *********************************************************************** */
00022 
00023 #ifndef ABSTRACTDOCKWIDGET_H
00024 #define ABSTRACTDOCKWIDGET_H
00025 
00026 #include "../global.h"
00027 #include "../common/sharedStructures.h"
00028 
00029 #include <qmainwindow.h>
00030 #include <qdockwidget.h>
00031 #include <qmenubar.h>
00032 #include <qevent.h>
00033 #include <qmap.h>
00034 #include <qtoolbar.h>
00035 #include <qdebug.h>
00036 #include <qstring.h>
00037 #include <qaction.h>
00038 #include <qshortcut.h>
00039 #include <qrect.h>
00040 #include <qwidget.h>
00041 
00042 
00043 namespace ito
00044 {
00045     class AbstractDockWidget : public QDockWidget
00046     {
00047         Q_OBJECT
00048         
00049         //these properties are taken from QWidget in order to redirect them either to the QDockWidget or to the main window (depending on dock status)
00050         Q_PROPERTY(bool visible READ isVisible WRITE setVisible DESIGNABLE false)
00051         Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
00052 
00053         Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry)
00054         Q_PROPERTY(QRect frameGeometry READ frameGeometry)
00055         Q_PROPERTY(QRect normalGeometry READ normalGeometry)
00056         Q_PROPERTY(int x READ x)
00057         Q_PROPERTY(int y READ y)
00058         Q_PROPERTY(QPoint pos READ pos WRITE move DESIGNABLE false STORED false)
00059         Q_PROPERTY(QSize frameSize READ frameSize)
00060         Q_PROPERTY(QSize size READ size WRITE resize DESIGNABLE false STORED false)
00061         Q_PROPERTY(int width READ width)
00062         Q_PROPERTY(int height READ height)
00063         Q_PROPERTY(QRect rect READ rect)
00064         Q_PROPERTY(QRect childrenRect READ childrenRect)
00065         Q_PROPERTY(QRegion childrenRegion READ childrenRegion)
00066 
00067         public:
00068 
00069             enum tFloatingStyle { floatingNone, floatingStandard, floatingWindow }; 
00070             enum tMovingStyle { movingDisabled, movingEnabled };    
00071             enum tTopLevelStyle { topLevelOverall, topLevelParentOnly, topLevelNothing };
00072 
00073             struct Toolbar
00074             {
00075                 Toolbar() : section(0), key(""), tb(NULL) {}
00076                 Qt::ToolBarArea area;
00077                 int section;
00078                 QString key;
00079                 QToolBar *tb;
00080             };
00081 
00082             AbstractDockWidget(bool docked, bool isDockAvailable, tFloatingStyle floatingStyle, tMovingStyle movingStyle, const QString &title = QString(), const QString &objName = QString(), QWidget *parent = 0);
00083             virtual ~AbstractDockWidget();
00084 
00085             inline bool docked() const { return m_docked; }    
00087             RetVal setAdvancedWindowTitle( QString newCompleteTitle = QString(), bool appendToBasicTitle = true );
00088 
00089             RetVal setTopLevel( tTopLevelStyle topLevel );
00090 
00091             void setParent ( QWidget * parent ) { m_overallParent = parent; QDockWidget::setParent(parent); }
00092 
00093             QWidget *getActiveInstance() 
00094             { 
00095                 if(!m_docked && m_floatingStyle == floatingWindow)
00096                 {
00097                     return m_pWindow;
00098                 }
00099                 return this;
00100             }
00101 
00102             //these methods are mainly redirected to QDockWidget or QMainWindow (depending on dock status)
00103             #define QWIDGETPROPGETTER(gettername) if(m_docked && m_dockAvailable) { return QDockWidget::gettername(); } else { return m_pWindow->gettername(); }
00104 
00105             #define QWIDGETPROPSETTER(settername,...) \
00106             if (m_docked) \
00107             { \
00108                 QDockWidget::settername(__VA_ARGS__);  \
00109             } \
00110             else \
00111             { \
00112                 if (m_floatingStyle == floatingWindow) \
00113                 { \
00114                     m_pWindow->settername(__VA_ARGS__); \
00115                     QDockWidget::settername(__VA_ARGS__); \
00116                 } \
00117                 else \
00118                 { \
00119                     QDockWidget::settername(__VA_ARGS__); \
00120                 } \
00121             }
00122 
00123             #define QWIDGETPROPSETTERSPECIAL(settername,...) \
00124             if (m_docked) \
00125             { \
00126                 QDockWidget::settername(__VA_ARGS__);  \
00127             } \
00128             else \
00129             { \
00130                 if (m_floatingStyle == floatingWindow) \
00131                 { \
00132                     m_pWindow->settername(__VA_ARGS__); \
00133                 } \
00134                 else \
00135                 { \
00136                     QDockWidget::settername(__VA_ARGS__); \
00137                 } \
00138             }
00139 
00140             QRect frameGeometry() const;
00141             const QRect &geometry() const;
00142             QRect normalGeometry() const;
00143 
00144             int x() const;
00145             int y() const;
00146             QPoint pos() const;
00147             QSize frameSize() const;
00148             QSize size() const;
00149             int width() const;
00150             int height() const;
00151             QRect rect() const;
00152             QRect childrenRect() const;
00153             QRegion childrenRegion() const;
00154 
00155             void move(int x, int y);
00156             void move(const QPoint &);
00157             void resize(int w, int h);
00158             void resize(const QSize &);
00159             void setGeometry(int x, int y, int w, int h);
00160             void setGeometry(const QRect &);
00161 
00162             bool isEnabled() const;
00163             bool isVisible() const;
00164 
00165             void saveState(const QString &iniName) const;
00166             void restoreState(const QString &iniName) const;
00167 
00168         public Q_SLOTS:
00169             void setEnabled(bool);
00170             virtual void setVisible(bool visible);
00171    
00172         protected:
00173 
00174             class ShortcutAction : public QObject
00175             {
00176             public:
00177                 ShortcutAction(const QString &text, AbstractDockWidget *parent) : QObject(parent), m_action(NULL), m_shortcut(NULL)
00178                 {
00179                     m_action = new QAction(text, parent);
00180                     QString toolTipText = text;
00181                     toolTipText.replace("&", "");
00182                     m_action->setToolTip(toolTipText);
00183                 }
00184 
00185                 ShortcutAction(const QIcon &icon, const QString &text, AbstractDockWidget *parent) : QObject(parent), m_action(NULL), m_shortcut(NULL)
00186                 {
00187                     m_action = new QAction(icon, text, parent);
00188                     QString toolTipText = text;
00189                     toolTipText.replace("&", "");
00190                     m_action->setToolTip(toolTipText);
00191                 }
00192 
00193                 ShortcutAction(const QIcon &icon, const QString &text, AbstractDockWidget *parent, const QKeySequence &key, Qt::ShortcutContext context = Qt::WindowShortcut) : QObject(parent), m_action(NULL), m_shortcut(NULL)
00194                 {
00195                     QString text2 = text;
00196                     QString text3 = text;
00197                     text3.replace("&", "");
00198 
00199                     //some key sequences do not exist as default on all operating systems
00200                     if (key.isEmpty() == false)
00201                     {
00202                         text2 += "\t" + key.toString(QKeySequence::NativeText);
00203                         text3 += " (" + key.toString(QKeySequence::NativeText) + ")";
00204 
00205                         m_shortcut = new QShortcut(key, parent->getCanvas());
00206                         m_shortcut->setContext(context);
00207                     }
00208 
00209                     m_action = new QAction(icon, text2, parent);
00210                     m_action->setToolTip(text3);
00211                 }
00212 
00213                 ~ShortcutAction()
00214                 {
00215                     //do not delete action and shortcut here, since it will be deleted by common parent.
00216                 }
00217 
00218                 void connectTrigger(const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
00219                 {
00220                     if(m_action)
00221                     {
00222                         QObject::connect(m_action, SIGNAL(triggered()), receiver, method, type);
00223                     }
00224                     if(m_shortcut)
00225                     {
00226                         QObject::connect(m_shortcut, SIGNAL(activated()), receiver, method, type);
00227                     }
00228                 }
00229 
00230                 void setEnabled(bool actionEnabled, bool shortcutEnabled)
00231                 {
00232                     if(m_action) 
00233                     {
00234                         m_action->setEnabled(actionEnabled);
00235                         if(m_shortcut) m_shortcut->setEnabled(shortcutEnabled);
00236                     }
00237                 }
00238 
00239                 void setEnabled(bool enabled)
00240                 {
00241                     setEnabled(enabled,enabled);
00242                 }
00243 
00244                 void setVisible(bool actionVisible, bool shortcutEnabled)
00245                 {
00246                     if(m_action) 
00247                     {
00248                         m_action->setVisible(actionVisible);
00249                         if(m_shortcut) m_shortcut->setEnabled(shortcutEnabled);
00250                     }
00251                 }
00252 
00253                 void setVisible(bool visible)
00254                 {
00255                     setVisible(visible,visible);
00256                 }
00257 
00258                 QAction* action() { return m_action; }
00259 
00260             private:
00261                 QAction *m_action;
00262                 QShortcut *m_shortcut;
00263             };
00264 
00266 
00271             bool eventFilter(QObject *obj, QEvent *event)
00272             {
00273                 if (event->type() == QEvent::Close)
00274                 {
00275                     closeEvent((QCloseEvent*)event);
00276                     if(testAttribute(Qt::WA_DeleteOnClose) && event->isAccepted() ) //if window should be closed and dockwidget is assigned with WA_DeleteOnClose, delete this dockwidget first.
00277                     {
00278                        deleteLater();
00279                     }
00280                     
00281                     return true;
00282                 }
00283                 else
00284                 {
00285                     return QObject::eventFilter(obj,event);
00286                 }
00287             };
00288 
00289             //void showEvent(QShowEvent * event);
00290 
00291             void init();
00292 
00293             virtual void closeEvent(QCloseEvent *event);
00294 
00295             virtual void createActions() = 0;
00296             virtual void createMenus() = 0;
00297             virtual void createToolBars() = 0;
00298             virtual void createStatusBar() = 0;
00299             virtual void updateActions() {}
00300             virtual void updatePythonActions() = 0;
00301             
00302             Qt::WindowFlags modifyFlags(const Qt::WindowFlags &flags, const Qt::WindowFlags &setFlags, const Qt::WindowFlags &unsetFlags);
00303 
00304             virtual void windowStateChanged( bool /*windowNotToolbox*/ ) {}
00305 
00306             void setContentWidget(QWidget *widget);
00307             inline QWidget* getContentWidget() const { return m_pWindow->centralWidget(); }   
00308             inline QMainWindow* getCanvas() { return m_pWindow; }
00309 
00310             inline bool pythonBusy() const { return m_pythonBusy; }                    
00311             inline bool pythonDebugMode() const { return m_pythonDebugMode; }          
00312             inline bool pythonInWaitingMode() const { return m_pythonInWaitingMode; }  
00314             //RetVal addAndRegisterToolBar(QToolBar* tb, QString key);
00315             //RetVal unregisterToolBar(QString key);
00316             QToolBar* getToolBar(QString key) const;
00317             inline QMenuBar* getMenuBar() const { return (m_pWindow == NULL) ?  NULL : m_pWindow->menuBar(); }
00318 
00319             RetVal addToolBar(QToolBar *tb, const QString &key, Qt::ToolBarArea area = Qt::TopToolBarArea, int section = 1);
00320             RetVal removeToolBar(const QString &key);
00321 
00322             QAction *m_actStayOnTop;
00323             QAction *m_actStayOnTopOfApp;
00324 
00325         private:
00326 
00327             void contextMenuEvent(QContextMenuEvent *e)
00328             {
00329                 e->accept();
00330                 qDebug() << "context menu of abstractDockWidget clicked. [placeholder for (un)docking feature.] pos: " << e->pos();
00331             }
00332 
00333             QMainWindow *m_pWindow;
00334 
00335             bool m_docked;                      
00336             bool m_dockAvailable;               
00337             tFloatingStyle m_floatingStyle;     
00338             tMovingStyle m_movingStyle;         
00339             QString m_basicTitle;               
00340             QString m_completeTitle;            
00342             QMap<QString,QToolBar*> m_toolBars; 
00343             QList<Toolbar> m_toolbars;
00344 
00345             bool m_pythonBusy;                  
00346             bool m_pythonDebugMode;             
00347             bool m_pythonInWaitingMode;         
00349             QToolBar* m_dockToolbar;
00350             QAction* m_actDock;
00351             QAction* m_actUndock;
00352 
00353             QWidget* m_overallParent;           
00354             tTopLevelStyle m_recentTopLevelStyle;
00355 
00356             QSize m_oldMinSize;
00357             QSize m_oldMaxSize;
00358             QRect m_lastUndockedSize;
00359     
00360         //signals:
00361         //    void addDockToMainWindow(AbstractDockWidget *widget);       /*!<  signal emitted if widget should be docked to main window */
00362         //    void removeDockFromMainWindow(AbstractDockWidget *widget);  
00363         //    void dockCloseRequest(AbstractDockWidget *widget);
00364 
00365         public slots:
00366             virtual void dockedToMainWindow(AbstractDockWidget * /*widget*/){}
00367             virtual void removedFromMainWindow(AbstractDockWidget * /*widget*/){}
00368             virtual void pythonStateChanged(tPythonTransitions pyTransition);
00369 
00370             void raiseAndActivate();  
00372             void setDockSize(int newWidth, int newHeight);
00373 
00374             void dockWidget();
00375             void undockWidget();
00376 
00377         private slots:
00378             void mnuStayOnTop(bool checked);
00379             void mnuStayOnTopOfApp(bool checked);
00380 
00381             void returnToOldMinMaxSizes();
00382     
00383     };
00384 
00385 } //end namespace ito
00386 
00387 #endif
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends