/********************************************************************** *< FILE: ActionTable.h DESCRIPTION: Action Table definitions CREATED BY: Scott Morrison HISTORY: Created 8 February, 2000, Based on KbdAction.h. *> Copyright (c) 1998, All Rights Reserved. **********************************************************************/ // The ActionTable class is used by plug-ins (and core) to export // tables of items that can be used by the UI to attach to keyboard // shorcuts, assign to toolbar buttons, and add to menus. #pragma once #include "stack.h" #include "iFnPub.h" class MaxIcon; class MacroEntry; typedef DWORD ActionTableId; typedef DWORD ActionContextId; // ActionTableIds used by the system const ActionTableId kActionMainUI = 0; const ActionTableId kActionTrackView = 1; const ActionTableId kActionMaterialEditor = 2; const ActionTableId kActionVideoPost = 3; const ActionTableId kActionSchematicView = 5; const ActionTableId kActionCommonIReshade = 6; const ActionTableId kActionScanlineIReshade = 7; class ActionTable; class IMenu; // Context IDs used by the system. Several tables may share the same context id. const ActionContextId kActionMainUIContext = 0; const ActionContextId kActionTrackViewContext = 1; const ActionContextId kActionMaterialEditorContext = 2; const ActionContextId kActionVideoPostContext = 3; const ActionContextId kActionSchematicViewContext = 5; const ActionContextId kActionIReshadeContext = 6; // Description of a command for building action tables from static data struct ActionDescription { // A unique identifier for the command (must be uniqe per table) int mCmdID; // A string resource id that describes the command int mDescriptionResourceID; // A string resource ID for a short name for the action int mShortNameResourceID; // A string resource for the category of an operation int mCategoryResourceID; }; #define AO_DEFAULT 0x0001 //default option command to execute #define AO_CLOSEDIALOG 0x0002 //Execute closeDialog option #define ACTION_OPTION_INTERFACE Interface_ID(0x3c0276f5, 0x190964f5) #define ACTION_OPTION_INTERFACE_OPT2 Interface_ID(0x0011dcdc, 0x0012dcdc) // Implement if the an action item supports an alternate options command, // overwrite ActionItem::GetInterface(ACTION_OPTION_INTERFACE), to return an instance of this class class IActionOptions : public BaseInterface { public: virtual BOOL ExecuteOptions(DWORD options = AO_DEFAULT) = 0; }; // Describes an single operation that can be attached to a UI elements class ActionItem : public InterfaceServer { public: virtual int GetId() = 0; // return true if action executed, and FALSE otherwise virtual BOOL ExecuteAction() = 0; // override this if you wish to customize macroRecorder output for this action CoreExport virtual void EmitMacro(); // internal Execute(), handles macroRecording, etc. and call ExecuteAction() - jbw 9.9.00 CoreExport BOOL Execute(); // Get the text to put on a button virtual void GetButtonText(TSTR& buttonText) = 0; // Get the text to use in a menu virtual void GetMenuText(TSTR& menuText) = 0; // Get the long description text for tool tips etc. virtual void GetDescriptionText(TSTR& descText) = 0; // Get the string describing the category of the item virtual void GetCategoryText(TSTR& catText) = 0; // check to see if menu items should be checked, or button pressed virtual BOOL IsChecked() = 0; // Check to see if menu item should show up in context menu virtual BOOL IsItemVisible() = 0; // Check to see if menu item should be enabled in a menu virtual BOOL IsEnabled() = 0; virtual MaxIcon* GetIcon() = 0; virtual void DeleteThis() = 0; CoreExport ActionTable* GetTable() { return mpTable; } CoreExport void SetTable(ActionTable* pTable) { mpTable = pTable; } CoreExport TCHAR* GetShortcutString(); virtual MacroEntry* GetMacroScript() { return NULL; } // If this method returns true, then the ActionItem creates // a menu instead of performing an action CoreExport virtual BOOL IsDynamicMenu() { return FALSE; } // This can be called after an action item is created to tell the // system that is is a dynamic menu action. CoreExport virtual void SetIsDynamicMenu() {} // If the ActionItem does produce a menu, this method is called To // get the menu. See the DynamicMenu class below for an easy way // to produce these menus. If the menu is requested by a // right-click quad menu, then hwnd is the window where the click // occurred, and m is the point in the window where the user // clicked. If the item is used from a menu bar, hwnd will be NULL. CoreExport virtual IMenu* GetDynamicMenu(HWND hwnd, IPoint2& m) { return NULL; } // ActionItems that are deleted after they execute should return TRUE. CoreExport virtual BOOL IsDynamicAction() { return FALSE; } protected: ActionTable* mpTable; // The table that owns the action }; #define ACTIONITEM_STANDIN_INTERFACE Interface_ID(0x108e1314, 0x5aff3138) class IActionItemStandin : public BaseInterface { public: virtual void SetPersistentActionId(TSTR idString) = 0; virtual TSTR &GetPersistentActionId() = 0; virtual void SetActionTableId( ActionTableId id ) = 0; virtual ActionTableId GetActionTableId() = 0; virtual TSTR &GetPrefixString() = 0; }; inline IActionItemStandin* GetIActionItemStandin(ActionItem* a) { return (IActionItemStandin*)a->GetInterface(ACTIONITEM_STANDIN_INTERFACE); } class ActionItemStandin: public ActionItem, public IActionItemStandin { public: CoreExport ActionItemStandin(int cmdId ); CoreExport virtual ~ActionItemStandin() {}; CoreExport virtual int GetId() { return mCmdId; } CoreExport virtual void SetId(int id) { mCmdId = id; } CoreExport virtual TCHAR* GetDescription() { return mName.data();} CoreExport virtual void SetDescription(TCHAR* pDesc) { mName = pDesc; } CoreExport virtual TCHAR* GetShortName() { return mName.data();} CoreExport virtual void SetShortName(TCHAR* pShortName) { mName = pShortName; } CoreExport virtual TCHAR* GetCategory() { return mName.data();} CoreExport virtual void SetCategory(TCHAR* pCategory) { mName = pCategory; } CoreExport virtual MaxIcon* GetIcon() { return NULL; }; // return true if action executed, and FALSE otherwise CoreExport virtual BOOL ExecuteAction() { return FALSE; }; // Get the text to put on a button CoreExport virtual void GetButtonText(TSTR& buttonText) { buttonText = mName; }; // Get the text to use in a menu CoreExport virtual void GetMenuText(TSTR& menuText) { menuText = mName; }; // Get the long description text for tool tips etc. CoreExport virtual void GetDescriptionText(TSTR& descText) { descText = mName; }; // Get the string describing the category of the item CoreExport virtual void GetCategoryText(TSTR& catText) { catText = mName; }; // check to see if menu items should be checked, or button pressed CoreExport virtual BOOL IsChecked() { return FALSE; }; // Check to see if menu item should show up in context menu CoreExport virtual BOOL IsItemVisible() { return TRUE; }; // Check to see if menu item should be enabled in a menu CoreExport virtual BOOL IsEnabled() { return FALSE; }; CoreExport virtual BOOL IsDynamicMenu() { return FALSE; } CoreExport virtual void SetIsDynamicMenu() { }; CoreExport virtual IMenu* GetDynamicMenu(HWND hwnd, IPoint2& m) { return NULL; }; CoreExport void DeleteThis() { delete this; } CoreExport virtual BaseInterface* GetInterface(Interface_ID id); // IActionItemStandin CoreExport virtual void SetPersistentActionId(TSTR idString); CoreExport virtual TSTR &GetPersistentActionId() { return mPersistentActionId; }; CoreExport virtual void SetActionTableId( ActionTableId id ) { mId = id; }; CoreExport virtual ActionTableId GetActionTableId() { return mId; }; CoreExport virtual TSTR &GetPrefixString() { return mPrefix; }; protected: int mCmdId; TSTR mName; TSTR mPersistentActionId; TSTR mPrefix; ActionTableId mId; }; class ActionCallback; // A table of actions that can be tied to UI elements (buttons, menus, RC menu, // keyboard shortcuts) class ActionTable : public BaseInterfaceServer { public: CoreExport ActionTable(ActionTableId id, ActionContextId contextId, TSTR& name, HACCEL hDefaults, int numIds, ActionDescription* pOps, HINSTANCE hInst); CoreExport ActionTable(ActionTableId id, ActionContextId contextId, TSTR& name); CoreExport virtual ~ActionTable(); // Get/Set the current keyboard accelerators for the table CoreExport HACCEL GetHAccel() { return mhAccel; } CoreExport void SetHAccel(HACCEL hAccel) { mhAccel = hAccel; } // Get the default keyboard accelerator table. This is used when // the user has not assigned any accelerators. CoreExport HACCEL GetDefaultHAccel() { return mhDefaultAccel; } CoreExport void SetDefaultHAccel(HACCEL accel) { mhDefaultAccel = accel; } CoreExport TSTR& GetName() { return mName; } CoreExport ActionTableId GetId() { return mId; } CoreExport ActionContextId GetContextId() { return mContextId; } // Get the current callback assocuated with this table. // returns NULL if the table is not active. CoreExport ActionCallback* GetCallback() { return mpCallback; } CoreExport void SetCallback(ActionCallback* pCallback) { mpCallback = pCallback; } // Methods to iterate over the actions in the table CoreExport int Count() { return mOps.Count(); } CoreExport ActionItem* operator[](int i) { return mOps[i]; } // Get an action by its command id. CoreExport ActionItem* GetAction(int cmdId); // Add an operation to the table CoreExport void AppendOperation(ActionItem* pAction); // Remove an operation from the table CoreExport BOOL DeleteOperation(ActionItem* pAction); CoreExport virtual void DeleteThis() { delete this; } // Get the text to put on a button CoreExport virtual BOOL GetButtonText(int cmdId, TSTR& buttonText); // Get the text to use in a menu CoreExport virtual BOOL GetMenuText(int cmdId, TSTR& menuText) { return GetButtonText(cmdId, menuText); } // Get the long description text for tool tips etc. CoreExport virtual BOOL GetDescriptionText(int cmdId, TSTR& descText); // check to see if menu items should be checked, or button pressed CoreExport virtual BOOL IsChecked(int cmdId) { return FALSE; } // Check to see if menu item should show up in context menu CoreExport virtual BOOL IsItemVisible(int cmdId) { return TRUE; } // Check to see if menu item should be enabled in a menu CoreExport virtual BOOL IsEnabled(int cmdId) { return TRUE; } // Write an action identifier to a CUI file or KBD file // Default implementation is to write the integer ID. // This is over-riden when command IDs are not persistent CoreExport virtual void WritePersistentActionId(int cmdId, TSTR& idString); // Read an action identifier from a CUI file or KBD file // Default implementation is to read the integer ID. // This is over-riden when command IDs are not persistent // Returns -1 if the command is not found in the table CoreExport virtual int ReadPersistentActionId(TSTR& idString); // return an optional icon for the command CoreExport virtual MaxIcon* GetIcon(int cmdId) { return NULL; }; // Fill the action table with the given action descriptions CoreExport void BuildActionTable(HACCEL hDefaults, int numIds, ActionDescription* pOps, HINSTANCE hInst); // Get the action assigned to the given accelerator, if any CoreExport ActionItem* GetCurrentAssignment(ACCEL accel); // Assign the command to th given accelerator. Also removes any // previous assignment to that accelerator CoreExport void AssignKey(int cmdId, ACCEL accel); // removes the given assignment from the shortcut table void RemoveShortcutFromTable(ACCEL accel); private: // These values are set by the plug-in to describe a action table // Unique identifier of table (like a class id) ActionTableId mId; // An identifier to group tables use the same context. Tables with the // same context cannot have overlapping keyboard shortcuts. ActionContextId mContextId; // Name to use in preference dlg drop-down TSTR mName; // Descriptors of all operations that can have Actions Tab mOps; // The windows accelerator table in use when no keyboard shortcuts saved HACCEL mhDefaultAccel; // The windows accelerator table in use HACCEL mhAccel; // The currently active callback ActionCallback* mpCallback; }; class ActionCallback : public BaseInterfaceServer { public: CoreExport virtual ~ActionCallback(){}; CoreExport virtual BOOL ExecuteAction(int id) { return FALSE; } // called when an action item says it is a dynamic menu CoreExport virtual IMenu* GetDynamicMenu(int id, HWND hwnd, IPoint2& m) { return NULL; } // Access to the table the callback uses ActionTable* GetTable() { return mpTable; } void SetTable(ActionTable* pTable) { mpTable = pTable; } private: ActionTable *mpTable; }; // An ActionContext is an identifer of a group of keyboard shortcuts. // Examples are Main UI, Tack View, and Editable Mesh. They are // registered using Interface::RegisterActionContext(). // class ActionContext { public: ActionContext(ActionContextId contextId, TCHAR *pName) { mContextId = contextId; mName = pName; mActive = true; } TCHAR* GetName() { return mName.data(); } ActionContextId GetContextId() { return mContextId; } bool IsActive() { return mActive; } void SetActive(bool active) { mActive = active; } private: ActionContextId mContextId; TSTR mName; bool mActive; }; // The ActionManager manages a set of ActionTables, callbacks and ActionContexts. // The manager handles the keyboard accelerator tables for each ActionTable // as well. You get a pointer to this class using Interface::GetActionManager(). #define ACTION_MGR_INTERFACE Interface_ID(0x4bb71a79, 0x4e531e4f) class IActionManager : public FPStaticInterface { public: // Register an action table with the manager. // Note that most plug-ins will not need this method. Instead, // plug-ins export action table with the methods in ClassDesc. virtual void RegisterActionTable(ActionTable* pTable) = 0; // Methods to iterate over the action table virtual int NumActionTables() = 0; virtual ActionTable* GetTable(int i) = 0; // These methods are used to turn a table on and off. virtual int ActivateActionTable(ActionCallback* pCallback, ActionTableId id) = 0; virtual int DeactivateActionTable(ActionCallback* pCallback, ActionTableId id) = 0; // Find a table based on its id. virtual ActionTable* FindTable(ActionTableId id) = 0; // Get the string that describes the keyboard shortcut for the operation virtual BOOL GetShortcutString(ActionTableId tableId, int commandId, TCHAR* buf) = 0; // Get A string the descibes an operation virtual BOOL GetActionDescription(ActionTableId tableId, int commandId, TCHAR* buf) = 0; // Register an action context. This is called when you create the // action table that uses this context. virtual BOOL RegisterActionContext(ActionContextId contextId, TCHAR* pName) = 0; // Methods to iterate over the action contexts virtual int NumActionContexts() = 0; virtual ActionContext* GetActionContext(int i) = 0; // Find a context based on it's ID. virtual ActionContext* FindContext(ActionContextId contextId) = 0; // Query whether a context is active. virtual BOOL IsContextActive(ActionContextId contextId) = 0; // Internal methods used by the keyboard shotcut UI virtual TCHAR* GetShortcutFile() = 0; virtual TCHAR* GetShortcutDir() = 0; virtual int IdToIndex(ActionTableId id) = 0; virtual void SaveAllContextsToINI() = 0; virtual int MakeActionSetCurrent(TCHAR* pDir, TCHAR* pFile) = 0; virtual int LoadAccelConfig(LPACCEL *accel, int *cts, ActionTableId tableId = -1, BOOL forceDefault = FALSE) = 0; virtual int SaveAccelConfig(LPACCEL *accel, int *cts) = 0; virtual int GetCurrentActionSet(TCHAR *buf) = 0; virtual BOOL SaveKeyboardFile(TCHAR* pFileName) = 0; virtual BOOL LoadKeyboardFile(TCHAR* pFileName) = 0; virtual TCHAR* GetKeyboardFile() = 0; // Function IDs enum { executeAction, #ifndef NO_CUI // russom - 02/12/02 saveKeyboardFile, loadKeyboardFile, getKeyboardFile, #endif // NO_CUI }; }; // The DynamicMenu class provides a way for plugins to produce // the menu needed in the ActionItem::GetDynamicMenu() method. class DynamicMenuCallback { public: virtual void MenuItemSelected(int itemId) = 0; }; class DynamicMenu { public: CoreExport DynamicMenu(DynamicMenuCallback* pCallback); // Called after menu creation to get the IMenu created. // This is the value returned from ActionItem::GetDynamicMenu() CoreExport IMenu* GetMenu(); enum DynamicMenuFlags { kDisabled = 1 << 0, kChecked = 1 << 1, kSeparator = 1 << 2, }; // Add an item to the dynamic menu. CoreExport void AddItem(DWORD flags, UINT itemId, TCHAR* pItemTitle); CoreExport void BeginSubMenu(TCHAR* pTitle); CoreExport void EndSubMenu(); private: Stack mMenuStack; DynamicMenuCallback *mpCallback; };