/********************************************************************** ** Copyright (C) 2000-2008 Trolltech ASA. All rights reserved. ** ** This file is part of Qt Designer. ** ** This file may be used under the terms of the GNU General ** Public License versions 2.0 or 3.0 as published by the Free ** Software Foundation and appearing in the files LICENSE.GPL2 ** and LICENSE.GPL3 included in the packaging of this file. ** Alternatively you may (at your option) use any later version ** of the GNU General Public License if such license has been ** publicly approved by Trolltech ASA (or its successors, if any) ** and the KDE Free Qt Foundation. ** ** Please review the following information to ensure GNU General ** Public Licensing requirements will be met: ** http://trolltech.com/products/qt/licenses/licensing/opensource/. ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://trolltech.com/products/qt/licenses/licensing/licensingoverview ** or contact the sales department at sales@trolltech.com. ** ** Licensees holding valid Qt Commercial licenses may use this file in ** accordance with the Qt Commercial License Agreement provided with ** the Software. ** ** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, ** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted ** herein. ** **********************************************************************/ #ifndef COMMAND_H #define COMMAND_H #include "metadatabase.h" #include "layout.h" #include #include #include #include #include #include #include #include #include class QWizard; class QTabWidget; class Command; class QWidget; class FormWindow; class PropertyEditor; class QListBox; class QIconView; class QTable; class QAction; class QDesignerToolBar; class QMainWindow; class QTextEdit; struct LanguageInterface; class QToolBox; class MenuBarEditor; class MenuBarEditorItem; class PopupMenuEditor; class PopupMenuEditorItem; class ActionEditor; class Command : public Qt { public: Command( const QString &n, FormWindow *fw ); virtual ~Command(); enum Type { Resize, Insert, Move, Delete, SetProperty, LayoutHorizontal, LayoutVertical, LayoutHorizontalSplitter, LayoutVerticalSplitter, LayoutGrid, BreakLayout, Macro, AddTabPage, DeleteTabPage, MoveTabPage, AddWidgetStackPage, DeleteWidgetStackPage, AddWizardPage, DeleteWizardPage, SwapWizardPages, MoveWizardPage, RenameWizardPage, AddConnection, RemoveConnection, Lower, Raise, Paste, TabOrder, PopulateListBox, PopulateIconView, PopulateListView, PopulateMultiLineEdit, PopulateTable, AddActionToToolBar, RemoveActionFromToolBar, AddToolBar, RemoveToolBar, AddFunction, ChangeFunctionAttrib, RemoveFunction, AddVariable, SetVariables, RemoveVariable, EditDefinitions, AddContainerPage, DeleteContainerPage, RenameContainerPage, AddActionToPopup, RemoveActionFromPopup, ExchangeActionInPopup, //MoveActionInPopup, RenameAction, SetActionIcons, AddMenu, RemoveMenu, ExchangeMenu, MoveMenu, RenameMenu, AddToolBoxPage, DeleteToolBoxPage }; QString name() const; virtual void execute() = 0; virtual void unexecute() = 0; virtual Type type() const = 0; virtual void merge( Command *c ); virtual bool canMerge( Command *c ); FormWindow *formWindow() const; private: QString cmdName; FormWindow *formWin; }; class CommandHistory : public QObject { Q_OBJECT public: CommandHistory( int s ); void addCommand( Command *cmd, bool tryCompress = FALSE ); void undo(); void redo(); void emitUndoRedo(); void setModified( bool m ); bool isModified() const; public slots: void checkCompressedCommand(); signals: void undoRedoChanged( bool undoAvailable, bool redoAvailable, const QString &undoCmd, const QString &redoCmd ); void modificationChanged( bool m ); private: QPtrList history; int current, steps; bool modified; int savedAt; Command *compressedCommand; }; class ResizeCommand : public Command { public: ResizeCommand( const QString &n, FormWindow *fw, QWidget *w, const QRect &oldr, const QRect &nr ); void execute(); void unexecute(); Type type() const { return Resize; } private: QWidget *widget; QRect oldRect, newRect; }; class InsertCommand : public Command { public: InsertCommand( const QString &n, FormWindow *fw, QWidget *w, const QRect &g ); void execute(); void unexecute(); Type type() const { return Insert; } private: QWidget *widget; QRect geometry; }; class MoveCommand : public Command { public: MoveCommand( const QString &n, FormWindow *fw, const QWidgetList &w, const QValueList op, const QValueList np, QWidget *opr, QWidget *npr ); void execute(); void unexecute(); Type type() const { return Move; } void merge( Command *c ); bool canMerge( Command *c ); private: QWidgetList widgets; QValueList oldPos, newPos; QWidget *oldParent, *newParent; }; class DeleteCommand : public Command { public: DeleteCommand( const QString &n, FormWindow *fw, const QWidgetList &w ); void execute(); void unexecute(); Type type() const { return Delete; } private: QWidgetList widgets; QMap< QWidget*, QValueList > connections; }; class SetPropertyCommand : public Command { public: SetPropertyCommand( const QString &n, FormWindow *fw, QObject *w, PropertyEditor *e, const QString &pn, const QVariant &ov, const QVariant &nv, const QString &ncut, const QString &ocut, bool reset = FALSE ); void execute(); void unexecute(); Type type() const { return SetProperty; } void merge( Command *c ); bool canMerge( Command *c ); bool checkProperty(); private: void setProperty( const QVariant &v, const QString ¤tItemText, bool select = TRUE ); QGuardedPtr widget; PropertyEditor *editor; QString propName; QVariant oldValue, newValue; QString oldCurrentItemText, newCurrentItemText; bool wasChanged; bool isResetCommand; }; class LayoutHorizontalCommand : public Command { public: LayoutHorizontalCommand( const QString &n, FormWindow *fw, QWidget *parent, QWidget *layoutBase, const QWidgetList &wl ); void execute(); void unexecute(); Type type() const { return LayoutHorizontal; } private: HorizontalLayout layout; }; class LayoutHorizontalSplitCommand : public Command { public: LayoutHorizontalSplitCommand( const QString &n, FormWindow *fw, QWidget *parent, QWidget *layoutBase, const QWidgetList &wl ); void execute(); void unexecute(); Type type() const { return LayoutHorizontalSplitter; } private: HorizontalLayout layout; }; class LayoutVerticalCommand : public Command { public: LayoutVerticalCommand( const QString &n, FormWindow *fw, QWidget *parent, QWidget *layoutBase, const QWidgetList &wl ); void execute(); void unexecute(); Type type() const { return LayoutVertical; } private: VerticalLayout layout; }; class LayoutVerticalSplitCommand : public Command { public: LayoutVerticalSplitCommand( const QString &n, FormWindow *fw, QWidget *parent, QWidget *layoutBase, const QWidgetList &wl ); void execute(); void unexecute(); Type type() const { return LayoutVerticalSplitter; } private: VerticalLayout layout; }; class LayoutGridCommand : public Command { public: LayoutGridCommand( const QString &n, FormWindow *fw, QWidget *parent, QWidget *layoutBase, const QWidgetList &wl, int xres, int yres ); void execute(); void unexecute(); Type type() const { return LayoutGrid; } private: GridLayout layout; }; class BreakLayoutCommand : public Command { public: BreakLayoutCommand( const QString &n, FormWindow *fw, QWidget *layoutBase, const QWidgetList &wl ); void execute(); void unexecute(); Type type() const { return BreakLayout; } private: Layout *layout; int spacing; int margin; QWidget *lb; QWidgetList widgets; }; class MacroCommand : public Command { public: MacroCommand( const QString &n, FormWindow *fw, const QPtrList &cmds ); void execute(); void unexecute(); Type type() const { return Macro; } private: QPtrList commands; }; class AddTabPageCommand : public Command { public: AddTabPageCommand( const QString &n, FormWindow *fw, QTabWidget *tw, const QString &label ); void execute(); void unexecute(); Type type() const { return AddTabPage; } private: QTabWidget *tabWidget; int index; QWidget *tabPage; QString tabLabel; }; class DeleteTabPageCommand : public Command { public: DeleteTabPageCommand( const QString &n, FormWindow *fw, QTabWidget *tw, QWidget *page ); void execute(); void unexecute(); Type type() const { return DeleteTabPage; } private: QTabWidget *tabWidget; int index; QWidget *tabPage; QString tabLabel; }; class MoveTabPageCommand : public Command { public: MoveTabPageCommand(const QString &n, FormWindow *fw, QTabWidget *tw, QWidget *page, const QString& label, int nIndex, int oIndex ); void execute(); void unexecute(); Type type() const { return MoveTabPage; } private: QTabWidget *tabWidget; int newIndex, oldIndex; QWidget *tabPage; QString tabLabel; }; class QDesignerWidgetStack; class AddWidgetStackPageCommand : public Command { public: AddWidgetStackPageCommand( const QString &n, FormWindow *fw, QDesignerWidgetStack *ws ); void execute(); void unexecute(); Type type() const { return AddWidgetStackPage; } private: QDesignerWidgetStack *widgetStack; int index; QWidget *stackPage; }; class DeleteWidgetStackPageCommand : public Command { public: DeleteWidgetStackPageCommand( const QString &n, FormWindow *fw, QDesignerWidgetStack *ws, QWidget *page ); void execute(); void unexecute(); Type type() const { return DeleteWidgetStackPage; } private: QDesignerWidgetStack *widgetStack; int index; QWidget *stackPage; }; class AddWizardPageCommand : public Command { public: AddWizardPageCommand( const QString &n, FormWindow *fw, QWizard *w, const QString &label, int index = -1, bool show = TRUE ); void execute(); void unexecute(); Type type() const { return AddWizardPage; } private: QWizard *wizard; int index; bool show; QWidget *page; QString pageLabel; }; class DeleteWizardPageCommand : public Command { public: DeleteWizardPageCommand( const QString &n, FormWindow *fw, QWizard *w, int index, bool show = TRUE ); void execute(); void unexecute(); Type type() const { return DeleteWizardPage; } private: QWizard *wizard; int index; bool show; QWidget *page; QString pageLabel; }; class RenameWizardPageCommand : public Command { public: RenameWizardPageCommand( const QString &n, FormWindow *fw, QWizard *w, int index, const QString& name ); void execute(); void unexecute(); Type type() const { return RenameWizardPage; } private: QWizard *wizard; int index; QWidget *page; QString label; }; class SwapWizardPagesCommand : public Command { public: SwapWizardPagesCommand( const QString &n, FormWindow *fw, QWizard *w, int index1, int index2 ); void execute(); void unexecute(); Type type() const { return SwapWizardPages; } private: QWizard *wizard; int index1, index2; }; class MoveWizardPageCommand : public Command { public: MoveWizardPageCommand( const QString &n, FormWindow *fw, QWizard *w, int index1, int index2 ); void execute(); void unexecute(); Type type() const { return MoveWizardPage; } private: QWizard *wizard; int index1, index2; }; class AddConnectionCommand : public Command { public: AddConnectionCommand( const QString &name, FormWindow *fw, MetaDataBase::Connection c ); void execute(); void unexecute(); Type type() const { return AddConnection; } private: MetaDataBase::Connection connection; }; class RemoveConnectionCommand : public Command { public: RemoveConnectionCommand( const QString &name, FormWindow *fw, MetaDataBase::Connection c ); void execute(); void unexecute(); Type type() const { return RemoveConnection; } private: MetaDataBase::Connection connection; }; class AddFunctionCommand : public Command { public: AddFunctionCommand( const QString &name, FormWindow *fw, const QCString &f, const QString& spec, const QString &a, const QString &t, const QString &l, const QString &rt ); void execute(); void unexecute(); Type type() const { return AddFunction; } private: QCString function; QString specifier; QString access; QString functionType; QString language; QString returnType; }; class ChangeFunctionAttribCommand : public Command { public: ChangeFunctionAttribCommand( const QString &name, FormWindow *fw, MetaDataBase::Function f, const QString &on, const QString &os, const QString &oa, const QString &ot, const QString &ol, const QString &ort ); void execute(); void unexecute(); Type type() const { return ChangeFunctionAttrib; } private: QString oldName, newName; QString oldSpec, newSpec; QString oldAccess, newAccess; QString oldType, newType; QString oldLang, newLang; QString oldReturnType, newReturnType; }; class RemoveFunctionCommand : public Command { public: RemoveFunctionCommand( const QString &name, FormWindow *fw, const QCString &f, const QString& spec, const QString &a, const QString &t, const QString &l, const QString &rt ); void execute(); void unexecute(); Type type() const { return RemoveFunction; } private: QCString function; QString specifier; QString access; QString functionType; QString language; QString returnType; }; class AddVariableCommand : public Command { public: AddVariableCommand( const QString &name, FormWindow *fw, const QString &vn, const QString &a ); void execute(); void unexecute(); Type type() const { return AddVariable; } private: QString varName; QString access; }; class SetVariablesCommand : public Command { public: SetVariablesCommand( const QString &name, FormWindow *fw, QValueList lst ); void execute(); void unexecute(); Type type() const { return SetVariables; } private: QValueList oldList, newList; }; class RemoveVariableCommand : public Command { public: RemoveVariableCommand( const QString &name, FormWindow *fw, const QString &vn ); void execute(); void unexecute(); Type type() const { return RemoveVariable; } private: QString varName; QString access; }; class EditDefinitionsCommand : public Command { public: EditDefinitionsCommand( const QString &name, FormWindow *fw, LanguageInterface *lf, const QString &n, const QStringList &l ); void execute(); void unexecute(); Type type() const { return EditDefinitions; } private: LanguageInterface *lIface; QString defName; QStringList newList, oldList; }; class LowerCommand : public Command { public: LowerCommand( const QString &name, FormWindow *fw, const QWidgetList &w ); void execute(); void unexecute(); Type type() const { return Lower; } private: QWidgetList widgets; }; class RaiseCommand : public Command { public: RaiseCommand( const QString &name, FormWindow *fw, const QWidgetList &w ); void execute(); void unexecute(); Type type() const { return Raise; } private: QWidgetList widgets; }; class PasteCommand : public Command { public: PasteCommand( const QString &n, FormWindow *fw, const QWidgetList &w ); void execute(); void unexecute(); Type type() const { return Paste; } private: QWidgetList widgets; }; class TabOrderCommand : public Command { public: TabOrderCommand( const QString &n, FormWindow *fw, const QWidgetList &ol, const QWidgetList &nl ); void execute(); void unexecute(); Type type() const { return TabOrder; } void merge( Command *c ); bool canMerge( Command *c ); private: QWidgetList oldOrder, newOrder; }; class PopulateListBoxCommand : public Command { public: struct Item { QString text; QPixmap pix; Q_DUMMY_COMPARISON_OPERATOR( Item ) }; PopulateListBoxCommand( const QString &n, FormWindow *fw, QListBox *lb, const QValueList &items ); void execute(); void unexecute(); Type type() const { return PopulateListBox; } bool operator==( const PopulateListBoxCommand & ) const; private: QValueList oldItems, newItems; QListBox *listbox; }; class PopulateIconViewCommand : public Command { public: struct Item { QString text; QPixmap pix; Q_DUMMY_COMPARISON_OPERATOR( Item ) }; PopulateIconViewCommand( const QString &n, FormWindow *fw, QIconView *iv, const QValueList &items ); void execute(); void unexecute(); Type type() const { return PopulateIconView; } bool operator==( const PopulateIconViewCommand & ) const; private: QValueList oldItems, newItems; QIconView *iconview; }; class PopulateListViewCommand : public Command { public: PopulateListViewCommand( const QString &n, FormWindow *fw, QListView *lv, QListView *from ); void execute(); void unexecute(); Type type() const { return PopulateListView; } static void transferItems( QListView *from, QListView *to ); bool operator==( const PopulateListViewCommand & ) const; private: QListView *oldItems, *newItems; QListView *listview; }; class PopulateMultiLineEditCommand : public Command { public: PopulateMultiLineEditCommand( const QString &n, FormWindow *fw, QTextEdit *mle, const QString &txt ); void execute(); void unexecute(); Type type() const { return PopulateMultiLineEdit; } private: QString newText, oldText; QTextEdit *mlined; bool wasChanged; }; class PopulateTableCommand : public Command { public: struct Row { QString text; QPixmap pix; Q_DUMMY_COMPARISON_OPERATOR( Row ) }; struct Column { QString text; QPixmap pix; QString field; Q_DUMMY_COMPARISON_OPERATOR( Column ) }; PopulateTableCommand( const QString &n, FormWindow *fw, QTable *t, const QValueList &rows, const QValueList &columns ); void execute(); void unexecute(); Type type() const { return PopulateTable; } private: QValueList oldRows, newRows; QValueList oldColumns, newColumns; QTable *table; }; class AddActionToToolBarCommand : public Command { public: AddActionToToolBarCommand( const QString &n, FormWindow *fw, QAction *a, QDesignerToolBar *tb, int idx ); void execute(); void unexecute(); Type type() const { return AddActionToToolBar; } private: QAction *action; QDesignerToolBar *toolBar; int index; }; class RemoveActionFromToolBarCommand : public AddActionToToolBarCommand { public: RemoveActionFromToolBarCommand( const QString &n, FormWindow *fw, QAction *a, QDesignerToolBar *tb, int idx ) : AddActionToToolBarCommand( n, fw, a, tb, idx ) {} void execute() { AddActionToToolBarCommand::unexecute(); } void unexecute() { AddActionToToolBarCommand::execute(); } Type type() const { return RemoveActionFromToolBar; } }; // MenuCommands class AddToolBarCommand : public Command { public: AddToolBarCommand( const QString &n, FormWindow *fw, QMainWindow *mw ); void execute(); void unexecute(); Type type() const { return AddToolBar; } protected: QDesignerToolBar *toolBar; QMainWindow *mainWindow; }; class RemoveToolBarCommand : public AddToolBarCommand { public: RemoveToolBarCommand( const QString &n, FormWindow *fw, QMainWindow *mw, QDesignerToolBar *tb ) : AddToolBarCommand( n, fw, mw ) { toolBar = tb; } void execute() { AddToolBarCommand::unexecute(); } void unexecute() { AddToolBarCommand::execute(); } Type type() const { return RemoveToolBar; } }; struct QWidgetContainerInterfacePrivate; class AddContainerPageCommand : public Command { public: AddContainerPageCommand( const QString &n, FormWindow *fw, QWidget *c, const QString &label ); ~AddContainerPageCommand(); void execute(); void unexecute(); Type type() const { return AddContainerPage; } private: QString wClassName; QWidget *container; int index; QString pageLabel; QWidget *page; QWidgetContainerInterfacePrivate *wiface; }; class DeleteContainerPageCommand : public Command { public: DeleteContainerPageCommand( const QString &n, FormWindow *fw, QWidget *container, int index ); ~DeleteContainerPageCommand(); void execute(); void unexecute(); Type type() const { return DeleteContainerPage; } private: QString wClassName; QWidget *container; int index; QString pageLabel; QWidget *page; QWidgetContainerInterfacePrivate *wiface; }; class RenameContainerPageCommand : public Command { public: RenameContainerPageCommand( const QString &n, FormWindow *fw, QWidget *container, int index, const QString &label ); ~RenameContainerPageCommand(); void execute(); void unexecute(); Type type() const { return RenameContainerPage; } private: QString wClassName; QWidget *container; int index; QString oldLabel, newLabel; QWidgetContainerInterfacePrivate *wiface; }; class AddActionToPopupCommand : public Command { public: AddActionToPopupCommand( const QString &n, FormWindow *fw, PopupMenuEditor *m, PopupMenuEditorItem *i, int idx = -1 ); void execute(); void unexecute(); Type type() const { return AddActionToPopup; } protected: QString constructName() const; PopupMenuEditor *menu; PopupMenuEditorItem *item; int index; private: }; class RemoveActionFromPopupCommand : public AddActionToPopupCommand { public: RemoveActionFromPopupCommand( const QString &n, FormWindow *fw, PopupMenuEditor *m, int idx ); void execute(); void unexecute(); Type type() const { return RemoveActionFromPopup; } protected: private: }; class ExchangeActionInPopupCommand : public Command { public: ExchangeActionInPopupCommand( const QString &n, FormWindow *fw, PopupMenuEditor *m, int a, int b ); void execute(); void unexecute(); Type type() const { return ExchangeActionInPopup; } protected: private: PopupMenuEditor *menu; int c; int d; }; /* class MoveActionInPopupCommand : public Command { public: MoveActionInPopupCommand( const QString &n, FormWindow *fw, PopupMenuEditor *m, int a, int b ); void execute(); void unexecute(); Type type() const { return MoveActionInPopup; } protected: private: PopupMenuEditor *menu; int from; int to; }; */ class ActionCommand : public Command { public: ActionCommand( const QString &n, FormWindow *fw, QAction *a ) : Command( n, fw ), action( a ) { } virtual Type type() const = 0; protected: ActionEditor *actionEditor(); QAction *action; }; class RenameActionCommand : public ActionCommand { public: RenameActionCommand( const QString &n, FormWindow *fw, QAction *a, PopupMenuEditor *m, QString nm ); void execute(); void unexecute(); Type type() const { return RenameAction; } private: PopupMenuEditor *menu; QString newName; QString oldName; }; class SetActionIconsCommand : public ActionCommand { public: SetActionIconsCommand( const QString &n, FormWindow *fw, QAction *a, PopupMenuEditor *m, QIconSet &icons ); void execute(); void unexecute(); Type type() const { return SetActionIcons; } protected: void updateActionEditorItem(); private: PopupMenuEditor *menu; QIconSet newIcons; QIconSet oldIcons; }; class AddMenuCommand : public Command { public: AddMenuCommand( const QString &n, FormWindow *fw, MenuBarEditor *b, MenuBarEditorItem *i, int idx = -1 ); AddMenuCommand( const QString &n, FormWindow *fw, QMainWindow *mw, const QString &nm = "Menu" ); void execute(); void unexecute(); Type type() const { return AddMenu; } protected: MenuBarEditor *mb; MenuBarEditorItem *item; QString name; int index; private: }; class RemoveMenuCommand : public AddMenuCommand { public: RemoveMenuCommand( const QString &n, FormWindow *fw, MenuBarEditor *b, int idx ); void execute(); void unexecute(); Type type() const { return RemoveMenu; } protected: private: }; class ExchangeMenuCommand : public Command { public: ExchangeMenuCommand( const QString &n, FormWindow *fw, MenuBarEditor *b, int i, int j ); void execute(); void unexecute(); Type type() const { return ExchangeMenu; } protected: private: MenuBarEditor *bar; int k; int l; }; class MoveMenuCommand : public Command { public: MoveMenuCommand( const QString &n, FormWindow *fw, MenuBarEditor *b, int i, int j ); void execute(); void unexecute(); Type type() const { return MoveMenu; } protected: private: MenuBarEditor *bar; int from; int to; }; class RenameMenuCommand : public Command { public: RenameMenuCommand( const QString &n, FormWindow *fw, MenuBarEditor *m, QString nm, MenuBarEditorItem *i ); void execute(); void unexecute(); Type type() const { return RenameMenu; } static QString makeLegal( const QString &str ); private: MenuBarEditor *bar; MenuBarEditorItem *item; QString newName; QString oldName; }; class AddToolBoxPageCommand : public Command { public: AddToolBoxPageCommand( const QString &n, FormWindow *fw, QToolBox *tw, const QString &label ); void execute(); void unexecute(); Type type() const { return AddToolBoxPage; } private: QToolBox *toolBox; int index; QWidget *toolBoxPage; QString toolBoxLabel; }; class DeleteToolBoxPageCommand : public Command { public: DeleteToolBoxPageCommand( const QString &n, FormWindow *fw, QToolBox *tw, QWidget *page ); void execute(); void unexecute(); Type type() const { return DeleteToolBoxPage; } private: QToolBox *toolBox; int index; QWidget *toolBoxPage; QString toolBoxLabel; }; #endif