tools/shared/qttoolbardialog/qttoolbardialog.cpp
changeset 0 1918ee327afb
child 3 41300fa6a67c
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the tools applications of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 #include "qttoolbardialog.h"
       
    43 #include "ui_qttoolbardialog.h"
       
    44 
       
    45 #include <QtCore/QSet>
       
    46 #include <QtGui/QtEvents>
       
    47 #include <QtGui/QAction>
       
    48 #include <QtGui/QToolBar>
       
    49 #include <QtGui/QMainWindow>
       
    50 #include <QtGui/QHeaderView>
       
    51 #include <QtGui/QPushButton>
       
    52 
       
    53 QT_BEGIN_NAMESPACE
       
    54 
       
    55 class QtFullToolBarManagerPrivate;
       
    56 
       
    57 class QtFullToolBarManager : public QObject
       
    58 {
       
    59     Q_OBJECT
       
    60 public:
       
    61     QtFullToolBarManager(QObject *parent);
       
    62     ~QtFullToolBarManager();
       
    63 
       
    64     void setMainWindow(QMainWindow *mainWindow);
       
    65     QMainWindow *mainWindow() const;
       
    66 
       
    67     void addCategory(const QString &category);
       
    68     bool hasCategory(const QString &category) const;
       
    69     QStringList categories() const;
       
    70     QList<QAction *> categoryActions(const QString &category) const;
       
    71     QString actionCategory(QAction *action) const;
       
    72 
       
    73     // only non-separator
       
    74     void addAction(QAction *action, const QString &category);
       
    75 
       
    76     void removeAction(QAction *action);
       
    77 
       
    78     QSet<QAction *> actions() const;
       
    79     bool isWidgetAction(QAction *action) const;
       
    80 
       
    81     /*
       
    82     Adds (registers) toolBar. Adds (registers) actions that already exists in toolBar.
       
    83     Remembers toolbar and its actions as a default.
       
    84     */
       
    85     void addDefaultToolBar(QToolBar *toolBar, const QString &category);
       
    86 
       
    87     void removeDefaultToolBar(QToolBar *toolBar);
       
    88     // NULL on action list means separator.
       
    89     QMap<QToolBar *, QList<QAction *> > defaultToolBars() const;
       
    90     bool isDefaultToolBar(QToolBar *toolBar) const;
       
    91 
       
    92     QToolBar *createToolBar(const QString &toolBarName);
       
    93     void deleteToolBar(QToolBar *toolBar); // only those which were created, not added
       
    94 
       
    95     QList<QAction *> actions(QToolBar *toolBar) const;
       
    96 
       
    97     void setToolBars(const QMap<QToolBar *, QList<QAction *> > &actions);
       
    98     void setToolBar(QToolBar *toolBar, const QList<QAction *> &actions);
       
    99 
       
   100     QMap<QToolBar *, QList<QAction *> > toolBarsActions() const;
       
   101     QByteArray saveState(int version = 0) const;
       
   102     bool restoreState(const QByteArray &state, int version = 0);
       
   103 
       
   104 public slots:
       
   105 
       
   106     void resetToolBar(QToolBar *toolBar);
       
   107     void resetAllToolBars();
       
   108 
       
   109 signals:
       
   110     void toolBarCreated(QToolBar *toolBar);
       
   111     void toolBarRemoved(QToolBar *toolBar);
       
   112 
       
   113     /*
       
   114     If QToolBarWidgetAction was in another tool bar and is inserted into
       
   115     this toolBar, toolBarChanged is first emitted for other toolbar - without
       
   116     that action. (Another approach may be that user first must call setToolBar
       
   117     without that action for old tool bar)
       
   118     */
       
   119     void toolBarChanged(QToolBar *toolBar, const QList<QAction *> &actions);
       
   120 
       
   121 private:
       
   122     QScopedPointer<QtFullToolBarManagerPrivate> d_ptr;
       
   123     Q_DECLARE_PRIVATE(QtFullToolBarManager)
       
   124     Q_DISABLE_COPY(QtFullToolBarManager)
       
   125 };
       
   126 
       
   127 class QtFullToolBarManagerPrivate
       
   128 {
       
   129     class QtFullToolBarManager *q_ptr;
       
   130     Q_DECLARE_PUBLIC(QtFullToolBarManager)
       
   131 
       
   132 public:
       
   133 
       
   134     QToolBar *toolBarWidgetAction(QAction *action) const;
       
   135     void removeWidgetActions(const QMap<QToolBar *, QList<QAction *> > &actions);
       
   136 
       
   137     enum {
       
   138         VersionMarker = 0xff,
       
   139         ToolBarMarker = 0xfe,
       
   140         CustomToolBarMarker = 0xfd,
       
   141     };
       
   142 
       
   143     void saveState(QDataStream &stream) const;
       
   144     bool restoreState(QDataStream &stream) const;
       
   145     QToolBar *findDefaultToolBar(const QString &objectName) const;
       
   146     QAction *findAction(const QString &actionName) const;
       
   147 
       
   148     QToolBar *toolBarByName(const QString &toolBarName) const;
       
   149 
       
   150     QtFullToolBarManagerPrivate();
       
   151 
       
   152     QMap<QString, QList<QAction *> > categoryToActions;
       
   153     QMap<QAction *, QString>         actionToCategory;
       
   154 
       
   155     QSet<QAction *> allActions;
       
   156     QMap<QAction *, QToolBar *> widgetActions;
       
   157     QSet<QAction *> regularActions;
       
   158     QMap<QAction *, QList<QToolBar *> > actionToToolBars;
       
   159 
       
   160     QMap<QToolBar *, QList<QAction *> > toolBars;
       
   161     QMap<QToolBar *, QList<QAction *> > toolBarsWithSeparators;
       
   162     QMap<QToolBar *, QList<QAction *> > defaultToolBars;
       
   163     QList<QToolBar *> customToolBars;
       
   164 
       
   165     QMainWindow *theMainWindow;
       
   166 };
       
   167 
       
   168 
       
   169 
       
   170 
       
   171 QtFullToolBarManagerPrivate::QtFullToolBarManagerPrivate()
       
   172     : theMainWindow(0)
       
   173 {
       
   174 }
       
   175 
       
   176 QToolBar *QtFullToolBarManagerPrivate::toolBarWidgetAction(QAction *action) const
       
   177 {
       
   178     if (widgetActions.contains(action))
       
   179         return widgetActions.value(action);
       
   180     return 0;
       
   181 }
       
   182 
       
   183 void QtFullToolBarManagerPrivate::removeWidgetActions(const QMap<QToolBar *, QList<QAction *> >
       
   184             &actions)
       
   185 {
       
   186     QMap<QToolBar *, QList<QAction *> >::ConstIterator itToolBar = actions.constBegin();
       
   187     while (itToolBar != actions.constEnd()) {
       
   188         QToolBar *toolBar = itToolBar.key();
       
   189         QList<QAction *> newActions = toolBars.value(toolBar);
       
   190         QList<QAction *> newActionsWithSeparators = toolBarsWithSeparators.value(toolBar);
       
   191 
       
   192         QList<QAction *> removedActions;
       
   193         QList<QAction *> actionList = itToolBar.value();
       
   194         QListIterator<QAction *> itAction(actionList);
       
   195         while (itAction.hasNext()) {
       
   196             QAction *action = itAction.next();
       
   197             if (newActions.contains(action) && toolBarWidgetAction(action) == toolBar) {
       
   198                 newActions.removeAll(action);
       
   199                 newActionsWithSeparators.removeAll(action);
       
   200                 removedActions.append(action);
       
   201             }
       
   202         }
       
   203 
       
   204         //emit q_ptr->toolBarChanged(toolBar, newActions);
       
   205 
       
   206         toolBars.insert(toolBar, newActions);
       
   207         toolBarsWithSeparators.insert(toolBar, newActionsWithSeparators);
       
   208         QListIterator<QAction *> itRemovedAction(removedActions);
       
   209         while (itRemovedAction.hasNext()) {
       
   210             QAction *oldAction = itRemovedAction.next();
       
   211             widgetActions.insert(oldAction, 0);
       
   212             actionToToolBars[oldAction].removeAll(toolBar);
       
   213         }
       
   214 
       
   215         ++itToolBar;
       
   216     }
       
   217 }
       
   218 
       
   219 void QtFullToolBarManagerPrivate::saveState(QDataStream &stream) const
       
   220 {
       
   221     stream << (uchar) ToolBarMarker;
       
   222     stream << defaultToolBars.size();
       
   223     QMap<QToolBar *, QList<QAction *> >::ConstIterator itToolBar =
       
   224                 defaultToolBars.constBegin();
       
   225     while (itToolBar != defaultToolBars.constEnd()) {
       
   226         QToolBar *tb = itToolBar.key();
       
   227         if (tb->objectName().isEmpty()) {
       
   228             qWarning("QtToolBarManager::saveState(): 'objectName' not set for QToolBar "
       
   229                 "%p '%s', using 'windowTitle' instead",
       
   230             tb, tb->windowTitle().toLocal8Bit().constData());
       
   231             stream << tb->windowTitle();
       
   232         } else {
       
   233             stream << tb->objectName();
       
   234         }
       
   235 
       
   236         stream << toolBars[tb].size();
       
   237         QListIterator<QAction *> itAction(toolBars[tb]);
       
   238         while (itAction.hasNext()) {
       
   239             QAction *action = itAction.next();
       
   240 
       
   241             if (action) {
       
   242                 if (action->objectName().isEmpty()) {
       
   243                     qWarning("QtToolBarManager::saveState(): 'objectName' not set for QAction "
       
   244                                 "%p '%s', using 'text' instead",
       
   245                             action, action->text().toLocal8Bit().constData());
       
   246                     stream << action->text();
       
   247                 } else {
       
   248                     stream << action->objectName();
       
   249                 }
       
   250             } else {
       
   251                 stream << QString();
       
   252             }
       
   253         }
       
   254         ++itToolBar;
       
   255     }
       
   256 
       
   257 
       
   258     stream << (uchar) CustomToolBarMarker;
       
   259     stream << toolBars.size() - defaultToolBars.size();
       
   260     itToolBar = toolBars.constBegin();
       
   261     while (itToolBar != toolBars.constEnd()) {
       
   262         QToolBar *tb = itToolBar.key();
       
   263         if (!defaultToolBars.contains(tb)) {
       
   264             stream << tb->objectName();
       
   265             stream << tb->windowTitle();
       
   266 
       
   267             stream << toolBars[tb].size();
       
   268             QListIterator<QAction *> itAction(toolBars[tb]);
       
   269             while (itAction.hasNext()) {
       
   270                 QAction *action = itAction.next();
       
   271 
       
   272                 if (action) {
       
   273                     if (action->objectName().isEmpty()) {
       
   274                         qWarning("QtToolBarManager::saveState(): 'objectName' not set for QAction "
       
   275                                     "%p '%s', using 'text' instead",
       
   276                                 action, action->text().toLocal8Bit().constData());
       
   277                         stream << action->text();
       
   278                     } else {
       
   279                         stream << action->objectName();
       
   280                     }
       
   281                 } else {
       
   282                     stream << QString();
       
   283                 }
       
   284             }
       
   285         }
       
   286         ++itToolBar;
       
   287     }
       
   288 }
       
   289 
       
   290 bool QtFullToolBarManagerPrivate::restoreState(QDataStream &stream) const
       
   291 {
       
   292     uchar tmarker;
       
   293     stream >> tmarker;
       
   294     if (tmarker != ToolBarMarker)
       
   295         return false;
       
   296 
       
   297     int toolBars;
       
   298     stream >> toolBars;
       
   299     for (int i = 0; i < toolBars; i++) {
       
   300         QString objectName;
       
   301         stream >> objectName;
       
   302         int actionCount;
       
   303         stream >> actionCount;
       
   304         QList<QAction *> actions;
       
   305         for (int j = 0; j < actionCount; j++) {
       
   306             QString actionName;
       
   307             stream >> actionName;
       
   308 
       
   309             if (actionName.isEmpty())
       
   310                 actions.append(0);
       
   311             else {
       
   312                 QAction *action = findAction(actionName);
       
   313                 if (action)
       
   314                     actions.append(action);
       
   315             }
       
   316         }
       
   317 
       
   318         QToolBar *toolBar = findDefaultToolBar(objectName);
       
   319         if (toolBar)
       
   320             q_ptr->setToolBar(toolBar, actions);
       
   321     }
       
   322 
       
   323 
       
   324 
       
   325     uchar ctmarker;
       
   326     stream >> ctmarker;
       
   327     if (ctmarker != CustomToolBarMarker)
       
   328         return false;
       
   329 
       
   330     QList<QToolBar *> oldCustomToolBars = customToolBars;
       
   331 
       
   332     stream >> toolBars;
       
   333     for (int i = 0; i < toolBars; i++) {
       
   334         QString objectName;
       
   335         QString toolBarName;
       
   336         int actionCount;
       
   337         stream >> objectName;
       
   338         stream >> toolBarName;
       
   339         stream >> actionCount;
       
   340         QList<QAction *> actions;
       
   341         for (int j = 0; j < actionCount; j++) {
       
   342             QString actionName;
       
   343             stream >> actionName;
       
   344 
       
   345             if (actionName.isEmpty())
       
   346                 actions.append(0);
       
   347             else {
       
   348                 QAction *action = findAction(actionName);
       
   349                 if (action)
       
   350                     actions.append(action);
       
   351             }
       
   352         }
       
   353 
       
   354         QToolBar *toolBar = toolBarByName(objectName);
       
   355         if (toolBar) {
       
   356             toolBar->setWindowTitle(toolBarName);
       
   357             oldCustomToolBars.removeAll(toolBar);
       
   358         }
       
   359         else
       
   360             toolBar = q_ptr->createToolBar(toolBarName);
       
   361         if (toolBar) {
       
   362             toolBar->setObjectName(objectName);
       
   363             q_ptr->setToolBar(toolBar, actions);
       
   364         }
       
   365     }
       
   366     QListIterator<QToolBar *> itToolBar(oldCustomToolBars);
       
   367     while (itToolBar.hasNext())
       
   368         q_ptr->deleteToolBar(itToolBar.next());
       
   369     return true;
       
   370 }
       
   371 
       
   372 QToolBar *QtFullToolBarManagerPrivate::findDefaultToolBar(const QString &objectName) const
       
   373 {
       
   374     QMap<QToolBar *, QList<QAction *> >::ConstIterator itToolBar =
       
   375                 defaultToolBars.constBegin();
       
   376     while (itToolBar != defaultToolBars.constEnd()) {
       
   377         QToolBar *tb = itToolBar.key();
       
   378         if (tb->objectName() == objectName)
       
   379             return tb;
       
   380 
       
   381         ++itToolBar;
       
   382     }
       
   383 
       
   384     qWarning("QtToolBarManager::restoreState(): cannot find a QToolBar named "
       
   385         "'%s', trying to match using 'windowTitle' instead.",
       
   386         objectName.toLocal8Bit().constData());
       
   387 
       
   388     itToolBar = defaultToolBars.constBegin();
       
   389     while (itToolBar != defaultToolBars.constEnd()) {
       
   390         QToolBar *tb = itToolBar.key();
       
   391         if (tb->windowTitle() == objectName)
       
   392             return tb;
       
   393 
       
   394         ++itToolBar;
       
   395     }
       
   396     qWarning("QtToolBarManager::restoreState(): cannot find a QToolBar with "
       
   397         "matching 'windowTitle' (looking for '%s').",
       
   398         objectName.toLocal8Bit().constData());
       
   399 
       
   400     return 0;
       
   401 }
       
   402 
       
   403 QAction *QtFullToolBarManagerPrivate::findAction(const QString &actionName) const
       
   404 {
       
   405     QSetIterator<QAction *> itAction(allActions);
       
   406     while (itAction.hasNext()) {
       
   407         QAction *action = itAction.next();
       
   408 
       
   409         if (action->objectName() == actionName)
       
   410             return action;
       
   411     }
       
   412     qWarning("QtToolBarManager::restoreState(): cannot find a QAction named "
       
   413         "'%s', trying to match using 'text' instead.",
       
   414         actionName.toLocal8Bit().constData());
       
   415 
       
   416     itAction.toFront();
       
   417     while (itAction.hasNext()) {
       
   418         QAction *action = itAction.next();
       
   419 
       
   420         if (action->text() == actionName)
       
   421             return action;
       
   422     }
       
   423     qWarning("QtToolBarManager::restoreState(): cannot find a QAction with "
       
   424         "matching 'text' (looking for '%s').",
       
   425         actionName.toLocal8Bit().constData());
       
   426 
       
   427     return 0;
       
   428 }
       
   429 
       
   430 QToolBar *QtFullToolBarManagerPrivate::toolBarByName(const QString &toolBarName) const
       
   431 {
       
   432     QMap<QToolBar *, QList<QAction *> >::ConstIterator itToolBar = toolBars.constBegin();
       
   433     while (itToolBar != toolBars.constEnd()) {
       
   434         QToolBar *toolBar = itToolBar.key();
       
   435         if (toolBar->objectName() == toolBarName)
       
   436             return toolBar;
       
   437 
       
   438         ++itToolBar;
       
   439     }
       
   440     return 0;
       
   441 }
       
   442 
       
   443 //////////////////////////////
       
   444 
       
   445 QtFullToolBarManager::QtFullToolBarManager(QObject *parent)
       
   446     : QObject(parent), d_ptr(new QtFullToolBarManagerPrivate)
       
   447 {
       
   448     d_ptr->q_ptr = this;
       
   449 }
       
   450 
       
   451 QtFullToolBarManager::~QtFullToolBarManager()
       
   452 {
       
   453 }
       
   454 
       
   455 void QtFullToolBarManager::setMainWindow(QMainWindow *mainWindow)
       
   456 {
       
   457     d_ptr->theMainWindow = mainWindow;
       
   458 }
       
   459 
       
   460 QMainWindow *QtFullToolBarManager::mainWindow() const
       
   461 {
       
   462     return d_ptr->theMainWindow;
       
   463 }
       
   464 
       
   465 void QtFullToolBarManager::addCategory(const QString &category)
       
   466 {
       
   467     d_ptr->categoryToActions[category] = QList<QAction *>();
       
   468 }
       
   469 
       
   470 bool QtFullToolBarManager::hasCategory(const QString &category) const
       
   471 {
       
   472     return d_ptr->categoryToActions.contains(category);
       
   473 }
       
   474 
       
   475 QStringList QtFullToolBarManager::categories() const
       
   476 {
       
   477     return d_ptr->categoryToActions.keys();
       
   478 }
       
   479 
       
   480 QList<QAction *> QtFullToolBarManager::categoryActions(const QString &category) const
       
   481 {
       
   482     QMap<QString, QList<QAction *> >::ConstIterator it =
       
   483                 d_ptr->categoryToActions.find(category);
       
   484     if (it != d_ptr->categoryToActions.constEnd())
       
   485         return it.value();
       
   486     return QList<QAction *>();
       
   487 }
       
   488 
       
   489 QString QtFullToolBarManager::actionCategory(QAction *action) const
       
   490 {
       
   491     QMap<QAction *, QString>::ConstIterator it = d_ptr->actionToCategory.find(action);
       
   492     if (it != d_ptr->actionToCategory.constEnd())
       
   493         return it.value();
       
   494     return QString();
       
   495 }
       
   496 
       
   497 void QtFullToolBarManager::addAction(QAction *action, const QString &category)
       
   498 {
       
   499     if (!action)
       
   500         return;
       
   501     if (action->isSeparator())
       
   502         return;
       
   503     if (d_ptr->allActions.contains(action))
       
   504         return;
       
   505     if (QLatin1String(action->metaObject()->className()) ==
       
   506                 QLatin1String("QToolBarWidgetAction"))
       
   507         d_ptr->widgetActions.insert(action, 0);
       
   508     else
       
   509         d_ptr->regularActions.insert(action);
       
   510     d_ptr->allActions.insert(action);
       
   511     d_ptr->categoryToActions[category].append(action);
       
   512     d_ptr->actionToCategory[action] = category;
       
   513 }
       
   514 
       
   515 void QtFullToolBarManager::removeAction(QAction *action)
       
   516 {
       
   517     if (!d_ptr->allActions.contains(action))
       
   518         return;
       
   519 
       
   520     QList<QToolBar *> toolBars = d_ptr->actionToToolBars[action];
       
   521     QListIterator<QToolBar *> itToolBar(toolBars);
       
   522     while (itToolBar.hasNext()) {
       
   523         QToolBar *toolBar = itToolBar.next();
       
   524 
       
   525         d_ptr->toolBars[toolBar].removeAll(action);
       
   526         d_ptr->toolBarsWithSeparators[toolBar].removeAll(action);
       
   527 
       
   528         toolBar->removeAction(action);
       
   529     }
       
   530 
       
   531     QMap<QToolBar *, QList<QAction *> >::ConstIterator itDefault =
       
   532             d_ptr->defaultToolBars.constBegin();
       
   533     while (itDefault != d_ptr->defaultToolBars.constEnd()) {
       
   534         if (itDefault.value().contains(action))
       
   535             d_ptr->defaultToolBars[itDefault.key()].removeAll(action);
       
   536 
       
   537         itDefault++;
       
   538     }
       
   539 
       
   540     d_ptr->allActions.remove(action);
       
   541     d_ptr->widgetActions.remove(action);
       
   542     d_ptr->regularActions.remove(action);
       
   543     d_ptr->actionToToolBars.remove(action);
       
   544 
       
   545     QString category = d_ptr->actionToCategory.value(action);
       
   546     d_ptr->actionToCategory.remove(action);
       
   547     d_ptr->categoryToActions[category].removeAll(action);
       
   548 
       
   549     if (d_ptr->categoryToActions[category].isEmpty())
       
   550         d_ptr->categoryToActions.remove(category);
       
   551 }
       
   552 
       
   553 QSet<QAction *> QtFullToolBarManager::actions() const
       
   554 {
       
   555     return d_ptr->allActions;
       
   556 }
       
   557 
       
   558 bool QtFullToolBarManager::isWidgetAction(QAction *action) const
       
   559 {
       
   560     if (d_ptr->widgetActions.contains(action))
       
   561         return true;
       
   562     return false;
       
   563 }
       
   564 
       
   565 void QtFullToolBarManager::addDefaultToolBar(QToolBar *toolBar, const QString &category)
       
   566 {
       
   567     if (!toolBar)
       
   568         return;
       
   569     if (d_ptr->toolBars.contains(toolBar))
       
   570         return;
       
   571     // could be also checked if toolBar belongs to mainwindow
       
   572 
       
   573     QList<QAction *> newActionsWithSeparators;
       
   574     QList<QAction *> newActions;
       
   575     QList<QAction *> actions = toolBar->actions();
       
   576     QListIterator<QAction *> itAction(actions);
       
   577     while (itAction.hasNext()) {
       
   578         QAction *action = itAction.next();
       
   579         addAction(action, category);
       
   580         if (d_ptr->widgetActions.contains(action))
       
   581             d_ptr->widgetActions.insert(action, toolBar);
       
   582         newActionsWithSeparators.append(action);
       
   583         if (action->isSeparator())
       
   584             action = 0;
       
   585         else
       
   586             d_ptr->actionToToolBars[action].append(toolBar);
       
   587         newActions.append(action);
       
   588     }
       
   589     d_ptr->defaultToolBars.insert(toolBar, newActions);
       
   590     //Below could be done by call setToolBar() if we want signal emission here.
       
   591     d_ptr->toolBars.insert(toolBar, newActions);
       
   592     d_ptr->toolBarsWithSeparators.insert(toolBar, newActionsWithSeparators);
       
   593 }
       
   594 
       
   595 void QtFullToolBarManager::removeDefaultToolBar(QToolBar *toolBar)
       
   596 {
       
   597     if (!d_ptr->defaultToolBars.contains(toolBar))
       
   598         return;
       
   599 
       
   600     QList<QAction *> defaultActions = d_ptr->defaultToolBars[toolBar];
       
   601     setToolBar(toolBar, QList<QAction *>());
       
   602     QListIterator<QAction *> itAction(defaultActions);
       
   603     while (itAction.hasNext())
       
   604         removeAction(itAction.next());
       
   605 
       
   606     d_ptr->toolBars.remove(toolBar);
       
   607     d_ptr->toolBarsWithSeparators.remove(toolBar);
       
   608     d_ptr->defaultToolBars.remove(toolBar);
       
   609 
       
   610     itAction.toFront();
       
   611     while (itAction.hasNext()) {
       
   612         QAction *action = itAction.next();
       
   613         if (action)
       
   614             toolBar->insertAction(0, action);
       
   615         else
       
   616             toolBar->insertSeparator(0);
       
   617     }
       
   618 }
       
   619 
       
   620 QMap<QToolBar *, QList<QAction *> > QtFullToolBarManager::defaultToolBars() const
       
   621 {
       
   622     return d_ptr->defaultToolBars;
       
   623 }
       
   624 
       
   625 bool QtFullToolBarManager::isDefaultToolBar(QToolBar *toolBar) const
       
   626 {
       
   627     if (d_ptr->defaultToolBars.contains(toolBar))
       
   628         return true;
       
   629     return false;
       
   630 }
       
   631 
       
   632 QToolBar *QtFullToolBarManager::createToolBar(const QString &toolBarName)
       
   633 {
       
   634     if (!mainWindow())
       
   635         return 0;
       
   636     QToolBar *toolBar = new QToolBar(toolBarName, mainWindow());
       
   637     int i = 1;
       
   638     const QString prefix = QLatin1String("_Custom_Toolbar_%1");
       
   639     QString name = prefix.arg(i);
       
   640     while (d_ptr->toolBarByName(name))
       
   641         name = prefix.arg(++i);
       
   642     toolBar->setObjectName(name);
       
   643     mainWindow()->addToolBar(toolBar);
       
   644     d_ptr->customToolBars.append(toolBar);
       
   645     d_ptr->toolBars.insert(toolBar, QList<QAction *>());
       
   646     d_ptr->toolBarsWithSeparators.insert(toolBar, QList<QAction *>());
       
   647     return toolBar;
       
   648 }
       
   649 
       
   650 void QtFullToolBarManager::deleteToolBar(QToolBar *toolBar)
       
   651 {
       
   652     if (!d_ptr->toolBars.contains(toolBar))
       
   653         return;
       
   654     if (d_ptr->defaultToolBars.contains(toolBar))
       
   655         return;
       
   656     setToolBar(toolBar, QList<QAction *>());
       
   657     d_ptr->customToolBars.removeAll(toolBar);
       
   658     d_ptr->toolBars.remove(toolBar);
       
   659     d_ptr->toolBarsWithSeparators.remove(toolBar);
       
   660     delete toolBar;
       
   661 }
       
   662 
       
   663 QList<QAction *> QtFullToolBarManager::actions(QToolBar *toolBar) const
       
   664 {
       
   665     if (d_ptr->toolBars.contains(toolBar))
       
   666         return d_ptr->toolBars.value(toolBar);
       
   667     return QList<QAction *>();
       
   668 }
       
   669 
       
   670 void QtFullToolBarManager::setToolBars(const QMap<QToolBar *, QList<QAction *> > &actions)
       
   671 {
       
   672     QMap<QToolBar *, QList<QAction *> >::ConstIterator it = actions.constBegin();
       
   673     while (it != actions.constEnd()) {
       
   674         setToolBar(it.key(), it.value());
       
   675         ++it;
       
   676     }
       
   677 }
       
   678 
       
   679 void QtFullToolBarManager::setToolBar(QToolBar *toolBar, const QList<QAction *> &actions)
       
   680 {
       
   681     if (!toolBar)
       
   682         return;
       
   683     if (!d_ptr->toolBars.contains(toolBar))
       
   684         return;
       
   685 
       
   686     if (actions == d_ptr->toolBars[toolBar])
       
   687         return;
       
   688 
       
   689     QMap<QToolBar *, QList<QAction *> > toRemove;
       
   690 
       
   691     QList<QAction *> newActions;
       
   692     QListIterator<QAction *> itAction(actions);
       
   693     while (itAction.hasNext()) {
       
   694         QAction *action = itAction.next();
       
   695         if (!action || (!newActions.contains(action) && d_ptr->allActions.contains(action)))
       
   696             newActions.append(action);
       
   697 
       
   698         QToolBar *oldToolBar = d_ptr->toolBarWidgetAction(action);
       
   699         if (oldToolBar && oldToolBar != toolBar)
       
   700             toRemove[oldToolBar].append(action);
       
   701     }
       
   702 
       
   703     d_ptr->removeWidgetActions(toRemove);
       
   704 
       
   705     QList<QAction *> oldActions = d_ptr->toolBarsWithSeparators.value(toolBar);
       
   706     QListIterator<QAction *> itOldAction(oldActions);
       
   707     while (itOldAction.hasNext()) {
       
   708         QAction *action = itOldAction.next();
       
   709         /*
       
   710         When addDefaultToolBar() separator actions could be checked if they are
       
   711         inserted in other toolbars - if yes then create new one.
       
   712         */
       
   713         if (d_ptr->toolBarWidgetAction(action) == toolBar)
       
   714             d_ptr->widgetActions.insert(action, 0);
       
   715         toolBar->removeAction(action);
       
   716         if (action->isSeparator())
       
   717             delete action;
       
   718         else
       
   719             d_ptr->actionToToolBars[action].removeAll(toolBar);
       
   720     }
       
   721 
       
   722     QList<QAction *> newActionsWithSeparators;
       
   723     QListIterator<QAction *> itNewActions(newActions);
       
   724     while (itNewActions.hasNext()) {
       
   725         QAction *action = itNewActions.next();
       
   726         QAction *newAction = 0;
       
   727         if (!action)
       
   728             newAction = toolBar->insertSeparator(0);
       
   729         if (d_ptr->allActions.contains(action)) {
       
   730             toolBar->insertAction(0, action);
       
   731             newAction = action;
       
   732             d_ptr->actionToToolBars[action].append(toolBar);
       
   733         }
       
   734         newActionsWithSeparators.append(newAction);
       
   735     }
       
   736     d_ptr->toolBars.insert(toolBar, newActions);
       
   737     d_ptr->toolBarsWithSeparators.insert(toolBar, newActionsWithSeparators);
       
   738 }
       
   739 
       
   740 QMap<QToolBar *, QList<QAction *> > QtFullToolBarManager::toolBarsActions() const
       
   741 {
       
   742     return d_ptr->toolBars;
       
   743 }
       
   744 
       
   745 void QtFullToolBarManager::resetToolBar(QToolBar *toolBar)
       
   746 {
       
   747     if (!isDefaultToolBar(toolBar))
       
   748         return;
       
   749     setToolBar(toolBar, defaultToolBars().value(toolBar));
       
   750 }
       
   751 
       
   752 void QtFullToolBarManager::resetAllToolBars()
       
   753 {
       
   754     setToolBars(defaultToolBars());
       
   755     QList<QToolBar *> oldCustomToolBars = d_ptr->customToolBars;
       
   756     QListIterator<QToolBar *> itToolBar(oldCustomToolBars);
       
   757     while (itToolBar.hasNext()) {
       
   758         deleteToolBar(itToolBar.next());
       
   759     }
       
   760 }
       
   761 
       
   762 QByteArray QtFullToolBarManager::saveState(int version) const
       
   763 {
       
   764     QByteArray data;
       
   765     QDataStream stream(&data, QIODevice::WriteOnly);
       
   766     stream << QtFullToolBarManagerPrivate::VersionMarker;
       
   767     stream << version;
       
   768     d_ptr->saveState(stream);
       
   769     return data;
       
   770 }
       
   771 
       
   772 bool QtFullToolBarManager::restoreState(const QByteArray &state, int version)
       
   773 {
       
   774     QByteArray sd = state;
       
   775     QDataStream stream(&sd, QIODevice::ReadOnly);
       
   776     int marker, v;
       
   777     stream >> marker;
       
   778     stream >> v;
       
   779     if (marker != QtFullToolBarManagerPrivate::VersionMarker || v != version)
       
   780         return false;
       
   781     return d_ptr->restoreState(stream);
       
   782 }
       
   783 
       
   784 
       
   785 class QtToolBarManagerPrivate
       
   786 {
       
   787     class QtToolBarManager *q_ptr;
       
   788     Q_DECLARE_PUBLIC(QtToolBarManager)
       
   789 public:
       
   790     QtFullToolBarManager *manager;
       
   791 };
       
   792 
       
   793 //////////////////////////////////////
       
   794 
       
   795 /*! \class QtToolBarManager
       
   796     \internal
       
   797     \inmodule QtDesigner
       
   798     \since 4.4
       
   799 
       
   800     \brief The QtToolBarManager class provides toolbar management for
       
   801     main windows.
       
   802 
       
   803     The QtToolBarManager is typically used with a QtToolBarDialog
       
   804     which allows the user to customize the toolbars for a given main
       
   805     window. The QtToolBarDialog class's functionality is controlled by
       
   806     an instance of the QtToolBarManager class, and the main window is
       
   807     specified using the QtToolBarManager class's setMainWindow()
       
   808     function.
       
   809 
       
   810     The currently specified main window can be retrieved using the
       
   811     mainWindow() function.
       
   812 
       
   813     The toolbar manager holds lists of the given main window's actions
       
   814     and toolbars, and can add actions and toolbars to these
       
   815     lists using the addAction() and addToolBar() functions
       
   816     respectively. The actions can in addition be categorized
       
   817     acccording to the user's preferences. The toolbar manager can also
       
   818     remove custom actions and toolbars using the removeAction() and
       
   819     removeToolBar() functions.
       
   820 
       
   821     Finally, the QtToolBarManager is able to save the customized state
       
   822     of its toolbars using the saveState() function as well as restore
       
   823     the toolbars' saved state using restoreState() function.
       
   824 
       
   825     \sa QtToolBarDialog
       
   826 */
       
   827 
       
   828 /*!
       
   829     Creates a toolbar manager with the given \a parent.
       
   830 */
       
   831 QtToolBarManager::QtToolBarManager(QObject *parent)
       
   832     : QObject(parent), d_ptr(new QtToolBarManagerPrivate)
       
   833 {
       
   834     d_ptr->q_ptr = this;
       
   835 
       
   836     d_ptr->manager = new QtFullToolBarManager(this);
       
   837 }
       
   838 
       
   839 /*!
       
   840     Destroys the toolbar manager.
       
   841 */
       
   842 QtToolBarManager::~QtToolBarManager()
       
   843 {
       
   844 }
       
   845 
       
   846 /*!
       
   847     Sets the main window upon which the toolbar manager operates, to
       
   848     be the given \a mainWindow.
       
   849 */
       
   850 void QtToolBarManager::setMainWindow(QMainWindow *mainWindow)
       
   851 {
       
   852     d_ptr->manager->setMainWindow(mainWindow);
       
   853 }
       
   854 
       
   855 /*!
       
   856     Returns the main window associated this toolbar manager.
       
   857 */
       
   858 QMainWindow *QtToolBarManager::mainWindow() const
       
   859 {
       
   860     return d_ptr->manager->mainWindow();
       
   861 }
       
   862 
       
   863 /*!
       
   864     Adds the given \a action to the given \a category in the manager's
       
   865     list of actions. If the \a category doesn't exist it is created.
       
   866     Only non separator actions can be added. If the action is already
       
   867     added to the list, the function doesn't do anything.
       
   868 
       
   869     \sa removeAction()
       
   870 */
       
   871 void QtToolBarManager::addAction(QAction *action, const QString &category)
       
   872 {
       
   873     d_ptr->manager->addAction(action, category);
       
   874 }
       
   875 
       
   876 /*!
       
   877     Removes the specified \a action from the manager's list of
       
   878     actions. The action is also removed from all the registered
       
   879     toolbars.  If the specified \a action is the only action in its
       
   880     category, that category is removed as well.
       
   881 
       
   882     \sa addAction()
       
   883 */
       
   884 void QtToolBarManager::removeAction(QAction *action)
       
   885 {
       
   886     d_ptr->manager->removeAction(action);
       
   887 }
       
   888 
       
   889 /*!
       
   890     Adds the given \a toolBar to the manager's toolbar list.
       
   891 
       
   892     All the \a toolBar's actions are automatically added to the given
       
   893     \a category in the manager's list of actions if they're not
       
   894     already there. The manager remembers which toolbar the actions
       
   895     belonged to, so, when the \a toolBar is removed, its actions will
       
   896     be removed as well.
       
   897 
       
   898     Custom toolbars are created with the main window returned by
       
   899     the mainWindow() function, as its parent.
       
   900 
       
   901     \sa removeToolBar()
       
   902 */
       
   903 void QtToolBarManager::addToolBar(QToolBar *toolBar, const QString &category)
       
   904 {
       
   905     d_ptr->manager->addDefaultToolBar(toolBar, category);
       
   906 }
       
   907 
       
   908 /*!
       
   909     Removes the specified \a toolBar from the manager's list. All the
       
   910     actions that existed in the specified \a toolBar when it was
       
   911     added are removed as well.
       
   912 
       
   913     \sa addToolBar()
       
   914 */
       
   915 void QtToolBarManager::removeToolBar(QToolBar *toolBar)
       
   916 {
       
   917     d_ptr->manager->removeDefaultToolBar(toolBar);
       
   918 }
       
   919 
       
   920 /*!
       
   921     Returns the manager's toolbar list.
       
   922 */
       
   923 QList<QToolBar *> QtToolBarManager::toolBars() const
       
   924 {
       
   925     return d_ptr->manager->toolBarsActions().keys();
       
   926 }
       
   927 
       
   928 /*
       
   929 void QtToolBarManager::resetToolBar(QToolBar *toolBar)
       
   930 {
       
   931     d_ptr->manager->resetToolBar(toolBar);
       
   932 }
       
   933 
       
   934 void QtToolBarManager::resetAllToolBars()
       
   935 {
       
   936     d_ptr->manager->resetAllToolBars();
       
   937 }
       
   938 */
       
   939 
       
   940 /*!
       
   941     Saves the state of the toolbar manager's toolbars. The \a version
       
   942     number is stored as part of the data.
       
   943 
       
   944     Identifies all the QToolBar and QAction objects by their object
       
   945     name property. Ensure that this property is unique for each
       
   946     QToolBar and QAction that you add using the QtToolBarManager.
       
   947 
       
   948     Returns an identifier for the state which can be passed along with
       
   949     the version number to the restoreState() function to restore the
       
   950     saved state.
       
   951 
       
   952     \sa restoreState()
       
   953 */
       
   954 QByteArray QtToolBarManager::saveState(int version) const
       
   955 {
       
   956     return d_ptr->manager->saveState(version);
       
   957 }
       
   958 
       
   959 /*!
       
   960     Restores the saved state of the toolbar manager's toolbars.  The
       
   961     \a version number is compared with the version number of the
       
   962     stored \a state.
       
   963 
       
   964     Returns true if the version numbers are matching and the toolbar
       
   965     manager's state is restored; otherwise the toolbar manager's state
       
   966     is left unchanged and the function returns false.
       
   967 
       
   968     Note that the state of the toolbar manager's toolbars should be
       
   969     restored before restoring the state of the main window's toolbars
       
   970     and dockwidgets using the QMainWindow::restoreState() function. In
       
   971     that way the restoreState() function can create the custom
       
   972     toolbars before the QMainWindow::restoreState() function restores
       
   973     the custom toolbars' positions.
       
   974 
       
   975     \sa saveState()
       
   976 */
       
   977 bool QtToolBarManager::restoreState(const QByteArray &state, int version)
       
   978 {
       
   979     return d_ptr->manager->restoreState(state, version);
       
   980 }
       
   981 
       
   982 //////////////////////
       
   983 
       
   984 class ToolBarItem {
       
   985 public:
       
   986     ToolBarItem() : tb(0) {}
       
   987     ToolBarItem(QToolBar *toolBar) : tb(toolBar) {}
       
   988     ToolBarItem(QToolBar *toolBar, const QString &toolBarName)
       
   989             : tb(toolBar), tbName(toolBarName) {}
       
   990     ToolBarItem(const QString &toolBarName) : tb(0), tbName(toolBarName) {}
       
   991     QToolBar *toolBar() const
       
   992         { return tb; }
       
   993     void setToolBar(QToolBar *toolBar)
       
   994         { tb = toolBar; }
       
   995     QString toolBarName() const
       
   996         { return tbName; }
       
   997     void setToolBarName(const QString &toolBarName)
       
   998         { tbName = toolBarName; }
       
   999 private:
       
  1000     QToolBar *tb;
       
  1001     QString tbName;
       
  1002 };
       
  1003 
       
  1004 class QtToolBarDialogPrivate {
       
  1005     QtToolBarDialog *q_ptr;
       
  1006     Q_DECLARE_PUBLIC(QtToolBarDialog)
       
  1007 public:
       
  1008     QtToolBarDialogPrivate()
       
  1009         : toolBarManager(0),
       
  1010           currentAction(0),
       
  1011           currentToolBar(0)
       
  1012           { }
       
  1013 
       
  1014     ToolBarItem *createItem(QToolBar *toolBar);
       
  1015     ToolBarItem *createItem(const QString &toolBarName);
       
  1016     void deleteItem(ToolBarItem *item);
       
  1017 
       
  1018     void newClicked();
       
  1019     void removeClicked();
       
  1020     void defaultClicked();
       
  1021     void okClicked();
       
  1022     void applyClicked();
       
  1023     void cancelClicked();
       
  1024     void upClicked();
       
  1025     void downClicked();
       
  1026     void leftClicked();
       
  1027     void rightClicked();
       
  1028     void renameClicked();
       
  1029     void toolBarRenamed(QListWidgetItem *item);
       
  1030     void currentActionChanged(QTreeWidgetItem *current);
       
  1031     void currentToolBarChanged(QListWidgetItem *current);
       
  1032     void currentToolBarActionChanged(QListWidgetItem *current);
       
  1033 
       
  1034     void removeToolBar(ToolBarItem *item);
       
  1035     bool isDefaultToolBar(ToolBarItem *item) const;
       
  1036     void setButtons();
       
  1037     void clearOld();
       
  1038     void fillNew();
       
  1039     QtFullToolBarManager *toolBarManager;
       
  1040     QMap<ToolBarItem *, QList<QAction *> > currentState;
       
  1041     QMap<QToolBar *, ToolBarItem *> toolBarItems;
       
  1042     QSet<ToolBarItem *> createdItems;
       
  1043     QSet<ToolBarItem *> removedItems;
       
  1044 
       
  1045     QSet<ToolBarItem *> allToolBarItems;
       
  1046 
       
  1047     // static
       
  1048     QTreeWidgetItem *currentAction;
       
  1049     QMap<QAction *, QTreeWidgetItem *> actionToItem;
       
  1050     QMap<QTreeWidgetItem *, QAction *> itemToAction;
       
  1051 
       
  1052     // dynamic
       
  1053     ToolBarItem *currentToolBar;
       
  1054     QMap<ToolBarItem *, QListWidgetItem *> toolBarToItem;
       
  1055     QMap<QListWidgetItem *, ToolBarItem *> itemToToolBar;
       
  1056 
       
  1057     // dynamic
       
  1058     QMap<QAction *, QListWidgetItem *> actionToCurrentItem;
       
  1059     QMap<QListWidgetItem *, QAction *> currentItemToAction;
       
  1060 
       
  1061     QMap<QAction *, ToolBarItem *> widgetActionToToolBar;
       
  1062     QMap<ToolBarItem *, QSet<QAction *> > toolBarToWidgetActions;
       
  1063 
       
  1064     QString separatorText;
       
  1065     Ui::QtToolBarDialog ui;
       
  1066 };
       
  1067 
       
  1068 ToolBarItem *QtToolBarDialogPrivate::createItem(QToolBar *toolBar)
       
  1069 {
       
  1070     if (!toolBar)
       
  1071         return 0;
       
  1072     ToolBarItem *item = new ToolBarItem(toolBar, toolBar->windowTitle());
       
  1073     allToolBarItems.insert(item);
       
  1074     return item;
       
  1075 }
       
  1076 
       
  1077 ToolBarItem *QtToolBarDialogPrivate::createItem(const QString &toolBarName)
       
  1078 {
       
  1079     ToolBarItem *item = new ToolBarItem(toolBarName);
       
  1080     allToolBarItems.insert(item);
       
  1081     return item;
       
  1082 }
       
  1083 
       
  1084 void QtToolBarDialogPrivate::deleteItem(ToolBarItem *item)
       
  1085 {
       
  1086     if (!allToolBarItems.contains(item))
       
  1087         return;
       
  1088     allToolBarItems.remove(item);
       
  1089     delete item;
       
  1090 }
       
  1091 
       
  1092 void QtToolBarDialogPrivate::clearOld()
       
  1093 {
       
  1094     ui.actionTree->clear();
       
  1095     ui.toolBarList->clear();
       
  1096     ui.currentToolBarList->clear();
       
  1097     ui.removeButton->setEnabled(false);
       
  1098     ui.newButton->setEnabled(false);
       
  1099     ui.upButton->setEnabled(false);
       
  1100     ui.downButton->setEnabled(false);
       
  1101     ui.leftButton->setEnabled(false);
       
  1102     ui.rightButton->setEnabled(false);
       
  1103 
       
  1104     actionToItem.clear();
       
  1105     itemToAction.clear();
       
  1106     toolBarToItem.clear();
       
  1107     itemToToolBar.clear();
       
  1108     actionToCurrentItem.clear();
       
  1109     currentItemToAction.clear();
       
  1110     widgetActionToToolBar.clear();
       
  1111     toolBarToWidgetActions.clear();
       
  1112 
       
  1113     toolBarItems.clear();
       
  1114     currentState.clear();
       
  1115     createdItems.clear();
       
  1116     removedItems.clear();
       
  1117     QSetIterator<ToolBarItem *> itItem(allToolBarItems);
       
  1118     while (itItem.hasNext())
       
  1119         delete itItem.next();
       
  1120     allToolBarItems.clear();
       
  1121 
       
  1122     currentToolBar = 0;
       
  1123     currentAction = 0;
       
  1124 }
       
  1125 
       
  1126 void QtToolBarDialogPrivate::fillNew()
       
  1127 {
       
  1128     if (!toolBarManager)
       
  1129         return;
       
  1130 
       
  1131     QTreeWidgetItem *item = new QTreeWidgetItem(ui.actionTree);
       
  1132     item->setText(0, separatorText);
       
  1133     ui.actionTree->setCurrentItem(item);
       
  1134     currentAction = item;
       
  1135     actionToItem.insert(0, item);
       
  1136     itemToAction.insert(item, 0);
       
  1137     QStringList categories = toolBarManager->categories();
       
  1138     QStringListIterator itCategory(categories);
       
  1139     while (itCategory.hasNext()) {
       
  1140         QString category = itCategory.next();
       
  1141         QTreeWidgetItem *categoryItem = new QTreeWidgetItem(ui.actionTree);
       
  1142         categoryItem->setText(0, category);
       
  1143         QList<QAction *> actions = toolBarManager->categoryActions(category);
       
  1144         QListIterator<QAction *> itAction(actions);
       
  1145         while (itAction.hasNext()) {
       
  1146             QAction *action = itAction.next();
       
  1147             item = new QTreeWidgetItem(categoryItem);
       
  1148             item->setText(0, action->text());
       
  1149             item->setIcon(0, action->icon());
       
  1150             item->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic);
       
  1151             actionToItem.insert(action, item);
       
  1152             itemToAction.insert(item, action);
       
  1153             if (toolBarManager->isWidgetAction(action)) {
       
  1154                 item->setData(0, Qt::TextColorRole, QColor(Qt::blue));
       
  1155                 widgetActionToToolBar.insert(action, 0);
       
  1156             }
       
  1157             item->setFlags(item->flags() | Qt::ItemIsDragEnabled);
       
  1158         }
       
  1159         ui.actionTree->setItemExpanded(categoryItem, true);
       
  1160     }
       
  1161     //ui.actionTree->sortItems(0, Qt::AscendingOrder);
       
  1162 
       
  1163     QMap<QToolBar *, QList<QAction *> > toolBars = toolBarManager->toolBarsActions();
       
  1164     QMap<QToolBar *, QList<QAction *> >::ConstIterator it = toolBars.constBegin();
       
  1165     while (it != toolBars.constEnd()) {
       
  1166         QToolBar *toolBar = it.key();
       
  1167         ToolBarItem *tbItem = createItem(toolBar);
       
  1168         toolBarItems.insert(toolBar, tbItem);
       
  1169         QListWidgetItem *item = new QListWidgetItem(toolBar->windowTitle(),
       
  1170                 ui.toolBarList);
       
  1171         toolBarToItem.insert(tbItem, item);
       
  1172         itemToToolBar.insert(item, tbItem);
       
  1173         QList<QAction *> actions = it.value();
       
  1174         QListIterator<QAction *> itAction(actions);
       
  1175         while (itAction.hasNext()) {
       
  1176             QAction *action = itAction.next();
       
  1177             if (toolBarManager->isWidgetAction(action)) {
       
  1178                 widgetActionToToolBar.insert(action, tbItem);
       
  1179                 toolBarToWidgetActions[tbItem].insert(action);
       
  1180             }
       
  1181         }
       
  1182         currentState.insert(tbItem, actions);
       
  1183         if (it == toolBars.constBegin())
       
  1184             ui.toolBarList->setCurrentItem(item);
       
  1185         if (isDefaultToolBar(tbItem))
       
  1186             item->setData(Qt::TextColorRole, QColor(Qt::darkGreen));
       
  1187         else
       
  1188             item->setFlags(item->flags() | Qt::ItemIsEditable);
       
  1189 
       
  1190         ++it;
       
  1191     }
       
  1192     ui.toolBarList->sortItems();
       
  1193     setButtons();
       
  1194 }
       
  1195 
       
  1196 bool QtToolBarDialogPrivate::isDefaultToolBar(ToolBarItem *item) const
       
  1197 {
       
  1198     if (!item)
       
  1199         return false;
       
  1200     if (!item->toolBar())
       
  1201         return false;
       
  1202     return toolBarManager->isDefaultToolBar(item->toolBar());
       
  1203 }
       
  1204 
       
  1205 void QtToolBarDialogPrivate::setButtons()
       
  1206 {
       
  1207     bool newEnabled = false;
       
  1208     bool removeEnabled = false;
       
  1209     bool renameEnabled = false;
       
  1210     bool upEnabled = false;
       
  1211     bool downEnabled = false;
       
  1212     bool leftEnabled = false;
       
  1213     bool rightEnabled = false;
       
  1214 
       
  1215     if (toolBarManager) {
       
  1216         newEnabled = true;
       
  1217         removeEnabled = !isDefaultToolBar(currentToolBar);
       
  1218         renameEnabled = removeEnabled;
       
  1219         QListWidgetItem *currentToolBarAction = ui.currentToolBarList->currentItem();
       
  1220         if (currentToolBarAction) {
       
  1221             int row = ui.currentToolBarList->row(currentToolBarAction);
       
  1222             upEnabled = row > 0;
       
  1223             downEnabled = row < ui.currentToolBarList->count() - 1;
       
  1224             leftEnabled = true;
       
  1225         }
       
  1226         if (currentAction && currentToolBar)
       
  1227             rightEnabled = true;
       
  1228     }
       
  1229     ui.newButton->setEnabled(newEnabled);
       
  1230     ui.removeButton->setEnabled(removeEnabled);
       
  1231     ui.renameButton->setEnabled(renameEnabled);
       
  1232     ui.upButton->setEnabled(upEnabled);
       
  1233     ui.downButton->setEnabled(downEnabled);
       
  1234     ui.leftButton->setEnabled(leftEnabled);
       
  1235     ui.rightButton->setEnabled(rightEnabled);
       
  1236 }
       
  1237 
       
  1238 void QtToolBarDialogPrivate::newClicked()
       
  1239 {
       
  1240     QString toolBarName = QtToolBarDialog::tr("Custom Toolbar"); // = QInputDialog::getString();
       
  1241     // produce unique name
       
  1242     ToolBarItem *item = createItem(toolBarName);
       
  1243     currentState.insert(item, QList<QAction *>());
       
  1244     createdItems.insert(item);
       
  1245     QListWidgetItem *i = new QListWidgetItem(toolBarName, ui.toolBarList);
       
  1246     i->setFlags(i->flags() | Qt::ItemIsEditable);
       
  1247     ui.toolBarList->setCurrentItem(i);
       
  1248     itemToToolBar.insert(i, item);
       
  1249     toolBarToItem.insert(item, i);
       
  1250     ui.toolBarList->sortItems();
       
  1251     ui.toolBarList->setCurrentItem(i);
       
  1252     currentToolBarChanged(i);
       
  1253     renameClicked();
       
  1254 }
       
  1255 
       
  1256 void QtToolBarDialogPrivate::removeToolBar(ToolBarItem *item)
       
  1257 {
       
  1258     if (!item)
       
  1259         return;
       
  1260     if (item->toolBar() && toolBarManager->isDefaultToolBar(item->toolBar()))
       
  1261         return;
       
  1262     if (!toolBarToItem.contains(item))
       
  1263         return;
       
  1264     QListWidgetItem *i = toolBarToItem.value(item);
       
  1265     bool wasCurrent = false;
       
  1266     if (i == ui.toolBarList->currentItem())
       
  1267         wasCurrent = true;
       
  1268     int row = ui.toolBarList->row(i);
       
  1269     QMap<ToolBarItem *, QSet<QAction *> >::ConstIterator itToolBar =
       
  1270             toolBarToWidgetActions.find(item);
       
  1271     if (itToolBar != toolBarToWidgetActions.constEnd()) {
       
  1272         QSet<QAction *> actions = itToolBar.value();
       
  1273         QSetIterator<QAction *> itAction(actions);
       
  1274         while (itAction.hasNext()) {
       
  1275             QAction *action = itAction.next();
       
  1276             widgetActionToToolBar.insert(action, 0);
       
  1277         }
       
  1278         toolBarToWidgetActions.remove(item);
       
  1279     }
       
  1280 
       
  1281     currentState.remove(item);
       
  1282     createdItems.remove(item);
       
  1283     toolBarToItem.remove(item);
       
  1284     itemToToolBar.remove(i);
       
  1285     delete i;
       
  1286     if (item->toolBar())
       
  1287         removedItems.insert(item);
       
  1288     else
       
  1289         deleteItem(item);
       
  1290     if (wasCurrent) {
       
  1291         if (row == ui.toolBarList->count())
       
  1292             row--;
       
  1293         if (row < 0)
       
  1294             ;
       
  1295         else
       
  1296             ui.toolBarList->setCurrentRow(row);
       
  1297     }
       
  1298     setButtons();
       
  1299 }
       
  1300 
       
  1301 void QtToolBarDialogPrivate::removeClicked()
       
  1302 {
       
  1303     QListWidgetItem *i = ui.toolBarList->currentItem();
       
  1304     if (!i)
       
  1305         return;
       
  1306     ToolBarItem *item = itemToToolBar.value(i);
       
  1307     removeToolBar(item);
       
  1308 }
       
  1309 
       
  1310 void QtToolBarDialogPrivate::defaultClicked()
       
  1311 {
       
  1312     QMap<QToolBar *, QList<QAction *> > defaultToolBars = toolBarManager->defaultToolBars();
       
  1313     QMap<QToolBar *, QList<QAction *> >::ConstIterator itToolBar = defaultToolBars.constBegin();
       
  1314     while (itToolBar != defaultToolBars.constEnd()) {
       
  1315         QToolBar *toolBar = itToolBar.key();
       
  1316         ToolBarItem *toolBarItem = toolBarItems.value(toolBar);
       
  1317 
       
  1318         if (toolBarToWidgetActions.contains(toolBarItem)) {
       
  1319             QSetIterator<QAction *> itAction(toolBarToWidgetActions.value(toolBarItem));
       
  1320             while (itAction.hasNext())
       
  1321                 widgetActionToToolBar.insert(itAction.next(), 0);
       
  1322             toolBarToWidgetActions.remove(toolBarItem);
       
  1323         }
       
  1324 
       
  1325         currentState.remove(toolBarItem);
       
  1326 
       
  1327         QListIterator<QAction *> itAction(itToolBar.value());
       
  1328         while (itAction.hasNext()) {
       
  1329             QAction *action = itAction.next();
       
  1330             if (toolBarManager->isWidgetAction(action)) {
       
  1331                 ToolBarItem *otherToolBar = widgetActionToToolBar.value(action);
       
  1332                 if (otherToolBar) {
       
  1333                     toolBarToWidgetActions[otherToolBar].remove(action);
       
  1334                     currentState[otherToolBar].removeAll(action);
       
  1335                 }
       
  1336                 widgetActionToToolBar.insert(action, toolBarItem);
       
  1337                 toolBarToWidgetActions[toolBarItem].insert(action);
       
  1338             }
       
  1339         }
       
  1340         currentState.insert(toolBarItem, itToolBar.value());
       
  1341 
       
  1342         ++itToolBar;
       
  1343     }
       
  1344     currentToolBarChanged(toolBarToItem.value(currentToolBar));
       
  1345 
       
  1346     QList<ToolBarItem *> toolBars = currentState.keys();
       
  1347     QListIterator<ToolBarItem *> itTb(toolBars);
       
  1348     while (itTb.hasNext())
       
  1349         removeToolBar(itTb.next());
       
  1350 }
       
  1351 
       
  1352 void QtToolBarDialogPrivate::okClicked()
       
  1353 {
       
  1354     applyClicked();
       
  1355     q_ptr->accept();
       
  1356 }
       
  1357 
       
  1358 void QtToolBarDialogPrivate::applyClicked()
       
  1359 {
       
  1360     QMap<ToolBarItem *, QList<QAction *> > toolBars = currentState;
       
  1361     QMap<ToolBarItem *, QList<QAction *> >::ConstIterator itToolBar = toolBars.constBegin();
       
  1362     while (itToolBar != toolBars.constEnd()) {
       
  1363         ToolBarItem *item = itToolBar.key();
       
  1364         QToolBar *toolBar = item->toolBar();
       
  1365         if (toolBar) {
       
  1366             toolBarManager->setToolBar(toolBar, itToolBar.value());
       
  1367             toolBar->setWindowTitle(item->toolBarName());
       
  1368         }
       
  1369 
       
  1370         ++itToolBar;
       
  1371     }
       
  1372 
       
  1373     QSet<ToolBarItem *> toRemove = removedItems;
       
  1374     QSetIterator<ToolBarItem *> itRemove(toRemove);
       
  1375     while (itRemove.hasNext()) {
       
  1376         ToolBarItem *item = itRemove.next();
       
  1377         QToolBar *toolBar = item->toolBar();
       
  1378         removedItems.remove(item);
       
  1379         currentState.remove(item);
       
  1380         deleteItem(item);
       
  1381         if (toolBar)
       
  1382             toolBarManager->deleteToolBar(toolBar);
       
  1383     }
       
  1384 
       
  1385     QSet<ToolBarItem *> toCreate = createdItems;
       
  1386     QSetIterator<ToolBarItem *> itCreate(toCreate);
       
  1387     while (itCreate.hasNext()) {
       
  1388         ToolBarItem *item = itCreate.next();
       
  1389         QString toolBarName = item->toolBarName();
       
  1390         createdItems.remove(item);
       
  1391         QList<QAction *> actions = currentState.value(item);
       
  1392         QToolBar *toolBar = toolBarManager->createToolBar(toolBarName);
       
  1393         item->setToolBar(toolBar);
       
  1394         toolBarManager->setToolBar(toolBar, actions);
       
  1395     }
       
  1396 }
       
  1397 
       
  1398 void QtToolBarDialogPrivate::upClicked()
       
  1399 {
       
  1400     QListWidgetItem *currentToolBarAction = ui.currentToolBarList->currentItem();
       
  1401     if (!currentToolBarAction)
       
  1402         return;
       
  1403     int row = ui.currentToolBarList->row(currentToolBarAction);
       
  1404     if (row == 0)
       
  1405         return;
       
  1406     ui.currentToolBarList->takeItem(row);
       
  1407     int newRow = row - 1;
       
  1408     ui.currentToolBarList->insertItem(newRow, currentToolBarAction);
       
  1409     QList<QAction *> actions = currentState.value(currentToolBar);
       
  1410     QAction *action = actions.at(row);
       
  1411     actions.removeAt(row);
       
  1412     actions.insert(newRow, action);
       
  1413     currentState.insert(currentToolBar, actions);
       
  1414     ui.currentToolBarList->setCurrentItem(currentToolBarAction);
       
  1415     setButtons();
       
  1416 }
       
  1417 
       
  1418 void QtToolBarDialogPrivate::downClicked()
       
  1419 {
       
  1420     QListWidgetItem *currentToolBarAction = ui.currentToolBarList->currentItem();
       
  1421     if (!currentToolBarAction)
       
  1422         return;
       
  1423     int row = ui.currentToolBarList->row(currentToolBarAction);
       
  1424     if (row == ui.currentToolBarList->count() - 1)
       
  1425         return;
       
  1426     ui.currentToolBarList->takeItem(row);
       
  1427     int newRow = row + 1;
       
  1428     ui.currentToolBarList->insertItem(newRow, currentToolBarAction);
       
  1429     QList<QAction *> actions = currentState.value(currentToolBar);
       
  1430     QAction *action = actions.at(row);
       
  1431     actions.removeAt(row);
       
  1432     actions.insert(newRow, action);
       
  1433     currentState.insert(currentToolBar, actions);
       
  1434     ui.currentToolBarList->setCurrentItem(currentToolBarAction);
       
  1435     setButtons();
       
  1436 }
       
  1437 
       
  1438 void QtToolBarDialogPrivate::leftClicked()
       
  1439 {
       
  1440     QListWidgetItem *currentToolBarAction = ui.currentToolBarList->currentItem();
       
  1441     if (!currentToolBarAction)
       
  1442         return;
       
  1443     int row = ui.currentToolBarList->row(currentToolBarAction);
       
  1444     currentState[currentToolBar].removeAt(row);
       
  1445     QAction *action = currentItemToAction.value(currentToolBarAction);
       
  1446     if (widgetActionToToolBar.contains(action)) {
       
  1447         ToolBarItem *item = widgetActionToToolBar.value(action);
       
  1448         if (item == currentToolBar) { // have to be
       
  1449             toolBarToWidgetActions[item].remove(action);
       
  1450             if (toolBarToWidgetActions[item].empty())
       
  1451                 toolBarToWidgetActions.remove(item);
       
  1452         }
       
  1453         widgetActionToToolBar.insert(action, 0);
       
  1454     }
       
  1455     if (action)
       
  1456         actionToCurrentItem.remove(action);
       
  1457     currentItemToAction.remove(currentToolBarAction);
       
  1458     delete currentToolBarAction;
       
  1459     if (row == ui.currentToolBarList->count())
       
  1460         row--;
       
  1461     if (row >= 0) {
       
  1462         QListWidgetItem *item = ui.currentToolBarList->item(row);
       
  1463         ui.currentToolBarList->setCurrentItem(item);
       
  1464     }
       
  1465     setButtons();
       
  1466 }
       
  1467 
       
  1468 void QtToolBarDialogPrivate::rightClicked()
       
  1469 {
       
  1470     if (!currentAction)
       
  1471         return;
       
  1472     if (!currentToolBar)
       
  1473         return;
       
  1474     QListWidgetItem *currentToolBarAction = ui.currentToolBarList->currentItem();
       
  1475 
       
  1476     QAction *action = itemToAction.value(currentAction);
       
  1477     QListWidgetItem *item = 0;
       
  1478     if (action) {
       
  1479         if (currentState[currentToolBar].contains(action)) {
       
  1480             item = actionToCurrentItem.value(action);
       
  1481             if (item == currentToolBarAction)
       
  1482                 return;
       
  1483             int row = ui.currentToolBarList->row(item);
       
  1484             ui.currentToolBarList->takeItem(row);
       
  1485             currentState[currentToolBar].removeAt(row);
       
  1486             // only reorder here
       
  1487         } else {
       
  1488             item = new QListWidgetItem(action->text());
       
  1489             item->setIcon(action->icon());
       
  1490             item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic);
       
  1491             currentItemToAction.insert(item, action);
       
  1492             actionToCurrentItem.insert(action, item);
       
  1493             if (widgetActionToToolBar.contains(action)) {
       
  1494                 item->setData(Qt::TextColorRole, QColor(Qt::blue));
       
  1495                 ToolBarItem *toolBar = widgetActionToToolBar.value(action);
       
  1496                 if (toolBar) {
       
  1497                     currentState[toolBar].removeAll(action);
       
  1498                     toolBarToWidgetActions[toolBar].remove(action);
       
  1499                     if (toolBarToWidgetActions[toolBar].empty())
       
  1500                         toolBarToWidgetActions.remove(toolBar);
       
  1501                 }
       
  1502                 widgetActionToToolBar.insert(action, currentToolBar);
       
  1503                 toolBarToWidgetActions[currentToolBar].insert(action);
       
  1504             }
       
  1505         }
       
  1506     } else {
       
  1507         item = new QListWidgetItem(separatorText);
       
  1508         currentItemToAction.insert(item, 0);
       
  1509     }
       
  1510 
       
  1511     int row = ui.currentToolBarList->count();
       
  1512     if (currentToolBarAction) {
       
  1513         row = ui.currentToolBarList->row(currentToolBarAction) + 1;
       
  1514     }
       
  1515     ui.currentToolBarList->insertItem(row, item);
       
  1516     currentState[currentToolBar].insert(row, action);
       
  1517     ui.currentToolBarList->setCurrentItem(item);
       
  1518 
       
  1519     setButtons();
       
  1520 }
       
  1521 
       
  1522 void QtToolBarDialogPrivate::renameClicked()
       
  1523 {
       
  1524     if (!currentToolBar)
       
  1525         return;
       
  1526 
       
  1527     QListWidgetItem *item = toolBarToItem.value(currentToolBar);
       
  1528     ui.toolBarList->editItem(item);
       
  1529 }
       
  1530 
       
  1531 void QtToolBarDialogPrivate::toolBarRenamed(QListWidgetItem *item)
       
  1532 {
       
  1533     if (!currentToolBar)
       
  1534         return;
       
  1535 
       
  1536     ToolBarItem *tbItem = itemToToolBar.value(item);
       
  1537     if (!tbItem)
       
  1538         return;
       
  1539     tbItem->setToolBarName(item->text());
       
  1540     //ui.toolBarList->sortItems();
       
  1541 }
       
  1542 
       
  1543 void QtToolBarDialogPrivate::currentActionChanged(QTreeWidgetItem *current)
       
  1544 {
       
  1545     if (itemToAction.contains(current))
       
  1546         currentAction = current;
       
  1547     else
       
  1548         currentAction = NULL;
       
  1549     setButtons();
       
  1550 }
       
  1551 
       
  1552 void QtToolBarDialogPrivate::currentToolBarChanged(QListWidgetItem *current)
       
  1553 {
       
  1554     currentToolBar = itemToToolBar.value(current);
       
  1555     ui.currentToolBarList->clear();
       
  1556     actionToCurrentItem.clear();
       
  1557     currentItemToAction.clear();
       
  1558     setButtons();
       
  1559     if (!currentToolBar) {
       
  1560         return;
       
  1561     }
       
  1562     QList<QAction *> actions = currentState.value(currentToolBar);
       
  1563     QListIterator<QAction *> itAction(actions);
       
  1564     QListWidgetItem *first = 0;
       
  1565     while (itAction.hasNext()) {
       
  1566         QAction *action = itAction.next();
       
  1567         QString actionName = separatorText;
       
  1568         if (action)
       
  1569             actionName = action->text();
       
  1570         QListWidgetItem *item = new QListWidgetItem(actionName, ui.currentToolBarList);
       
  1571         if (action) {
       
  1572             item->setIcon(action->icon());
       
  1573             item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic);
       
  1574             actionToCurrentItem.insert(action, item);
       
  1575             if (widgetActionToToolBar.contains(action))
       
  1576                 item->setData(Qt::TextColorRole, QColor(Qt::blue));
       
  1577         }
       
  1578         currentItemToAction.insert(item, action);
       
  1579         if (!first)
       
  1580             first = item;
       
  1581     }
       
  1582     if (first)
       
  1583         ui.currentToolBarList->setCurrentItem(first);
       
  1584 }
       
  1585 
       
  1586 void QtToolBarDialogPrivate::currentToolBarActionChanged(QListWidgetItem *)
       
  1587 {
       
  1588     setButtons();
       
  1589 }
       
  1590 
       
  1591 void QtToolBarDialogPrivate::cancelClicked()
       
  1592 {
       
  1593     // just nothing
       
  1594     q_ptr->reject();
       
  1595 }
       
  1596 
       
  1597 //////////////////////
       
  1598 /*
       
  1599 class FeedbackItemDelegate : public QItemDelegate
       
  1600 {
       
  1601     Q_OBJECT
       
  1602 public:
       
  1603     FeedbackItemDelegate(QObject *parent = 0) : QItemDelegate(parent) { }
       
  1604 
       
  1605     virtual void paint(QPainter *painter, const QStyleOptionViewItem &option,
       
  1606                     const QModelIndex & index) const;
       
  1607     virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
       
  1608 };
       
  1609 
       
  1610 void FeedbackItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
       
  1611                             const QModelIndex &index) const
       
  1612 {
       
  1613     if ()
       
  1614     painter->save();
       
  1615     QRect r = option.rect;
       
  1616     float yCentral = r.height() / 2.0;
       
  1617     float margin = 2.0;
       
  1618     float arrowWidth = 5.0;
       
  1619     float width = 20;
       
  1620     qDebug("rect: x %d, y %d, w %d, h %d", r.x(), r.y(), r.width(), r.height());
       
  1621     QLineF lineBase(0.0 + margin, r.y() + yCentral, width - margin, r.y() + yCentral);
       
  1622     QLineF lineArrowLeft(width - margin - arrowWidth, r.y() + yCentral - arrowWidth,
       
  1623                     width - margin, r.y() + yCentral);
       
  1624     QLineF lineArrowRight(width - margin - arrowWidth, r.y() + yCentral + arrowWidth,
       
  1625                     width - margin, r.y() + yCentral);
       
  1626     painter->drawLine(lineBase);
       
  1627     painter->drawLine(lineArrowLeft);
       
  1628     painter->drawLine(lineArrowRight);
       
  1629     painter->translate(QPoint(width, 0));
       
  1630     QItemDelegate::paint(painter, option, index);
       
  1631     painter->restore();
       
  1632 }
       
  1633 
       
  1634 QSize FeedbackItemDelegate::sizeHint(const QStyleOptionViewItem &option,
       
  1635             const QModelIndex &index) const
       
  1636 {
       
  1637     //return QItemDelegate::sizeHint(option, index);
       
  1638     QSize s = QItemDelegate::sizeHint(option, index);
       
  1639     s.setWidth(s.width() - 20);
       
  1640     return s;
       
  1641 }
       
  1642 
       
  1643 class QtToolBarListWidget : public QListWidget
       
  1644 {
       
  1645     Q_OBJECT
       
  1646 public:
       
  1647     QtToolBarListWidget(QWidget *parent) : QListWidget(parent), actionDrag(false) {}
       
  1648 
       
  1649 protected:
       
  1650     void startDrag(Qt::DropActions supportedActions);
       
  1651 
       
  1652     void dragEnterEvent(QDragEnterEvent *event);
       
  1653     void dragMoveEvent(QDragMoveEvent *event);
       
  1654     void dragLeaveEvent(QDragLeaveEvent *);
       
  1655     void dropEvent(QDropEvent *event);
       
  1656 
       
  1657     void setDragAction(const QString *action) { actionName = action; }
       
  1658 private:
       
  1659     QPersistentModelIndex lastDropIndicator;
       
  1660     QString actionName;
       
  1661     bool actionDrag;
       
  1662 };
       
  1663 
       
  1664 void QtToolBarListWidget::startDrag(Qt::DropActions supportedActions)
       
  1665 {
       
  1666     QListWidgetItem *item = currentItem();
       
  1667     if (item) {
       
  1668         actionName = QString();
       
  1669         emit aboutToDrag(item);
       
  1670         if (!actionName.isEmpty()) {
       
  1671             QDrag *drag = new QDrag(this);
       
  1672             QMimeData *data = new QMimeData;
       
  1673             data->setData("action", actionName.toLocal8Bit().constData());
       
  1674             drag->setMimeData(data);
       
  1675             drag->start(supportedActions);
       
  1676         }
       
  1677     }
       
  1678 }
       
  1679 
       
  1680 void QtToolBarListWidget::dragEnterEvent(QDragEnterEvent *event)
       
  1681 {
       
  1682     const QMimeData *mime = event->mimeData();
       
  1683     actionDrag = mime->hasFormat("action");
       
  1684     if (actionDrag)
       
  1685         event->accept();
       
  1686     else
       
  1687         event->ignore();
       
  1688 }
       
  1689 
       
  1690 void QtToolBarListWidget::dragMoveEvent(QDragMoveEvent *event)
       
  1691 {
       
  1692     event->ignore();
       
  1693     if (actionDrag) {
       
  1694         QPoint p = event->pos();
       
  1695         QListWidgetItem *item = itemAt(p);
       
  1696         Indicator indic = QtToolBarListWidget::None;
       
  1697         if (item) {
       
  1698             QRect rect = visualItemRect(item);
       
  1699             if (p.y() - rect.top() < rect.height() / 2)
       
  1700                 indic = QtToolBarListWidget::Above;
       
  1701             else
       
  1702                 indic = QtToolBarListWidget::Below;
       
  1703         }
       
  1704         setIndicator(item, indic);
       
  1705         event->accept();
       
  1706     }
       
  1707 }
       
  1708 
       
  1709 void QtToolBarListWidget::dragLeaveEvent(QDragLeaveEvent *)
       
  1710 {
       
  1711     if (actionDrag) {
       
  1712         actionDrag = false;
       
  1713         setIndicator(item, QtToolBarListWidget::None);
       
  1714     }
       
  1715 }
       
  1716 
       
  1717 void QtToolBarListWidget::dropEvent(QDropEvent *event)
       
  1718 {
       
  1719     if (actionDrag) {
       
  1720         QListWidgetItem *item = indicatorItem();
       
  1721         Indicator indic = indicator();
       
  1722         QByteArray array = event->mimeData()->data("action");
       
  1723         QDataStream stream(&array, QIODevice::ReadOnly);
       
  1724         QString action;
       
  1725         stream >> action;
       
  1726         emit actionDropped(action, item, );
       
  1727 
       
  1728         actionDrag = false;
       
  1729         setIndicator(item, QtToolBarListWidget::None);
       
  1730     }
       
  1731 }
       
  1732 */
       
  1733 
       
  1734 /*! \class QtToolBarDialog
       
  1735     \internal
       
  1736     \inmodule QtDesigner
       
  1737     \since 4.4
       
  1738 
       
  1739     \brief The QtToolBarDialog class provides a dialog for customizing
       
  1740     toolbars.
       
  1741 
       
  1742     QtToolBarDialog allows the user to customize the toolbars for a
       
  1743     given main window.
       
  1744 
       
  1745     \image qttoolbardialog.png
       
  1746 
       
  1747     The dialog lets the users add, rename and remove custom toolbars.
       
  1748     Note that built-in toolbars are marked with a green color, and
       
  1749     cannot be removed or renamed.
       
  1750 
       
  1751     The users can also add and remove actions from the toolbars. An
       
  1752     action can be added to many toolbars, but a toolbar can only
       
  1753     contain one instance of each action. Actions that contains a
       
  1754     widget are marked with a blue color in the list of actions, and
       
  1755     can only be added to one single toolbar.
       
  1756 
       
  1757     Finally, the users can add separators to the toolbars.
       
  1758 
       
  1759     The original toolbars can be restored by clicking the \gui
       
  1760     {Restore all} button. All custom toolbars will then be removed,
       
  1761     and all built-in toolbars will be restored to their original state.
       
  1762 
       
  1763     The QtToolBarDialog class's functionality is controlled by an
       
  1764     instance of the QtToolBarManager class, and the main window is
       
  1765     specified using the QtToolBarManager::setMainWindow() function.
       
  1766 
       
  1767     All you need to do to use QtToolBarDialog is to specify an
       
  1768     QtToolBarManager instance and call the QDialog::exec() slot:
       
  1769 
       
  1770     \snippet doc/src/snippets/code/tools_shared_qttoolbardialog_qttoolbardialog.cpp 0
       
  1771 
       
  1772     \sa QtToolBarManager
       
  1773 */
       
  1774 
       
  1775 /*!
       
  1776     Creates a toolbar dialog with the given \a parent and the specified
       
  1777     window \a flags.
       
  1778 */
       
  1779 QtToolBarDialog::QtToolBarDialog(QWidget *parent, Qt::WindowFlags flags)
       
  1780     : QDialog(parent, flags), d_ptr(new QtToolBarDialogPrivate)
       
  1781 {
       
  1782     d_ptr->q_ptr = this;
       
  1783     d_ptr->ui.setupUi(this);
       
  1784     d_ptr->separatorText = tr("< S E P A R A T O R >");
       
  1785 
       
  1786     d_ptr->ui.actionTree->setColumnCount(1);
       
  1787     d_ptr->ui.actionTree->setRootIsDecorated(false);
       
  1788     d_ptr->ui.actionTree->header()->hide();
       
  1789 
       
  1790     d_ptr->ui.upButton->setIcon(QIcon(QLatin1String(":/trolltech/qttoolbardialog/images/up.png")));
       
  1791     d_ptr->ui.downButton->setIcon(QIcon(QLatin1String(":/trolltech/qttoolbardialog/images/down.png")));
       
  1792     d_ptr->ui.leftButton->setIcon(QIcon(QLatin1String(":/trolltech/qttoolbardialog/images/back.png")));
       
  1793     d_ptr->ui.rightButton->setIcon(QIcon(QLatin1String(":/trolltech/qttoolbardialog/images/forward.png")));
       
  1794     d_ptr->ui.newButton->setIcon(QIcon(QLatin1String(":/trolltech/qttoolbardialog/images/plus.png")));
       
  1795     d_ptr->ui.removeButton->setIcon(QIcon(QLatin1String(":/trolltech/qttoolbardialog/images/minus.png")));
       
  1796 
       
  1797     connect(d_ptr->ui.newButton, SIGNAL(clicked()), this, SLOT(newClicked()));
       
  1798     connect(d_ptr->ui.removeButton, SIGNAL(clicked()), this, SLOT(removeClicked()));
       
  1799     connect(d_ptr->ui.renameButton, SIGNAL(clicked()), this, SLOT(renameClicked()));
       
  1800     connect(d_ptr->ui.upButton, SIGNAL(clicked()), this, SLOT(upClicked()));
       
  1801     connect(d_ptr->ui.downButton, SIGNAL(clicked()), this, SLOT(downClicked()));
       
  1802     connect(d_ptr->ui.leftButton, SIGNAL(clicked()), this, SLOT(leftClicked()));
       
  1803     connect(d_ptr->ui.rightButton, SIGNAL(clicked()), this, SLOT(rightClicked()));
       
  1804 
       
  1805     connect(d_ptr->ui.buttonBox->button(QDialogButtonBox::RestoreDefaults), SIGNAL(clicked()), this, SLOT(defaultClicked()));
       
  1806     connect(d_ptr->ui.buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(okClicked()));
       
  1807     connect(d_ptr->ui.buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(applyClicked()));
       
  1808     connect(d_ptr->ui.buttonBox->button(QDialogButtonBox::Cancel), SIGNAL(clicked()), this, SLOT(cancelClicked()));
       
  1809 
       
  1810     connect(d_ptr->ui.actionTree, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)),
       
  1811                     this, SLOT(currentActionChanged(QTreeWidgetItem *)));
       
  1812     connect(d_ptr->ui.toolBarList, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)),
       
  1813                     this, SLOT(currentToolBarChanged(QListWidgetItem *)));
       
  1814     connect(d_ptr->ui.currentToolBarList,
       
  1815                     SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)),
       
  1816                     this, SLOT(currentToolBarActionChanged(QListWidgetItem *)));
       
  1817 
       
  1818     connect(d_ptr->ui.actionTree, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),
       
  1819                     this, SLOT(rightClicked()));
       
  1820     connect(d_ptr->ui.currentToolBarList, SIGNAL(itemDoubleClicked(QListWidgetItem *)),
       
  1821                     this, SLOT(leftClicked()));
       
  1822     connect(d_ptr->ui.toolBarList, SIGNAL(itemChanged(QListWidgetItem *)),
       
  1823                     this, SLOT(toolBarRenamed(QListWidgetItem *)));
       
  1824 }
       
  1825 
       
  1826 /*!
       
  1827     Destroys the toolbar dialog.
       
  1828 */
       
  1829 QtToolBarDialog::~QtToolBarDialog()
       
  1830 {
       
  1831     d_ptr->clearOld();
       
  1832 }
       
  1833 
       
  1834 /*!
       
  1835     Connects the toolbar dialog to the given \a toolBarManager. Then,
       
  1836     when exec() is called, the toolbar dialog will operate using the
       
  1837     given \a toolBarManager.
       
  1838 */
       
  1839 void QtToolBarDialog::setToolBarManager(QtToolBarManager *toolBarManager)
       
  1840 {
       
  1841     if (d_ptr->toolBarManager == toolBarManager->d_ptr->manager)
       
  1842         return;
       
  1843     if (isVisible())
       
  1844         d_ptr->clearOld();
       
  1845     d_ptr->toolBarManager = toolBarManager->d_ptr->manager;
       
  1846     if (isVisible())
       
  1847         d_ptr->fillNew();
       
  1848 }
       
  1849 
       
  1850 /*!
       
  1851     \reimp
       
  1852 */
       
  1853 void QtToolBarDialog::showEvent(QShowEvent *event)
       
  1854 {
       
  1855     if (!event->spontaneous())
       
  1856         d_ptr->fillNew();
       
  1857 }
       
  1858 
       
  1859 /*!
       
  1860     \reimp
       
  1861 */
       
  1862 void QtToolBarDialog::hideEvent(QHideEvent *event)
       
  1863 {
       
  1864     if (!event->spontaneous())
       
  1865         d_ptr->clearOld();
       
  1866 }
       
  1867 
       
  1868 QT_END_NAMESPACE
       
  1869 
       
  1870 #include "moc_qttoolbardialog.cpp"
       
  1871 #include "qttoolbardialog.moc"