4#include "Stroika/Foundation/StroikaPreComp.h"
6DISABLE_COMPILER_MSC_WARNING_START (5054)
8DISABLE_COMPILER_MSC_WARNING_END (5054)
17#include "UserConfigCommands.h"
19using Characters::String;
22 template <
class EnumType,
class CollType>
23 HRESULT CreateSTLEnumerator (IUnknown** ppUnk, IUnknown* pUnkForRelease, CollType& collection)
29 CComObject<EnumType>* pEnum = NULL;
30 HRESULT hr = CComObject<EnumType>::CreateInstance (&pEnum);
35 hr = pEnum->Init (pUnkForRelease, collection);
38 hr = pEnum->QueryInterface (ppUnk);
48 template <
typename INT_NAME_GRABBER>
49 void DoRemove (vector<CComPtr<IDispatch>>* list, VARIANT eltIntNameOrIndex)
51 CComVariant e2r (eltIntNameOrIndex);
52 if (SUCCEEDED (e2r.ChangeType (VT_UI4))) {
53 size_t idx = e2r.ulVal;
54 if (idx >= list->size ()) {
57 list->erase (list->begin () + idx, list->begin () + idx + 1);
59 else if (SUCCEEDED (e2r.ChangeType (VT_BSTR))) {
60 for (vector<CComPtr<IDispatch>>::iterator i = list->begin (); i != list->end (); ++i) {
61 if (wstring (INT_NAME_GRABBER (*i)) == wstring (e2r.bstrVal)) {
62 list->erase (i, i + 1);
67 else if (SUCCEEDED (e2r.ChangeType (VT_DISPATCH))) {
68 for (vector<CComPtr<IDispatch>>::iterator i = list->begin (); i != list->end (); ++i) {
69 if ((*i).p == e2r.pdispVal) {
70 list->erase (i, i + 1);
76 template <
typename INT_NAME_GRABBER>
77 size_t DoFindIndex (vector<CComPtr<IDispatch>>* list, VARIANT eltIntNameOrObj)
79 for (vector<CComPtr<IDispatch>>::iterator i = list->begin (); i != list->end (); ++i) {
80 CComVariant nameV (eltIntNameOrObj);
81 if (SUCCEEDED (nameV.ChangeType (VT_BSTR))) {
82 if (wstring (INT_NAME_GRABBER (*i)) == wstring (nameV.bstrVal)) {
83 return i - list->begin ();
86 else if (SUCCEEDED (nameV.ChangeType (VT_DISPATCH))) {
87 if ((*i).p == nameV.pdispVal) {
88 return i - list->begin ();
97 struct CMD_NAME_GRABBER {
98 CMD_NAME_GRABBER (IDispatch* p)
104#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
105 CComQIPtr<IALCommand> c = (IDispatch*)fDisp;
107 CComQIPtr<IALCommand> c = fDisp;
111 return wstring (name);
113 CComPtr<IDispatch> fDisp;
116 struct ACCEL_NAME_GRABBER {
117 ACCEL_NAME_GRABBER (IDispatch* p)
123#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
124 CComQIPtr<IALAcceleratorElement> c = (IDispatch*)fDisp;
126 CComQIPtr<IALAcceleratorElement> c = fDisp;
130 return wstring (name);
132 CComPtr<IDispatch> fDisp;
138 struct STL_ATL_COPY_VARIANT_IDISPATCH {
139 static HRESULT copy (VARIANT* p1,
const ATL::CComPtr<IDispatch>* p2)
141 if (p2 != NULL and *p2 != NULL) {
142 p1->vt = VT_DISPATCH;
144 IDispatch* pp2 = *p2;
153 static void init (VARIANT* p)
157 static void destroy (VARIANT* p)
165 wstring NormalizeCmdNameToInternal (
const wstring& cmdName)
167 wstring result = cmdName;
169 for (wstring::iterator i = result.begin (); i != result.end (); ++i) {
171 if (iswspace (*i) or (iswpunct (*i) and *i !=
'-' and *i !=
'_')) {
172 result.erase (i, i + 1);
181 const string kFontNameCMDPrefix =
"FontName";
189UserCommandNameNumberRegistry* UserCommandNameNumberRegistry::sThis;
191UserCommandNameNumberRegistry& UserCommandNameNumberRegistry::Get ()
194 sThis =
new UserCommandNameNumberRegistry ();
199UserCommandNameNumberRegistry::UserCommandNameNumberRegistry ()
202 , fNextUserCmdNum (kFirstOLEUserCmdCmdID)
206UINT UserCommandNameNumberRegistry::Enter (
const wstring& internalName)
209 if (not Lookup (internalName, &cmdNum)) {
210 fName2Num.insert (map<wstring, UINT>::value_type (internalName, fNextUserCmdNum));
211 fNum2Name.insert (map<UINT, wstring>::value_type (fNextUserCmdNum, internalName));
212 cmdNum = fNextUserCmdNum;
214 if (fNextUserCmdNum > kLastOLEUserCmdCmdID) {
216 fNextUserCmdNum = kFirstOLEUserCmdCmdID;
222bool UserCommandNameNumberRegistry::Lookup (UINT cmdNum, wstring* internalName)
224 map<UINT, wstring>::const_iterator i = fNum2Name.find (cmdNum);
225 if (i == fNum2Name.end ()) {
229 *internalName = (*i).second;
234bool UserCommandNameNumberRegistry::Lookup (
const wstring& internalName, UINT* cmdNum)
236 map<wstring, UINT>::const_iterator i = fName2Num.find (internalName);
237 if (i == fName2Num.end ()) {
241 *cmdNum = (*i).second;
246wstring UserCommandNameNumberRegistry::Lookup (UINT cmdNum)
249 [[maybe_unused]]
bool r = Lookup (cmdNum, &name);
259ActiveLedIt_CurrentEventArguments::ActiveLedIt_CurrentEventArguments ()
267ActiveLedIt_CurrentEventArguments::~ActiveLedIt_CurrentEventArguments ()
271STDMETHODIMP ActiveLedIt_CurrentEventArguments::get_InternalCommandName (BSTR* pVal)
277 *pVal = CComBSTR (fInternalName.c_str ()).Detach ();
279 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
283STDMETHODIMP ActiveLedIt_CurrentEventArguments::put_InternalCommandName (BSTR val)
291 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
295STDMETHODIMP ActiveLedIt_CurrentEventArguments::get_Enabled (VARIANT_BOOL* pVal)
303 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
307STDMETHODIMP ActiveLedIt_CurrentEventArguments::put_Enabled (VARIANT_BOOL val)
313STDMETHODIMP ActiveLedIt_CurrentEventArguments::get_Checked (VARIANT_BOOL* pVal)
321 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
325STDMETHODIMP ActiveLedIt_CurrentEventArguments::put_Checked (VARIANT_BOOL val)
331STDMETHODIMP ActiveLedIt_CurrentEventArguments::get_Name (BSTR* pVal)
337 *pVal = CComBSTR (fName.c_str ()).Detach ();
339 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
343STDMETHODIMP ActiveLedIt_CurrentEventArguments::put_Name (BSTR val)
351 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
355HRESULT ActiveLedIt_CurrentEventArguments::FinalConstruct ()
360void ActiveLedIt_CurrentEventArguments::FinalRelease ()
369AL_CommandListHelper::AL_CommandListHelper ()
374AL_CommandListHelper::~AL_CommandListHelper ()
378STDMETHODIMP AL_CommandListHelper::GeneratePopupMenu (IDispatch* acceleratorTable, HMENU* val)
384 HMENU hMenu = ::CreatePopupMenu ();
385 for (vector<CComPtr<IDispatch>>::iterator i = fOwnedItems.begin (); i != fOwnedItems.end (); ++i) {
386#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
387 CComQIPtr<IALCommand> alc = (IDispatch*)*i;
389 CComQIPtr<IALCommand> alc = *i;
398 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
401STDMETHODIMP AL_CommandListHelper::LookupCommand (BSTR internalName, IDispatch** val)
408 for (vector<CComPtr<IDispatch>>::iterator i = fOwnedItems.begin (); i != fOwnedItems.end (); ++i) {
409#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
410 CComQIPtr<IALCommand> alc = (IDispatch*)*i;
412 CComQIPtr<IALCommand> alc = *i;
416 if (iName == internalName) {
422#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
423 CComQIPtr<IALCommandList> alcl = (IDispatch*)*i;
425 CComQIPtr<IALCommandList> alcl = *i;
427 if (alcl.p != NULL) {
438 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
441STDMETHODIMP AL_CommandListHelper::IndexOf (VARIANT internalNameOrObject, UINT* val)
447 *val =
static_cast<UINT
> (DoFindIndex<CMD_NAME_GRABBER> (&fOwnedItems, internalNameOrObject));
450 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
453STDMETHODIMP AL_CommandListHelper::get__NewEnum (IUnknown** ppUnk)
455 using VarVarEnum = CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, STL_ATL_COPY_VARIANT_IDISPATCH, std::vector<CComPtr<IDispatch>>>;
460 return CreateSTLEnumerator<VarVarEnum> (ppUnk,
this, fOwnedItems);
462 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
465STDMETHODIMP AL_CommandListHelper::get_Item (
long Index, IDispatch** pVal)
470 if (Index < 0 or
static_cast<size_t> (Index) >= fOwnedItems.size ()) {
474 *pVal = fOwnedItems[Index];
477 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
481STDMETHODIMP AL_CommandListHelper::get_Count (
long* pVal)
487 *pVal =
static_cast<long> (fOwnedItems.size ());
489 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
493void AL_CommandListHelper::AppendBuiltinCmd (const BuiltinCmdSpec& cmdSpec)
495 fOwnedItems.push_back (ActiveLedIt_BuiltinCommand::mk (cmdSpec));
498void AL_CommandListHelper::AppendBuiltinCmds (
const BuiltinCmdSpec* cmdSpecsStart,
const BuiltinCmdSpec* cmdSpecsEnd)
500 for (
const BuiltinCmdSpec* i = cmdSpecsStart; i != cmdSpecsEnd; ++i) {
501 AppendBuiltinCmd (*i);
510AL_UserCommandListHelper::AL_UserCommandListHelper ()
514AL_UserCommandListHelper::~AL_UserCommandListHelper ()
518STDMETHODIMP AL_UserCommandListHelper::Insert (IDispatch* newElt, UINT afterElt)
521 if (newElt == NULL) {
524 size_t idx = min (
static_cast<size_t> (afterElt), fOwnedItems.size ());
525 fOwnedItems.insert (fOwnedItems.begin () + idx, newElt);
527 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
531STDMETHODIMP AL_UserCommandListHelper::Remove (VARIANT eltIntNameOrIndex)
534 DoRemove<CMD_NAME_GRABBER> (&fOwnedItems, eltIntNameOrIndex);
537 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
540STDMETHODIMP AL_UserCommandListHelper::Clear ()
543 fOwnedItems.clear ();
546 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
554ActiveLedIt_UserCommand::ActiveLedIt_UserCommand ()
556 fCommandNumber = UserCommandNameNumberRegistry::Get ().Enter (fInternalName);
559ActiveLedIt_UserCommand::~ActiveLedIt_UserCommand ()
563HRESULT ActiveLedIt_UserCommand::FinalConstruct ()
568void ActiveLedIt_UserCommand::FinalRelease ()
572STDMETHODIMP ActiveLedIt_UserCommand::put_Name (BSTR val)
580 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
584STDMETHODIMP ActiveLedIt_UserCommand::put_InternalName (BSTR val)
591 fCommandNumber = UserCommandNameNumberRegistry::Get ().Enter (fInternalName);
593 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
602ActiveLedIt_AcceleratorElement::ActiveLedIt_AcceleratorElement ()
603 : fCommandInternalName ()
604 , fAcceleratorModifierFlag (static_cast<AcceleratorModifierFlag> (0))
609HRESULT ActiveLedIt_AcceleratorElement::FinalConstruct ()
614void ActiveLedIt_AcceleratorElement::FinalRelease ()
618STDMETHODIMP ActiveLedIt_AcceleratorElement::get_CommandInternalName (BSTR* pVal)
624 *pVal = CComBSTR (fCommandInternalName.c_str ()).Detach ();
627 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
630STDMETHODIMP ActiveLedIt_AcceleratorElement::put_CommandInternalName (BSTR val)
636 fCommandInternalName = val;
638 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
642STDMETHODIMP ActiveLedIt_AcceleratorElement::get_ModifierFlag (AcceleratorModifierFlag* pVal)
648 *pVal = fAcceleratorModifierFlag;
651 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
654STDMETHODIMP ActiveLedIt_AcceleratorElement::put_ModifierFlag (AcceleratorModifierFlag val)
660 fAcceleratorModifierFlag = val;
662 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
666STDMETHODIMP ActiveLedIt_AcceleratorElement::get_Key (WORD* pVal)
675 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
678STDMETHODIMP ActiveLedIt_AcceleratorElement::put_Key (WORD val)
686 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
695ActiveLedIt_AcceleratorTable::ActiveLedIt_AcceleratorTable ()
700ActiveLedIt_AcceleratorTable::~ActiveLedIt_AcceleratorTable ()
704HRESULT ActiveLedIt_AcceleratorTable::FinalConstruct ()
709void ActiveLedIt_AcceleratorTable::FinalRelease ()
713void ActiveLedIt_AcceleratorTable::AppendACCEL (
const char* internalCmdName, AcceleratorModifierFlag modifierFlag, WORD key)
715 CComObject<ActiveLedIt_AcceleratorElement>* ae = NULL;
717 CComQIPtr<IDispatch> result = ae->GetUnknown ();
718 ae->put_CommandInternalName (CComBSTR (internalCmdName));
719 ae->put_ModifierFlag (modifierFlag);
724STDMETHODIMP ActiveLedIt_AcceleratorTable::get__NewEnum (IUnknown** ppUnk)
726 using VarVarEnum = CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, STL_ATL_COPY_VARIANT_IDISPATCH, std::vector<CComPtr<IDispatch>>>;
731 return CreateSTLEnumerator<VarVarEnum> (ppUnk,
this, fAccelerators);
733 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
736STDMETHODIMP ActiveLedIt_AcceleratorTable::get_Item (
long Index, IDispatch** pVal)
741 if (Index < 0 or
static_cast<size_t> (Index) >= fAccelerators.size ()) {
745 *pVal = fAccelerators[Index];
748 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
752STDMETHODIMP ActiveLedIt_AcceleratorTable::get_Count (
long* pVal)
758 *pVal =
static_cast<long> (fAccelerators.size ());
760 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
764STDMETHODIMP ActiveLedIt_AcceleratorTable::Lookup (BSTR cmdInternalName, IDispatch** pVal)
769 if (cmdInternalName == NULL) {
774 for (vector<CComPtr<IDispatch>>::const_iterator i = fAccelerators.begin (); i != fAccelerators.end (); ++i) {
775#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
776 CComQIPtr<IALAcceleratorElement> ae = (IDispatch*)*i;
778 CComQIPtr<IALAcceleratorElement> ae = *i;
780 CComBSTR itsInternalCmdName;
782 if (CComBSTR (cmdInternalName) == itsInternalCmdName) {
790 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
793STDMETHODIMP ActiveLedIt_AcceleratorTable::Add (IDispatch* newElt, UINT atIndex)
795 if (newElt == NULL) {
799 size_t idx = min (
static_cast<size_t> (atIndex), fAccelerators.size ());
800 fAccelerators.insert (fAccelerators.begin () + idx, newElt);
802 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
806STDMETHODIMP ActiveLedIt_AcceleratorTable::Remove (VARIANT eltIntNameOrIndex)
809 DoRemove<ACCEL_NAME_GRABBER> (&fAccelerators, eltIntNameOrIndex);
812 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
815STDMETHODIMP ActiveLedIt_AcceleratorTable::Clear ()
818 fAccelerators.clear ();
820 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
824STDMETHODIMP ActiveLedIt_AcceleratorTable::GenerateWin32AcceleratorTable (HACCEL* pVal)
830#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
831 CComQIPtr<IALCommandList> builtins = (IDispatch*)GenerateBuiltinCommandsObject ();
833 CComQIPtr<IALCommandList> builtins = GenerateBuiltinCommandsObject ();
836 Memory::StackBuffer<ACCEL> accels{fAccelerators.size ()};
837 size_t goodKeysFound = 0;
838 for (vector<CComPtr<IDispatch>>::const_iterator i = fAccelerators.begin (); i != fAccelerators.end (); ++i) {
839#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
840 CComQIPtr<IALAcceleratorElement> ae = (IDispatch*)*i;
842 CComQIPtr<IALAcceleratorElement> ae = *i;
844 CComBSTR internalCmdName;
850 builtins->get_Count (&bicc);
851 for (
long ii = 0; ii < bicc; ++ii) {
852 CComPtr<IDispatch> e;
854#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
855 CComQIPtr<IALCommand> alc = (IDispatch*)e;
857 CComQIPtr<IALCommand> alc = e;
861 if (bicCmdName == internalCmdName) {
863 HMENU hMenu = ::CreatePopupMenu ();
865 cmdNum = ::GetMenuItemID (hMenu, 0);
866 ::DestroyMenu (hMenu);
872 (void)UserCommandNameNumberRegistry::Get ().Lookup (wstring (internalCmdName), &cmdNum);
877 AcceleratorModifierFlag modfierFlag;
881 accels[goodKeysFound].fVirt =
static_cast<BYTE
> (modfierFlag);
882 accels[goodKeysFound].key = key;
883 Assert (cmdNum <= numeric_limits<WORD>::max ());
884 accels[goodKeysFound].cmd =
static_cast<WORD
> (cmdNum);
887 *pVal = ::CreateAcceleratorTable (accels.data (),
static_cast<int> (goodKeysFound));
890 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
899ActiveLedIt_StaticCommandList::ActiveLedIt_StaticCommandList ()
903ActiveLedIt_StaticCommandList::~ActiveLedIt_StaticCommandList ()
907void ActiveLedIt_StaticCommandList::Append (IDispatch* p)
909 fOwnedItems.push_back (p);
912HRESULT ActiveLedIt_StaticCommandList::FinalConstruct ()
917void ActiveLedIt_StaticCommandList::FinalRelease ()
926ActiveLedIt_UserCommandList::ActiveLedIt_UserCommandList ()
930ActiveLedIt_UserCommandList::~ActiveLedIt_UserCommandList ()
934HRESULT ActiveLedIt_UserCommandList::FinalConstruct ()
939void ActiveLedIt_UserCommandList::FinalRelease ()
948ActiveLedIt_MenuItemPopup::ActiveLedIt_MenuItemPopup ()
952ActiveLedIt_MenuItemPopup::~ActiveLedIt_MenuItemPopup ()
956HRESULT ActiveLedIt_MenuItemPopup::FinalConstruct ()
961void ActiveLedIt_MenuItemPopup::FinalRelease ()
965STDMETHODIMP ActiveLedIt_MenuItemPopup::Insert (IDispatch* newElt, UINT afterElt)
967 if (newElt == NULL) {
971 size_t idx = min (
static_cast<size_t> (afterElt), fOwnedItems.size ());
972 fOwnedItems.insert (fOwnedItems.begin () + idx, newElt);
974 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
978STDMETHODIMP ActiveLedIt_MenuItemPopup::Remove (VARIANT eltIntNameOrIndex)
981 DoRemove<CMD_NAME_GRABBER> (&fOwnedItems, eltIntNameOrIndex);
984 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
987STDMETHODIMP ActiveLedIt_MenuItemPopup::Clear ()
990 fOwnedItems.clear ();
992 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
996STDMETHODIMP ActiveLedIt_MenuItemPopup::AppendSelfToMenu (HMENU menu, IDispatch* acceleratorTable)
999 HMENU subMenu = NULL;
1001 ::AppendMenu (menu, MF_POPUP,
reinterpret_cast<UINT_PTR
> (subMenu),
String{L
"&" + fName}.
AsSDKString ().c_str ());
1004 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
1012AL_CommandHelper::AL_CommandHelper ()
1015 , fCommandNumber (0)
1019AL_CommandHelper::~AL_CommandHelper ()
1023STDMETHODIMP AL_CommandHelper::get_Name (BSTR* pVal)
1026 return E_INVALIDARG;
1029 *pVal = CComBSTR (fName.c_str ()).Detach ();
1031 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
1035STDMETHODIMP AL_CommandHelper::get_InternalName (BSTR* pVal)
1038 return E_INVALIDARG;
1041 *pVal = CComBSTR (fInternalName.c_str ()).Detach ();
1044 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
1047STDMETHODIMP AL_CommandHelper::AppendSelfToMenu (HMENU menu, IDispatch* acceleratorTable)
1052 if (acceleratorTable) {
1053 CComQIPtr<IALAcceleratorTable> at = acceleratorTable;
1055 CComPtr<IDispatch> accelElt;
1057 if (accelElt.p != NULL) {
1058#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
1059 CComQIPtr<IALAcceleratorElement> accelerator = (IDispatch*)accelElt;
1061 CComQIPtr<IALAcceleratorElement> accelerator = accelElt;
1064 AcceleratorModifierFlag modFlag =
static_cast<AcceleratorModifierFlag
> (0);
1069 if (modFlag & eVIRTKEY) {
1072 if (modFlag & eCONTROL) {
1075 if (modFlag & eALT) {
1078 if (modFlag & eSHIFT) {
1079 suffix += L
"Shift+";
1081 if (modFlag & eVIRTKEY) {
1082 if (VK_F1 <= key and key <= VK_F12) {
1083 suffix += String::FromSDKString (Characters::CString::Format (Led_SDK_TCHAROF (
"F%d"), key + 1 - VK_F1)).As<wstring> ();
1085 else if (key == VK_SUBTRACT) {
1088 else if (key == VK_ADD) {
1091 else if (key == VK_RETURN) {
1094 else if (key == VK_BACK) {
1095 suffix += L
"Backspace";
1097 else if (key == VK_TAB) {
1100 else if (key == VK_DELETE) {
1101 suffix += L
"Delete";
1103 else if (key == VK_INSERT) {
1104 suffix += L
"Insert";
1106 else if (
'A' <= key and key <=
'Z') {
1107 suffix.push_back (key);
1110 suffix += L
"(Unknown key)";
1116 ::AppendMenu (menu, fCommandNumber == 0 ? MF_SEPARATOR : MF_STRING, fCommandNumber,
1117 String::FromSDKString ((fCommandNumber == 0 ? L
"" : L
"&") + fName + suffix).AsSDKString ().c_str ());
1120 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
1128AL_UserCommandHelper::AL_UserCommandHelper ()
1132AL_UserCommandHelper::~AL_UserCommandHelper ()
1136STDMETHODIMP AL_UserCommandHelper::put_Name (BSTR val)
1139 return E_INVALIDARG;
1145 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
1148STDMETHODIMP AL_UserCommandHelper::put_InternalName (BSTR val)
1151 return E_INVALIDARG;
1154 fInternalName = val;
1157 CATCH_AND_HANDLE_EXCEPTIONS_IN_HRESULT_FUNCTION ()
1165ActiveLedIt_BuiltinCommand::ActiveLedIt_BuiltinCommand ()
1169ActiveLedIt_BuiltinCommand::~ActiveLedIt_BuiltinCommand ()
1173ActiveLedIt_BuiltinCommand* ActiveLedIt_BuiltinCommand::mk (
const BuiltinCmdSpec& cmdSpec)
1178 CComObject<ActiveLedIt_BuiltinCommand>* o = NULL;
1181 o->fName = String::FromNarrowSDKString (cmdSpec.fCmdName).As<wstring> ();
1182 o->fInternalName = NormalizeCmdNameToInternal (String::FromNarrowSDKString (cmdSpec.fInternalCmdName).As<wstring> ());
1183 o->fCommandNumber = cmdSpec.fCmdNum;
1192HRESULT ActiveLedIt_BuiltinCommand::FinalConstruct ()
1197void ActiveLedIt_BuiltinCommand::FinalRelease ()
1206string mkFontNameCMDName (
const SDKString& fontName)
1208 return kFontNameCMDPrefix + String::FromSDKString (fontName).AsNarrowSDKString ();
1216CComPtr<IDispatch> GenerateBuiltinCommandsObject ()
1218 CComPtr<IDispatch> builtinCmds;
1219 CComObject<ActiveLedIt_StaticCommandList>* o = NULL;
1223 o->AppendBuiltinCmds (kAllCmds, kAllCmds + Memory::NEltsOf (kAllCmds));
1225 const vector<SDKString>& fontNames = GetUsableFontNames ();
1226 Assert (fontNames.size () <= kLastFontNameCmd - kBaseFontNameCmd + 1);
1227 for (UINT i = 0; i < fontNames.size (); ++i) {
1228 UINT cmdNum = kBaseFontNameCmd + i;
1229 if (cmdNum > kLastFontNameCmd) {
1232 ActiveLedIt_BuiltinCommand* c = ActiveLedIt_BuiltinCommand::mk (BuiltinCmdSpec (cmdNum, mkFontNameCMDName (fontNames[i]).c_str ()));
1233 c->SetName (String::FromSDKString (fontNames[i]).As<wstring> ());
1245UINT CmdObjOrName2Num (
const VARIANT& cmdObjOrName)
1247 CComVariant c (cmdObjOrName);
1248 if (SUCCEEDED (c.ChangeType (VT_BSTR))) {
1249 wstring lookForCmdName = c.bstrVal == NULL ? wstring () : wstring (c.bstrVal);
1250 for (
const BuiltinCmdSpec* i = kAllCmds; i != kAllCmds + Memory::NEltsOf (kAllCmds); ++i) {
1251 if (NormalizeCmdNameToInternal (String::FromNarrowSDKString ((*i).fInternalCmdName).As<wstring> ()) == lookForCmdName) {
1252 return (*i).fCmdNum;
1256 if (lookForCmdName.length () > kFontNameCMDPrefix.length () and
1257 lookForCmdName.substr (0, kFontNameCMDPrefix.length ()) == String::FromNarrowSDKString (kFontNameCMDPrefix)) {
1258 const vector<SDKString>& fontNames = GetUsableFontNames ();
1259 Assert (fontNames.size () <= kLastFontNameCmd - kBaseFontNameCmd + 1);
1260 for (UINT i = 0; i < fontNames.size (); ++i) {
1261 UINT cmdNum = kBaseFontNameCmd + i;
1262 if (cmdNum > kLastFontNameCmd) {
1265 if (lookForCmdName == NormalizeCmdNameToInternal (String::FromNarrowSDKString (mkFontNameCMDName (fontNames[i])).As<wstring> ())) {
1273 if (UserCommandNameNumberRegistry::Get ().Lookup (c.bstrVal, &uCmdNum)) {
1277 else if (SUCCEEDED (c.ChangeType (VT_DISPATCH))) {
1278 CComQIPtr<IALCommand> bicc = c.pdispVal;
1283 HMENU hMenu = ::CreatePopupMenu ();
1286 UINT cmdNum = ::GetMenuItemID (hMenu, 0);
1287 ::DestroyMenu (hMenu);
1288 return static_cast<WORD
> (cmdNum);
1291 ::DestroyMenu (hMenu);
1304wstring CmdNum2Name (UINT cmdNum)
1307 for (
const BuiltinCmdSpec* i = kAllCmds; i != kAllCmds + Memory::NEltsOf (kAllCmds); ++i) {
1308 if ((*i).fCmdNum == cmdNum) {
1309 return NormalizeCmdNameToInternal (String::FromNarrowSDKString ((*i).fInternalCmdName).As<wstring> ());
1314 if (kBaseFontNameCmd <= cmdNum and cmdNum <= kLastFontNameCmd) {
1315 const vector<SDKString>& fontNames = GetUsableFontNames ();
1316 size_t i = cmdNum - kBaseFontNameCmd;
1317 i = max (fontNames.size () - 1, i);
1318 i = max (fontNames.size (), i);
1319 return NormalizeCmdNameToInternal (String::FromNarrowSDKString (mkFontNameCMDName (fontNames[i])).As<wstring> ());
1323 wstring userCmdIntName;
1324 if (UserCommandNameNumberRegistry::Get ().Lookup (cmdNum, &userCmdIntName)) {
1325 return userCmdIntName;
String is like std::u32string, except it is much easier to use, often much more space efficient,...
nonvirtual SDKString AsSDKString() const