11#include "Stroika/Foundation/StroikaPreComp.h"
19DISABLE_COMPILER_MSC_WARNING_START (5054)
21DISABLE_COMPILER_MSC_WARNING_END (5054)
25#include "Stroika/Foundation/Characters/LineEndings.h"
26#include "Stroika/Foundation/Memory/Platform/Windows/Handle.h"
28#include "Stroika/Frameworks/Led/StdDialogs.h"
29#include "Stroika/Frameworks/Led/StyledTextIO/StyledTextIO_LedNative.h"
30#include "Stroika/Frameworks/Led/StyledTextIO/StyledTextIO_PlainText.h"
32#include "ActiveLedIt.h"
33#include "ActiveLedItPpg.h"
37#include "UserConfigCommands.h"
39#include "ActiveLedItControl.h"
41#include "ActiveLedIt_h.h"
47#define qDisableEditorWhenNotActive 0
49#define CATCH_AND_HANDLE_EXCEPTIONS() \
52 AfxThrowOleException (hr); \
54 catch (const system_error& h) \
56 if (h.code ().category () == Stroika::Foundation::Execution::Platform::Windows::HRESULT_error_category ()) { \
57 AfxThrowOleException (HRESULT_FROM_WIN32 (h.code ().value ())); \
59 if (h.code ().category () == system_category ()) { \
60 AfxThrowOleException (HRESULT_FROM_WIN32 (h.code ().value ())); \
65 AfxThrowMemoryException (); \
68const int kEditorWindowID = 100;
73using namespace Stroika::Frameworks;
74using namespace Stroika::Frameworks::Led;
75using namespace Stroika::Frameworks::Led::StyledTextIO;
85COMBased_SpellCheckEngine::COMBased_SpellCheckEngine (IDispatch* engine)
92bool COMBased_SpellCheckEngine::ScanForUndefinedWord (
const Led_tChar* startBuf,
const Led_tChar* endBuf,
const Led_tChar** cursor,
93 const Led_tChar** wordStartResult,
const Led_tChar** wordEndResult)
96 Require (startBuf <= endBuf);
98 if (fEngine != NULL) {
99 size_t textBufLen = endBuf - startBuf;
100 size_t cursorIdx = *cursor == NULL ? 0 : (*cursor - startBuf);
102 BSTR bstrVal = ::SysAllocStringLen (startBuf,
static_cast<UINT
> (textBufLen));
103 CComVariant textToScan (bstrVal);
104 ::SysFreeString (bstrVal);
106 CComVariant cursorIdxAsCCV = cursorIdx;
107 ThrowIfErrorHRESULT (fEngine.Invoke2 (CA2W (
"CreateScanContext"), &textToScan, &cursorIdxAsCCV, &result));
109 if (result.vt == VT_DISPATCH) {
110 CComPtr<IDispatch> scanContext = result.pdispVal;
111 CComVariant comCursor;
112 if (SUCCEEDED (scanContext.GetPropertyByName (CA2W (
"Cursor"), &comCursor))) {
113 size_t sbCursor = comCursor.uintVal;
114 sbCursor = max (sbCursor, cursorIdx + 1);
115 sbCursor = min (sbCursor, textBufLen);
116 *cursor = startBuf + sbCursor;
118 CComVariant comWordFound;
119 if (SUCCEEDED (scanContext.GetPropertyByName (CA2W (
"WordFound"), &comWordFound)) and comWordFound.boolVal) {
120 CComVariant comWordStart;
121 CComVariant comWordEnd;
122 if (SUCCEEDED (scanContext.GetPropertyByName (CA2W (
"WordStart"), &comWordStart)) and
123 SUCCEEDED (scanContext.GetPropertyByName (CA2W (
"WordEnd"), &comWordEnd)) and
124 SUCCEEDED (comWordStart.ChangeType (VT_UI4)) and SUCCEEDED (comWordEnd.ChangeType (VT_UI4))) {
125 size_t newWS = comWordStart.uintVal;
126 size_t newWE = comWordEnd.uintVal;
127 newWS = min (newWS, textBufLen);
128 newWE = min (newWE, textBufLen);
129 newWE = max (newWS, newWE);
130 *wordStartResult = startBuf + newWS;
131 *wordEndResult = startBuf + newWE;
140bool COMBased_SpellCheckEngine::LookupWord_ (
const Led_tString& checkWord, Led_tString* matchedWordResult)
142 CComVariant comMissingWord;
144 CComVariant checkWordCCV = CComVariant{checkWord.c_str ()};
145 ThrowIfErrorHRESULT (fEngine.Invoke2 (CA2W (
"LookupWord"), &checkWordCCV, matchedWordResult == NULL ? NULL : &comMissingWord, &result));
146 if (SUCCEEDED (result.ChangeType (VT_BOOL)) and result.boolVal) {
147 if (matchedWordResult != NULL) {
148 if (SUCCEEDED (comMissingWord.ChangeType (VT_BSTR))) {
149 *matchedWordResult = Led_tString{comMissingWord.bstrVal};
161vector<Led_tString> COMBased_SpellCheckEngine::GenerateSuggestions (
const Led_tString& misspelledWord)
163 CComVariant comResult;
164 CComVariant misspelledWordAsCCV = misspelledWord.c_str ();
165 ThrowIfErrorHRESULT (fEngine.Invoke1 (CA2W (
"GenerateSuggestions"), &misspelledWordAsCCV, &comResult));
166 return UnpackVectorOfStringsFromVariantArray (comResult);
169TextBreaks* COMBased_SpellCheckEngine::PeekAtTextBreaksUsed ()
174void COMBased_SpellCheckEngine::FindWordBreaks (
const Led_tChar* startOfText,
size_t lengthOfText,
size_t textOffsetToStartLookingForWord,
175 size_t* wordStartResult,
size_t* wordEndResult,
bool* wordReal)
const
177 Led_tString text = Led_tString{startOfText, startOfText + lengthOfText};
178 CComVariant wordInfoResult;
179 CComPtr<IDispatch> engine = fEngine;
180 CComVariant textOffsetToStartLookingForWordAsCCV = textOffsetToStartLookingForWord;
181 CComVariant textAsCCV = text.c_str ();
182 ThrowIfErrorHRESULT (engine.Invoke2 (CA2W (
"FindWordBreaks"), &textAsCCV, &textOffsetToStartLookingForWordAsCCV, &wordInfoResult));
184 if (wordInfoResult.vt == VT_DISPATCH) {
185 CComPtr<IDispatch> wordInfo = wordInfoResult.pdispVal;
191 *wordStartResult = val.uintVal;
192 *wordStartResult = min (*wordStartResult, lengthOfText);
198 *wordEndResult = val.uintVal;
199 *wordEndResult = min (*wordEndResult, lengthOfText);
205 *wordReal = !!val.boolVal;
210void COMBased_SpellCheckEngine::FindLineBreaks (
const Led_tChar* startOfText,
size_t lengthOfText,
size_t textOffsetToStartLookingForWord,
211 size_t* wordEndResult,
bool* wordReal)
const
215 size_t wordStartIgnored = 0;
216 FindWordBreaks (startOfText, lengthOfText, textOffsetToStartLookingForWord, &wordStartIgnored, wordEndResult, wordReal);
219COMBased_SpellCheckEngine::UDInterface* COMBased_SpellCheckEngine::GetUDInterface ()
224bool COMBased_SpellCheckEngine::AddWordToUserDictionarySupported ()
const
226 CComVariant comResult;
227 CComPtr<IDispatch> engine = fEngine;
228 ThrowIfErrorHRESULT (engine.GetPropertyByName (CA2W (
"AddWordToUserDictionarySupported"), &comResult));
229 return SUCCEEDED (comResult.ChangeType (VT_BOOL)) and comResult.boolVal;
232void COMBased_SpellCheckEngine::AddWordToUserDictionary (
const Led_tString& word)
234 CComVariant wordAsCCV = word.c_str ();
245static const DWORD BASED_CODE _dwActiveLedItOleMisc =
246 OLEMISC_SIMPLEFRAME | OLEMISC_ACTIVATEWHENVISIBLE |
247 OLEMISC_SETCLIENTSITEFIRST | OLEMISC_INSIDEOUT | OLEMISC_CANTLINKINSIDE | OLEMISC_RECOMPOSEONRESIZE;
249IMPLEMENT_OLECTLTYPE (ActiveLedItControl, IDS_ACTIVELEDIT, _dwActiveLedItOleMisc)
253BOOL ActiveLedItControl::ActiveLedItControlFactory::UpdateRegistry (BOOL bRegister)
261 return AfxOleRegisterControlClass (AfxGetInstanceHandle (), m_clsid, m_lpszProgID, IDS_ACTIVELEDIT, IDB_ACTIVELEDIT,
262 afxRegInsertable | afxRegApartmentThreading, _dwActiveLedItOleMisc, _tlid, _wVerMajor, _wVerMinor);
265 return AfxOleUnregisterClass (m_clsid, m_lpszProgID);
274using ALIC = ActiveLedItControl;
275IMPLEMENT_DYNCREATE (ActiveLedItControl, COleControl)
277BEGIN_MESSAGE_MAP (ActiveLedItControl, COleControl)
279ON_WM_WINDOWPOSCHANGED ()
282ON_COMMAND (ID_APP_ABOUT, AboutBox)
283ON_OLEVERB (AFX_IDS_VERB_EDIT, OnEdit)
284ON_OLEVERB (AFX_IDS_VERB_PROPERTIES, OnProperties)
287BEGIN_DISPATCH_MAP (ActiveLedItControl, COleControl)
290DISP_STOCKPROP_APPEARANCE ()
291DISP_STOCKPROP_BACKCOLOR ()
292DISP_STOCKPROP_BORDERSTYLE ()
293DISP_STOCKPROP_HWND ()
295DISP_FUNCTION_ID (ALIC, "InvalidateLayout", DISPID_InvalidateLayout, OLE_InvalidateLayout, VT_EMPTY, VTS_NONE)
297DISP_FUNCTION_ID (ALIC, "VersionNumber", DISPID_VersionNumber, OLE_VersionNumber, VT_I4, VTS_NONE)
298DISP_FUNCTION_ID (ALIC, "ShortVersionString", DISPID_ShortVersionString, OLE_ShortVersionString, VT_BSTR, VTS_NONE)
299DISP_PROPERTY_EX_ID (ALIC, "ReadOnly", DISPID_ReadOnly, OLE_GetReadOnly, OLE_SetReadOnly, VT_BOOL)
300DISP_PROPERTY_EX_ID (ALIC, "Enabled", DISPID_ENABLED, OLE_GetEnabled, OLE_SetEnabled, VT_BOOL)
301DISP_PROPERTY_EX_ID (ALIC, "EnableAutoChangesBackgroundColor", DISPID_EnableAutoChangesBackgroundColor,
302 OLE_GetEnableAutoChangesBackgroundColor, OLE_SetEnableAutoChangesBackgroundColor, VT_BOOL)
303DISP_PROPERTY_EX_ID (ALIC, "WindowMarginTop", DISPID_WindowMarginTop, OLE_GetWindowMarginTop, OLE_SetWindowMarginTop, VT_I4)
304DISP_PROPERTY_EX_ID (ALIC, "WindowMarginLeft", DISPID_WindowMarginLeft, OLE_GetWindowMarginLeft, OLE_SetWindowMarginLeft, VT_I4)
305DISP_PROPERTY_EX_ID (ALIC, "WindowMarginBottom", DISPID_WindowMarginBottom, OLE_GetWindowMarginBottom, OLE_SetWindowMarginBottom, VT_I4)
306DISP_PROPERTY_EX_ID (ALIC, "WindowMarginRight", DISPID_WindowMarginRight, OLE_GetWindowMarginRight, OLE_SetWindowMarginRight, VT_I4)
307DISP_PROPERTY_EX_ID (ALIC, "PrintMarginTop", DISPID_PrintMarginTop, OLE_GetPrintMarginTop, OLE_SetPrintMarginTop, VT_I4)
308DISP_PROPERTY_EX_ID (ALIC, "PrintMarginLeft", DISPID_PrintMarginLeft, OLE_GetPrintMarginLeft, OLE_SetPrintMarginLeft, VT_I4)
309DISP_PROPERTY_EX_ID (ALIC, "PrintMarginBottom", DISPID_PrintMarginBottom, OLE_GetPrintMarginBottom, OLE_SetPrintMarginBottom, VT_I4)
310DISP_PROPERTY_EX_ID (ALIC, "PrintMarginRight", DISPID_PrintMarginRight, OLE_GetPrintMarginRight, OLE_SetPrintMarginRight, VT_I4)
311DISP_PROPERTY_EX_ID (ALIC, "HasVerticalScrollBar", DISPID_HasVerticalScrollBar, GetHasVerticalScrollBar, SetHasVerticalScrollBar, VT_I4)
312DISP_PROPERTY_EX_ID (ALIC, "HasHorizontalScrollBar", DISPID_HasHorizontalScrollBar, GetHasHorizontalScrollBar, SetHasHorizontalScrollBar, VT_I4)
313DISP_PROPERTY_EX_ID (ALIC, "Text", DISPID_Text, GetBufferText, SetBufferText, VT_BSTR)
314DISP_PROPERTY_EX_ID (ALIC, "TextCRLF", DISPID_TextCRLF, GetBufferTextCRLF, SetBufferTextCRLF, VT_BSTR)
315DISP_PROPERTY_EX_ID (ALIC, "TextRTF", DISPID_TextRTF, GetBufferTextAsRTF, SetBufferTextAsRTF, VT_BSTR)
316DISP_PROPERTY_EX_ID (ALIC, "TextHTML", DISPID_TextHTML, GetBufferTextAsHTML, SetBufferTextAsHTML, VT_BSTR)
317DISP_FUNCTION_ID (ALIC, "TextBitmap", DISPID_TextBitmap, GetBufferTextAsDIB, VT_VARIANT, VTS_NONE)
318DISP_FUNCTION_ID (ALIC, "Length", DISPID_Length, GetBufferLength, VT_I4, VTS_NONE)
319DISP_PROPERTY_EX_ID (ALIC, "MaxLength", DISPID_MaxLength, GetMaxLength, SetMaxLength, VT_I4)
320DISP_PROPERTY_EX_ID (ALIC, "SupportContextMenu", DISPID_SupportContextMenu, GetSupportContextMenu, SetSupportContextMenu, VT_BOOL)
321DISP_PROPERTY_EX_ID (ALIC, "ContextMenu", DISPID_ContextMenu, OLE_GetContextMenu, OLE_SetContextMenu, VT_VARIANT)
322DISP_PROPERTY_EX_ID (ALIC, "Toolbars", DISPID_ToolbarList, OLE_GetToolbarList, OLE_SetToolbarList, VT_VARIANT)
323DISP_PROPERTY_EX_ID (ALIC, "HideDisabledContextMenuItems", DISPID_HideDisabledContextMenuItems, OLE_GetHideDisabledContextMenuItems,
324 OLE_SetHideDisabledContextMenuItems, VT_BOOL)
325DISP_FUNCTION_ID (ALIC, "BuiltinCommands", DISPID_BuiltinCommands, OLE_GetBuiltinCommands, VT_VARIANT, VTS_NONE)
326DISP_FUNCTION_ID (ALIC, "PredefinedMenus", DISPID_PredefinedMenus, OLE_GetPredefinedMenus, VT_VARIANT, VTS_NONE)
327DISP_PROPERTY_EX_ID (ALIC, "AcceleratorTable", DISPID_AcceleratorTable, OLE_GetAcceleratorTable, OLE_SetAcceleratorTable, VT_VARIANT)
328DISP_FUNCTION_ID (ALIC, "GetDefaultContextMenu", DISPID_GetDefaultContextMenu, OLE_GetDefaultContextMenu, VT_DISPATCH, VTS_NONE)
329DISP_FUNCTION_ID (ALIC, "GetDefaultAcceleratorTable", DISPID_GetDefaultAcceleratorTable, OLE_GetDefaultAcceleratorTable, VT_DISPATCH, VTS_NONE)
331DISP_FUNCTION_ID (ALIC, "MakeNewPopupMenuItem", DISPID_MakeNewPopupMenuItem, OLE_MakeNewPopupMenuItem, VT_DISPATCH, VTS_NONE)
332DISP_FUNCTION_ID (ALIC, "MakeNewUserMenuItem", DISPID_MakeNewUserMenuItem, OLE_MakeNewUserMenuItem, VT_DISPATCH, VTS_NONE)
333DISP_FUNCTION_ID (ALIC, "MakeNewAcceleratorElement", DISPID_MakeNewAcceleratorElement, OLE_MakeNewAcceleratorElement, VT_DISPATCH, VTS_NONE)
334DISP_FUNCTION_ID (ALIC, "InvokeCommand", DISPID_InvokeCommand, OLE_InvokeCommand, VT_EMPTY, VTS_VARIANT)
335DISP_FUNCTION_ID (ALIC, "CommandEnabled", DISPID_CommandEnabled, OLE_CommandEnabled, VT_BOOL, VTS_VARIANT)
336DISP_FUNCTION_ID (ALIC, "CommandChecked", DISPID_CommandChecked, OLE_CommandChecked, VT_BOOL, VTS_VARIANT)
337DISP_FUNCTION_ID (ALIC, "MakeNewToolbarList", DISPID_MakeNewToolbarList, OLE_MakeNewToolbarList, VT_DISPATCH, VTS_NONE)
338DISP_FUNCTION_ID (ALIC, "MakeNewToolbar", DISPID_MakeNewToolbar, OLE_MakeNewToolbar, VT_DISPATCH, VTS_NONE)
339DISP_FUNCTION_ID (ALIC, "MakeIconButtonToolbarItem", DISPID_MakeIconButtonToolbarItem, OLE_MakeIconButtonToolbarItem, VT_DISPATCH, VTS_NONE)
340DISP_FUNCTION_ID (ALIC, "MakeSeparatorToolbarItem", DISPID_MakeSeparatorToolbarItem, OLE_MakeSeparatorToolbarItem, VT_DISPATCH, VTS_NONE)
341DISP_FUNCTION_ID (ALIC, "MakeBuiltinToolbar", DISPID_MakeBuiltinToolbar, OLE_MakeBuiltinToolbar, VT_DISPATCH, VTS_WBSTR)
342DISP_FUNCTION_ID (ALIC, "MakeBuiltinToolbarItem", DISPID_MakeBuiltinToolbarItem, OLE_MakeBuiltinToolbarItem, VT_DISPATCH, VTS_WBSTR)
343DISP_FUNCTION_ID (ALIC, "CurrentEventArguments", DISPID_CurrentEventArguments, OLE_GetCurrentEventArguments, VT_VARIANT, VTS_NONE)
344DISP_PROPERTY_EX_ID (ALIC, "SmartCutAndPaste", DISPID_SmartCutAndPaste, GetSmartCutAndPaste, SetSmartCutAndPaste, VT_BOOL)
345DISP_PROPERTY_EX_ID (ALIC, "SmartQuoteMode", DISPID_SmartQuoteMode, OLE_GetSmartQuoteMode, OLE_SetSmartQuoteMode, VT_BOOL)
346DISP_PROPERTY_EX_ID (ALIC, "WrapToWindow", DISPID_WrapToWindow, GetWrapToWindow, SetWrapToWindow, VT_BOOL)
347DISP_PROPERTY_EX_ID (ALIC, "ShowParagraphGlyphs", DISPID_ShowParagraphGlyphs, GetShowParagraphGlyphs, SetShowParagraphGlyphs, VT_BOOL)
348DISP_PROPERTY_EX_ID (ALIC, "ShowTabGlyphs", DISPID_ShowTabGlyphs, GetShowTabGlyphs, SetShowTabGlyphs, VT_BOOL)
349DISP_PROPERTY_EX_ID (ALIC, "ShowSpaceGlyphs", DISPID_ShowSpaceGlyphs, GetShowSpaceGlyphs, SetShowSpaceGlyphs, VT_BOOL)
350DISP_PROPERTY_EX_ID (ALIC, "UseSelectEOLBOLRowHilightStyle", DISPID_UseSelectEOLBOLRowHilightStyle, OLE_GetUseSelectEOLBOLRowHilightStyle,
351 OLE_SetUseSelectEOLBOLRowHilightStyle, VT_BOOL)
352DISP_PROPERTY_EX_ID (ALIC, "ShowSecondaryHilight", DISPID_ShowSecondaryHilight, OLE_GetShowSecondaryHilight, OLE_SetShowSecondaryHilight, VT_BOOL)
353DISP_PROPERTY_EX_ID (ALIC, "ShowHidableText", DISPID_ShowHidableText, OLE_GetShowHidableText, OLE_SetShowHidableText, VT_BOOL)
354DISP_PROPERTY_EX_ID (ALIC, "HidableTextColor", DISPID_HidableTextColor, OLE_GetHidableTextColor, OLE_SetHidableTextColor, VT_I4)
355DISP_PROPERTY_EX_ID (ALIC, "HidableTextColored", DISPID_HidableTextColored, OLE_GetHidableTextColored, OLE_SetHidableTextColored, VT_BOOL)
356DISP_PROPERTY_EX_ID (ALIC, "SpellChecker", DISPID_SpellChecker, OLE_GetSpellChecker, OLE_SetSpellChecker, VT_VARIANT)
357DISP_PROPERTY_EX_ID (ALIC, "SelStart", DISPID_SELSTART, GetSelStart, SetSelStart, VT_I4)
358DISP_PROPERTY_EX_ID (ALIC, "SelLength", DISPID_SELLENGTH, GetSelLength, SetSelLength, VT_I4)
359DISP_PROPERTY_EX_ID (ALIC, "SelText", DISPID_SELTEXT, GetSelText, SetSelText, VT_BSTR)
360DISP_PROPERTY_EX_ID (ALIC, "SelTextRTF", DISPID_SelTextRTF, GetSelTextAsRTF, SetSelTextAsRTF, VT_BSTR)
361DISP_PROPERTY_EX_ID (ALIC, "SelTextHTML", DISPID_SelTextHTML, GetSelTextAsHTML, SetSelTextAsHTML, VT_BSTR)
362DISP_PROPERTY_EX_ID (ALIC, "SelColor", DISPID_SelColor, GetSelColor, SetSelColor, VT_I4)
363DISP_PROPERTY_EX_ID (ALIC, "SelFontFace", DISPID_SelFontFace, GetSelFontFace, SetSelFontFace, VT_BSTR)
364DISP_PROPERTY_EX_ID (ALIC, "SelFontSize", DISPID_SelFontSize, GetSelFontSize, SetSelFontSize, VT_I4)
365DISP_PROPERTY_EX_ID (ALIC, "SelBold", DISPID_SelBold, GetSelBold, SetSelBold, VT_I4)
366DISP_PROPERTY_EX_ID (ALIC, "SelItalic", DISPID_SelItalic, GetSelItalic, SetSelItalic, VT_I4)
367DISP_PROPERTY_EX_ID (ALIC, "SelStrikeThru", DISPID_SelStrikeThru, GetSelStrikeThru, SetSelStrikeThru, VT_I4)
368DISP_PROPERTY_EX_ID (ALIC, "SelUnderline", DISPID_SelUnderline, GetSelUnderline, SetSelUnderline, VT_I4)
369DISP_PROPERTY_EX_ID (ALIC, "SelJustification", DISPID_SelJustification, OLE_GetSelJustification, OLE_SetSelJustification, VT_I4)
370DISP_PROPERTY_EX_ID (ALIC, "SelListStyle", DISPID_SelListStyle, OLE_GetSelListStyle, OLE_SetSelListStyle, VT_I4)
371DISP_PROPERTY_EX_ID (ALIC, "SelHidable", DISPID_SelHidable, OLE_GetSelHidable, OLE_SetSelHidable, VT_I4)
374DISP_FUNCTION_ID (ALIC, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
375DISP_FUNCTION_ID (ALIC, "LoadFile", DISPID_LoadFile, LoadFile, VT_EMPTY, VTS_BSTR)
376DISP_FUNCTION_ID (ALIC, "SaveFile", DISPID_SaveFile, SaveFile, VT_EMPTY, VTS_BSTR)
377DISP_FUNCTION_ID (ALIC, "SaveFileCRLF", DISPID_SaveFileCRLF, SaveFileCRLF, VT_EMPTY, VTS_BSTR)
378DISP_FUNCTION_ID (ALIC, "SaveFileRTF", DISPID_SaveFileRTF, SaveFileRTF, VT_EMPTY, VTS_BSTR)
379DISP_FUNCTION_ID (ALIC, "SaveFileHTML", DISPID_SaveFileHTML, SaveFileHTML, VT_EMPTY, VTS_BSTR)
380DISP_FUNCTION_ID (ALIC, "Refresh", DISPID_REFRESH, Refresh, VT_EMPTY, VTS_NONE)
381DISP_FUNCTION_ID (ALIC, "ScrollToSelection", DISPID_ScrollToSelection, ScrollToSelection, VT_EMPTY, VTS_NONE)
384DISP_PROPERTY_EX_ID (ALIC, "MaxUndoLevel", DISPID_MaxUndoLevel, OLE_GetMaxUndoLevel, OLE_SetMaxUndoLevel, VT_I4)
385DISP_FUNCTION_ID (ALIC, "CanUndo", DISPID_CanUndo, OLE_GetCanUndo, VT_BOOL, VTS_NONE)
386DISP_FUNCTION_ID (ALIC, "CanRedo", DISPID_CanRedo, OLE_GetCanRedo, VT_BOOL, VTS_NONE)
387DISP_FUNCTION_ID (ALIC, "Undo", DISPID_Undo, OLE_Undo, VT_EMPTY, VTS_NONE)
388DISP_FUNCTION_ID (ALIC, "Redo", DISPID_Redo, OLE_Redo, VT_EMPTY, VTS_NONE)
389DISP_FUNCTION_ID (ALIC, "CommitUndo", DISPID_CommitUndo, OLE_CommitUndo, VT_EMPTY, VTS_NONE)
392DISP_FUNCTION_ID (ALIC, "LaunchFontSettingsDialog", DISPID_LaunchFontSettingsDialog, OLE_LaunchFontSettingsDialog, VT_EMPTY, VTS_NONE)
393DISP_FUNCTION_ID (ALIC, "LaunchParagraphSettingsDialog", DISPID_LaunchParagraphSettingsDialog, OLE_LaunchParagraphSettingsDialog, VT_EMPTY, VTS_NONE)
396DISP_FUNCTION_ID (ALIC, "LaunchFindDialog", DISPID_LaunchFindDialog, OLE_LaunchFindDialog, VT_EMPTY, VTS_NONE)
397DISP_FUNCTION_ID (ALIC, "Find", DISPID_Find, OLE_Find, VT_I4, VTS_I4 VTS_VARIANT VTS_BOOL VTS_BOOL VTS_BOOL)
400DISP_FUNCTION_ID (ALIC, "LaunchReplaceDialog", DISPID_LaunchReplaceDialog, OLE_LaunchReplaceDialog, VT_EMPTY, VTS_NONE)
401DISP_FUNCTION_ID (ALIC, "FindReplace", DISPID_FindReplace, OLE_FindReplace, VT_I4, VTS_I4 VTS_VARIANT VTS_VARIANT VTS_BOOL VTS_BOOL VTS_BOOL)
404DISP_FUNCTION_ID (ALIC, "PrinterSetupDialog", DISPID_PrinterSetupDialog, OLE_PrinterSetupDialog, VT_EMPTY, VTS_NONE)
405DISP_FUNCTION_ID (ALIC, "PrintDialog", DISPID_PrintDialog, OLE_PrintDialog, VT_EMPTY, VTS_NONE)
406DISP_FUNCTION_ID (ALIC, "PrintOnce", DISPID_PrintOnce, OLE_PrintOnce, VT_EMPTY, VTS_NONE)
409DISP_FUNCTION_ID (ALIC, "GetHeight", DISPID_GetHeight, OLE_GetHeight, VT_I4, VTS_I4 VTS_I4)
412DISP_PROPERTY_EX_ID (ALIC, "Dirty", DISPID_Dirty, OLE_GetDirty, OLE_SetDirty, VT_BOOL)
416BEGIN_EVENT_MAP (ActiveLedItControl, COleControl)
417EVENT_CUSTOM_ID ("Change", DISPID_Change, _IGNORED_, VTS_NONE)
419EVENT_STOCK_DBLCLICK ()
420EVENT_STOCK_KEYDOWN ()
422EVENT_STOCK_KEYPRESS ()
423EVENT_STOCK_MOUSEDOWN ()
424EVENT_STOCK_MOUSEMOVE ()
425EVENT_STOCK_MOUSEUP ()
426EVENT_STOCK_KEYPRESS ()
427EVENT_CUSTOM_ID ("SelChange", DISPID_SelChange, _IGNORED_, VTS_NONE)
428EVENT_CUSTOM_ID ("UpdateUserCommand", DISPID_UpdateUserCommand, _IGNORED_, VTS_NONE)
429EVENT_CUSTOM_ID ("UserCommand", DISPID_UserCommand, _IGNORED_, VTS_NONE)
432#if qKeepListOfALInstancesForSPR_1599BWA
433set<ActiveLedItControl*> ActiveLedItControl::sAll;
435const set<ActiveLedItControl*>& ActiveLedItControl::GetAll ()
441BEGIN_PROPPAGEIDS (ActiveLedItControl, 1)
442PROPPAGEID (ActiveLedItPropPage::guid)
443END_PROPPAGEIDS (ActiveLedItControl)
446IMPLEMENT_OLECREATE_EX (ActiveLedItControl, "ActiveLedIt.ActiveLedItCtrl.1", 0x9a013a76, 0xad34, 0x11d0, 0x8d, 0x9b, 0, 0xa0, 0xc9, 0x8, 0xc, 0x73)
449IMPLEMENT_OLETYPELIB (ActiveLedItControl, _tlid, _wVerMajor, _wVerMinor)
451ActiveLedItControl::ActiveLedItControl ()
454 , LedItViewController ()
455 , fSpellChecker (NULL)
456 , fLedSpellCheckWrapper (NULL)
459 , fBuiltinCommands ()
460 , fPredefinedMenus ()
461 , fAcceleratorTable ()
462 , fWin32AccelTable (NULL)
463 , fCurrentEventArguments ()
467 fConextMenu.Attach (OLE_GetDefaultContextMenu ());
468 fToolbarList.Attach (OLE_MakeNewToolbarList ());
469 fAcceleratorTable.Attach (OLE_GetDefaultAcceleratorTable ());
471 InitializeIIDs (&DIID__DActiveLedIt, &DIID__DActiveLedItEvents);
473 SetInitialSize (300, 150);
475 EnableSimpleFrame ();
477 fTextStore.AddMarkerOwner (
this);
478 fEditor.SetController (
this);
479#if qKeepListOfALInstancesForSPR_1599BWA
484ActiveLedItControl::~ActiveLedItControl ()
486#if qKeepListOfALInstancesForSPR_1599BWA
489 if (fSpellChecker != NULL) {
490 fSpellChecker->Release ();
491 fSpellChecker = NULL;
492 fEditor.SetSpellCheckEngine (NULL);
494 fEditor.SetController (NULL);
495 fTextStore.RemoveMarkerOwner (
this);
496 if (fWin32AccelTable != NULL) {
497 ::DestroyAcceleratorTable (fWin32AccelTable);
501void ActiveLedItControl::DidUpdateText (
const UpdateInfo& updateInfo)
noexcept
503 if (updateInfo.fRealContentUpdate) {
506 FireOLEEvent (DISPID_Change);
510TextStore* ActiveLedItControl::PeekAtTextStore ()
const
512 return &
const_cast<ActiveLedItControl*
> (
this)->fTextStore;
515void ActiveLedItControl::OnDraw (CDC* pdc,
const CRect& rcBounds,
const CRect& rcInvalid)
518 TRACE (
"ActiveLedItControl::OnDraw (rcBounds= (%d, %d, %d, %d), rcInvalid= (%d, %d, %d, %d))\n", rcBounds.top, rcBounds.left,
519 rcBounds.bottom, rcBounds.right, rcInvalid.top, rcInvalid.left, rcInvalid.bottom, rcInvalid.right);
520 Led_Rect invalRect = AsLedRect (rcInvalid);
521 if (invalRect.IsEmpty ()) {
525 Led_Rect oldWinRect = fEditor.GetWindowRect ();
527 Led_Rect newWinRect = oldWinRect;
528 if (m_hWnd == NULL) {
533 fEditor.SetDefaultTextColor (TextImager::eDefaultBackgroundColor,
Color (TranslateColor (GetBackColor ())));
535 Led_Size controlSize = Led_Size (0, 0);
539 GetControlSize (&cx, &cy);
540 controlSize = Led_Size (cy, cx);
542 newWinRect = Led_Rect (AsLedRect (rcBounds).GetOrigin (), controlSize);
553 Verify (::GetWindowRect (m_hWnd, &editorWndRct));
554 ScreenToClient (&editorWndRct);
555 newWinRect += AsLedRect (rcBounds).GetOrigin () - AsLedRect (editorWndRct).GetOrigin ();
557 fEditor.SetWindowRect (newWinRect);
558 Led_MFC_TabletFromCDC useTablet = Led_MFC_TabletFromCDC (pdc);
559 LedItView::TemporarilyUseTablet tmpUseTablet (fEditor, useTablet);
560 fEditor.WindowDrawHelper (useTablet, invalRect,
false);
561 fEditor.SetWindowRect (oldWinRect);
567 fEditor.SetWindowRect (oldWinRect);
571void ActiveLedItControl::OnDrawMetafile (CDC* pDC,
const CRect& rcBounds)
578 TRACE (
"ActiveLedItControl::OnDrawMetafile (rcBounds= (%d, %d, %d, %d))\n", rcBounds.top, rcBounds.left, rcBounds.bottom, rcBounds.right);
583 GetControlSize (&cx, &cy);
584 CRect rc (0, 0, cx, cy);
585 pDC->SetViewportOrg (0, 0);
586 pDC->SetViewportExt (cx, cy);
589 Led_MFC_TabletFromCDC useTablet = Led_MFC_TabletFromCDC (pDC);
590 bool oldImageUsingOffscreenBitmapsFlag = fEditor.GetImageUsingOffscreenBitmaps ();
591 bool oldInDrawMetaFileMode = fEditor.fInDrawMetaFileMode;
592 Led_Rect oldWinRect = fEditor.GetWindowRect ();
594 Led_Rect newWinRect = AsLedRect (rcBounds);
597 Led_Rect wmr = useTablet->CvtFromTWIPS (fEditor.GetDefaultWindowMargins ());
598 newWinRect.top += wmr.GetTop ();
599 newWinRect.left += wmr.GetLeft ();
600 newWinRect.bottom -= wmr.GetBottom ();
601 newWinRect.right -= wmr.GetRight ();
604 fEditor.SetImageUsingOffscreenBitmaps (
false);
605 fEditor.fInDrawMetaFileMode =
true;
606 if (not newWinRect.IsEmpty ()) {
607 LedItView::TemporarilyUseTablet tmpUseTablet (fEditor, useTablet);
608 fEditor.SetWindowRect (newWinRect);
609 fEditor.WindowDrawHelper (useTablet, AsLedRect (rcBounds),
false);
611 fEditor.SetWindowRect (oldWinRect);
613 fEditor.fInDrawMetaFileMode = oldInDrawMetaFileMode;
614 fEditor.SetWindowRect (oldWinRect);
615 fEditor.SetImageUsingOffscreenBitmaps (oldImageUsingOffscreenBitmapsFlag);
621 fEditor.SetImageUsingOffscreenBitmaps (oldImageUsingOffscreenBitmapsFlag);
622 fEditor.fInDrawMetaFileMode = oldInDrawMetaFileMode;
623 fEditor.SetWindowRect (oldWinRect);
627BOOL ActiveLedItControl::OnEraseBkgnd ([[maybe_unused]] CDC* pDC)
633void ActiveLedItControl::DoPropExchange (CPropExchange* pPX)
636 ExchangeVersion (pPX, MAKELONG (_wVerMinor, _wVerMajor));
637 COleControl::DoPropExchange (pPX);
638 ExchangeTextAsRTFBlob (pPX);
641 if (pPX->IsLoading ()) {
645 PX_String (pPX, _T(
"DefaultFontFace"), aProp, _T(
""));
646 if (not aProp.IsEmpty ()) {
647 IncrementalFontSpecification applyFontSpec;
648 applyFontSpec.SetFontName ((
const TCHAR*)aProp);
649 fEditor.SetDefaultFont (applyFontSpec);
658 PX_String (pPX, _T(
"DefaultFontSize"), aProp, _T(
""));
659 if (not aProp.IsEmpty ()) {
660 IncrementalFontSpecification applyFontSpec;
661 applyFontSpec.SetPointSize (
static_cast<FontSpecification::FontSize
> (_ttoi ((
const TCHAR*)aProp)));
662 fEditor.SetDefaultFont (applyFontSpec);
671 if (PX_Bool (pPX, _T(
"ReadOnly"), aProp)) {
672 OLE_SetReadOnly (aProp);
681 PX_String (pPX, _T(
"Text"), aProp, _T(
""));
682 if ((fTextStore.GetLength () == 0) and (not aProp.IsEmpty ())) {
683 SetBufferTextCRLF (aProp);
693 PX_String (pPX, _T(
"TextRTF"), aProp, _T(
""));
694 if ((fTextStore.GetLength () == 0) and (not aProp.IsEmpty ())) {
695 SetBufferTextAsRTF (aProp);
705 PX_String (pPX, _T(
"TextHTML"), aProp, _T(
""));
706 if ((fTextStore.GetLength () == 0) and (not aProp.IsEmpty ())) {
707 SetBufferTextAsHTML (aProp);
721DWORD ActiveLedItControl::GetControlFlags ()
723 DWORD dwFlags = COleControl::GetControlFlags ();
727 dwFlags |= noFlickerActivate;
732 dwFlags |= canOptimizeDraw;
737void ActiveLedItControl::OnGetControlInfo (LPCONTROLINFO pControlInfo)
740 ::memset (pControlInfo, 0,
sizeof (*pControlInfo));
741 pControlInfo->cb =
sizeof (*pControlInfo);
747 HACCEL hAccel = GetCurrentWin32AccelTable ();
750 pControlInfo->hAccel = hAccel;
752 pControlInfo->cAccel = pControlInfo->hAccel == NULL ? 0 :
static_cast<USHORT
> (::CopyAcceleratorTable (pControlInfo->hAccel, NULL, 0));
753 pControlInfo->dwFlags = CTRLINFO_EATS_RETURN;
756BOOL ActiveLedItControl::PreTranslateMessage (MSG* pMsg)
759 switch (pMsg->message) {
762 switch (pMsg->wParam) {
765 if (pMsg->message == WM_KEYDOWN) {
766 fEditor.SendMessage (WM_CHAR, VK_TAB, pMsg->lParam);
778 fEditor.SendMessage (pMsg->message, pMsg->wParam, pMsg->lParam);
784 HACCEL hAccel = GetCurrentWin32AccelTable ();
785 if (hAccel != NULL) {
786 return ::TranslateAccelerator (pMsg->hwnd, hAccel, pMsg);
791void ActiveLedItControl::AddFrameLevelUI ()
796 COleControl::AddFrameLevelUI ();
797#if qDisableEditorWhenNotActive
798 fEditor.ModifyStyle (WS_DISABLED, 0);
803void ActiveLedItControl::RemoveFrameLevelUI ()
805#if qDisableEditorWhenNotActive
806 fEditor.ModifyStyle (0, WS_DISABLED);
807 if (CWnd::GetFocus () == &fEditor) {
809 CWnd::GetDesktopWindow ()->SetFocus ();
812 COleControl::RemoveFrameLevelUI ();
815BOOL ActiveLedItControl::OnSetObjectRects (LPCRECT lprcPosRect, LPCRECT lprcClipRect)
817#if qStroika_Foundation_Debug_DefaultTracingOn
818 if (lprcClipRect == NULL) {
819 DbgTrace (
"ActiveLedItControl::OnSetObjectRects (m_bUIActive={}, m_bInPlaceSiteWndless={}, lprcPosRect=({}, {}, {}, {}), NULL)"_f,
820 (
bool)m_bUIActive, (
bool)m_bInPlaceSiteWndless, lprcPosRect->top, (
int)lprcPosRect->left, lprcPosRect->bottom, lprcPosRect->right);
823 DbgTrace (
"ActiveLedItControl::OnSetObjectRects (m_bUIActive={}, m_bInPlaceSiteWndless={}, lprcPosRect=({}, {}, {}, {}), lprcClipRect=({}, {}, {}, {}))"_f,
824 (
bool)m_bUIActive, (
bool)m_bInPlaceSiteWndless, lprcPosRect->top, lprcPosRect->left, lprcPosRect->bottom,
825 lprcPosRect->right, lprcClipRect->top, lprcClipRect->left, lprcClipRect->bottom, lprcClipRect->right);
830 if (lprcClipRect != NULL) {
831 if (AsLedRect (*lprcPosRect) != AsLedRect (*lprcClipRect)) {
836 BOOL r = COleControl::OnSetObjectRects (lprcPosRect, lprcClipRect);
840BOOL ActiveLedItControl::OnGetNaturalExtent (DWORD , LONG , DVTARGETDEVICE* , HDC ,
841 DVEXTENTINFO* , LPSIZEL
850void ActiveLedItControl::OnResetState ()
852 COleControl::OnResetState ();
855void ActiveLedItControl::ExchangeTextAsRTFBlob (CPropExchange* pPX)
857 const LPCTSTR kTextAsRTFBlob = _T(
"TextAsRTFBlob");
859 if (pPX->IsLoading ()) {
860 HGLOBAL hglobal = NULL;
861 PX_Blob (pPX, kTextAsRTFBlob, hglobal);
862 if (hglobal != NULL) {
864 Memory::Platform::Windows::StackBasedHandleLocker hdl{hglobal};
865 const byte* data =
reinterpret_cast<byte*
> (hdl.GetPointer ());
867 size_t size = *(
size_t*)data;
868 string s =
string{((
const char*)data) +
sizeof (size_t), size};
869 SetBufferTextAsRTF (String::FromNarrowSDKString (s).AsSDKString ().c_str ());
871 ::GlobalFree (hglobal);
874 if (hglobal != NULL) {
875 ::GlobalFree (hglobal);
882 string s = GetBufferTextAsRTF_ ();
883 size_t len = s.length ();
884 HGLOBAL hglobal = ::GlobalAlloc (GMEM_MOVEABLE, len +
sizeof (
size_t));
885 if (hglobal != NULL) {
887 Memory::Platform::Windows::StackBasedHandleLocker hdl (hglobal);
888 void* pvBlob = hdl.GetPointer ();
890 *(
size_t*)pvBlob = len;
891 ::memcpy (
reinterpret_cast<char*
> (pvBlob) +
sizeof (
size_t), s.c_str (), len);
894 PX_Blob (pPX, kTextAsRTFBlob, hglobal);
895 ::GlobalFree (hglobal);
898 ::GlobalFree (hglobal);
905const DWORD dwSupportedBits = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
906const DWORD dwNotSupportedBits = ~dwSupportedBits;
908BEGIN_INTERFACE_MAP (ActiveLedItControl, COleControl)
909INTERFACE_PART (ActiveLedItControl, IID_IObjectSafety, ObjSafe)
912ULONG FAR EXPORT ActiveLedItControl::XObjSafe::AddRef ()
914 METHOD_PROLOGUE (ActiveLedItControl, ObjSafe)
915 return pThis->ExternalAddRef ();
918ULONG FAR EXPORT ActiveLedItControl::XObjSafe::Release ()
920 METHOD_PROLOGUE (ActiveLedItControl, ObjSafe)
921 return pThis->ExternalRelease ();
924HRESULT FAR EXPORT ActiveLedItControl::XObjSafe::QueryInterface (REFIID iid,
void FAR* FAR* ppvObj)
926 METHOD_PROLOGUE (ActiveLedItControl, ObjSafe)
927 return (HRESULT)pThis->ExternalQueryInterface (&iid, ppvObj);
935HRESULT STDMETHODCALLTYPE ActiveLedItControl::XObjSafe::GetInterfaceSafetyOptions (
937 DWORD __RPC_FAR* pdwSupportedOptions,
938 DWORD __RPC_FAR* pdwEnabledOptions)
940 METHOD_PROLOGUE (ActiveLedItControl, ObjSafe)
942 HRESULT retval = ResultFromScode (S_OK);
945 IUnknown FAR* punkInterface;
946 retval = pThis->ExternalQueryInterface (&riid, (
void**)&punkInterface);
947 if (retval != E_NOINTERFACE) {
948 punkInterface->Release ();
953 *pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits;
963HRESULT STDMETHODCALLTYPE ActiveLedItControl::XObjSafe::SetInterfaceSafetyOptions (
965 DWORD dwOptionSetMask,
966 DWORD dwEnabledOptions)
968 METHOD_PROLOGUE (ActiveLedItControl, ObjSafe)
971 IUnknown FAR* punkInterface;
972 pThis->ExternalQueryInterface (&riid, (
void**)&punkInterface);
974 punkInterface->Release ();
977 return ResultFromScode (E_NOINTERFACE);
981 if (dwOptionSetMask & dwNotSupportedBits) {
982 return ResultFromScode (E_FAIL);
986 dwEnabledOptions &= dwSupportedBits;
988 if ((dwOptionSetMask & dwEnabledOptions) != dwOptionSetMask) {
989 return ResultFromScode (E_FAIL);
993 return ResultFromScode (S_OK);
996void ActiveLedItControl::AboutBox ()
998 OnAboutBoxCommand ();
1001Led_FileFormat ActiveLedItControl::GuessFormatFromName (LPCTSTR name)
1003 Led_FileFormat format = eUnknownFormat;
1005 SDKString fileName = pathName.substr (pathName.rfind (_T (
"\\")) + 1);
1006 SDKString suffix = (fileName.rfind (_T (
".")) == SDKString::npos) ? _T (
"") : fileName.substr (fileName.rfind (_T (
".")) + 1);
1007 if (::_tcsicmp (suffix.c_str (), _T (
"txt")) == 0) {
1008 format = eTextFormat;
1010 else if (::_tcsicmp (suffix.c_str (), _T (
"led")) == 0) {
1011 format = eLedPrivateFormat;
1013 else if (::_tcsicmp (suffix.c_str (), _T (
"rtf")) == 0) {
1014 format = eRTFFormat;
1016 else if (::_tcsicmp (suffix.c_str (), _T (
"htm")) == 0 or ::_tcsicmp (suffix.c_str (), _T (
"html")) == 0) {
1017 format = eHTMLFormat;
1024 DISABLE_COMPILER_MSC_WARNING_START (4996)
1025 int fd = ::_topen (filename, O_RDONLY | O_BINARY, _S_IREAD);
1026 DISABLE_COMPILER_MSC_WARNING_END (4996)
1029 AfxThrowFileException (CFileException::fileNotFound, -1, filename);
1031 long eof = ::_lseek (fd, 0, SEEK_END);
1033 AfxThrowFileException (CFileException::badSeek, -1, filename);
1039 (void)::_lseek (fd, 0, SEEK_SET);
1040 int nBytes = ::_read (fd, buffer->
data (), eof);
1041 if (nBytes != eof) {
1042 AfxThrowFileException (CFileException::genericException, -1, filename);
1044 (void)::_close (fd);
1048 (void)::_close (fd);
1054void ActiveLedItControl::WriteBytesToFile (LPCTSTR filename,
const void* buffer,
size_t size)
1056 (void)::_tunlink (filename);
1057 DISABLE_COMPILER_MSC_WARNING_START (4996)
1058 int fd = ::_topen (filename, O_CREAT | O_RDWR | O_TRUNC | O_BINARY, _S_IREAD | _S_IWRITE);
1059 DISABLE_COMPILER_MSC_WARNING_END (4996)
1062 AfxThrowFileException (CFileException::fileNotFound, -1, filename);
1064 int nBytes = ::_write (fd, buffer,
static_cast<unsigned int> (size));
1065 if (nBytes !=
static_cast<int> (size)) {
1066 AfxThrowFileException (CFileException::genericException, -1, filename);
1068 (void)::_close (fd);
1072 (void)::_close (fd);
1078void ActiveLedItControl::LoadFile (LPCTSTR filename)
1080 fCommandHandler.Commit ();
1081 fEditor.Replace (0, fEditor.GetEnd (), LED_TCHAR_OF (
""), 0);
1085 DoReadFile (filename, &buffer, &size);
1087 StyledTextIOSrcStream_Memory source{buffer.data (), size};
1090 Led_FileFormat format = GuessFormatFromName (filename);
1095 StyledTextIOReader_PlainText textReader (&source, &sink);
1099 case eLedPrivateFormat: {
1100 StyledTextIOReader_LedNativeFileFormat textReader (&source, &sink);
1105 StyledTextIOReader_RTF textReader (&source, &sink);
1110 StyledTextIOReader_HTML textReader (&source, &sink, &fHTMLInfo);
1114 case eUnknownFormat: {
1121 StyledTextIOReader_RTF reader (&source, &sink);
1122 if (reader.QuickLookAppearsToBeRightFormat ()) {
1123 format = eRTFFormat;
1133 StyledTextIOReader_LedNativeFileFormat reader (&source, &sink);
1134 if (reader.QuickLookAppearsToBeRightFormat ()) {
1135 format = eLedPrivateFormat;
1145 StyledTextIOReader_HTML reader (&source, &sink);
1146 if (reader.QuickLookAppearsToBeRightFormat ()) {
1147 format = eHTMLFormat;
1156 format = eTextFormat;
1164 fEditor.SetEmptySelectionStyle ();
1167void ActiveLedItControl::SaveFile (LPCTSTR filename)
1170 StyledTextIOWriterSinkStream_Memory sink;
1171 switch (GuessFormatFromName (filename)) {
1173 StyledTextIOWriter_PlainText textWriter (&source, &sink);
1174 textWriter.Write ();
1178 StyledTextIOWriter_RTF textWriter (&source, &sink);
1179 textWriter.Write ();
1183 StyledTextIOWriter_HTML textWriter (&source, &sink, &fHTMLInfo);
1184 textWriter.Write ();
1187 case eLedPrivateFormat: {
1188 StyledTextIOWriter_LedNativeFileFormat textWriter (&source, &sink);
1189 textWriter.Write ();
1193 StyledTextIOWriter_RTF textWriter (&source, &sink);
1194 textWriter.Write ();
1197 WriteBytesToFile (filename, sink.PeekAtData (), sink.GetLength ());
1200void ActiveLedItControl::SaveFileCRLF (LPCTSTR filename)
1203 StyledTextIOWriterSinkStream_Memory sink;
1204 StyledTextIOWriter_PlainText textWriter (&source, &sink);
1205 textWriter.Write ();
1206 WriteBytesToFile (filename, sink.PeekAtData (), sink.GetLength ());
1209void ActiveLedItControl::SaveFileRTF (LPCTSTR filename)
1212 StyledTextIOWriterSinkStream_Memory sink;
1213 StyledTextIOWriter_RTF textWriter (&source, &sink);
1214 textWriter.Write ();
1215 WriteBytesToFile (filename, sink.PeekAtData (), sink.GetLength ());
1218void ActiveLedItControl::SaveFileHTML (LPCTSTR filename)
1221 StyledTextIOWriterSinkStream_Memory sink;
1222 StyledTextIOWriter_HTML textWriter (&source, &sink);
1223 textWriter.Write ();
1224 WriteBytesToFile (filename, sink.PeekAtData (), sink.GetLength ());
1227void ActiveLedItControl::Refresh ()
1232void ActiveLedItControl::ScrollToSelection ()
1234 fEditor.ScrollToSelection ();
1237long ActiveLedItControl::OLE_GetMaxUndoLevel ()
1239 return static_cast<long> (fCommandHandler.GetMaxUnDoLevels ());
1242void ActiveLedItControl::OLE_SetMaxUndoLevel (
long maxUndoLevel)
1245 maxUndoLevel = max (0L, maxUndoLevel);
1246 maxUndoLevel = min (maxUndoLevel, 10L);
1247 fCommandHandler.SetMaxUnDoLevels (maxUndoLevel);
1250BOOL ActiveLedItControl::OLE_GetCanUndo ()
1252 return fCommandHandler.CanUndo () or (fCommandHandler.GetMaxUnDoLevels () == 1 and fCommandHandler.CanRedo ());
1255BOOL ActiveLedItControl::OLE_GetCanRedo ()
1257 return fCommandHandler.CanRedo ();
1260void ActiveLedItControl::OLE_Undo ()
1262 if (fCommandHandler.CanUndo ()) {
1263 fCommandHandler.DoUndo (fEditor);
1265 else if (fCommandHandler.GetMaxUnDoLevels () == 1 and fCommandHandler.CanRedo ()) {
1266 fCommandHandler.DoRedo (fEditor);
1273void ActiveLedItControl::OLE_Redo ()
1275 if (fCommandHandler.CanRedo ()) {
1276 fCommandHandler.DoRedo (fEditor);
1283void ActiveLedItControl::OLE_CommitUndo ()
1285 fCommandHandler.Commit ();
1288void ActiveLedItControl::OLE_LaunchFontSettingsDialog ()
1290 fEditor.OnChooseFontCommand ();
1293void ActiveLedItControl::OLE_LaunchParagraphSettingsDialog ()
1295 fEditor.OnParagraphSpacingChangeCommand ();
1298void ActiveLedItControl::OLE_LaunchFindDialog ()
1300 fEditor.OnFindCommand ();
1303long ActiveLedItControl::OLE_Find (
long searchFrom,
const VARIANT& findText, BOOL wrapSearch, BOOL wholeWordSearch, BOOL caseSensativeSearch)
1306 if (searchFrom < 0) {
1309 if (
static_cast<size_t> (searchFrom) > fTextStore.GetEnd ()) {
1312 if (findText.vt != VT_BSTR) {
1316 TextStore::SearchParameters parameters;
1318 parameters.fMatchString = findText.bstrVal;
1319 parameters.fWrapSearch = !!wrapSearch;
1320 parameters.fWholeWordSearch = !!wholeWordSearch;
1321 parameters.fCaseSensativeSearch = !!caseSensativeSearch;
1323 size_t whereTo = fTextStore.Find (parameters, searchFrom);
1325 return static_cast<long> (whereTo);
1328void ActiveLedItControl::OLE_LaunchReplaceDialog ()
1330 fEditor.OnReplaceCommand ();
1333long ActiveLedItControl::OLE_FindReplace (
long searchFrom,
const VARIANT& findText,
const VARIANT& replaceText, BOOL wrapSearch,
1334 BOOL wholeWordSearch, BOOL caseSensativeSearch)
1337 if (searchFrom < 0) {
1340 if (
static_cast<size_t> (searchFrom) > fTextStore.GetEnd ()) {
1343 if (findText.vt != VT_BSTR) {
1346 if (replaceText.vt != VT_BSTR) {
1350 TextStore::SearchParameters parameters;
1352 Led_tString findStr = findText.bstrVal;
1353 Led_tString replaceStr = replaceText.bstrVal;
1354 return fEditor.OLE_FindReplace (searchFrom, findStr, replaceStr, wrapSearch, wholeWordSearch, caseSensativeSearch);
1357void ActiveLedItControl::OLE_PrinterSetupDialog ()
1359 fEditor.OnFilePrintSetup ();
1362void ActiveLedItControl::OLE_PrintDialog ()
1364 fEditor.OnFilePrint ();
1367void ActiveLedItControl::OLE_PrintOnce ()
1369 fEditor.OnFilePrintOnce ();
1372long ActiveLedItControl::OLE_GetHeight (
long from,
long to)
1374 using RowReference = MultiRowTextImager::RowReference;
1379 to =
static_cast<long> (fTextStore.GetEnd ());
1385 if (
static_cast<size_t> (to) > fTextStore.GetEnd ()) {
1389 RowReference startingRow = fEditor.GetRowReferenceContainingPosition (from);
1390 RowReference endingRow = fEditor.GetRowReferenceContainingPosition (to);
1395 return fEditor.GetHeightOfRows (startingRow, fEditor.CountRowDifference (startingRow, endingRow) + 1);
1398BOOL ActiveLedItControl::OLE_GetDirty ()
1403void ActiveLedItControl::OLE_SetDirty (BOOL dirty)
1405 fDataDirty = !!dirty;
1408void ActiveLedItControl::OnBrowseHelpCommand ()
1410 Led_URLManager::Get ().Open (MakeSophistsAppNameVersionURL (
"/Led/ActiveLedIt/UserDocs.asp", kAppName,
""));
1413void ActiveLedItControl::OnAboutBoxCommand ()
1415 class MyAboutBox :
public Led_StdDialogHelper_AboutBox {
1417 using inherited = Led_StdDialogHelper_AboutBox;
1420 MyAboutBox (HINSTANCE hInstance, HWND parentWnd)
1421 : inherited (hInstance, parentWnd)
1426 virtual BOOL OnInitDialog ()
override
1428 BOOL result = inherited::OnInitDialog ();
1432 const int kPictWidth = 437;
1433 const int kButHSluff = 17;
1434 const int kButVSluff = 61;
1435 const int kPictHeight = 318;
1439 ::GetWindowRect (GetHWND (), &windowRect);
1445 ::GetClientRect (GetHWND (), &clientRect);
1446 ncWidth = AsLedRect (windowRect).GetWidth () - AsLedRect (clientRect).GetWidth ();
1447 ncHeight = AsLedRect (windowRect).GetHeight () - AsLedRect (clientRect).GetHeight ();
1449 ::MoveWindow (GetHWND (), windowRect.left, windowRect.top, kPictWidth + ncWidth, kPictHeight + ncHeight,
false);
1454 HWND w = ::GetDlgItem (GetHWND (), kLedStdDlg_AboutBox_VersionFieldID);
1456 const int kVERWidth = 230;
1457 ::MoveWindow (w, kPictWidth / 2 - kVERWidth / 2, 35, 230, 14,
false);
1459#define kUNICODE_NAME_ADORNER L" [UNICODE]"
1461#define kUNICODE_NAME_ADORNER " [Internal UNICODE]"
1463 ::SetWindowText (w, (
SDKString{_T (qLed_ShortVersionString) kUNICODE_NAME_ADORNER _T (
" (") _T (__DATE__) _T (")")}).c_str ());
1468 HWND w = ::GetDlgItem (GetHWND (), kLedStdDlg_AboutBox_InfoLedFieldID);
1470 ::MoveWindow (w, 15, 159, 142, 17,
false);
1471 w = ::GetDlgItem (GetHWND (), kLedStdDlg_AboutBox_LedWebPageFieldID);
1473 ::MoveWindow (w, 227, 159, 179, 17,
false);
1478 HWND w = ::GetDlgItem (GetHWND (), IDOK);
1481 ::GetWindowRect (w, &tmp);
1482 ::MoveWindow (w, kButHSluff, kPictHeight - AsLedRect (tmp).GetHeight () - kButVSluff, AsLedRect (tmp).GetWidth (),
1483 AsLedRect (tmp).GetHeight (),
false);
1486 ::SetWindowText (GetHWND (), _T (
"About ActiveLedIt!"));
1492 virtual void OnClickInInfoField ()
override
1495 Led_URLManager::Get ().Open (
"mailto:info-led@sophists.com");
1500 inherited::OnClickInInfoField ();
1503 virtual void OnClickInLedWebPageField ()
override
1506 Led_URLManager::Get ().Open (MakeSophistsAppNameVersionURL (
"/Led/ActiveLedIt/", kAppName,
""));
1511 inherited::OnClickInLedWebPageField ();
1514 MyAboutBox dlg (::AfxGetResourceHandle (), fEditor.GetHWND ());
1518void ActiveLedItControl::ForceUIActive ()
1520 OnActivateInPlace (TRUE, NULL);
1523void ActiveLedItControl::FireOLEEvent (DISPID eventID)
1525 FireOLEEvent (eventID, EVENT_PARAM (VTS_NONE));
1528void ActiveLedItControl::FireOLEEvent (DISPID dispid, BYTE* pbParams, ...)
1532 va_start (argList, pbParams);
1533 FireEventV (dispid, pbParams, argList);
1537void ActiveLedItControl::FireUpdateUserCommand (
const wstring& internalCmdName, VARIANT_BOOL* enabled, VARIANT_BOOL* checked, wstring* name)
1540 CComObject<ActiveLedIt_CurrentEventArguments>* o = NULL;
1542 o->fInternalName = internalCmdName;
1544 o->fEnabled = !!*enabled;
1545 o->fChecked = !!*checked;
1546 fCurrentEventArguments = o;
1547 FireOLEEvent (DISPID_UpdateUserCommand);
1549 *enabled = o->fEnabled;
1550 *checked = o->fChecked;
1553 fCurrentEventArguments.Release ();
1556 fCurrentEventArguments.Release ();
1559void ActiveLedItControl::FireUserCommand (
const wstring& internalCmdName)
1562 CComObject<ActiveLedIt_CurrentEventArguments>* o = NULL;
1564 o->fInternalName = internalCmdName;
1565 fCurrentEventArguments = o;
1566 FireOLEEvent (DISPID_UserCommand);
1569 fCurrentEventArguments.Release ();
1572 fCurrentEventArguments.Release ();
1575#if qFunnyDisplayInDesignMode
1576bool ActiveLedItControl::IsInDesignMode ()
const
1578 return not
const_cast<ActiveLedItControl*
> (
this)->AmbientUserMode ();
1581bool ActiveLedItControl::DrawExtraDesignModeBorder ()
const
1583 return const_cast<ActiveLedItControl*
> (
this)->GetAppearance () == 0 and
const_cast<ActiveLedItControl*
> (
this)->GetBorderStyle () == 0;
1587HMENU ActiveLedItControl::GenerateContextMenu ()
1589 if (fConextMenu != NULL) {
1590#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
1591 CComQIPtr<IALCommandList> cm = (IDispatch*)fConextMenu;
1593 CComQIPtr<IALCommandList> cm = fConextMenu;
1597 if (SUCCEEDED (cm->GeneratePopupMenu (fAcceleratorTable, &menu))) {
1605int ActiveLedItControl::OnCreate (LPCREATESTRUCT lpCreateStruct)
1607 if (COleControl::OnCreate (lpCreateStruct) == -1) {
1611 fEditor.SetDefaultTextColor (TextImager::eDefaultBackgroundColor,
Color (TranslateColor (GetBackColor ())));
1614 GetClientRect (&clientRect);
1615 if (fEditor.Create (WS_CHILD | WS_VISIBLE, clientRect,
this, kEditorWindowID) == 0) {
1619#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
1620 CComQIPtr<IALToolbarList> tbl = (IDispatch*)fToolbarList;
1622 CComQIPtr<IALToolbarList> tbl = fToolbarList;
1624 if (tbl.p != NULL) {
1625 tbl->NotifyOfOwningActiveLedIt (CComQIPtr<IDispatch> (GetControllingUnknown ()), m_hWnd);
1628 if (fOnCreateExtras.get () != NULL) {
1629 OLE_SetReadOnly (fOnCreateExtras.get ()->fReadOnly);
1630 OLE_SetEnabled (fOnCreateExtras.get ()->fEnabled);
1631 fOnCreateExtras.release ();
1637void ActiveLedItControl::OnWindowPosChanged (WINDOWPOS* lpwndpos)
1640 DbgTrace (
"ActiveLedItControl::OnWindowPosChanged (cx={}, cy={}, flags=0x{:x})"_f, lpwndpos->cx, lpwndpos->cy, lpwndpos->flags);
1642 IdleManager::NonIdleContext nonIdleContext;
1649 COleControl::OnWindowPosChanged (lpwndpos);
1654void ActiveLedItControl::OnSetFocus (CWnd* pOldWnd)
1656 IdleManager::NonIdleContext nonIdleContext;
1657 COleControl::OnSetFocus (pOldWnd);
1658 fEditor.SetFocus ();
1661void ActiveLedItControl::Layout ()
1663 IdleManager::NonIdleContext nonIdleContext;
1664 if (m_hWnd != NULL) {
1665 DistanceType toolbarHeightUsed = 0;
1668 GetClientRect (&cr);
1671#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
1672 CComQIPtr<IALToolbarList> tbl = (IDispatch*)fToolbarList;
1674 CComQIPtr<IALToolbarList> tbl = fToolbarList;
1676 if (tbl.p != NULL) {
1677 UINT preferredHeight = 0;
1679 toolbarHeightUsed = preferredHeight;
1681 tblRect.bottom = tblRect.top + preferredHeight;
1682 ThrowIfErrorHRESULT (tbl->SetRectangle (tblRect.left, tblRect.top, tblRect.Width (), tblRect.Height ()));
1688 CRect editRect = cr;
1689 editRect.top += toolbarHeightUsed;
1690 fEditor.MoveWindow (editRect);
1694void ActiveLedItControl::OLE_InvalidateLayout ()
1699#if qDontUIActivateOnOpen
1700HRESULT ActiveLedItControl::OnOpen (BOOL , LPMSG pMsg)
1702 return OnActivateInPlace (
false, pMsg);
1706void ActiveLedItControl::OnBackColorChanged ()
1708 COleControl::OnBackColorChanged ();
1710 Color c =
Color (TranslateColor (GetBackColor ()));
1711 if (fEditor.GetDefaultTextColor (TextImager::eDefaultBackgroundColor) == NULL or
1712 *fEditor.GetDefaultTextColor (TextImager::eDefaultBackgroundColor) != c) {
1713 fEditor.SetDefaultTextColor (TextImager::eDefaultBackgroundColor, c);
1718#if qFunnyDisplayInDesignMode
1719void ActiveLedItControl::OnAmbientPropertyChange (DISPID dispid)
1721 COleControl::OnAmbientPropertyChange (dispid);
1722 if (dispid == DISPID_AMBIENT_USERMODE) {
1723 InvalidateControl ();
1724 ::InvalidateRect (fEditor.GetHWND (), NULL,
true);
1729UINT ActiveLedItControl::OLE_VersionNumber ()
1731 return kActiveLedItDWORDVersion;
1734BSTR ActiveLedItControl::OLE_ShortVersionString ()
1737 string result = qLed_ShortVersionString;
1738 return CString (result.c_str ()).AllocSysString ();
1740 CATCH_AND_HANDLE_EXCEPTIONS ();
1745BOOL ActiveLedItControl::OLE_GetReadOnly ()
1747 if (fEditor.m_hWnd == NULL) {
1749 if (fOnCreateExtras.get () == NULL) {
1753 return fOnCreateExtras.get ()->fReadOnly;
1757 bool result = !!(fEditor.GetStyle () & ES_READONLY);
1760 CATCH_AND_HANDLE_EXCEPTIONS ();
1764void ActiveLedItControl::OLE_SetReadOnly (BOOL bNewValue)
1767 if (fEditor.m_hWnd == NULL) {
1768 if (fOnCreateExtras.get () == NULL) {
1769 fOnCreateExtras = unique_ptr<OnCreateExtras> (
new OnCreateExtras ());
1771 fOnCreateExtras.get ()->fReadOnly = !!bNewValue;
1774 fEditor.SetReadOnly (bNewValue);
1777 CATCH_AND_HANDLE_EXCEPTIONS ();
1780BOOL ActiveLedItControl::OLE_GetEnabled ()
1782 if (fEditor.m_hWnd == NULL) {
1784 if (fOnCreateExtras.get () == NULL) {
1788 return fOnCreateExtras.get ()->fEnabled;
1792 return not(fEditor.GetStyle () & WS_DISABLED);
1794 CATCH_AND_HANDLE_EXCEPTIONS ();
1798void ActiveLedItControl::OLE_SetEnabled (BOOL bNewValue)
1801 if (fEditor.m_hWnd == NULL) {
1802 if (fOnCreateExtras.get () == NULL) {
1803 fOnCreateExtras = unique_ptr<OnCreateExtras> (
new OnCreateExtras ());
1805 fOnCreateExtras.get ()->fEnabled = !!bNewValue;
1809 fEditor.ModifyStyle (WS_DISABLED, 0);
1812 fEditor.ModifyStyle (0, WS_DISABLED);
1817 CATCH_AND_HANDLE_EXCEPTIONS ();
1820BOOL ActiveLedItControl::OLE_GetEnableAutoChangesBackgroundColor ()
1822 return fEditor.fEnableAutoChangesBackgroundColor;
1825void ActiveLedItControl::OLE_SetEnableAutoChangesBackgroundColor (BOOL bNewValue)
1828 IdleManager::NonIdleContext nonIdleContext;
1829 fEditor.fEnableAutoChangesBackgroundColor = !!bNewValue;
1832 CATCH_AND_HANDLE_EXCEPTIONS ();
1835int ActiveLedItControl::OLE_GetWindowMarginTop ()
1837 return fEditor.GetDefaultWindowMargins ().GetTop ();
1840void ActiveLedItControl::OLE_SetWindowMarginTop (
int windowMarginTop)
1843 TWIPS_Rect margRect = fEditor.GetDefaultWindowMargins ();
1844 margRect.top = TWIPS (windowMarginTop);
1845 fEditor.SetDefaultWindowMargins (margRect);
1847 fEditor.Invalidate ();
1849 CATCH_AND_HANDLE_EXCEPTIONS ();
1852int ActiveLedItControl::OLE_GetWindowMarginLeft ()
1854 return fEditor.GetDefaultWindowMargins ().GetLeft ();
1857void ActiveLedItControl::OLE_SetWindowMarginLeft (
int windowMarginLeft)
1860 TWIPS_Rect margRect = fEditor.GetDefaultWindowMargins ();
1861 margRect.left = TWIPS (windowMarginLeft);
1862 fEditor.SetDefaultWindowMargins (margRect);
1864 fEditor.Invalidate ();
1866 CATCH_AND_HANDLE_EXCEPTIONS ();
1869int ActiveLedItControl::OLE_GetWindowMarginBottom ()
1871 return fEditor.GetDefaultWindowMargins ().GetBottom ();
1874void ActiveLedItControl::OLE_SetWindowMarginBottom (
int windowMarginBottom)
1877 TWIPS_Rect margRect = fEditor.GetDefaultWindowMargins ();
1878 margRect.SetBottom (TWIPS (windowMarginBottom));
1879 fEditor.SetDefaultWindowMargins (margRect);
1881 fEditor.Invalidate ();
1883 CATCH_AND_HANDLE_EXCEPTIONS ();
1886int ActiveLedItControl::OLE_GetWindowMarginRight ()
1888 return fEditor.GetDefaultWindowMargins ().GetRight ();
1891void ActiveLedItControl::OLE_SetWindowMarginRight (
int windowMarginRight)
1894 TWIPS_Rect margRect = fEditor.GetDefaultWindowMargins ();
1895 margRect.SetRight (TWIPS (windowMarginRight));
1896 fEditor.SetDefaultWindowMargins (margRect);
1898 fEditor.Invalidate ();
1900 CATCH_AND_HANDLE_EXCEPTIONS ();
1903int ActiveLedItControl::OLE_GetPrintMarginTop ()
1905 return fEditor.GetPrintMargins ().GetTop ();
1908void ActiveLedItControl::OLE_SetPrintMarginTop (
int printMarginTop)
1911 TWIPS_Rect margRect = fEditor.GetPrintMargins ();
1912 margRect.SetTop (TWIPS (printMarginTop));
1913 fEditor.SetPrintMargins (margRect);
1915 CATCH_AND_HANDLE_EXCEPTIONS ();
1918int ActiveLedItControl::OLE_GetPrintMarginLeft ()
1920 return fEditor.GetPrintMargins ().GetLeft ();
1923void ActiveLedItControl::OLE_SetPrintMarginLeft (
int printMarginLeft)
1926 TWIPS_Rect margRect = fEditor.GetPrintMargins ();
1927 margRect.SetLeft (TWIPS (printMarginLeft));
1928 fEditor.SetPrintMargins (margRect);
1930 CATCH_AND_HANDLE_EXCEPTIONS ();
1933int ActiveLedItControl::OLE_GetPrintMarginBottom ()
1935 return fEditor.GetPrintMargins ().GetBottom ();
1938void ActiveLedItControl::OLE_SetPrintMarginBottom (
int printMarginBottom)
1941 TWIPS_Rect margRect = fEditor.GetPrintMargins ();
1942 margRect.SetBottom (TWIPS (printMarginBottom));
1943 fEditor.SetPrintMargins (margRect);
1945 CATCH_AND_HANDLE_EXCEPTIONS ();
1948int ActiveLedItControl::OLE_GetPrintMarginRight ()
1950 return fEditor.GetPrintMargins ().GetRight ();
1953void ActiveLedItControl::OLE_SetPrintMarginRight (
int printMarginRight)
1956 TWIPS_Rect margRect = fEditor.GetPrintMargins ();
1957 margRect.SetRight (TWIPS (printMarginRight));
1958 fEditor.SetPrintMargins (margRect);
1960 CATCH_AND_HANDLE_EXCEPTIONS ();
1963UINT ActiveLedItControl::GetHasVerticalScrollBar ()
1965 switch (fEditor.GetScrollBarType (LedItView::v)) {
1966 case LedItView::eScrollBarNever:
1967 return eNoScrollBar;
1968 case LedItView::eScrollBarAsNeeded:
1969 return eShowScrollbarIfNeeded;
1970 case LedItView::eScrollBarAlways:
1971 return eShowScrollBar;
1973 return eNoScrollBar;
1976void ActiveLedItControl::SetHasVerticalScrollBar (UINT bNewValue)
1978 if (bNewValue != GetHasVerticalScrollBar ()) {
1979 IdleManager::NonIdleContext nonIdleContext;
1981 switch (bNewValue) {
1983 fEditor.SetScrollBarType (LedItView::v, LedItView::eScrollBarNever);
1985 case eShowScrollBar:
1986 fEditor.SetScrollBarType (LedItView::v, LedItView::eScrollBarAlways);
1988 case eShowScrollbarIfNeeded:
1989 fEditor.SetScrollBarType (LedItView::v, LedItView::eScrollBarAsNeeded);
1995UINT ActiveLedItControl::GetHasHorizontalScrollBar ()
1997 switch (fEditor.GetScrollBarType (LedItView::h)) {
1998 case LedItView::eScrollBarNever:
1999 return eNoScrollBar;
2000 case LedItView::eScrollBarAsNeeded:
2001 return eShowScrollbarIfNeeded;
2002 case LedItView::eScrollBarAlways:
2003 return eShowScrollBar;
2005 return eNoScrollBar;
2008void ActiveLedItControl::SetHasHorizontalScrollBar (UINT bNewValue)
2010 if (bNewValue != GetHasHorizontalScrollBar ()) {
2011 IdleManager::NonIdleContext nonIdleContext;
2013 switch (bNewValue) {
2015 fEditor.SetScrollBarType (LedItView::h, LedItView::eScrollBarNever);
2017 case eShowScrollBar:
2018 fEditor.SetScrollBarType (LedItView::h, LedItView::eScrollBarAlways);
2020 case eShowScrollbarIfNeeded:
2021 fEditor.SetScrollBarType (LedItView::h, LedItView::eScrollBarAsNeeded);
2027BSTR ActiveLedItControl::GetBufferText ()
2029 size_t len = fEditor.GetLength ();
2031 fEditor.CopyOut (0, len, buf.data ());
2033 return CString (buf.data ()).AllocSysString ();
2036void ActiveLedItControl::SetBufferText (LPCTSTR text)
2039 IdleManager::NonIdleContext nonIdleContext;
2040 fCommandHandler.Commit ();
2042 size_t len = text == NULL ? 0 : ::_tcslen (text);
2045 memcpy (&buf[1], text, len *
sizeof (
wchar_t));
2046 StyledTextIOSrcStream_Memory source (buf.data (), (len + 1) * sizeof (
wchar_t));
2048 StyledTextIOSrcStream_Memory source (text, text == NULL ? 0 : ::_tcslen (text));
2051 StyledTextIOReader_PlainText textReader (&source, &sink);
2052 fEditor.Replace (0, fEditor.GetEnd (), LED_TCHAR_OF (
""), 0);
2054 fEditor.SetEmptySelectionStyle ();
2056 CATCH_AND_HANDLE_EXCEPTIONS ();
2059BSTR ActiveLedItControl::GetBufferTextCRLF ()
2062 size_t len = fEditor.GetLength ();
2064 fEditor.CopyOut (0, len, buf.data ());
2067 len = Characters::NLToNative<Led_tChar> (buf.data (), len, buf2.data (), 2 * len + 1);
2069 return CString (buf2.data ()).AllocSysString ();
2071 CATCH_AND_HANDLE_EXCEPTIONS ();
2076void ActiveLedItControl::SetBufferTextCRLF (LPCTSTR text)
2078 SetBufferText (text);
2081BSTR ActiveLedItControl::GetBufferTextAsRTF ()
2084 return CString (GetBufferTextAsRTF_ ().c_str ()).AllocSysString ();
2086 CATCH_AND_HANDLE_EXCEPTIONS ();
2091string ActiveLedItControl::GetBufferTextAsRTF_ ()
2094 StyledTextIOWriterSinkStream_Memory sink;
2095 StyledTextIOWriter_RTF textWriter (&source, &sink);
2096 textWriter.Write ();
2097 size_t len = sink.GetLength ();
2099 memcpy (buf.data (), sink.PeekAtData (), len);
2101 return string{
static_cast<char*
> (buf)};
2104void ActiveLedItControl::SetBufferTextAsRTF (LPCTSTR text)
2107 IdleManager::NonIdleContext nonIdleContext;
2108 TextInteractor::TemporarilySetUpdateMode tsum (fEditor, m_hWnd == NULL ? TextInteractor::eNoUpdate : TextInteractor::eDefaultUpdate);
2109 fCommandHandler.Commit ();
2111 string s = String::FromSDKString (text).AsNarrowSDKString ();
2112 StyledTextIOSrcStream_Memory source (s.c_str (), s.length ());
2114 StyledTextIOReader_RTF textReader (&source, &sink);
2115 fEditor.Replace (0, fEditor.GetEnd (), LED_TCHAR_OF (
""), 0);
2117 fEditor.SetEmptySelectionStyle ();
2119 CATCH_AND_HANDLE_EXCEPTIONS ();
2122BSTR ActiveLedItControl::GetBufferTextAsHTML ()
2126 StyledTextIOWriterSinkStream_Memory sink;
2127 StyledTextIOWriter_HTML textWriter (&source, &sink);
2128 textWriter.Write ();
2129 size_t len = sink.GetLength ();
2131 memcpy (buf.data (), sink.PeekAtData (), len);
2133 return CString{buf.data ()}.AllocSysString ();
2135 CATCH_AND_HANDLE_EXCEPTIONS ();
2140void ActiveLedItControl::SetBufferTextAsHTML (LPCTSTR text)
2143 IdleManager::NonIdleContext nonIdleContext;
2144 fCommandHandler.Commit ();
2145 string s = String::FromSDKString (text).AsNarrowSDKString ();
2146 StyledTextIOSrcStream_Memory source (s.c_str (), s.length ());
2148 StyledTextIOReader_HTML textReader (&source, &sink);
2149 fEditor.Replace (0, fEditor.GetEnd (), LED_TCHAR_OF (
""), 0);
2151 fEditor.SetEmptySelectionStyle ();
2153 CATCH_AND_HANDLE_EXCEPTIONS ();
2156inline void PackBytesIntoVariantSAFEARRAY (
const void* bytes,
size_t nBytes, VARIANT* into)
2161 SAFEARRAYBOUND rgsaBounds[1];
2162 rgsaBounds[0].lLbound = 0;
2163 rgsaBounds[0].cElements =
static_cast<ULONG
> (nBytes);
2164 SAFEARRAY* ar = ::SafeArrayCreate (VT_I1, 1, rgsaBounds);
2165 Execution::ThrowIfNull (ar);
2169 (void)::memcpy (ptr, bytes, nBytes);
2170 ::SafeArrayUnaccessData (ar);
2171 ::VariantInit (into);
2172 into->vt = VT_ARRAY | VT_I1;
2176VARIANT ActiveLedItControl::GetBufferTextAsDIB ()
2178 if (fEditor.m_hWnd == NULL) {
2184 CWindowDC windowDC (&fEditor);
2185 Led_MFC_TabletFromCDC tabFromDC (&windowDC);
2186 Tablet* tablet = tabFromDC;
2188 DistanceType rhsMargin = 0;
2190 const int kRTF_SPEC_DefaultInches = 6;
2191 TWIPS rhsTWIPS = TWIPS (kRTF_SPEC_DefaultInches * 1440);
2192 rhsMargin = Led_CvtScreenPixelsFromTWIPSH (rhsTWIPS);
2195 size_t savedScrollPos = fEditor.GetMarkerPositionOfStartOfWindow ();
2196 Led_Rect savedWindowRect = fEditor.GetWindowRect ();
2197 Led_Rect offscreenRect (0, 0, 1000, rhsMargin);
2199 Bitmap memoryBitmap;
2203 unsigned nTimes = 0;
2204 fEditor.SetWindowRect (offscreenRect);
2205 offscreenRect.bottom = fEditor.GetHeightOfRows (0, fEditor.GetRowCount ());
2206 fEditor.SetWindowRect (offscreenRect);
2208 DistanceType farthestRHSMargin = fEditor.CalculateFarthestRightMarginInWindow ();
2209 if (farthestRHSMargin !=
static_cast<DistanceType
> (offscreenRect.GetRight ()) and farthestRHSMargin > 10) {
2210 offscreenRect.right = farthestRHSMargin;
2222 Verify (memDC.CreateCompatibleDC (tablet));
2223 Verify (memoryBitmap.CreateCompatibleBitmap (tablet->m_hDC, offscreenRect.GetWidth (), offscreenRect.GetHeight ()));
2224 Verify (memDC.SelectObject (memoryBitmap));
2225 (void)memDC.SetWindowOrg (offscreenRect.left, offscreenRect.top);
2227 LedItView::TemporarilyUseTablet tmpUseTablet (fEditor, &memDC, LedItView::TemporarilyUseTablet::eDontDoTextMetricsChangedCall);
2228 fEditor.Draw (offscreenRect,
false);
2230 fEditor.SetWindowRect (savedWindowRect);
2231 fEditor.SetTopRowInWindowByMarkerPosition (savedScrollPos);
2234 fEditor.SetWindowRect (savedWindowRect);
2235 fEditor.SetTopRowInWindowByMarkerPosition (savedScrollPos);
2239#define qCopyDIBToClipToTest 0
2241#if qCopyDIBToClipToTest
2243 Verify (::OpenClipboard (fEditor.m_hWnd));
2244 Verify (::EmptyClipboard ());
2245 HGLOBAL dataHandle = ::GlobalAlloc (GMEM_DDESHARE, dibRAMSize);
2247 ::memcpy (Led_StackBasedHandleLocker (dataHandle).GetPointer (), tmpDIB, dibRAMSize);
2248 Verify (::SetClipboardData (CF_DIB, dataHandle));
2249 Verify (::CloseClipboard ());
2250 ::GlobalFree (dataHandle);
2259 ::memset (&pictDesc, 0,
sizeof (pictDesc));
2260 pictDesc.cbSizeofstruct =
sizeof (pictDesc);
2261 pictDesc.picType = PICTYPE_BITMAP;
2262 pictDesc.bmp.hbitmap = memoryBitmap;
2263 pictDesc.bmp.hpal = NULL;
2264 CComQIPtr<IDispatch> result;
2265 ThrowIfErrorHRESULT (::OleCreatePictureIndirect (&pictDesc, IID_IDispatch,
true, (
void**)&result));
2267 v.pdispVal = result.Detach ();
2274long ActiveLedItControl::GetBufferLength ()
2276 return static_cast<long> (fEditor.GetLength ());
2279long ActiveLedItControl::GetMaxLength ()
2281 return fEditor.GetMaxLength ();
2284void ActiveLedItControl::SetMaxLength (
long maxLength)
2286 fEditor.SetMaxLength (maxLength < 0 ? -1 : maxLength);
2289BOOL ActiveLedItControl::GetSupportContextMenu ()
2291 return fEditor.GetSupportContextMenu ();
2294void ActiveLedItControl::SetSupportContextMenu (BOOL bNewValue)
2296 if (bNewValue != GetSupportContextMenu ()) {
2297 fEditor.SetSupportContextMenu (!!bNewValue);
2301BOOL ActiveLedItControl::OLE_GetHideDisabledContextMenuItems ()
2303 return fEditor.GetHideDisabledContextMenuItems ();
2306void ActiveLedItControl::OLE_SetHideDisabledContextMenuItems (BOOL bNewValue)
2308 if (bNewValue != OLE_GetHideDisabledContextMenuItems ()) {
2309 fEditor.SetHideDisabledContextMenuItems (!!bNewValue);
2313BOOL ActiveLedItControl::GetSmartCutAndPaste ()
2315 return fEditor.GetSmartCutAndPasteMode ();
2318void ActiveLedItControl::SetSmartCutAndPaste (BOOL bNewValue)
2320 if (bNewValue != GetSmartCutAndPaste ()) {
2321 fEditor.SetSmartCutAndPasteMode (!!bNewValue);
2325BOOL ActiveLedItControl::OLE_GetSmartQuoteMode ()
2327 return fEditor.GetSmartQuoteMode ();
2330void ActiveLedItControl::OLE_SetSmartQuoteMode (BOOL bNewValue)
2332 if (bNewValue != OLE_GetSmartQuoteMode ()) {
2333 fEditor.SetSmartQuoteMode (!!bNewValue);
2337BOOL ActiveLedItControl::GetWrapToWindow ()
2339 return fEditor.GetWrapToWindow ();
2342void ActiveLedItControl::SetWrapToWindow (BOOL bNewValue)
2344 if (bNewValue != GetWrapToWindow ()) {
2345 fEditor.SetWrapToWindow (!!bNewValue);
2349BOOL ActiveLedItControl::GetShowParagraphGlyphs ()
2351 return fEditor.GetShowParagraphGlyphs ();
2354void ActiveLedItControl::SetShowParagraphGlyphs (BOOL bNewValue)
2356 if (bNewValue != GetShowParagraphGlyphs ()) {
2357 fEditor.SetShowParagraphGlyphs (!!bNewValue);
2361BOOL ActiveLedItControl::GetShowTabGlyphs ()
2363 return fEditor.GetShowTabGlyphs ();
2366void ActiveLedItControl::SetShowTabGlyphs (BOOL bNewValue)
2368 if (bNewValue != GetShowTabGlyphs ()) {
2369 fEditor.SetShowTabGlyphs (!!bNewValue);
2373BOOL ActiveLedItControl::GetShowSpaceGlyphs ()
2375 return fEditor.GetShowSpaceGlyphs ();
2378void ActiveLedItControl::SetShowSpaceGlyphs (BOOL bNewValue)
2380 if (bNewValue != GetShowSpaceGlyphs ()) {
2381 fEditor.SetShowSpaceGlyphs (!!bNewValue);
2385BOOL ActiveLedItControl::OLE_GetUseSelectEOLBOLRowHilightStyle ()
2387 return fEditor.GetUseSelectEOLBOLRowHilightStyle ();
2390void ActiveLedItControl::OLE_SetUseSelectEOLBOLRowHilightStyle (BOOL bNewValue)
2392 if (bNewValue != OLE_GetUseSelectEOLBOLRowHilightStyle ()) {
2393 fEditor.SetUseSelectEOLBOLRowHilightStyle (!!bNewValue);
2398BOOL ActiveLedItControl::OLE_GetShowSecondaryHilight ()
2400 return fEditor.GetUseSecondaryHilight ();
2403void ActiveLedItControl::OLE_SetShowSecondaryHilight (BOOL bNewValue)
2405 if (bNewValue != OLE_GetShowSecondaryHilight ()) {
2406 fEditor.SetUseSecondaryHilight (!!bNewValue);
2411BOOL ActiveLedItControl::OLE_GetShowHidableText ()
2416 return !uhtmo->IsHidden ();
2419void ActiveLedItControl::OLE_SetShowHidableText (BOOL bNewValue)
2421 IdleManager::NonIdleContext nonIdleContext;
2423 fEditor.GetHidableTextDatabase ()->ShowAll ();
2426 fEditor.GetHidableTextDatabase ()->HideAll ();
2430OLE_COLOR ActiveLedItControl::OLE_GetHidableTextColor ()
2436 return uhtmo->GetColor ().GetOSRep ();
2438 CATCH_AND_HANDLE_EXCEPTIONS ();
2443void ActiveLedItControl::OLE_SetHidableTextColor (OLE_COLOR color)
2449 uhtmo->SetColor (
Color (TranslateColor (color)));
2452 CATCH_AND_HANDLE_EXCEPTIONS ();
2455BOOL ActiveLedItControl::OLE_GetHidableTextColored ()
2461 return uhtmo->GetColored ();
2463 CATCH_AND_HANDLE_EXCEPTIONS ();
2468void ActiveLedItControl::OLE_SetHidableTextColored (BOOL bNewValue)
2474 uhtmo->SetColored (!!bNewValue);
2477 CATCH_AND_HANDLE_EXCEPTIONS ();
2480VARIANT ActiveLedItControl::OLE_GetSpellChecker ()
2484 ::VariantInit (&result);
2485 if (fSpellChecker != NULL) {
2486 result.vt = VT_DISPATCH;
2487 result.pdispVal = fSpellChecker;
2488 result.pdispVal->AddRef ();
2492 CATCH_AND_HANDLE_EXCEPTIONS ();
2496void ActiveLedItControl::OLE_SetSpellChecker (VARIANT& newValue)
2502 IdleManager::NonIdleContext nonIdleContext;
2503 if (fSpellChecker != NULL) {
2504 fSpellChecker->Release ();
2505 fSpellChecker = NULL;
2506 ChangedSpellCheckerCOMObject ();
2509 Assert (fSpellChecker == NULL);
2511 ::VariantInit (&tmpV);
2512 if (::VariantChangeType (&tmpV, &newValue, 0, VT_DISPATCH) == S_OK) {
2513 fSpellChecker = tmpV.pdispVal;
2514 if (fSpellChecker != NULL) {
2515 fSpellChecker->AddRef ();
2517 ::VariantClear (&tmpV);
2518 ChangedSpellCheckerCOMObject ();
2520 else if (::VariantChangeType (&tmpV, &newValue, 0, VT_BSTR) == S_OK) {
2523 if (::SysStringLen (tmpV.bstrVal) != 0) {
2525 if (SUCCEEDED (hr = ::CLSIDFromProgID (tmpV.bstrVal, &theCLSID)) or SUCCEEDED (hr = ::CLSIDFromString (tmpV.bstrVal, &theCLSID))) {
2526 hr = ::CoCreateInstance (theCLSID, NULL, CLSCTX_ALL, IID_IDispatch,
reinterpret_cast<LPVOID*
> (&fSpellChecker));
2527 Assert (SUCCEEDED (hr) == (fSpellChecker != NULL));
2530 ::VariantClear (&tmpV);
2531 ChangedSpellCheckerCOMObject ();
2538 CATCH_AND_HANDLE_EXCEPTIONS ();
2541void ActiveLedItControl::ChangedSpellCheckerCOMObject ()
2543 fEditor.SetSpellCheckEngine (NULL);
2544 fLedSpellCheckWrapper = COMBased_SpellCheckEngine (fSpellChecker);
2545 if (fSpellChecker != NULL) {
2546 fEditor.SetSpellCheckEngine (&fLedSpellCheckWrapper);
2550VARIANT ActiveLedItControl::OLE_GetContextMenu ()
2554 ::VariantInit (&result);
2555 if (fConextMenu.p != NULL) {
2556 result.vt = VT_DISPATCH;
2557 result.pdispVal = fConextMenu;
2558 result.pdispVal->AddRef ();
2562 CATCH_AND_HANDLE_EXCEPTIONS ();
2567void ActiveLedItControl::OLE_SetContextMenu (VARIANT& newValue)
2573 fConextMenu.Release ();
2575 ::VariantInit (&tmpV);
2576 if (::VariantChangeType (&tmpV, &newValue, 0, VT_DISPATCH) == S_OK) {
2577 fConextMenu = tmpV.pdispVal;
2578 ::VariantClear (&tmpV);
2584 CATCH_AND_HANDLE_EXCEPTIONS ();
2587VARIANT ActiveLedItControl::OLE_GetToolbarList ()
2591 ::VariantInit (&result);
2592 if (fToolbarList.p != NULL) {
2593 result.vt = VT_DISPATCH;
2594 result.pdispVal = fToolbarList;
2595 result.pdispVal->AddRef ();
2599 CATCH_AND_HANDLE_EXCEPTIONS ();
2604void ActiveLedItControl::OLE_SetToolbarList (VARIANT& newValue)
2610 IdleManager::NonIdleContext nonIdleContext;
2612#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
2613 CComQIPtr<IALToolbarList> tbl = (IDispatch*)fToolbarList;
2615 CComQIPtr<IALToolbarList> tbl = fToolbarList;
2617 if (tbl.p != NULL) {
2618 tbl->NotifyOfOwningActiveLedIt (NULL, NULL);
2621 fToolbarList.Release ();
2623 ::VariantInit (&tmpV);
2624 if (::VariantChangeType (&tmpV, &newValue, 0, VT_DISPATCH) == S_OK) {
2625 fToolbarList = tmpV.pdispVal;
2626 ::VariantClear (&tmpV);
2632#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
2633 CComQIPtr<IALToolbarList> tbl = (IDispatch*)fToolbarList;
2635 CComQIPtr<IALToolbarList> tbl = fToolbarList;
2637 if (tbl.p != NULL) {
2638 tbl->NotifyOfOwningActiveLedIt (CComQIPtr<IDispatch> (GetControllingUnknown ()), m_hWnd);
2642 CATCH_AND_HANDLE_EXCEPTIONS ();
2645VARIANT ActiveLedItControl::OLE_GetBuiltinCommands ()
2648 if (fBuiltinCommands.p == NULL) {
2649 fBuiltinCommands = GenerateBuiltinCommandsObject ();
2652 ::VariantInit (&result);
2654 result.vt = VT_DISPATCH;
2655 result.pdispVal = fBuiltinCommands;
2656 result.pdispVal->AddRef ();
2660 CATCH_AND_HANDLE_EXCEPTIONS ();
2666 CComPtr<IDispatch> mkMenu_Select ()
2669 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2671 CComQIPtr<IDispatch> result = o->GetUnknown ();
2673 o->put_Name (CComBSTR (L
"Select"));
2674 o->put_InternalName (CComBSTR (kName_SelectMenu));
2676 o->AppendBuiltinCmd (kCmd_SelectWord);
2677 o->AppendBuiltinCmd (kCmd_SelectTextRow);
2678 o->AppendBuiltinCmd (kCmd_SelectParagraph);
2680 o->AppendBuiltinCmd (kCmd_Separator);
2682 o->AppendBuiltinCmd (kCmd_SelectTableIntraCellAll);
2683 o->AppendBuiltinCmd (kCmd_SelectTableCell);
2684 o->AppendBuiltinCmd (kCmd_SelectTableRow);
2685 o->AppendBuiltinCmd (kCmd_SelectTableColumn);
2686 o->AppendBuiltinCmd (kCmd_SelectTable);
2688 o->AppendBuiltinCmd (kCmd_Separator);
2690 o->AppendBuiltinCmd (kCmd_SelectAll);
2692 o->AppendBuiltinCmd (kCmd_Separator);
2694 o->AppendBuiltinCmd (kCmd_Find);
2695 o->AppendBuiltinCmd (kCmd_FindAgain);
2696 o->AppendBuiltinCmd (kCmd_EnterFindString);
2697 o->AppendBuiltinCmd (kCmd_Replace);
2698 o->AppendBuiltinCmd (kCmd_ReplaceAgain);
2700 o->AppendBuiltinCmd (kCmd_Separator);
2702 o->AppendBuiltinCmd (kCmd_CheckSpelling);
2705 CATCH_AND_HANDLE_EXCEPTIONS ();
2707 return CComPtr<IDispatch>{};
2710 CComPtr<IDispatch> mkMenu_Insert ()
2713 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2715 CComQIPtr<IDispatch> result = o->GetUnknown ();
2717 o->put_Name (CComBSTR (L
"Insert"));
2718 o->put_InternalName (CComBSTR (kName_InsertMenu));
2720 o->AppendBuiltinCmd (kCmd_InsertTable);
2721 o->AppendBuiltinCmd (kCmd_InsertTableRowAbove);
2722 o->AppendBuiltinCmd (kCmd_InsertTableRowBelow);
2723 o->AppendBuiltinCmd (kCmd_InsertTableColBefore);
2724 o->AppendBuiltinCmd (kCmd_InsertTableColAfter);
2726 o->AppendBuiltinCmd (kCmd_Separator);
2728 o->AppendBuiltinCmd (kCmd_InsertURL);
2729 o->AppendBuiltinCmd (kCmd_InsertSymbol);
2732 CATCH_AND_HANDLE_EXCEPTIONS ();
2734 return CComPtr<IDispatch>{};
2737 CComPtr<IDispatch> mkMenu_Font ()
2740 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2742 CComQIPtr<IDispatch> result = o->GetUnknown ();
2744 o->put_Name (CComBSTR (L
"Font"));
2745 o->put_InternalName (CComBSTR (kName_FontNameMenu));
2747 const vector<SDKString>& fontNames = GetUsableFontNames ();
2748 Assert (fontNames.size () <= kLastFontNameCmd - kBaseFontNameCmd + 1);
2749 for (
size_t i = 0; i < fontNames.size (); i++) {
2750 WORD cmdNum =
static_cast<WORD
> (kBaseFontNameCmd + i);
2751 if (cmdNum > kLastFontNameCmd) {
2754 ActiveLedIt_BuiltinCommand* c = ActiveLedIt_BuiltinCommand::mk (BuiltinCmdSpec (cmdNum, mkFontNameCMDName (fontNames[i]).c_str ()));
2755 c->SetName (String::FromSDKString (fontNames[i]).As<wstring> ());
2761 CATCH_AND_HANDLE_EXCEPTIONS ();
2763 return CComPtr<IDispatch>{};
2766 CComPtr<IDispatch> mkMenu_FontStyle ()
2769 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2771 CComQIPtr<IDispatch> result = o->GetUnknown ();
2773 o->put_Name (CComBSTR (L
"Font Style"));
2774 o->put_InternalName (CComBSTR (kName_FontStyleMenu));
2776 o->AppendBuiltinCmd (kCmd_FontStylePlain);
2778 o->AppendBuiltinCmd (kCmd_Separator);
2780 o->AppendBuiltinCmd (kCmd_FontStyleBold);
2781 o->AppendBuiltinCmd (kCmd_FontStyleItalic);
2782 o->AppendBuiltinCmd (kCmd_FontStyleUnderline);
2783 o->AppendBuiltinCmd (kCmd_FontStyleStrikeout);
2784 o->AppendBuiltinCmd (kCmd_SubScript);
2785 o->AppendBuiltinCmd (kCmd_SuperScript);
2789 CATCH_AND_HANDLE_EXCEPTIONS ();
2791 return CComPtr<IDispatch>{};
2794 CComPtr<IDispatch> mkMenu_FontSize (
bool forComboBox)
2797 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2799 CComQIPtr<IDispatch> result = o->GetUnknown ();
2801 o->put_Name (CComBSTR (L
"Font Size"));
2802 o->put_InternalName (CComBSTR (kName_FontSizeMenu));
2804 o->AppendBuiltinCmd (kCmd_FontSize9);
2805 o->AppendBuiltinCmd (kCmd_FontSize10);
2806 o->AppendBuiltinCmd (kCmd_FontSize12);
2807 o->AppendBuiltinCmd (kCmd_FontSize14);
2808 o->AppendBuiltinCmd (kCmd_FontSize18);
2809 o->AppendBuiltinCmd (kCmd_FontSize24);
2810 o->AppendBuiltinCmd (kCmd_FontSize36);
2811 o->AppendBuiltinCmd (kCmd_FontSize48);
2812 o->AppendBuiltinCmd (kCmd_FontSize72);
2814 if (not forComboBox) {
2815 o->AppendBuiltinCmd (kCmd_Separator);
2817 o->AppendBuiltinCmd (kCmd_FontSizeSmaller);
2818 o->AppendBuiltinCmd (kCmd_FontSizeLarger);
2820 o->AppendBuiltinCmd (kCmd_Separator);
2823 o->AppendBuiltinCmd (kCmd_FontSizeOther);
2827 CATCH_AND_HANDLE_EXCEPTIONS ();
2829 return CComPtr<IDispatch>{};
2832 CComPtr<IDispatch> mkMenu_FontColor ()
2835 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2837 CComQIPtr<IDispatch> result = o->GetUnknown ();
2839 o->put_Name (CComBSTR (L
"Font Color"));
2840 o->put_InternalName (CComBSTR (kName_FontColorMenu));
2842 o->AppendBuiltinCmd (kCmd_BlackColor);
2843 o->AppendBuiltinCmd (kCmd_MaroonColor);
2844 o->AppendBuiltinCmd (kCmd_GreenColor);
2845 o->AppendBuiltinCmd (kCmd_OliveColor);
2846 o->AppendBuiltinCmd (kCmd_NavyColor);
2847 o->AppendBuiltinCmd (kCmd_PurpleColor);
2848 o->AppendBuiltinCmd (kCmd_TealColor);
2849 o->AppendBuiltinCmd (kCmd_GrayColor);
2850 o->AppendBuiltinCmd (kCmd_SilverColor);
2851 o->AppendBuiltinCmd (kCmd_RedColor);
2852 o->AppendBuiltinCmd (kCmd_LimeColor);
2853 o->AppendBuiltinCmd (kCmd_YellowColor);
2854 o->AppendBuiltinCmd (kCmd_BlueColor);
2855 o->AppendBuiltinCmd (kCmd_FuchsiaColor);
2856 o->AppendBuiltinCmd (kCmd_AquaColor);
2857 o->AppendBuiltinCmd (kCmd_WhiteColor);
2859 o->AppendBuiltinCmd (kCmd_Separator);
2861 o->AppendBuiltinCmd (kCmd_OtherColor);
2865 CATCH_AND_HANDLE_EXCEPTIONS ();
2867 return CComPtr<IDispatch>{};
2870 CComPtr<IDispatch> mkMenu_ParagraphJustification ()
2873 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2875 CComQIPtr<IDispatch> result = o->GetUnknown ();
2877 o->put_Name (CComBSTR (L
"Paragraph Justification"));
2878 o->put_InternalName (CComBSTR (kName_ParagraphJustification));
2880 o->AppendBuiltinCmd (kCmd_JustifyLeft);
2881 o->AppendBuiltinCmd (kCmd_JustifyCenter);
2882 o->AppendBuiltinCmd (kCmd_JustifyRight);
2883 o->AppendBuiltinCmd (kCmd_JustifyFull);
2887 CATCH_AND_HANDLE_EXCEPTIONS ();
2889 return CComPtr<IDispatch>{};
2892 CComPtr<IDispatch> mkMenu_ListStyle ()
2895 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2897 CComQIPtr<IDispatch> result = o->GetUnknown ();
2899 o->put_Name (CComBSTR (L
"List Style"));
2900 o->put_InternalName (CComBSTR (kName_ListStyle));
2902 o->AppendBuiltinCmd (kCmd_ListStyle_None);
2903 o->AppendBuiltinCmd (kCmd_ListStyle_Bullet);
2907 CATCH_AND_HANDLE_EXCEPTIONS ();
2909 return CComPtr<IDispatch>{};
2913VARIANT ActiveLedItControl::OLE_GetPredefinedMenus ()
2916 if (fPredefinedMenus.p == NULL) {
2917 CComObject<ActiveLedIt_StaticCommandList>* o = NULL;
2919 CComPtr<IDispatch> saved = o;
2921 o->Append (mkMenu_Select ());
2922 o->Append (mkMenu_Insert ());
2923 o->Append (mkMenu_Font ());
2924 o->Append (mkMenu_FontStyle ());
2925 o->Append (mkMenu_FontSize (
false));
2926 o->Append (mkMenu_FontColor ());
2927 o->Append (mkMenu_ParagraphJustification ());
2928 o->Append (mkMenu_ListStyle ());
2930 fPredefinedMenus = o;
2933 ::VariantInit (&result);
2935 result.vt = VT_DISPATCH;
2936 result.pdispVal = fPredefinedMenus;
2937 result.pdispVal->AddRef ();
2941 CATCH_AND_HANDLE_EXCEPTIONS ();
2945VARIANT ActiveLedItControl::OLE_GetAcceleratorTable ()
2949 ::VariantInit (&result);
2950 if (fAcceleratorTable.p != NULL) {
2951 result.vt = VT_DISPATCH;
2952 result.pdispVal = fAcceleratorTable;
2953 result.pdispVal->AddRef ();
2957 CATCH_AND_HANDLE_EXCEPTIONS ();
2961void ActiveLedItControl::OLE_SetAcceleratorTable (VARIANT& newValue)
2967 fAcceleratorTable.Release ();
2969 ::VariantInit (&tmpV);
2970 if (::VariantChangeType (&tmpV, &newValue, 0, VT_DISPATCH) == S_OK) {
2971 fAcceleratorTable = tmpV.pdispVal;
2972 ::VariantClear (&tmpV);
2978 CATCH_AND_HANDLE_EXCEPTIONS ();
2981HACCEL ActiveLedItControl::GetCurrentWin32AccelTable ()
2984 if (fWin32AccelTable ==
nullptr or Time::GetTickCount () - fLastAccelTableUpdateAt > kTimeBetweenRecomputes) {
2986#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
2987 CComQIPtr<IALAcceleratorTable> accelTable = (IDispatch*)fAcceleratorTable;
2989 CComQIPtr<IALAcceleratorTable> accelTable = fAcceleratorTable;
2991 if (accelTable.p != NULL) {
2992 HACCEL maybeNewAccelTable = NULL;
2993 accelTable->GenerateWin32AcceleratorTable (&maybeNewAccelTable);
2994 fLastAccelTableUpdateAt = Time::GetTickCount ();
3000 bool keepOld =
false;
3001 if (fWin32AccelTable != NULL) {
3002 size_t accelTableSize =
static_cast<size_t> (::CopyAcceleratorTable (fWin32AccelTable, NULL, 0));
3003 if (accelTableSize ==
static_cast<size_t> (::CopyAcceleratorTable (maybeNewAccelTable, NULL, 0))) {
3005 Verify (::CopyAcceleratorTable (fWin32AccelTable, oldOne.data (),
static_cast<int> (accelTableSize)) ==
3006 static_cast<int> (accelTableSize));
3008 Verify (::CopyAcceleratorTable (maybeNewAccelTable, newOne.data (),
static_cast<int> (accelTableSize)) ==
3009 static_cast<int> (accelTableSize));
3010 if (::memcmp (oldOne.data (), newOne.data (), accelTableSize * sizeof (ACCEL)) == 0) {
3016 ::DestroyAcceleratorTable (maybeNewAccelTable);
3019 if (fWin32AccelTable != NULL) {
3020 ::DestroyAcceleratorTable (fWin32AccelTable);
3021 fWin32AccelTable = NULL;
3023 fWin32AccelTable = maybeNewAccelTable;
3028 return fWin32AccelTable;
3031IDispatch* ActiveLedItControl::OLE_GetDefaultContextMenu ()
3034 CComObject<ActiveLedIt_UserCommandList>* o = NULL;
3036 CComQIPtr<IDispatch> saved = o->GetUnknown ();
3038 o->AppendBuiltinCmd (kCmd_Undo);
3039 o->AppendBuiltinCmd (kCmd_Redo);
3040 o->AppendBuiltinCmd (kCmd_Separator);
3041 o->AppendBuiltinCmd (kCmd_Cut);
3042 o->AppendBuiltinCmd (kCmd_Copy);
3043 o->AppendBuiltinCmd (kCmd_Paste);
3044 o->AppendBuiltinCmd (kCmd_Clear);
3045 o->AppendBuiltinCmd (kCmd_Separator);
3047 o->Insert (mkMenu_Select ());
3048 o->Insert (mkMenu_Insert ());
3050 o->AppendBuiltinCmd (kCmd_Separator);
3051 o->AppendBuiltinCmd (kCmd_RemoveTableRows);
3052 o->AppendBuiltinCmd (kCmd_RemoveTableColumns);
3053 o->AppendBuiltinCmd (kCmd_Separator);
3055 o->Insert (mkMenu_Font ());
3056 o->Insert (mkMenu_FontStyle ());
3057 o->Insert (mkMenu_FontSize (
false));
3058 o->Insert (mkMenu_FontColor ());
3060 o->AppendBuiltinCmd (kCmd_ChooseFontDialog);
3061 o->AppendBuiltinCmd (kCmd_Separator);
3063 o->Insert (mkMenu_ParagraphJustification ());
3065 o->AppendBuiltinCmd (kCmd_ParagraphIndents);
3066 o->AppendBuiltinCmd (kCmd_ParagraphSpacing);
3067 o->AppendBuiltinCmd (kCmd_Separator);
3069 o->Insert (mkMenu_ListStyle ());
3071 o->AppendBuiltinCmd (kCmd_IncreaseIndent);
3072 o->AppendBuiltinCmd (kCmd_DescreaseIndent);
3073 o->AppendBuiltinCmd (kCmd_Separator);
3074 o->AppendBuiltinCmd (kCmd_PropertiesForSelection);
3075 o->AppendBuiltinCmd (kCmd_OpenEmbedding);
3076 o->AppendBuiltinCmd (kCmd_Separator);
3078 o->AppendBuiltinCmd (kCmd_Print);
3079 o->AppendBuiltinCmd (kCmd_PrintSetup);
3081 o->AppendBuiltinCmd (kCmd_Separator);
3083 o->AppendBuiltinCmd (kCmd_BrowseOnlineHelp);
3084 o->AppendBuiltinCmd (kCmd_CheckForUpdatesOnWeb);
3086 o->AppendBuiltinCmd (kCmd_Separator);
3088 o->AppendBuiltinCmd (kCmd_About);
3093 CATCH_AND_HANDLE_EXCEPTIONS ();
3098IDispatch* ActiveLedItControl::OLE_GetDefaultAcceleratorTable ()
3101 CComObject<ActiveLedIt_AcceleratorTable>* o = NULL;
3103 CComQIPtr<IDispatch> saved = o->GetUnknown ();
3105 o->AppendACCEL (
"Undo",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'Z');
3106 o->AppendACCEL (
"Undo",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eALT), VK_BACK);
3107 o->AppendACCEL (
"Redo",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'Y');
3108 o->AppendACCEL (
"Cut",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'X');
3109 o->AppendACCEL (
"Cut",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eSHIFT), VK_DELETE);
3110 o->AppendACCEL (
"Copy",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'C');
3111 o->AppendACCEL (
"Copy",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL), VK_INSERT);
3112 o->AppendACCEL (
"Paste",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'V');
3113 o->AppendACCEL (
"Paste",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eSHIFT), VK_INSERT);
3114 o->AppendACCEL (
"SelectAll",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'A');
3115 o->AppendACCEL (
"ChooseFontDialog",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'D');
3116 o->AppendACCEL (
"Find",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'F');
3117 o->AppendACCEL (
"FindAgain",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY), VK_F3);
3118 o->AppendACCEL (
"EnterFindString",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'E');
3119 o->AppendACCEL (
"Replace",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'H');
3120 o->AppendACCEL (
"ReplaceAgain",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'R');
3121 o->AppendACCEL (
"CheckSpelling",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'L');
3122 o->AppendACCEL (
"Plain",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'T');
3123 o->AppendACCEL (
"Bold",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'B');
3124 o->AppendACCEL (
"Print",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'P');
3125 o->AppendACCEL (
"Italic",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'I');
3126 o->AppendACCEL (
"Underline",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL),
'U');
3127 o->AppendACCEL (
"Smaller",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL), VK_SUBTRACT);
3128 o->AppendACCEL (
"Larger",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eCONTROL), VK_ADD);
3129 o->AppendACCEL (
"Properties",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eALT), VK_RETURN);
3130 o->AppendACCEL (
"IncreaseListIndent",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY), VK_TAB);
3131 o->AppendACCEL (
"DecreaseListIndent",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eSHIFT), VK_TAB);
3132 o->AppendACCEL (
"BrowseOnlineHelp",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY), VK_F1);
3134 o->AppendACCEL (
"Help",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY), VK_F1);
3135 o->AppendACCEL (
"ContextHelp",
static_cast<AcceleratorModifierFlag
> (eVIRTKEY | eSHIFT), VK_F1);
3140 CATCH_AND_HANDLE_EXCEPTIONS ();
3145IDispatch* ActiveLedItControl::OLE_MakeNewPopupMenuItem ()
3148 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
3151 CComQIPtr<IDispatch> result = o->GetUnknown ();
3154 CATCH_AND_HANDLE_EXCEPTIONS ();
3159IDispatch* ActiveLedItControl::OLE_MakeNewUserMenuItem ()
3162 CComObject<ActiveLedIt_UserCommand>* o = NULL;
3165 CComQIPtr<IDispatch> result = o->GetUnknown ();
3168 CATCH_AND_HANDLE_EXCEPTIONS ();
3173IDispatch* ActiveLedItControl::OLE_MakeNewAcceleratorElement ()
3176 CComObject<ActiveLedIt_AcceleratorElement>* o = NULL;
3179 CComQIPtr<IDispatch> result = o->GetUnknown ();
3182 CATCH_AND_HANDLE_EXCEPTIONS ();
3187void ActiveLedItControl::OLE_InvokeCommand (
const VARIANT& command)
3190 IdleManager::NonIdleContext nonIdleContext;
3191 UINT32 cmdNum = CmdObjOrName2Num (command);
3193 (void)::SendMessage (fEditor.GetHWND (), WM_COMMAND, cmdNum, 0);
3198 CATCH_AND_HANDLE_EXCEPTIONS ();
3201BOOL ActiveLedItControl::OLE_CommandEnabled (
const VARIANT& command)
3204 UINT32 cmdNum = CmdObjOrName2Num (command);
3206 struct MyCmdUI : CCmdUI {
3211 virtual void Enable (BOOL bOn)
override
3214 m_bEnableChanged = TRUE;
3216 virtual void SetCheck (
int )
override
3219 virtual void SetText (LPCTSTR )
override
3226 state.m_nID = cmdNum;
3227 state.DoUpdate (&fEditor,
true);
3228 return state.fEnabled;
3230 CATCH_AND_HANDLE_EXCEPTIONS ();
3235BOOL ActiveLedItControl::OLE_CommandChecked (
const VARIANT& command)
3238 UINT32 cmdNum = CmdObjOrName2Num (command);
3240 struct MyCmdUI : CCmdUI {
3246 virtual void Enable ([[maybe_unused]] BOOL bOn)
override
3248 m_bEnableChanged = TRUE;
3250 virtual void SetCheck (
int nCheck)
override
3252 fChecked = nCheck != 0;
3254 virtual void SetText (LPCTSTR )
override
3261 state.m_nID = cmdNum;
3262 state.DoUpdate (&fEditor,
true);
3263 return state.fChecked;
3265 CATCH_AND_HANDLE_EXCEPTIONS ();
3270IDispatch* ActiveLedItControl::OLE_MakeNewToolbarList ()
3273 CComObject<ActiveLedIt_ToolbarList>* o = NULL;
3276 CComQIPtr<IDispatch> result = o->GetUnknown ();
3279 CATCH_AND_HANDLE_EXCEPTIONS ();
3284CComPtr<IDispatch> ActiveLedItControl::MakeNewToolbar ()
3286 CComPtr<IDispatch> tmp;
3287 tmp.Attach (OLE_MakeNewToolbar ());
3291IDispatch* ActiveLedItControl::OLE_MakeNewToolbar ()
3294 CComObject<ActiveLedIt_Toolbar>* o = NULL;
3297 CComQIPtr<IDispatch> result = o->GetUnknown ();
3300 CATCH_AND_HANDLE_EXCEPTIONS ();
3305IDispatch* ActiveLedItControl::OLE_MakeIconButtonToolbarItem ()
3308 CComObject<ActiveLedIt_IconButtonToolbarElement>* o = NULL;
3309 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_IconButtonToolbarElement>::CreateInstance (&o));
3311 CComQIPtr<IDispatch> result = o->GetUnknown ();
3314 CATCH_AND_HANDLE_EXCEPTIONS ();
3319CComPtr<IDispatch> ActiveLedItControl::MakeSeparatorToolbarItem ()
3321 CComPtr<IDispatch> tmp;
3322 tmp.Attach (OLE_MakeSeparatorToolbarItem ());
3326IDispatch* ActiveLedItControl::OLE_MakeSeparatorToolbarItem ()
3329 CComObject<ActiveLedIt_SeparatorToolbarElement>* o = NULL;
3330 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_SeparatorToolbarElement>::CreateInstance (&o));
3332 CComQIPtr<IDispatch> result = o->GetUnknown ();
3335 CATCH_AND_HANDLE_EXCEPTIONS ();
3340CComPtr<IDispatch> ActiveLedItControl::MakeBuiltinToolbar (LPCOLESTR builtinToolbarName)
3342 if (wstring{builtinToolbarName} == L
"Standard") {
3343 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3344#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3345 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3347 CComQIPtr<IALToolbar> tb = newTB;
3359 if (wstring{builtinToolbarName} == L
"StandardToolsOnly") {
3360 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3361#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3362 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3364 CComQIPtr<IALToolbar> tb = newTB;
3378 if (wstring{builtinToolbarName} == L
"FormatBar") {
3379 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3380#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3381 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3383 CComQIPtr<IALToolbar> tb = newTB;
3391 if (wstring{builtinToolbarName} == L
"EditBar") {
3392 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3393#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3394 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3396 CComQIPtr<IALToolbar> tb = newTB;
3407 if (wstring{builtinToolbarName} == L
"SelectBar") {
3408 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3409#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3410 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3412 CComQIPtr<IALToolbar> tb = newTB;
3420 if (wstring{builtinToolbarName} == L
"InsertBar") {
3421 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3422#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3423 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3425 CComQIPtr<IALToolbar> tb = newTB;
3433 if (wstring{builtinToolbarName} == L
"CharacterFormatBar") {
3434 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3435#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3436 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3438 CComQIPtr<IALToolbar> tb = newTB;
3451 if (wstring{builtinToolbarName} == L
"ParagraphFormatBar") {
3452 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3453#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3454 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3456 CComQIPtr<IALToolbar> tb = newTB;
3472 return CComPtr<IDispatch> ();
3475IDispatch* ActiveLedItControl::OLE_MakeBuiltinToolbar (LPCOLESTR builtinToolbarName)
3478 return MakeBuiltinToolbar (builtinToolbarName).Detach ();
3480 CATCH_AND_HANDLE_EXCEPTIONS ();
3485CComPtr<IDispatch> ActiveLedItControl::MakeBuiltinToolbarItem (LPCOLESTR builtinToolbarItemName)
3487 CComPtr<IDispatch> tmp;
3488 tmp.Attach (OLE_MakeBuiltinToolbarItem (builtinToolbarItemName));
3492IDispatch* ActiveLedItControl::OLE_MakeBuiltinToolbarItem (LPCOLESTR builtinToolbarItemName)
3494 const ActiveLedItControl::ToolBarIconSpec kToolBarIconSpecs[] = {
3495 {_T(
"Undo"), kToolbarButton_Undo_ResID, _T(
"Undo"), eIconButton_PushButton},
3496 {_T(
"Redo"), kToolbarButton_Redo_ResID, _T(
"Redo"), eIconButton_PushButton},
3497 {_T(
"Cut"), kToolbarButton_Cut_ResID, _T(
"Cut"), eIconButton_PushButton},
3498 {_T(
"Copy"), kToolbarButton_Copy_ResID, _T(
"Copy"), eIconButton_PushButton},
3499 {_T(
"Paste"), kToolbarButton_Paste_ResID, _T(
"Paste"), eIconButton_PushButton},
3500 {_T(
"Print"), kToolbarButton_Print_ResID, _T(
"Print"), eIconButton_PushButton},
3501 {_T(
"Bold"), kToolbarButton_Bold_ResID, _T(
"Bold"), eIconButton_Toggle},
3502 {_T(
"Italic"), kToolbarButton_Italics_ResID, _T(
"Italic"), eIconButton_Toggle},
3503 {_T(
"Underline"), kToolbarButton_Underline_ResID, _T(
"Underline"), eIconButton_Toggle},
3504 {_T(
"JustifyLeft"), kToolbarButton_JustifyLeft_ResID, _T(
"JustifyLeft"), eIconButton_Sticky},
3505 {_T(
"JustifyCenter"), kToolbarButton_JustifyCenter_ResID, _T(
"JustifyCenter"), eIconButton_Sticky},
3506 {_T(
"JustifyRight"), kToolbarButton_JustifyRight_ResID, _T(
"JustifyRight"), eIconButton_Sticky},
3507 {_T(
"JustifyFull"), kToolbarButton_JustifyFull_ResID, _T(
"JustifyFull"), eIconButton_Sticky},
3508 {_T(
"ParagraphIndents"), kToolbarButton_ParagraphIndents_ResID, _T(
"ParagraphIndents"), eIconButton_PushButton},
3509 {_T(
"ParagraphSpacing"), kToolbarButton_ParagraphSpacing_ResID, _T(
"ParagraphSpacing"), eIconButton_PushButton},
3510 {_T(
"ListStyle_None"), kToolbarButton_ListStyle_None_ResID, _T(
"ListStyle_None"), eIconButton_Sticky},
3511 {_T(
"ListStyle_Bullet"), kToolbarButton_ListStyle_Bullet_ResID, _T(
"ListStyle_Bullet"), eIconButton_Sticky},
3512 {_T(
"Find"), kToolbarButton_Find_ResID, _T(
"Find"), eIconButton_PushButton},
3513 {_T(
"Replace"), kToolbarButton_Replace_ResID, _T(
"Replace"), eIconButton_PushButton},
3514 {_T(
"CheckSpelling"), kToolbarButton_CheckSpelling_ResID, _T(
"CheckSpelling"), eIconButton_PushButton},
3515 {_T(
"InsertTable"), kToolbarButton_InsertTable_ResID, _T(
"InsertTable"), eIconButton_PushButton},
3516 {_T(
"InsertURL"), kToolbarButton_InsertURL_ResID, _T(
"InsertURL"), eIconButton_PushButton},
3517 {_T(
"InsertSymbol"), kToolbarButton_InsertSymbol_ResID, _T(
"InsertSymbol"), eIconButton_PushButton},
3521 for (
size_t i = 0; i < Memory::NEltsOf (kToolBarIconSpecs); ++i) {
3522 if (CComBSTR (builtinToolbarItemName) == CComBSTR (kToolBarIconSpecs[i].fIconName)) {
3523 return mkIconElement (kToolBarIconSpecs[i]).Detach ();
3527 if (wstring (builtinToolbarItemName) == wstring (L
"FontNameComboBox")) {
3528 return MakeBuiltinComboBoxToolbarItem (mkMenu_Font ()).Detach ();
3530 else if (wstring (builtinToolbarItemName) == wstring (L
"FontSizeComboBox")) {
3531 return MakeBuiltinComboBoxToolbarItem (mkMenu_FontSize (
true)).Detach ();
3533 else if (wstring (builtinToolbarItemName) == wstring (L
"FontColor")) {
3534 return mkIconElement (kToolbarButton_FontColor_ResID, mkMenu_FontColor ()).Detach ();
3536 else if (wstring (builtinToolbarItemName) == wstring (L
"ActiveLedIt")) {
3537 CComPtr<IDispatch> tmp;
3538 tmp.Attach (OLE_GetDefaultContextMenu ());
3539 return mkIconElement (kToolbarButton_ActiveLedIt_ResID, tmp).Detach ();
3543 CATCH_AND_HANDLE_EXCEPTIONS ();
3548CComPtr<IDispatch> ActiveLedItControl::mkIconElement (
int iconResID)
3550 CComPtr<IDispatch> item;
3551 item.Attach (OLE_MakeIconButtonToolbarItem ());
3552#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3553 CComQIPtr<IALIconButtonToolbarElement> newIconButton = (IDispatch*)item;
3555 CComQIPtr<IALIconButtonToolbarElement> newIconButton = item;
3558 CComPtr<IDispatch> picture;
3561 ::memset (&pictDesc, 0,
sizeof (pictDesc));
3562 pictDesc.cbSizeofstruct =
sizeof (pictDesc);
3563 pictDesc.picType = PICTYPE_ICON;
3564 pictDesc.icon.hicon =
reinterpret_cast<HICON
> (::LoadImage (AfxGetInstanceHandle (), MAKEINTRESOURCE (iconResID), IMAGE_ICON, 0, 0, 0));
3565 ThrowIfErrorHRESULT (::OleCreatePictureIndirect (&pictDesc, IID_IDispatch,
true, (
void**)&picture));
3572CComPtr<IDispatch> ActiveLedItControl::mkIconElement (
const ToolBarIconSpec& s)
3574 CComPtr<IDispatch> item = mkIconElement (s.fIconResId);
3575#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3576 CComQIPtr<IALIconButtonToolbarElement> iconButton = (IDispatch*)item;
3578 CComQIPtr<IALIconButtonToolbarElement> iconButton = item;
3586CComPtr<IDispatch> ActiveLedItControl::mkIconElement (
int iconResID, CComPtr<IDispatch> cmdList)
3588 CComPtr<IDispatch> item = mkIconElement (iconResID);
3589#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3590 CComQIPtr<IALIconButtonToolbarElement> iconButton = (IDispatch*)item;
3592 CComQIPtr<IALIconButtonToolbarElement> iconButton = item;
3599CComPtr<IDispatch> ActiveLedItControl::MakeBuiltinComboBoxToolbarItem (CComPtr<IDispatch> cmdList)
3602 CComObject<ActiveLedIt_ComboBoxToolbarElement>* o = NULL;
3603 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_ComboBoxToolbarElement>::CreateInstance (&o));
3604 CComQIPtr<IDispatch> result = o->GetUnknown ();
3605#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3606 CComQIPtr<IALComboBoxToolbarElement> alcomboBox = (IDispatch*)result;
3608 CComQIPtr<IALComboBoxToolbarElement> alcomboBox = result;
3613 CATCH_AND_HANDLE_EXCEPTIONS ();
3615 return CComPtr<IDispatch>{};
3618VARIANT ActiveLedItControl::OLE_GetCurrentEventArguments ()
3621 ::VariantInit (&result);
3623 result.vt = VT_DISPATCH;
3624 result.pdispVal = fCurrentEventArguments;
3625 if (result.pdispVal != NULL) {
3626 result.pdispVal->AddRef ();
3632long ActiveLedItControl::GetSelStart ()
3634 return static_cast<long> (fEditor.GetSelectionStart ());
3637void ActiveLedItControl::SetSelStart (
long start)
3641 fEditor.GetSelection (&s, &e);
3643 size_t bufLen = fEditor.GetLength ();
3644 size_t newStart = min (
static_cast<size_t> (start), bufLen);
3645 size_t newEnd = min (newStart + l, bufLen);
3646 fEditor.SetSelection (newStart, newEnd);
3649long ActiveLedItControl::GetSelLength ()
3653 fEditor.GetSelection (&s, &e);
3654 return static_cast<long> (e - s);
3657void ActiveLedItControl::SetSelLength (
long length)
3666 [[maybe_unused]]
size_t e;
3667 fEditor.GetSelection (&s, &e);
3668 size_t bufLen = fEditor.GetLength ();
3669 size_t newEnd = min (s +
static_cast<size_t> (length), bufLen);
3670 fEditor.SetSelection (s, newEnd);
3673BSTR ActiveLedItControl::GetSelText ()
3678 fEditor.GetSelection (&s, &e);
3681 fEditor.CopyOut (s, len, buf.data ());
3683 return CString{buf.
data ()}.AllocSysString ();
3685 CATCH_AND_HANDLE_EXCEPTIONS ();
3690void ActiveLedItControl::SetSelText (LPCTSTR text)
3693 size_t len = ::_tcslen (text);
3695 len = Characters::NativeToNL<Led_tChar> (Led_SDKString2tString (text).c_str (), len, buf.data (), len + 1);
3698 fEditor.GetSelection (&s, &e);
3699 fEditor.Replace (s, e, buf.data (), len);
3701 fEditor.SetSelection (s, s + len);
3704 CATCH_AND_HANDLE_EXCEPTIONS ();
3707BSTR ActiveLedItControl::GetSelTextAsRTF ()
3711 StyledTextIOWriterSinkStream_Memory sink;
3712 StyledTextIOWriter_RTF textWriter (&source, &sink);
3713 textWriter.Write ();
3714 size_t len = sink.GetLength ();
3716 ::memcpy (buf.data (), sink.PeekAtData (), len);
3718 return CString (buf.data ()).AllocSysString ();
3720 CATCH_AND_HANDLE_EXCEPTIONS ();
3725void ActiveLedItControl::SetSelTextAsRTF (LPCTSTR text)
3728 IdleManager::NonIdleContext nonIdleContext;
3729 fCommandHandler.Commit ();
3730 StyledTextIOSrcStream_Memory source (text, text == NULL ? 0 : ::_tcslen (text));
3732 StyledTextIOReader_RTF textReader (&source, &sink);
3733 fEditor.Replace (fEditor.GetSelectionStart (), fEditor.GetSelectionEnd (), LED_TCHAR_OF (
""), 0);
3735 fEditor.SetEmptySelectionStyle ();
3737 CATCH_AND_HANDLE_EXCEPTIONS ();
3742BSTR ActiveLedItControl::GetSelTextAsHTML ()
3746 StyledTextIOWriterSinkStream_Memory sink;
3747 StyledTextIOWriter_HTML textWriter (&source, &sink);
3748 textWriter.Write ();
3749 size_t len = sink.GetLength ();
3751 ::memcpy (buf.data (), sink.PeekAtData (), len);
3753 return CString (buf.data ()).AllocSysString ();
3755 CATCH_AND_HANDLE_EXCEPTIONS ();
3760void ActiveLedItControl::SetSelTextAsHTML (LPCTSTR text)
3763 IdleManager::NonIdleContext nonIdleContext;
3764 fCommandHandler.Commit ();
3765 StyledTextIOSrcStream_Memory source (text, text == NULL ? 0 : ::_tcslen (text));
3767 StyledTextIOReader_HTML textReader (&source, &sink);
3768 fEditor.Replace (fEditor.GetSelectionStart (), fEditor.GetSelectionEnd (), LED_TCHAR_OF (
""), 0);
3770 fEditor.SetEmptySelectionStyle ();
3773 CATCH_AND_HANDLE_EXCEPTIONS ();
3776OLE_COLOR ActiveLedItControl::GetSelColor ()
3779 Assert (fEditor.GetSelectionEnd () >= fEditor.GetSelectionStart ());
3780 size_t selectionLength = fEditor.GetSelectionEnd () - fEditor.GetSelectionStart ();
3781 IncrementalFontSpecification fsp = fEditor.GetContinuousStyleInfo (fEditor.GetSelectionStart (), selectionLength);
3783 if (not fsp.GetTextColor_Valid ()) {
3785 fsp = fEditor.GetContinuousStyleInfo (fEditor.GetSelectionStart (), 0);
3786 Assert (fsp.GetTextColor_Valid ());
3788 return fsp.GetTextColor ().GetOSRep ();
3790 CATCH_AND_HANDLE_EXCEPTIONS ();
3795void ActiveLedItControl::SetSelColor (OLE_COLOR color)
3798 IdleManager::NonIdleContext nonIdleContext;
3799 fCommandHandler.Commit ();
3800 IncrementalFontSpecification applyFontSpec;
3801 applyFontSpec.SetTextColor (
Color (TranslateColor (color)));
3802 fEditor.InteractiveSetFont (applyFontSpec);
3804 CATCH_AND_HANDLE_EXCEPTIONS ();
3807BSTR ActiveLedItControl::GetSelFontFace ()
3810 Assert (fEditor.GetSelectionEnd () >= fEditor.GetSelectionStart ());
3811 size_t selectionLength = fEditor.GetSelectionEnd () - fEditor.GetSelectionStart ();
3812 IncrementalFontSpecification fsp = fEditor.GetContinuousStyleInfo (fEditor.GetSelectionStart (), selectionLength);
3813 if (not fsp.GetFontNameSpecifier_Valid ()) {
3814 return CString ().AllocSysString ();
3816 return CString (fsp.GetFontName ().c_str ()).AllocSysString ();
3818 CATCH_AND_HANDLE_EXCEPTIONS ();
3823void ActiveLedItControl::SetSelFontFace (LPCTSTR fontFace)
3826 IdleManager::NonIdleContext nonIdleContext;
3827 fCommandHandler.Commit ();
3828 IncrementalFontSpecification applyFontSpec;
3829 applyFontSpec.SetFontName (fontFace);
3830 fEditor.InteractiveSetFont (applyFontSpec);
3832 CATCH_AND_HANDLE_EXCEPTIONS ();
3835long ActiveLedItControl::GetSelFontSize ()
3838 Assert (fEditor.GetSelectionEnd () >= fEditor.GetSelectionStart ());
3839 size_t selectionLength = fEditor.GetSelectionEnd () - fEditor.GetSelectionStart ();
3840 IncrementalFontSpecification fsp = fEditor.GetContinuousStyleInfo (fEditor.GetSelectionStart (), selectionLength);
3841 if (not fsp.GetPointSize_Valid ()) {
3844 return fsp.GetPointSize ();
3846 CATCH_AND_HANDLE_EXCEPTIONS ();
3851void ActiveLedItControl::SetSelFontSize (
long size)
3854 IdleManager::NonIdleContext nonIdleContext;
3855 fCommandHandler.Commit ();
3856 IncrementalFontSpecification applyFontSpec;
3863 applyFontSpec.SetPointSize (
static_cast<unsigned short> (size));
3864 fEditor.InteractiveSetFont (applyFontSpec);
3866 CATCH_AND_HANDLE_EXCEPTIONS ();
3869long ActiveLedItControl::GetSelBold ()
3874 fEditor.GetSelection (&selStart, &selEnd);
3875 Assert (selStart <= selEnd);
3876 size_t selectionLength = selEnd - selStart;
3877 IncrementalFontSpecification fsp = fEditor.GetContinuousStyleInfo (selStart, selectionLength);
3878 if (not fsp.GetStyle_Bold_Valid ()) {
3881 return fsp.GetStyle_Bold () ? 1 : 0;
3883 CATCH_AND_HANDLE_EXCEPTIONS ();
3888void ActiveLedItControl::SetSelBold (
long bold)
3891 IdleManager::NonIdleContext nonIdleContext;
3892 fCommandHandler.Commit ();
3893 IncrementalFontSpecification applyFontSpec;
3894 applyFontSpec.SetStyle_Bold (!!bold);
3895 fEditor.InteractiveSetFont (applyFontSpec);
3897 CATCH_AND_HANDLE_EXCEPTIONS ();
3900long ActiveLedItControl::GetSelItalic ()
3905 fEditor.GetSelection (&selStart, &selEnd);
3906 Assert (selStart <= selEnd);
3907 size_t selectionLength = selEnd - selStart;
3908 IncrementalFontSpecification fsp = fEditor.GetContinuousStyleInfo (selStart, selectionLength);
3909 if (not fsp.GetStyle_Italic_Valid ()) {
3912 return fsp.GetStyle_Italic () ? 1 : 0;
3914 CATCH_AND_HANDLE_EXCEPTIONS ();
3919void ActiveLedItControl::SetSelItalic (
long italic)
3922 IdleManager::NonIdleContext nonIdleContext;
3923 fCommandHandler.Commit ();
3924 IncrementalFontSpecification applyFontSpec;
3925 applyFontSpec.SetStyle_Italic (!!italic);
3926 fEditor.InteractiveSetFont (applyFontSpec);
3928 CATCH_AND_HANDLE_EXCEPTIONS ();
3931long ActiveLedItControl::GetSelStrikeThru ()
3936 fEditor.GetSelection (&selStart, &selEnd);
3937 Assert (selStart <= selEnd);
3938 size_t selectionLength = selEnd - selStart;
3939 IncrementalFontSpecification fsp = fEditor.GetContinuousStyleInfo (selStart, selectionLength);
3940 if (not fsp.GetStyle_Strikeout_Valid ()) {
3943 return fsp.GetStyle_Strikeout () ? 1 : 0;
3945 CATCH_AND_HANDLE_EXCEPTIONS ();
3950void ActiveLedItControl::SetSelStrikeThru (
long strikeThru)
3953 IdleManager::NonIdleContext nonIdleContext;
3954 fCommandHandler.Commit ();
3955 IncrementalFontSpecification applyFontSpec;
3956 applyFontSpec.SetStyle_Strikeout (!!strikeThru);
3957 fEditor.InteractiveSetFont (applyFontSpec);
3959 CATCH_AND_HANDLE_EXCEPTIONS ();
3962long ActiveLedItControl::GetSelUnderline ()
3967 fEditor.GetSelection (&selStart, &selEnd);
3968 Assert (selStart <= selEnd);
3969 size_t selectionLength = selEnd - selStart;
3970 IncrementalFontSpecification fsp = fEditor.GetContinuousStyleInfo (selStart, selectionLength);
3971 if (not fsp.GetStyle_Underline_Valid ()) {
3974 return fsp.GetStyle_Underline () ? 1 : 0;
3976 CATCH_AND_HANDLE_EXCEPTIONS ();
3981void ActiveLedItControl::SetSelUnderline (
long underline)
3984 IdleManager::NonIdleContext nonIdleContext;
3985 fCommandHandler.Commit ();
3986 IncrementalFontSpecification applyFontSpec;
3987 applyFontSpec.SetStyle_Underline (!!underline);
3988 fEditor.InteractiveSetFont (applyFontSpec);
3990 CATCH_AND_HANDLE_EXCEPTIONS ();
3993UINT ActiveLedItControl::OLE_GetSelJustification ()
3996 Justification justification = eLeftJustify;
3999 fEditor.GetSelection (&selStart, &selEnd);
4000 Assert (selStart <= selEnd);
4001 if (fEditor.GetJustification (selStart, selEnd, &justification)) {
4002 switch (justification) {
4004 return eLeftJustification;
4006 return eRightJustification;
4007 case eCenterJustify:
4008 return eCenterJustification;
4010 return eFullJustification;
4012 return eLeftJustification;
4016 return eNoCommonJustification;
4019 CATCH_AND_HANDLE_EXCEPTIONS ();
4024void ActiveLedItControl::OLE_SetSelJustification (UINT justification)
4027 IdleManager::NonIdleContext nonIdleContext;
4028 Justification lh = eLeftJustify;
4029 switch (justification) {
4030 case eLeftJustification:
4033 case eCenterJustification:
4034 lh = eCenterJustify;
4036 case eRightJustification:
4039 case eFullJustification:
4045 fEditor.InteractiveSetJustification (lh);
4047 CATCH_AND_HANDLE_EXCEPTIONS ();
4050UINT ActiveLedItControl::OLE_GetSelListStyle ()
4053 Led::ListStyle listStyle = Led::eListStyle_None;
4056 fEditor.GetSelection (&selStart, &selEnd);
4057 Assert (selStart <= selEnd);
4058 if (fEditor.GetListStyle (selStart, selEnd, &listStyle)) {
4062 return static_cast<::ListStyle
> (listStyle);
4065 return static_cast<UINT
> (eNoCommonListStyle);
4068 CATCH_AND_HANDLE_EXCEPTIONS ();
4073void ActiveLedItControl::OLE_SetSelListStyle (UINT listStyle)
4076 IdleManager::NonIdleContext nonIdleContext;
4077 ::ListStyle ls1 =
static_cast<::ListStyle
> (listStyle);
4078 Led::ListStyle ls2 =
static_cast<Led::ListStyle
> (ls1);
4080 fEditor.InteractiveSetListStyle (ls2);
4082 CATCH_AND_HANDLE_EXCEPTIONS ();
4085UINT ActiveLedItControl::OLE_GetSelHidable ()
4090 fEditor.GetSelection (&selStart, &selEnd);
4091 Assert (selStart <= selEnd);
4092 if (fEditor.GetHidableTextDatabase ()->GetHidableRegionsContiguous (selStart, selEnd,
true)) {
4095 else if (fEditor.GetHidableTextDatabase ()->GetHidableRegionsContiguous (selStart, selEnd,
false)) {
4099 CATCH_AND_HANDLE_EXCEPTIONS ();
4103void ActiveLedItControl::OLE_SetSelHidable (UINT hidable)
4106 IdleManager::NonIdleContext nonIdleContext;
4109 fEditor.GetSelection (&selStart, &selEnd);
4110 Assert (selStart <= selEnd);
4112 fEditor.GetHidableTextDatabase ()->MakeRegionHidable (selStart, selEnd);
4115 fEditor.GetHidableTextDatabase ()->MakeRegionUnHidable (selStart, selEnd);
4118 CATCH_AND_HANDLE_EXCEPTIONS ();
#define RequireNotNull(p)
#define AssertNotReached()
chrono::duration< double > DurationSeconds
chrono::duration<double> - a time span (length of time) measured in seconds, but high precision.
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Logically halfway between std::array and std::vector; Smart 'direct memory array' - which when needed...
nonvirtual pointer data() noexcept
returns a (possibly const) pointer to the start of the live buffer data. This return value can be inv...
nonvirtual void GrowToSize(size_t nElements)
Create a format-string (see std::wformat_string or Stroika FormatString, or python 'f' strings.
basic_string< SDKChar > SDKString