/********************************************************************** ** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** ** This file is part of TQt Designer. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** Licensees holding valid TQt Enterprise Edition or TQt Professional Edition ** licenses may use this file in accordance with the TQt Commercial License ** Agreement provided with the Software. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for ** information about TQt Commercial License Agreements. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef COMMAND_H #define COMMAND_H #include "metadatabase.h" #include "layout.h" #include #include #include #include #include #include #include #include #include class TQWizard; class TQTabWidget; class Command; class TQWidget; class FormWindow; class PropertyEditor; class TQListBox; class TQIconView; class TQTable; class TQAction; class QDesignerToolBar; class TQMainWindow; class TQTextEdit; struct LanguageInterface; class TQToolBox; class MenuBarEditor; class MenuBarEditorItem; class PopupMenuEditor; class PopupMenuEditorItem; class ActionEditor; class Command : public TQt { public: Command( const TQString &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 }; TQString 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: TQString cmdName; FormWindow *formWin; }; class CommandHistory : public TQObject { 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 TQString &undoCmd, const TQString &redoCmd ); void modificationChanged( bool m ); private: TQPtrList history; int current, steps; bool modified; int savedAt; Command *compressedCommand; }; class ResizeCommand : public Command { public: ResizeCommand( const TQString &n, FormWindow *fw, TQWidget *w, const TQRect &oldr, const TQRect &nr ); void execute(); void unexecute(); Type type() const { return Resize; } private: TQWidget *widget; TQRect oldRect, newRect; }; class InsertCommand : public Command { public: InsertCommand( const TQString &n, FormWindow *fw, TQWidget *w, const TQRect &g ); void execute(); void unexecute(); Type type() const { return Insert; } private: TQWidget *widget; TQRect geometry; }; class MoveCommand : public Command { public: MoveCommand( const TQString &n, FormWindow *fw, const TQWidgetList &w, const TQValueList op, const TQValueList np, TQWidget *opr, TQWidget *npr ); void execute(); void unexecute(); Type type() const { return Move; } void merge( Command *c ); bool canMerge( Command *c ); private: TQWidgetList widgets; TQValueList oldPos, newPos; TQWidget *oldParent, *newParent; }; class DeleteCommand : public Command { public: DeleteCommand( const TQString &n, FormWindow *fw, const TQWidgetList &w ); void execute(); void unexecute(); Type type() const { return Delete; } private: TQWidgetList widgets; TQMap< TQWidget*, TQValueList > connections; }; class SetPropertyCommand : public Command { public: SetPropertyCommand( const TQString &n, FormWindow *fw, TQObject *w, PropertyEditor *e, const TQString &pn, const TQVariant &ov, const TQVariant &nv, const TQString &ncut, const TQString &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 TQVariant &v, const TQString ¤tItemText, bool select = TRUE ); TQGuardedPtr widget; PropertyEditor *editor; TQString propName; TQVariant oldValue, newValue; TQString oldCurrentItemText, newCurrentItemText; bool wasChanged; bool isResetCommand; }; class LayoutHorizontalCommand : public Command { public: LayoutHorizontalCommand( const TQString &n, FormWindow *fw, TQWidget *parent, TQWidget *layoutBase, const TQWidgetList &wl ); void execute(); void unexecute(); Type type() const { return LayoutHorizontal; } private: HorizontalLayout layout; }; class LayoutHorizontalSplitCommand : public Command { public: LayoutHorizontalSplitCommand( const TQString &n, FormWindow *fw, TQWidget *parent, TQWidget *layoutBase, const TQWidgetList &wl ); void execute(); void unexecute(); Type type() const { return LayoutHorizontalSplitter; } private: HorizontalLayout layout; }; class LayoutVerticalCommand : public Command { public: LayoutVerticalCommand( const TQString &n, FormWindow *fw, TQWidget *parent, TQWidget *layoutBase, const TQWidgetList &wl ); void execute(); void unexecute(); Type type() const { return LayoutVertical; } private: VerticalLayout layout; }; class LayoutVerticalSplitCommand : public Command { public: LayoutVerticalSplitCommand( const TQString &n, FormWindow *fw, TQWidget *parent, TQWidget *layoutBase, const TQWidgetList &wl ); void execute(); void unexecute(); Type type() const { return LayoutVerticalSplitter; } private: VerticalLayout layout; }; class LayoutGridCommand : public Command { public: LayoutGridCommand( const TQString &n, FormWindow *fw, TQWidget *parent, TQWidget *layoutBase, const TQWidgetList &wl, int xres, int yres ); void execute(); void unexecute(); Type type() const { return LayoutGrid; } private: GridLayout layout; }; class BreakLayoutCommand : public Command { public: BreakLayoutCommand( const TQString &n, FormWindow *fw, TQWidget *layoutBase, const TQWidgetList &wl ); void execute(); void unexecute(); Type type() const { return BreakLayout; } private: Layout *layout; int spacing; int margin; TQWidget *lb; TQWidgetList widgets; }; class MacroCommand : public Command { public: MacroCommand( const TQString &n, FormWindow *fw, const TQPtrList &cmds ); void execute(); void unexecute(); Type type() const { return Macro; } private: TQPtrList commands; }; class AddTabPageCommand : public Command { public: AddTabPageCommand( const TQString &n, FormWindow *fw, TQTabWidget *tw, const TQString &label ); void execute(); void unexecute(); Type type() const { return AddTabPage; } private: TQTabWidget *tabWidget; int index; TQWidget *tabPage; TQString tabLabel; }; class DeleteTabPageCommand : public Command { public: DeleteTabPageCommand( const TQString &n, FormWindow *fw, TQTabWidget *tw, TQWidget *page ); void execute(); void unexecute(); Type type() const { return DeleteTabPage; } private: TQTabWidget *tabWidget; int index; TQWidget *tabPage; TQString tabLabel; }; class MoveTabPageCommand : public Command { public: MoveTabPageCommand(const TQString &n, FormWindow *fw, TQTabWidget *tw, TQWidget *page, const TQString& label, int nIndex, int oIndex ); void execute(); void unexecute(); Type type() const { return MoveTabPage; } private: TQTabWidget *tabWidget; int newIndex, oldIndex; TQWidget *tabPage; TQString tabLabel; }; class QDesignerWidgetStack; class AddWidgetStackPageCommand : public Command { public: AddWidgetStackPageCommand( const TQString &n, FormWindow *fw, QDesignerWidgetStack *ws ); void execute(); void unexecute(); Type type() const { return AddWidgetStackPage; } private: QDesignerWidgetStack *widgetStack; int index; TQWidget *stackPage; }; class DeleteWidgetStackPageCommand : public Command { public: DeleteWidgetStackPageCommand( const TQString &n, FormWindow *fw, QDesignerWidgetStack *ws, TQWidget *page ); void execute(); void unexecute(); Type type() const { return DeleteWidgetStackPage; } private: QDesignerWidgetStack *widgetStack; int index; TQWidget *stackPage; }; class AddWizardPageCommand : public Command { public: AddWizardPageCommand( const TQString &n, FormWindow *fw, TQWizard *w, const TQString &label, int index = -1, bool show = TRUE ); void execute(); void unexecute(); Type type() const { return AddWizardPage; } private: TQWizard *wizard; int index; bool show; TQWidget *page; TQString pageLabel; }; class DeleteWizardPageCommand : public Command { public: DeleteWizardPageCommand( const TQString &n, FormWindow *fw, TQWizard *w, int index, bool show = TRUE ); void execute(); void unexecute(); Type type() const { return DeleteWizardPage; } private: TQWizard *wizard; int index; bool show; TQWidget *page; TQString pageLabel; }; class RenameWizardPageCommand : public Command { public: RenameWizardPageCommand( const TQString &n, FormWindow *fw, TQWizard *w, int index, const TQString& name ); void execute(); void unexecute(); Type type() const { return RenameWizardPage; } private: TQWizard *wizard; int index; TQWidget *page; TQString label; }; class SwapWizardPagesCommand : public Command { public: SwapWizardPagesCommand( const TQString &n, FormWindow *fw, TQWizard *w, int index1, int index2 ); void execute(); void unexecute(); Type type() const { return SwapWizardPages; } private: TQWizard *wizard; int index1, index2; }; class MoveWizardPageCommand : public Command { public: MoveWizardPageCommand( const TQString &n, FormWindow *fw, TQWizard *w, int index1, int index2 ); void execute(); void unexecute(); Type type() const { return MoveWizardPage; } private: TQWizard *wizard; int index1, index2; }; class AddConnectionCommand : public Command { public: AddConnectionCommand( const TQString &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 TQString &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 TQString &name, FormWindow *fw, const TQCString &f, const TQString& spec, const TQString &a, const TQString &t, const TQString &l, const TQString &rt ); void execute(); void unexecute(); Type type() const { return AddFunction; } private: TQCString function; TQString specifier; TQString access; TQString functionType; TQString language; TQString returnType; }; class ChangeFunctionAttribCommand : public Command { public: ChangeFunctionAttribCommand( const TQString &name, FormWindow *fw, MetaDataBase::Function f, const TQString &on, const TQString &os, const TQString &oa, const TQString &ot, const TQString &ol, const TQString &ort ); void execute(); void unexecute(); Type type() const { return ChangeFunctionAttrib; } private: TQString oldName, newName; TQString oldSpec, newSpec; TQString oldAccess, newAccess; TQString oldType, newType; TQString oldLang, newLang; TQString oldReturnType, newReturnType; }; class RemoveFunctionCommand : public Command { public: RemoveFunctionCommand( const TQString &name, FormWindow *fw, const TQCString &f, const TQString& spec, const TQString &a, const TQString &t, const TQString &l, const TQString &rt ); void execute(); void unexecute(); Type type() const { return RemoveFunction; } private: TQCString function; TQString specifier; TQString access; TQString functionType; TQString language; TQString returnType; }; class AddVariableCommand : public Command { public: AddVariableCommand( const TQString &name, FormWindow *fw, const TQString &vn, const TQString &a ); void execute(); void unexecute(); Type type() const { return AddVariable; } private: TQString varName; TQString access; }; class SetVariablesCommand : public Command { public: SetVariablesCommand( const TQString &name, FormWindow *fw, TQValueList lst ); void execute(); void unexecute(); Type type() const { return SetVariables; } private: TQValueList oldList, newList; }; class RemoveVariableCommand : public Command { public: RemoveVariableCommand( const TQString &name, FormWindow *fw, const TQString &vn ); void execute(); void unexecute(); Type type() const { return RemoveVariable; } private: TQString varName; TQString access; }; class EditDefinitionsCommand : public Command { public: EditDefinitionsCommand( const TQString &name, FormWindow *fw, LanguageInterface *lf, const TQString &n, const TQStringList &l ); void execute(); void unexecute(); Type type() const { return EditDefinitions; } private: LanguageInterface *lIface; TQString defName; TQStringList newList, oldList; }; class LowerCommand : public Command { public: LowerCommand( const TQString &name, FormWindow *fw, const TQWidgetList &w ); void execute(); void unexecute(); Type type() const { return Lower; } private: TQWidgetList widgets; }; class RaiseCommand : public Command { public: RaiseCommand( const TQString &name, FormWindow *fw, const TQWidgetList &w ); void execute(); void unexecute(); Type type() const { return Raise; } private: TQWidgetList widgets; }; class PasteCommand : public Command { public: PasteCommand( const TQString &n, FormWindow *fw, const TQWidgetList &w ); void execute(); void unexecute(); Type type() const { return Paste; } private: TQWidgetList widgets; }; class TabOrderCommand : public Command { public: TabOrderCommand( const TQString &n, FormWindow *fw, const TQWidgetList &ol, const TQWidgetList &nl ); void execute(); void unexecute(); Type type() const { return TabOrder; } void merge( Command *c ); bool canMerge( Command *c ); private: TQWidgetList oldOrder, newOrder; }; class PopulateListBoxCommand : public Command { public: struct Item { TQString text; TQPixmap pix; TQ_DUMMY_COMPARISON_OPERATOR( Item ) }; PopulateListBoxCommand( const TQString &n, FormWindow *fw, TQListBox *lb, const TQValueList &items ); void execute(); void unexecute(); Type type() const { return PopulateListBox; } bool operator==( const PopulateListBoxCommand & ) const; private: TQValueList oldItems, newItems; TQListBox *listbox; }; class PopulateIconViewCommand : public Command { public: struct Item { TQString text; TQPixmap pix; TQ_DUMMY_COMPARISON_OPERATOR( Item ) }; PopulateIconViewCommand( const TQString &n, FormWindow *fw, TQIconView *iv, const TQValueList &items ); void execute(); void unexecute(); Type type() const { return PopulateIconView; } bool operator==( const PopulateIconViewCommand & ) const; private: TQValueList oldItems, newItems; TQIconView *iconview; }; class PopulateListViewCommand : public Command { public: PopulateListViewCommand( const TQString &n, FormWindow *fw, TQListView *lv, TQListView *from ); void execute(); void unexecute(); Type type() const { return PopulateListView; } static void transferItems( TQListView *from, TQListView *to ); bool operator==( const PopulateListViewCommand & ) const; private: TQListView *oldItems, *newItems; TQListView *listview; }; class PopulateMultiLineEditCommand : public Command { public: PopulateMultiLineEditCommand( const TQString &n, FormWindow *fw, TQTextEdit *mle, const TQString &txt ); void execute(); void unexecute(); Type type() const { return PopulateMultiLineEdit; } private: TQString newText, oldText; TQTextEdit *mlined; bool wasChanged; }; class PopulateTableCommand : public Command { public: struct Row { TQString text; TQPixmap pix; TQ_DUMMY_COMPARISON_OPERATOR( Row ) }; struct Column { TQString text; TQPixmap pix; TQString field; TQ_DUMMY_COMPARISON_OPERATOR( Column ) }; PopulateTableCommand( const TQString &n, FormWindow *fw, TQTable *t, const TQValueList &rows, const TQValueList &columns ); void execute(); void unexecute(); Type type() const { return PopulateTable; } private: TQValueList oldRows, newRows; TQValueList oldColumns, newColumns; TQTable *table; }; class AddActionToToolBarCommand : public Command { public: AddActionToToolBarCommand( const TQString &n, FormWindow *fw, TQAction *a, QDesignerToolBar *tb, int idx ); void execute(); void unexecute(); Type type() const { return AddActionToToolBar; } private: TQAction *action; QDesignerToolBar *toolBar; int index; }; class RemoveActionFromToolBarCommand : public AddActionToToolBarCommand { public: RemoveActionFromToolBarCommand( const TQString &n, FormWindow *fw, TQAction *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 TQString &n, FormWindow *fw, TQMainWindow *mw ); void execute(); void unexecute(); Type type() const { return AddToolBar; } protected: QDesignerToolBar *toolBar; TQMainWindow *mainWindow; }; class RemoveToolBarCommand : public AddToolBarCommand { public: RemoveToolBarCommand( const TQString &n, FormWindow *fw, TQMainWindow *mw, QDesignerToolBar *tb ) : AddToolBarCommand( n, fw, mw ) { toolBar = tb; } void execute() { AddToolBarCommand::unexecute(); } void unexecute() { AddToolBarCommand::execute(); } Type type() const { return RemoveToolBar; } }; struct TQWidgetContainerInterfacePrivate; class AddContainerPageCommand : public Command { public: AddContainerPageCommand( const TQString &n, FormWindow *fw, TQWidget *c, const TQString &label ); ~AddContainerPageCommand(); void execute(); void unexecute(); Type type() const { return AddContainerPage; } private: TQString wClassName; TQWidget *container; int index; TQString pageLabel; TQWidget *page; TQWidgetContainerInterfacePrivate *wiface; }; class DeleteContainerPageCommand : public Command { public: DeleteContainerPageCommand( const TQString &n, FormWindow *fw, TQWidget *container, int index ); ~DeleteContainerPageCommand(); void execute(); void unexecute(); Type type() const { return DeleteContainerPage; } private: TQString wClassName; TQWidget *container; int index; TQString pageLabel; TQWidget *page; TQWidgetContainerInterfacePrivate *wiface; }; class RenameContainerPageCommand : public Command { public: RenameContainerPageCommand( const TQString &n, FormWindow *fw, TQWidget *container, int index, const TQString &label ); ~RenameContainerPageCommand(); void execute(); void unexecute(); Type type() const { return RenameContainerPage; } private: TQString wClassName; TQWidget *container; int index; TQString oldLabel, newLabel; TQWidgetContainerInterfacePrivate *wiface; }; class AddActionToPopupCommand : public Command { public: AddActionToPopupCommand( const TQString &n, FormWindow *fw, PopupMenuEditor *m, PopupMenuEditorItem *i, int idx = -1 ); void execute(); void unexecute(); Type type() const { return AddActionToPopup; } protected: TQString constructName() const; PopupMenuEditor *menu; PopupMenuEditorItem *item; int index; private: }; class RemoveActionFromPopupCommand : public AddActionToPopupCommand { public: RemoveActionFromPopupCommand( const TQString &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 TQString &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 TQString &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 TQString &n, FormWindow *fw, TQAction *a ) : Command( n, fw ), action( a ) { } virtual Type type() const = 0; protected: ActionEditor *actionEditor(); TQAction *action; }; class RenameActionCommand : public ActionCommand { public: RenameActionCommand( const TQString &n, FormWindow *fw, TQAction *a, PopupMenuEditor *m, TQString nm ); void execute(); void unexecute(); Type type() const { return RenameAction; } private: PopupMenuEditor *menu; TQString newName; TQString oldName; }; class SetActionIconsCommand : public ActionCommand { public: SetActionIconsCommand( const TQString &n, FormWindow *fw, TQAction *a, PopupMenuEditor *m, TQIconSet &icons ); void execute(); void unexecute(); Type type() const { return SetActionIcons; } protected: void updateActionEditorItem(); private: PopupMenuEditor *menu; TQIconSet newIcons; TQIconSet oldIcons; }; class AddMenuCommand : public Command { public: AddMenuCommand( const TQString &n, FormWindow *fw, MenuBarEditor *b, MenuBarEditorItem *i, int idx = -1 ); AddMenuCommand( const TQString &n, FormWindow *fw, TQMainWindow *mw, const TQString &nm = "Menu" ); void execute(); void unexecute(); Type type() const { return AddMenu; } protected: MenuBarEditor *mb; MenuBarEditorItem *item; TQString name; int index; private: }; class RemoveMenuCommand : public AddMenuCommand { public: RemoveMenuCommand( const TQString &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 TQString &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 TQString &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 TQString &n, FormWindow *fw, MenuBarEditor *m, TQString nm, MenuBarEditorItem *i ); void execute(); void unexecute(); Type type() const { return RenameMenu; } static TQString makeLegal( const TQString &str ); private: MenuBarEditor *bar; MenuBarEditorItem *item; TQString newName; TQString oldName; }; class AddToolBoxPageCommand : public Command { public: AddToolBoxPageCommand( const TQString &n, FormWindow *fw, TQToolBox *tw, const TQString &label ); void execute(); void unexecute(); Type type() const { return AddToolBoxPage; } private: TQToolBox *toolBox; int index; TQWidget *toolBoxPage; TQString toolBoxLabel; }; class DeleteToolBoxPageCommand : public Command { public: DeleteToolBoxPageCommand( const TQString &n, FormWindow *fw, TQToolBox *tw, TQWidget *page ); void execute(); void unexecute(); Type type() const { return DeleteToolBoxPage; } private: TQToolBox *toolBox; int index; TQWidget *toolBoxPage; TQString toolBoxLabel; }; #endif