// --------------------------------------------------------------------------- #include #include #include #pragma hdrstop #include "HotKey.h" #include "MainMenu.h" // --------------------------------------------------------------------------- #pragma package(smart_init) // --------------------------------------------------------------------------- #define IDS_MSG_FILE_NOT_FOUND HotKeyStringTable[0] #define IDS_MSG_DONOT_OPEN_FILE HotKeyStringTable[1] //--------------------------------------------------------------------------- TTexActionManager *TexActionManager; // --------------------------------------------------------------------------- /** @brief TTexActionManager ±âº» »ý¼ºÀÚ */ // --------------------------------------------------------------------------- __fastcall TTexActionManager::TTexActionManager(TComponent* Owner) { HotKeyStringTable.Create(DirectoryBin, Language, "HotKey"); FForceSwitch = false; FEnabled = false; ActionList = new TActionList(Owner); ExcludedList = new TList; DisplayOnlyList = new TList; if (ActionList) Initialization(); } // --------------------------------------------------------------------------- /** @brief TTexActionManager ±âº» ¼Ò¸êÀÚ */ __fastcall TTexActionManager::~TTexActionManager() { Clear(); if (ActionList) delete ActionList; if (ExcludedList) delete ExcludedList; if (DisplayOnlyList) delete DisplayOnlyList; ActionList = NULL; ExcludedList = NULL; DisplayOnlyList = NULL; } // --------------------------------------------------------------------------- /** @brief ´ÜÃàŰ(Action) °´Ã¼ »ý¼º(ÃʱâÈ­) ¹× Ãß°¡ */ TAction * __fastcall TTexActionManager::AddAction(String strACategory, String strACaption) { TAction *Action = NULL; Action = new TAction(ActionList); Action->Category = strACategory; Action->Caption = strACaption; Action->ActionList = ActionList; Action->OnExecute = ExecuteOperation; return Action; } // --------------------------------------------------------------------------- /** @brief ´ÜÃàŰ °´Ã¼µéÀ» »ý¼ºÇÑ´Ù */ void __fastcall TTexActionManager::Initialization() { // ÃʱâÈ­ Clear(); // ´ÜÃàŰ ÁöÁ¤ (Ãß°¡ÇÒ °æ¿ì ¿©±â¿¡ Ãß°¡ÇÑ´Ù) AddAction("Main", "New256"); AddAction("Main", "NewFull"); AddAction("Main", "Save"); AddAction("Main", "Open"); AddAction("Main", "EnlargeCanvas"); AddAction("Main", "Print"); AddAction("Main", "Cut"); AddAction("Main", "Copy"); AddAction("Main", "Paste"); // AddAction("Main", "WorkareaLoad"); // AddAction("Main", "WorkareaSave"); // AddAction("Main", "MotifLoad"); // AddAction("Main", "MotifSave"); AddAction("Normal", "ZoomIn"); AddAction("Normal", "ZoomOut"); AddAction("Normal", "Exit"); AddAction("Normal", "Undo"); AddAction("Normal", "Redo"); AddAction("MainMenu", "WorkArea"); AddAction("MainMenu", "MoveCopy"); AddAction("MainMenu", "ColorChange"); AddAction("MainMenu", "Clear"); AddAction("MainMenu", "ColorGrouping"); AddAction("MainMenu", "ManualRepeat"); AddAction("MainMenu", "AutoRepeat"); // AddAction("MainMenu", "Draw"); AddAction("MainMenu", "Proportion"); // AddAction("MainMenu", "Fill"); // AddAction("MainMenu", "Stripe"); // AddAction("MainMenu", "Text"); AddAction("MainMenu", "Vector"); AddAction("WorkArea", "Square"); AddAction("WorkArea", "Rectangle"); AddAction("WorkArea", "Circle"); AddAction("WorkArea", "Ellipse"); AddAction("WorkArea", "Irregular"); AddAction("WorkArea", "SurfaceByMultiColors"); AddAction("WorkArea", "SurfaceBySingleColor"); AddAction("WorkArea", "Magic"); AddAction("WorkArea", "Surface"); AddAction("WorkArea", "Outline"); AddAction("WorkArea", "Whole"); AddAction("WorkArea", "Release"); AddAction("WorkArea", "Invert"); AddAction("WorkArea", "Undo"); AddAction("MoveCopy", "CopyNormal"); AddAction("MoveCopy", "CopyTBMirror"); AddAction("MoveCopy", "CopyLRMirror"); AddAction("MoveCopy", "CopyRotateMirror"); AddAction("MoveCopy", "CopyRotate180"); AddAction("MoveCopy", "CopyRotate"); AddAction("MoveCopy", "CopyBend"); AddAction("MoveCopy", "MoveNormal"); AddAction("MoveCopy", "MoveTBMirror"); AddAction("MoveCopy", "MoveLRMirror"); AddAction("MoveCopy", "MoveRotateMirror"); AddAction("MoveCopy", "MoveRotate180"); AddAction("MoveCopy", "MoveRotate"); AddAction("MoveCopy", "MoveBend"); AddAction("ColorChange", "SwapByWorkArea"); AddAction("ColorChange", "FromSingleToSingleByWorkArea"); AddAction("ColorChange", "FromMultiToSingleByWorkArea"); AddAction("ColorChange", "FromSingleToSingleByPen"); AddAction("ColorChange", "FromMultiToSingleByPen"); AddAction("ColorChange", "HLS"); AddAction("ColorChange", "CMY"); AddAction("Clear", "Whole"); AddAction("Clear", "WorkAreaIn"); AddAction("Clear", "WorkAreaOut"); AddAction("Clear", "ByPen"); AddAction("ColorGrouping", "AutoBy256"); AddAction("ColorGrouping", "FilterBy256"); AddAction("ColorGrouping", "ColorChooseBy256"); AddAction("ColorGrouping", "RearrangeBy256"); AddAction("ColorGrouping", "FullColor"); AddAction("ManualRepeat", "Normal"); AddAction("ManualRepeat", "VertDiv"); AddAction("ManualRepeat", "HorzDiv"); AddAction("ManualRepeat", "NormalFitIn"); AddAction("ManualRepeat", "VertFitIn"); AddAction("ManualRepeat", "HorzFitIn"); AddAction("AutoRepeat", "Normal"); AddAction("AutoRepeat", "HorzDiv"); AddAction("AutoRepeat", "VertDiv"); AddAction("AutoRepeat", "Exit"); // AddAction("Draw", "Line"); // AddAction("Draw", "Curve"); // AddAction("Draw", "Square"); // AddAction("Draw", "Rectangle"); // AddAction("Draw", "Circle"); // AddAction("Draw", "Ellipse"); // AddAction("Draw", "Outline"); AddAction("Proportion", "Rectangle"); AddAction("Proportion", "Pull"); AddAction("Proportion", "PerspectiveByAxisX"); AddAction("Proportion", "PerspectiveByAxisY"); // AddAction("Fill", "FromSingleToSingle"); // AddAction("Fill", "FromSingle"); // AddAction("Fill", "FromMulti"); AddAction("Vector", "Line"); AddAction("Vector", "Curve"); AddAction("Vector", "Square"); AddAction("Vector", "Rectangle"); AddAction("Vector", "Circle"); AddAction("Vector", "Ellipse"); AddAction("Vector", "Text"); AddAction("Vector", "EditObject"); AddAction("Vector", "SelectAll"); AddAction("Vector", "SelectDirect"); AddAction("Vector", "Convert"); AddAction("Vector", "AddPoint"); AddAction("Vector", "DeletePoint"); AddAction("Vector", "Knife"); AddAction("Vector", "BringToFront"); AddAction("Vector", "SendToBack"); AddAction("Vector", "Group"); AddAction("Vector", "Ungroup"); AddAction("Vector", "Lock"); AddAction("Vector", "Unlock"); AddAction("Vector", "JoinPoint"); AddAction("Vector", "ArrangePointHorz"); AddAction("Vector", "ArrangePointVert"); AddAction("Vector", "ArrangePointBoth"); AddAction("Vector", "Undo"); AddAction("Vector", "Redo"); AddAction("Vector", "QualitySpeed"); AddAction("Vector", "ImageSpray"); AddAction("Vector", "Cutting"); AddAction("Etc", "ControlT"); AddAction("Etc", "DefaultSize1"); AddAction("Etc", "DefaultSize2"); //AddAction("Textile", "Delete"); // DeleteŰ·Î ÀÛ¾÷±¸¿ª »èÁ¦ AddAction("Textile", "LeftBracketPenSizeDecrement"); // [·Î Ææ ±½±â Ãà¼Ò AddAction("Textile", "RightBracketPenSizeIncrement"); // ]·Î Ææ ±½±â È®Àå AddAction("Textile", "CtrlPlusZoomIn"); // Ctrl+'+'·Î È®´ë AddAction("Textile", "CtrlMinusZoomOut"); // Ctrl+'-'·Î Ãà¼Ò AddAction("System", "CtrlF4Close"); // Ctrl+F4·Î ĵ¹ö½º ´Ý±â AddAction("System", "CtrlF6Next"); // Ctrl+F6·Î ĵ¹ö½º Àüȯ AddAction("System", "CtrlTabNext"); // Ctrl+TabÀ¸·Î ĵ¹ö½º Àüȯ AddAction("System", "AltF4Exit"); // Alt+F4·Î ÇÁ·Î±×·¥ Á¾·á } // --------------------------------------------------------------------------- /** @brief ´ÜÃàŰ °´Ã¼µéÀ» ÃʱâÈ­ÇÑ´Ù */ void __fastcall TTexActionManager::Clear() { TAction *Action = NULL; SetEnabled(false); if (ActionList) { for (int i = 0; i < ActionList->ActionCount; i++) { Action = (TAction *)ActionList->Actions[i]; if (Action) { Action->ActionList = NULL; delete Action; } Action = NULL; } ActionList->CleanupInstance(); } if (ExcludedList) { for (int i = 0; i < ExcludedList->Count; i++) { Action = (TAction *)ExcludedList->Items[i]; if (Action) delete Action; Action = NULL; } ExcludedList->Clear(); } if (DisplayOnlyList) { for (int i = 0; i < DisplayOnlyList->Count; i++) { Action = (TAction *)DisplayOnlyList->Items[i]; if (Action) delete Action; Action = NULL; } DisplayOnlyList->Clear(); } } // --------------------------------------------------------------------------- /** @brief INI, TDW ÆÄÀÏ¿¡¼­ ´ÜÃàŰ µ¥ÀÌÅ͸¦ °¡Á®¿Â´Ù @param FileName : ´ÜÃà۰¡ µé¾îÀÖ´Â ÆÄÀϸí @param TDWFileName : ´ÜÃàŰ ³»¿ë ¼³¸íÀÌ µé¾îÀÖ´Â TDW ÆÄÀϸí @return bool : ÆÄÀÏ Àб⠼º°ø/½ÇÆÐ ¿©ºÎ */ bool __fastcall TTexActionManager::LoadFromFile(String strAActionFileName, String strATDWFileName) { bool bReturn = false; TIniFile *ActionIniFile = NULL, *TDWIniFile = NULL; TAction *Action = NULL; int nValue = 0, nCount = 0; String strId = 0, strText = 0, strValue = 0; if (FileExists(strAActionFileName) == false || FileExists(strATDWFileName) == false) { // Message : ´ÜÃàŰ ÆÄÀÏÀÌ ¾ø½À´Ï´Ù. MessageDlg(IDS_MSG_FILE_NOT_FOUND, mtError, TMsgDlgButtons() << mbOK, 0); return bReturn; } ActionIniFile = new TIniFile(strAActionFileName); TDWIniFile = new TIniFile(strATDWFileName); if (ActionIniFile && TDWIniFile) { ActionFileName = strAActionFileName; TDWFileName = strATDWFileName; // Action for (int i = 0; i < ActionList->ActionCount; i++) { Action = (TAction *)ActionList->Actions[i]; if (Action) { Action->Tag = i; // Key Code nValue = ActionIniFile->ReadInteger(Action->Category, Action->Caption, 0); Action->ShortCut = nValue; Action->Hint = TDWIniFile->ReadString(Action->Category, Action->Caption, ""); // Hint°¡ ¾ø´Â °æ¿ìµµ ÀÖÀ½ [System]ÀÇ °æ¿ì - by monkman (2010.07.30) //if (Action->Hint.IsEmpty()) { // //Message : ´ÜÃàŰ ÆÄÀÏÀ» ¿­ ¼ö ¾ø½À´Ï´Ù. // MessageDlg(IDS_MSG_DONOT_OPEN_FILE, mtError, TMsgDlgButtons() << mbOK, 0); //} } } // Á¦¿ÜµÈ ´ÜÃàŰ // ÃʱâÈ­ if (ExcludedList) { for (int i = 0; i < ExcludedList->Count; i++) { Action = (TAction *)ExcludedList->Items[i]; if (Action) delete Action; Action = NULL; } ExcludedList->Clear(); } nCount = ActionIniFile->ReadInteger("ExcludedShortCuts", "Count", 0); for (int i = 0; i < nCount; i++) { Action = new TAction(NULL); // Key Code nValue = ActionIniFile->ReadInteger("ExcludedShortCuts", IntToStr(i), 0); Action->ShortCut = nValue; ExcludedList->Add(Action); } // º¸¿©Áֱ⸸ ÇÏ´Â ´ÜÃàŰ // ÃʱâÈ­ if (DisplayOnlyList) { for (int i = 0; i < DisplayOnlyList->Count; i++) { Action = (TAction *)DisplayOnlyList->Items[i]; if (Action) delete Action; Action = NULL; } DisplayOnlyList->Clear(); } nCount = TDWIniFile->ReadInteger("DisplayOnly", "Count", 0); for (int i = 0; i < nCount; i++) { Action = new TAction(NULL); // Key Code strId = IntToStr(i)+"T"; strText = TDWIniFile->ReadString("DisplayOnly", strId, ""); strId = IntToStr(i)+"V"; strValue = TDWIniFile->ReadString("DisplayOnly", strId, ""); Action->Category = "DisplayOnly"; Action->Caption = strValue; Action->Hint = strText; DisplayOnlyList->Add(Action); } delete ActionIniFile; delete TDWIniFile; bReturn = true; } else { // Message : ´ÜÃàŰ ÆÄÀÏÀ» ¿­ ¼ö ¾ø½À´Ï´Ù. MessageDlg(IDS_MSG_DONOT_OPEN_FILE, mtError, TMsgDlgButtons() << mbOK, 0); bReturn = false; } ActionIniFile = NULL; TDWIniFile = NULL; return bReturn; } // --------------------------------------------------------------------------- /** @brief ´ÜÃàŰ ÆÄÀÏÀ» ÀúÀåÇÑ´Ù @param ActionFileName : ´ÜÃàŰ µ¥ÀÌÅͰ¡ µé¾îÀÖ´Â ÆÄÀϸí @return bool : ÆÄÀÏ ¾²±â ¼º°ø/½ÇÆÐ ¿©ºÎ */ bool __fastcall TTexActionManager::SaveToFile(String strAActionFileName) { bool bReturn = false; TIniFile *IniFile = NULL; TAction *Action = NULL; int nValue; IniFile = new TIniFile(strAActionFileName); if (IniFile) { ActionFileName = strAActionFileName; // Action for (int i = 0; i < ActionList->ActionCount; i++) { Action = (TAction *)ActionList->Actions[i]; if (Action) { IniFile->WriteInteger(Action->Category, Action->Caption, Action->ShortCut); } } delete IniFile; bReturn = true; } else { bReturn = false; } IniFile = NULL; return bReturn; } // --------------------------------------------------------------------------- /** @brief ´ÜÃà۸¦ °­Á¦·Î Ȱ¼ºÈ­/ºñȰ¼ºÈ­ ÇÑ´Ù @param bAEnabled : Ȱ¼ºÈ­ ¿©ºÎ */ void __fastcall TTexActionManager::SetSwitch(bool bAForceSwitch) { if (bAForceSwitch == true) { FForceSwitch = true; SetEnabled(true); } else { FForceSwitch = false; SetEnabled(false); } } // --------------------------------------------------------------------------- /** @brief ´ÜÃà۸¦ Ȱ¼ºÈ­/ºñȰ¼ºÈ­ ÇÑ´Ù @param bAEnabled : Ȱ¼ºÈ­ ¿©ºÎ */ void __fastcall TTexActionManager::SetEnabled(bool bAEnabled) { if (FForceSwitch == true && bAEnabled == true) { // °­Á¦ Ȱ¼ºÈ­/ºñȰ¼ºÈ­ ¸ÕÀú üũ ActionList->State = asNormal; FEnabled = true; } else { ActionList->State = asSuspended; FEnabled = false; } } // --------------------------------------------------------------------------- /** @brief Category¿¡ ÇØ´çµÇ´Â ´ÜÃàŰ µ¥ÀÌÅ͸¦ List¿¡ Ãß°¡ÇÑ´Ù @param strACategory : Ä«Å×°í¸® Á¤º¸ @param List : ´ÜÃàŰ µ¥ÀÌÅͰ¡ Ãß°¡µÉ ¸®½ºÆ® */ void __fastcall TTexActionManager::FindCategory(String strACategory, TList *List) { TAction *Action = NULL; if (List) { List->Clear(); for (int i = 0; i < ActionList->ActionCount; i++) { Action = (TAction*)ActionList->Actions[i]; if (Action->Category == strACategory) List->Add(Action); } } } // --------------------------------------------------------------------------- /** @brief INI ÆÄÀÏ Á¤º¸·Î ¸®½ºÆ®³»¿¡¼­ ´ÜÃà۸¦ ã´Â´Ù @param strACategory : Category @param strACaption : ACaption @return TAction : °Ë»öµÈ ´ÜÃàŰ (TAction) µ¥ÀÌÅÍ */ TAction * __fastcall TTexActionManager::FindAction(String strACategory, String strACaption, bool bShortcutDefined) { TAction *Action = NULL; if (strACategory.IsEmpty() == false && strACaption.IsEmpty() == false) { for (int i = 0; i < ActionList->ActionCount; i++) { Action = (TAction*)ActionList->Actions[i]; if (Action && Action->Category == strACategory && Action->Caption == strACaption) { if ((bShortcutDefined == true && 0 < Action->ShortCut) || bShortcutDefined == false) return Action; } } } return NULL; } // --------------------------------------------------------------------------- /** @brief ShortCutÀ¸·Î ´ÜÃà۸¦ ã´Â´Ù @param nAShortCut : °Ë»öÇÒ ShortCut @return TAction : °Ë»öµÈ ´ÜÃàŰ (TAction) µ¥ÀÌÅÍ */ TAction * __fastcall TTexActionManager::FindAction(int nAShortCut) { TAction *Action = NULL; if (0 < nAShortCut) { for (int i = 0; i < ActionList->ActionCount; i++) { Action = (TAction*)ActionList->Actions[i]; if (Action && Action->ShortCut == nAShortCut) return Action; } } return NULL; } // --------------------------------------------------------------------------- /** @brief Á¦¿ÜÇÒ ShortCut üũ @param nAShortCut : ShortCut @return bool : Á¦¿ÜÇÒ ShortCutÀÎ °æ¿ì true, ¾Æ´Ï¸é false */ bool __fastcall TTexActionManager::IsExcludedShortCut(int nAShortCut) { TAction *Action = NULL; if (0 < nAShortCut) { for (int i = 0;i < ExcludedList->Count; i++) { Action = (TAction *)ExcludedList->Items[i]; if (Action && Action->ShortCut == nAShortCut) return true; } } return false; } // --------------------------------------------------------------------------- /** @brief ´ÜÃà۸¦ ¹®ÀÚ ÇüÅ·Πº¯°æ (65 => 'A') @param nAShortCut : ¹®ÀÚ·Î º¯°æÇÒ ´ÜÃàŰ @return String : ¹®ÀÚ·Î º¯°æµÈ ´ÜÃàŰ */ String __fastcall TTexActionManager::ShortCutToString(int nAShortCut) { String strShortCut = ""; if (0 < nAShortCut) { if (nAShortCut & 0x8000) { strShortCut += "Alt + "; } if (nAShortCut & 0x2000) { strShortCut += "Shift + "; } if (nAShortCut & 0x4000) { strShortCut += "Ctrl + "; } nAShortCut &= 0xFF; if ('A' <= nAShortCut && nAShortCut <= 'Z') { strShortCut += (wchar_t)nAShortCut; } else if (nAShortCut == VK_ESCAPE) { // ESC ó¸® strShortCut = "ESC"; } } return strShortCut; } // --------------------------------------------------------------------------- /** @brief Category¿Í Caption Á¤º¸·Î Hint¸¦ ã´Â´Ù @param strACategory : Category @param strACaption : Caption @return String : Hint */ String __fastcall TTexActionManager::GetHint(String strACategory, String strACaption) { TAction *Action = NULL; String strHint = ""; Action = FindAction(strACategory, strACaption, false); if (Action) { strHint = Action->Hint; if (0 < Action->ShortCut) { strHint = strHint + " (" + ShortCutToString(Action->ShortCut) + ")"; } } return strHint; } // --------------------------------------------------------------------------- /** @brief ´ÜÃàŰ À̺¥Æ®¸¦ ½ÇÇàÇÑ´Ù */ void __fastcall TTexActionManager::ExecuteOperation(TObject *Sender) { TAction *Action = NULL; if (FEnabled == true) { Action = dynamic_cast(Sender); if (Action) { if (MainMenuForm) MainMenuForm->ExecuteHotKey(Action); } } } // ---------------------------------------------------------------------------