Stroika Library 3.0d18
 
Loading...
Searching...
No Matches
ActiveLedItControl.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4
5/*
6 * Description:
7 * Implementation of the ActiveLedItControl ActiveX Control class.
8 *
9 */
10
11#include "Stroika/Foundation/StroikaPreComp.h"
12
13#include <climits>
14
15#include <fcntl.h>
16#include <io.h>
17#include <sys/stat.h>
18
19DISABLE_COMPILER_MSC_WARNING_START (5054)
20#include <afxctl.h>
21DISABLE_COMPILER_MSC_WARNING_END (5054)
22
23#include <atlbase.h>
24
25#include "Stroika/Foundation/Characters/LineEndings.h"
26#include "Stroika/Foundation/Memory/Platform/Windows/Handle.h"
27
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"
31
32#include "ActiveLedIt.h"
33#include "ActiveLedItPpg.h"
34#include "DispIDs.h"
35#include "FontMenu.h"
36#include "Toolbar.h"
37#include "UserConfigCommands.h"
38
39#include "ActiveLedItControl.h"
40
41#include "ActiveLedIt_h.h"
42
45
46// Not sure about this - experiment... See spr#0521
47#define qDisableEditorWhenNotActive 0
48
49#define CATCH_AND_HANDLE_EXCEPTIONS() \
50 catch (HRESULT hr) \
51 { \
52 AfxThrowOleException (hr); \
53 } \
54 catch (const system_error& h) \
55 { \
56 if (h.code ().category () == Stroika::Foundation::Execution::Platform::Windows::HRESULT_error_category ()) { \
57 AfxThrowOleException (HRESULT_FROM_WIN32 (h.code ().value ())); \
58 } \
59 if (h.code ().category () == system_category ()) { \
60 AfxThrowOleException (HRESULT_FROM_WIN32 (h.code ().value ())); \
61 } \
62 } \
63 catch (...) \
64 { \
65 AfxThrowMemoryException (); \
66 }
67
68const int kEditorWindowID = 100;
69
70using std::byte;
71
72using namespace Stroika::Foundation;
73using namespace Stroika::Frameworks;
74using namespace Stroika::Frameworks::Led;
75using namespace Stroika::Frameworks::Led::StyledTextIO;
76
78
79/*
80 ********************************************************************************
81 ************************** COMBased_SpellCheckEngine ***************************
82 ********************************************************************************
83 */
84
85COMBased_SpellCheckEngine::COMBased_SpellCheckEngine (IDispatch* engine)
86 : fEngine{engine}
87{
88 // NB: We use IDispatch interface rather than the vtable interface to avoid having to directly include the spellchecker IDL here,
89 // and having to compile it ourselves in this project
90}
91
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)
94{
95 RequireNotNull (startBuf);
96 Require (startBuf <= endBuf);
97
98 if (fEngine != NULL) {
99 size_t textBufLen = endBuf - startBuf;
100 size_t cursorIdx = *cursor == NULL ? 0 : (*cursor - startBuf);
101
102 BSTR bstrVal = ::SysAllocStringLen (startBuf, static_cast<UINT> (textBufLen));
103 CComVariant textToScan (bstrVal);
104 ::SysFreeString (bstrVal);
105 CComVariant result;
106 CComVariant cursorIdxAsCCV = cursorIdx;
107 ThrowIfErrorHRESULT (fEngine.Invoke2 (CA2W ("CreateScanContext"), &textToScan, &cursorIdxAsCCV, &result));
108 ThrowIfErrorHRESULT (result.ChangeType (VT_DISPATCH));
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;
117 }
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;
132 return true;
133 }
134 }
135 }
136 }
137 return false;
138}
139
140bool COMBased_SpellCheckEngine::LookupWord_ (const Led_tString& checkWord, Led_tString* matchedWordResult)
141{
142 CComVariant comMissingWord;
143 CComVariant result;
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};
150 }
151 else {
152 // even if MW found - if call requested matchedWord and COM didn't provide - treat that as failure...
153 return false;
154 }
155 }
156 return true;
157 }
158 return false;
159}
160
161vector<Led_tString> COMBased_SpellCheckEngine::GenerateSuggestions (const Led_tString& misspelledWord)
162{
163 CComVariant comResult;
164 CComVariant misspelledWordAsCCV = misspelledWord.c_str ();
165 ThrowIfErrorHRESULT (fEngine.Invoke1 (CA2W ("GenerateSuggestions"), &misspelledWordAsCCV, &comResult));
166 return UnpackVectorOfStringsFromVariantArray (comResult);
167}
168
169TextBreaks* COMBased_SpellCheckEngine::PeekAtTextBreaksUsed ()
170{
171 return this;
172}
173
174void COMBased_SpellCheckEngine::FindWordBreaks (const Led_tChar* startOfText, size_t lengthOfText, size_t textOffsetToStartLookingForWord,
175 size_t* wordStartResult, size_t* wordEndResult, bool* wordReal) const
176{
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));
183 ThrowIfErrorHRESULT (wordInfoResult.ChangeType (VT_DISPATCH));
184 if (wordInfoResult.vt == VT_DISPATCH) {
185 CComPtr<IDispatch> wordInfo = wordInfoResult.pdispVal;
186 // Validate COM results. They COULD be bogus - and that shouldn't crash/assert-out LED
187 {
188 CComVariant val;
189 ThrowIfErrorHRESULT (wordInfo.GetPropertyByName (CA2W ("WordStart"), &val));
190 ThrowIfErrorHRESULT (val.ChangeType (VT_UI4));
191 *wordStartResult = val.uintVal;
192 *wordStartResult = min (*wordStartResult, lengthOfText);
193 }
194 {
195 CComVariant val;
196 ThrowIfErrorHRESULT (wordInfo.GetPropertyByName (CA2W ("WordEnd"), &val));
197 ThrowIfErrorHRESULT (val.ChangeType (VT_UI4));
198 *wordEndResult = val.uintVal;
199 *wordEndResult = min (*wordEndResult, lengthOfText);
200 }
201 {
202 CComVariant val;
203 ThrowIfErrorHRESULT (wordInfo.GetPropertyByName (CA2W ("WordReal"), &val));
204 ThrowIfErrorHRESULT (val.ChangeType (VT_BOOL));
205 *wordReal = !!val.boolVal;
206 }
207 }
208}
209
210void COMBased_SpellCheckEngine::FindLineBreaks (const Led_tChar* startOfText, size_t lengthOfText, size_t textOffsetToStartLookingForWord,
211 size_t* wordEndResult, bool* wordReal) const
212{
213 // This really shouldn't be called - since the line-breaks code for a spellchecker isn't necessarily very reasonable.
214 // Anyhow - if it ever does get called - this should produce a vaguley reasonable result... LGP 2003-12-16
215 size_t wordStartIgnored = 0;
216 FindWordBreaks (startOfText, lengthOfText, textOffsetToStartLookingForWord, &wordStartIgnored, wordEndResult, wordReal);
217}
218
219COMBased_SpellCheckEngine::UDInterface* COMBased_SpellCheckEngine::GetUDInterface ()
220{
221 return this;
222}
223
224bool COMBased_SpellCheckEngine::AddWordToUserDictionarySupported () const
225{
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;
230}
231
232void COMBased_SpellCheckEngine::AddWordToUserDictionary (const Led_tString& word)
233{
234 CComVariant wordAsCCV = word.c_str ();
235 ThrowIfErrorHRESULT (fEngine.Invoke1 (CA2W ("AddWordToUserDictionary"), &wordAsCCV));
236}
237
238/*
239 ********************************************************************************
240 ************* ActiveLedItControl::ActiveLedItControlFactory ********************
241 ********************************************************************************
242 */
243
244// Control type information
245static const DWORD BASED_CODE _dwActiveLedItOleMisc =
246 OLEMISC_SIMPLEFRAME | OLEMISC_ACTIVATEWHENVISIBLE | /* See SPR#1522 & qDontUIActivateOnOpen about this */
247 OLEMISC_SETCLIENTSITEFIRST | OLEMISC_INSIDEOUT | OLEMISC_CANTLINKINSIDE | OLEMISC_RECOMPOSEONRESIZE;
248
249IMPLEMENT_OLECTLTYPE (ActiveLedItControl, IDS_ACTIVELEDIT, _dwActiveLedItOleMisc)
250
251// ActiveLedItControl::ActiveLedItControlFactory::UpdateRegistry -
252// Adds or removes system registry entries for ActiveLedItControl
253BOOL ActiveLedItControl::ActiveLedItControlFactory::UpdateRegistry (BOOL bRegister)
254{
255 // TODO: Verify that your control follows apartment-model threading rules.
256 // Refer to MFC TechNote 64 for more information.
257 // If your control does not conform to the apartment-model rules, then
258 // you must modify the code below, changing the 6th parameter from
259 // afxRegInsertable | afxRegApartmentThreading to afxRegInsertable.
260 if (bRegister) {
261 return AfxOleRegisterControlClass (AfxGetInstanceHandle (), m_clsid, m_lpszProgID, IDS_ACTIVELEDIT, IDB_ACTIVELEDIT,
262 afxRegInsertable | afxRegApartmentThreading, _dwActiveLedItOleMisc, _tlid, _wVerMajor, _wVerMinor);
263 }
264 else {
265 return AfxOleUnregisterClass (m_clsid, m_lpszProgID);
266 }
267}
268
269/*
270 ********************************************************************************
271 ******************************** ActiveLedItControl ****************************
272 ********************************************************************************
273 */
274using ALIC = ActiveLedItControl;
275IMPLEMENT_DYNCREATE (ActiveLedItControl, COleControl)
276
277BEGIN_MESSAGE_MAP (ActiveLedItControl, COleControl)
278ON_WM_CREATE ()
279ON_WM_WINDOWPOSCHANGED ()
280ON_WM_SETFOCUS ()
281ON_WM_ERASEBKGND ()
282ON_COMMAND (ID_APP_ABOUT, AboutBox)
283ON_OLEVERB (AFX_IDS_VERB_EDIT, OnEdit)
284ON_OLEVERB (AFX_IDS_VERB_PROPERTIES, OnProperties)
285END_MESSAGE_MAP ()
286
287BEGIN_DISPATCH_MAP (ActiveLedItControl, COleControl)
288
289// Properties
290DISP_STOCKPROP_APPEARANCE ()
291DISP_STOCKPROP_BACKCOLOR ()
292DISP_STOCKPROP_BORDERSTYLE ()
293DISP_STOCKPROP_HWND ()
294
295DISP_FUNCTION_ID (ALIC, "InvalidateLayout", DISPID_InvalidateLayout, OLE_InvalidateLayout, VT_EMPTY, VTS_NONE)
296
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)
330
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)
372
373// Functions
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)
382
383//UNDO support
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)
390
391// Font/Para DLG
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)
394
395// Find support
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)
398
399// Replace support
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)
402
403// Print support
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)
407
408// GetHeight
409DISP_FUNCTION_ID (ALIC, "GetHeight", DISPID_GetHeight, OLE_GetHeight, VT_I4, VTS_I4 VTS_I4)
410
411//DIRTY support
412DISP_PROPERTY_EX_ID (ALIC, "Dirty", DISPID_Dirty, OLE_GetDirty, OLE_SetDirty, VT_BOOL)
413
414END_DISPATCH_MAP ()
415
416BEGIN_EVENT_MAP (ActiveLedItControl, COleControl)
417EVENT_CUSTOM_ID ("Change", DISPID_Change, _IGNORED_, VTS_NONE)
418EVENT_STOCK_CLICK ()
419EVENT_STOCK_DBLCLICK ()
420EVENT_STOCK_KEYDOWN ()
421EVENT_STOCK_KEYUP ()
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)
430END_EVENT_MAP ()
431
432#if qKeepListOfALInstancesForSPR_1599BWA
433set<ActiveLedItControl*> ActiveLedItControl::sAll;
434
435const set<ActiveLedItControl*>& ActiveLedItControl::GetAll ()
436{
437 return sAll;
438}
439#endif
440
441BEGIN_PROPPAGEIDS (ActiveLedItControl, 1)
442PROPPAGEID (ActiveLedItPropPage::guid)
443END_PROPPAGEIDS (ActiveLedItControl)
444
445// Initialize class factory and guid
446IMPLEMENT_OLECREATE_EX (ActiveLedItControl, "ActiveLedIt.ActiveLedItCtrl.1", 0x9a013a76, 0xad34, 0x11d0, 0x8d, 0x9b, 0, 0xa0, 0xc9, 0x8, 0xc, 0x73)
447
448// Type library ID and version
449IMPLEMENT_OLETYPELIB (ActiveLedItControl, _tlid, _wVerMajor, _wVerMinor)
450
451ActiveLedItControl::ActiveLedItControl ()
452 : COleControl ()
453 , MarkerOwner ()
454 , LedItViewController ()
455 , fSpellChecker (NULL)
456 , fLedSpellCheckWrapper (NULL)
457 , fConextMenu ()
458 , fToolbarList ()
459 , fBuiltinCommands ()
460 , fPredefinedMenus ()
461 , fAcceleratorTable ()
462 , fWin32AccelTable (NULL)
463 , fCurrentEventArguments ()
464 , fEditor ()
465 , fDataDirty (false)
466{
467 fConextMenu.Attach (OLE_GetDefaultContextMenu ());
468 fToolbarList.Attach (OLE_MakeNewToolbarList ());
469 fAcceleratorTable.Attach (OLE_GetDefaultAcceleratorTable ());
470
471 InitializeIIDs (&DIID__DActiveLedIt, &DIID__DActiveLedItEvents);
472
473 SetInitialSize (300, 150); // Specify default control size... Really should be based on GetSystemMetrics, or screen resolution or something...
474
475 EnableSimpleFrame ();
476
477 fTextStore.AddMarkerOwner (this);
478 fEditor.SetController (this);
479#if qKeepListOfALInstancesForSPR_1599BWA
480 sAll.insert (this);
481#endif
482}
483
484ActiveLedItControl::~ActiveLedItControl ()
485{
486#if qKeepListOfALInstancesForSPR_1599BWA
487 sAll.erase (this);
488#endif
489 if (fSpellChecker != NULL) {
490 fSpellChecker->Release ();
491 fSpellChecker = NULL;
492 fEditor.SetSpellCheckEngine (NULL);
493 }
494 fEditor.SetController (NULL);
495 fTextStore.RemoveMarkerOwner (this);
496 if (fWin32AccelTable != NULL) {
497 ::DestroyAcceleratorTable (fWin32AccelTable);
498 }
499}
500
501void ActiveLedItControl::DidUpdateText (const UpdateInfo& updateInfo) noexcept
502{
503 if (updateInfo.fRealContentUpdate) {
504 SetModifiedFlag ();
505 fDataDirty = true;
506 FireOLEEvent (DISPID_Change);
507 }
508}
509
510TextStore* ActiveLedItControl::PeekAtTextStore () const
511{
512 return &const_cast<ActiveLedItControl*> (this)->fTextStore;
513}
514
515void ActiveLedItControl::OnDraw (CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
516{
517 RequireNotNull (pdc);
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 ()) {
522 return;
523 }
524
525 Led_Rect oldWinRect = fEditor.GetWindowRect ();
526 try {
527 Led_Rect newWinRect = oldWinRect;
528 if (m_hWnd == NULL) {
529 /*
530 * This can occur occasionally, when called from places like MSWord XP, and wordpad.
531 * This MAYBE because these apps don't respect OLEMISC_SETCLIENTSITEFIRST?
532 */
533 fEditor.SetDefaultTextColor (TextImager::eDefaultBackgroundColor, Color (TranslateColor (GetBackColor ())));
534
535 Led_Size controlSize = Led_Size (0, 0);
536 {
537 int cx;
538 int cy;
539 GetControlSize (&cx, &cy);
540 controlSize = Led_Size (cy, cx);
541 }
542 newWinRect = Led_Rect (AsLedRect (rcBounds).GetOrigin (), controlSize);
543 }
544 else {
545 /*
546 * Queer logic, and I'm not really sure what is right to do here. If the given rcBounds
547 * are the same as the last size handled to our last OnWindowPosChanged () - then this uses
548 * the same WindowRect for Led. But otherwise, it offsets it. Without this logic, AL instances
549 * embedded in WordPad or LedIt mess up badly when not leftmost in the embedding editors
550 * window. -- LGP 2003-05-06
551 */
552 RECT editorWndRct;
553 Verify (::GetWindowRect (m_hWnd, &editorWndRct));
554 ScreenToClient (&editorWndRct);
555 newWinRect += AsLedRect (rcBounds).GetOrigin () - AsLedRect (editorWndRct).GetOrigin ();
556 }
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);
562 }
563 catch (...) {
564 // Ignore exceptions on display. Would be had. Assert error if ever happens, but in release control,
565 // not much we can usefully do...
566 Assert (false);
567 fEditor.SetWindowRect (oldWinRect);
568 }
569}
570
571void ActiveLedItControl::OnDrawMetafile (CDC* pDC, const CRect& rcBounds)
572{
573 /*
574 * Override COleControl::OnDrawMetafile - to properly handle drawing to a metafile.
575 * See SPR#1447.
576 */
577 RequireNotNull (pDC);
578 TRACE ("ActiveLedItControl::OnDrawMetafile (rcBounds= (%d, %d, %d, %d))\n", rcBounds.top, rcBounds.left, rcBounds.bottom, rcBounds.right);
579
580 {
581 int cx;
582 int cy;
583 GetControlSize (&cx, &cy);
584 CRect rc (0, 0, cx, cy);
585 pDC->SetViewportOrg (0, 0);
586 pDC->SetViewportExt (cx, cy);
587 }
588
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 ();
593 try {
594 Led_Rect newWinRect = AsLedRect (rcBounds);
595
596 {
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 ();
602 }
603
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);
610 // fEditor.WindowDrawHelper (useTablet, newWinRect, true);
611 fEditor.SetWindowRect (oldWinRect);
612 }
613 fEditor.fInDrawMetaFileMode = oldInDrawMetaFileMode;
614 fEditor.SetWindowRect (oldWinRect);
615 fEditor.SetImageUsingOffscreenBitmaps (oldImageUsingOffscreenBitmapsFlag);
616 }
617 catch (...) {
618 // Ignore exceptions on display. Would be had. Assert error if ever happens, but in release control,
619 // not much we can usefully do...
620 Assert (false);
621 fEditor.SetImageUsingOffscreenBitmaps (oldImageUsingOffscreenBitmapsFlag);
622 fEditor.fInDrawMetaFileMode = oldInDrawMetaFileMode;
623 fEditor.SetWindowRect (oldWinRect);
624 }
625}
626
627BOOL ActiveLedItControl::OnEraseBkgnd ([[maybe_unused]] CDC* pDC)
628{
629 RequireNotNull (pDC);
630 return true; // cuz we erase our own background...
631}
632
633void ActiveLedItControl::DoPropExchange (CPropExchange* pPX)
634{
635 RequireNotNull (pPX);
636 ExchangeVersion (pPX, MAKELONG (_wVerMinor, _wVerMajor));
637 COleControl::DoPropExchange (pPX);
638 ExchangeTextAsRTFBlob (pPX);
639
640 // For SPR#0835- added the ability to load these selected properties. May want to add more in the future.
641 if (pPX->IsLoading ()) {
642 try {
643 // default font face for the control
644 CString aProp;
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);
650 }
651 }
652 catch (...) {
653 }
654
655 try {
656 // default font size for the control
657 CString aProp;
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);
663 }
664 }
665 catch (...) {
666 }
667
668 try {
669 //
670 BOOL aProp = false;
671 if (PX_Bool (pPX, _T("ReadOnly"), aProp)) {
672 OLE_SetReadOnly (aProp);
673 }
674 }
675 catch (...) {
676 }
677
678 try {
679 // Plain "Text" property
680 CString aProp;
681 PX_String (pPX, _T("Text"), aProp, _T(""));
682 if ((fTextStore.GetLength () == 0) and (not aProp.IsEmpty ())) {
683 SetBufferTextCRLF (aProp);
684 fDataDirty = false;
685 }
686 }
687 catch (...) {
688 }
689
690 try {
691 // "TextRTF" property
692 CString aProp;
693 PX_String (pPX, _T("TextRTF"), aProp, _T(""));
694 if ((fTextStore.GetLength () == 0) and (not aProp.IsEmpty ())) {
695 SetBufferTextAsRTF (aProp);
696 fDataDirty = false;
697 }
698 }
699 catch (...) {
700 }
701
702 try {
703 // "TextHTML" property
704 CString aProp;
705 PX_String (pPX, _T("TextHTML"), aProp, _T(""));
706 if ((fTextStore.GetLength () == 0) and (not aProp.IsEmpty ())) {
707 SetBufferTextAsHTML (aProp);
708 fDataDirty = false;
709 }
710 }
711 catch (...) {
712 }
713 }
714}
715
716// ActiveLedItControl::GetControlFlags -
717// Flags to customize MFC's implementation of ActiveX controls.
718//
719// For information on using these flags, please see MFC technical note
720// #nnn, "Optimizing an ActiveX Control".
721DWORD ActiveLedItControl::GetControlFlags ()
722{
723 DWORD dwFlags = COleControl::GetControlFlags ();
724#if 0
725 // The control will not be redrawn when making the transition
726 // between the active and inactivate state.
727 dwFlags |= noFlickerActivate;
728
729//DISABLED CUZ WE DON'T SUPPORT THIS IN OUR ONDRAW() method...
730 // The control can optimize its OnDraw method, by not restoring
731 // the original GDI objects in the device context.
732 dwFlags |= canOptimizeDraw;
733#endif
734 return dwFlags;
735}
736
737void ActiveLedItControl::OnGetControlInfo (LPCONTROLINFO pControlInfo)
738{
739 RequireNotNull (pControlInfo);
740 ::memset (pControlInfo, 0, sizeof (*pControlInfo));
741 pControlInfo->cb = sizeof (*pControlInfo);
742
743 // Unfortunately, the Win32 SDK documeantion is vague about the lifetime of the array returns
744 // as part of the CONTROLINFO structure. Hopefully this will cause no problems. Empirically - it
745 // doesn't seem to get called very often. And - the value should rarely change (but under OLE AUT control,
746 // so it COULD) -- LGP 2004-01-24
747 HACCEL hAccel = GetCurrentWin32AccelTable ();
748
749 //pControlInfo->hAccel = ::LoadAccelerators (AfxGetResourceHandle (),MAKEINTRESOURCE (kAcceleratorTableID));
750 pControlInfo->hAccel = hAccel;
751 // NB: queer - but CopyAcceleratorTable also counts # of entries...
752 pControlInfo->cAccel = pControlInfo->hAccel == NULL ? 0 : static_cast<USHORT> (::CopyAcceleratorTable (pControlInfo->hAccel, NULL, 0));
753 pControlInfo->dwFlags = CTRLINFO_EATS_RETURN;
754}
755
756BOOL ActiveLedItControl::PreTranslateMessage (MSG* pMsg)
757{
758 RequireNotNull (pMsg);
759 switch (pMsg->message) {
760 case WM_KEYDOWN:
761 case WM_KEYUP:
762 switch (pMsg->wParam) {
763 case VK_TAB: {
764 // Quirks here are for SPR#0829
765 if (pMsg->message == WM_KEYDOWN) {
766 fEditor.SendMessage (WM_CHAR, VK_TAB, pMsg->lParam);
767 }
768 return TRUE;
769 } break;
770 case VK_UP:
771 case VK_DOWN:
772 case VK_LEFT:
773 case VK_RIGHT:
774 case VK_HOME:
775 case VK_END:
776 case VK_PRIOR:
777 case VK_NEXT:
778 fEditor.SendMessage (pMsg->message, pMsg->wParam, pMsg->lParam);
779 return TRUE;
780 }
781 break;
782 }
783
784 HACCEL hAccel = GetCurrentWin32AccelTable ();
785 if (hAccel != NULL) {
786 return ::TranslateAccelerator (pMsg->hwnd, hAccel, pMsg);
787 }
788 return false; // so command dispatched normally
789}
790
791void ActiveLedItControl::AddFrameLevelUI ()
792{
793 // Kindof a hack - seems this is called when we get activated, and RemoveFrameLevelUI () is called when we are
794 // deactivated. This is about the behavior we want for those cases. Sadly, I've found no docs to see the
795 // "right" way to handle this...
796 COleControl::AddFrameLevelUI ();
797#if qDisableEditorWhenNotActive
798 fEditor.ModifyStyle (WS_DISABLED, 0);
799 fEditor.SetFocus ();
800#endif
801}
802
803void ActiveLedItControl::RemoveFrameLevelUI ()
804{
805#if qDisableEditorWhenNotActive
806 fEditor.ModifyStyle (0, WS_DISABLED);
807 if (CWnd::GetFocus () == &fEditor) {
808 // Not sure who to set the focus to, but just anybody but ME...
809 CWnd::GetDesktopWindow ()->SetFocus ();
810 }
811#endif
812 COleControl::RemoveFrameLevelUI ();
813}
814
815BOOL ActiveLedItControl::OnSetObjectRects (LPCRECT lprcPosRect, LPCRECT lprcClipRect)
816{
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);
821 }
822 else {
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);
826 }
827#endif
828#if 0
829 // keep debugging hack for SPR#1168
830 if (lprcClipRect != NULL) {
831 if (AsLedRect (*lprcPosRect) != AsLedRect (*lprcClipRect)) {
832 int breakHEre = 1;
833 }
834 }
835#endif
836 BOOL r = COleControl::OnSetObjectRects (lprcPosRect, lprcClipRect);
837 return r;
838}
839
840BOOL ActiveLedItControl::OnGetNaturalExtent (DWORD /* dwAspect */, LONG /* lindex */, DVTARGETDEVICE* /* ptd */, HDC /* hicTargetDev */,
841 DVEXTENTINFO* /*pExtentInfo*/, LPSIZEL /*psizel*/
842)
843{
844 // Tried overriding this to address teh funny size of the AL widget when inserted into
845 // LedIt 3.1a6x. Its a very small issue. BUt - for whatever reason - this method never
846 // seems to get called - LGP 2003-04-29.
847 return FALSE;
848}
849
850void ActiveLedItControl::OnResetState ()
851{
852 COleControl::OnResetState (); // Resets defaults found in DoPropExchange
853}
854
855void ActiveLedItControl::ExchangeTextAsRTFBlob (CPropExchange* pPX)
856{
857 const LPCTSTR kTextAsRTFBlob = _T("TextAsRTFBlob");
858 RequireNotNull (pPX);
859 if (pPX->IsLoading ()) {
860 HGLOBAL hglobal = NULL;
861 PX_Blob (pPX, kTextAsRTFBlob, hglobal);
862 if (hglobal != NULL) {
863 try {
864 Memory::Platform::Windows::StackBasedHandleLocker hdl{hglobal};
865 const byte* data = reinterpret_cast<byte*> (hdl.GetPointer ());
866 if (data != NULL) {
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 ());
870 }
871 ::GlobalFree (hglobal);
872 }
873 catch (...) {
874 if (hglobal != NULL) {
875 ::GlobalFree (hglobal);
876 }
877 throw;
878 }
879 }
880 }
881 else {
882 string s = GetBufferTextAsRTF_ ();
883 size_t len = s.length ();
884 HGLOBAL hglobal = ::GlobalAlloc (GMEM_MOVEABLE, len + sizeof (size_t));
885 if (hglobal != NULL) {
886 {
887 Memory::Platform::Windows::StackBasedHandleLocker hdl (hglobal);
888 void* pvBlob = hdl.GetPointer ();
889 AssertNotNull (pvBlob);
890 *(size_t*)pvBlob = len;
891 ::memcpy (reinterpret_cast<char*> (pvBlob) + sizeof (size_t), s.c_str (), len);
892 }
893 try {
894 PX_Blob (pPX, kTextAsRTFBlob, hglobal);
895 ::GlobalFree (hglobal);
896 }
897 catch (...) {
898 ::GlobalFree (hglobal);
899 throw;
900 }
901 }
902 }
903}
904
905const DWORD dwSupportedBits = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
906const DWORD dwNotSupportedBits = ~dwSupportedBits;
907
908BEGIN_INTERFACE_MAP (ActiveLedItControl, COleControl)
909INTERFACE_PART (ActiveLedItControl, IID_IObjectSafety, ObjSafe)
910END_INTERFACE_MAP ()
911
912ULONG FAR EXPORT ActiveLedItControl::XObjSafe::AddRef ()
913{
914 METHOD_PROLOGUE (ActiveLedItControl, ObjSafe)
915 return pThis->ExternalAddRef ();
916}
917
918ULONG FAR EXPORT ActiveLedItControl::XObjSafe::Release ()
919{
920 METHOD_PROLOGUE (ActiveLedItControl, ObjSafe)
921 return pThis->ExternalRelease ();
922}
923
924HRESULT FAR EXPORT ActiveLedItControl::XObjSafe::QueryInterface (REFIID iid, void FAR* FAR* ppvObj)
925{
926 METHOD_PROLOGUE (ActiveLedItControl, ObjSafe)
927 return (HRESULT)pThis->ExternalQueryInterface (&iid, ppvObj);
928}
929
930/////////////////////////////////////////////////////////////////////////////
931// CStopLiteCtrl::XObjSafe::GetInterfaceSafetyOptions
932// Allows container to query what interfaces are safe for what. We're
933// optimizing significantly by ignoring which interface the caller is
934// asking for.
935HRESULT STDMETHODCALLTYPE ActiveLedItControl::XObjSafe::GetInterfaceSafetyOptions (
936 /* [in] */ REFIID riid,
937 /* [out] */ DWORD __RPC_FAR* pdwSupportedOptions,
938 /* [out] */ DWORD __RPC_FAR* pdwEnabledOptions)
939{
940 METHOD_PROLOGUE (ActiveLedItControl, ObjSafe)
941
942 HRESULT retval = ResultFromScode (S_OK);
943
944 // does interface exist?
945 IUnknown FAR* punkInterface;
946 retval = pThis->ExternalQueryInterface (&riid, (void**)&punkInterface);
947 if (retval != E_NOINTERFACE) { // interface exists
948 punkInterface->Release (); // release it--just checking!
949 }
950
951 // we support both kinds of safety and have always both set,
952 // regardless of interface
953 *pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits;
954
955 return retval; // E_NOINTERFACE if QI failed
956}
957
958/////////////////////////////////////////////////////////////////////////////
959// CStopLiteCtrl::XObjSafe::SetInterfaceSafetyOptions
960// Since we're always safe, this is a no-brainer--but we do check to make
961// sure the interface requested exists and that the options we're asked to
962// set exist and are set on (we don't support unsafe mode).
963HRESULT STDMETHODCALLTYPE ActiveLedItControl::XObjSafe::SetInterfaceSafetyOptions (
964 /* [in] */ REFIID riid,
965 /* [in] */ DWORD dwOptionSetMask,
966 /* [in] */ DWORD dwEnabledOptions)
967{
968 METHOD_PROLOGUE (ActiveLedItControl, ObjSafe)
969
970 // does interface exist?
971 IUnknown FAR* punkInterface;
972 pThis->ExternalQueryInterface (&riid, (void**)&punkInterface);
973 if (punkInterface) { // interface exists
974 punkInterface->Release (); // release it--just checking!
975 }
976 else { // interface doesn't exist
977 return ResultFromScode (E_NOINTERFACE);
978 }
979
980 // can't set bits we don't support
981 if (dwOptionSetMask & dwNotSupportedBits) {
982 return ResultFromScode (E_FAIL);
983 }
984
985 // can't set bits we do support to zero
986 dwEnabledOptions &= dwSupportedBits;
987 // (we already know there are no extra bits in mask )
988 if ((dwOptionSetMask & dwEnabledOptions) != dwOptionSetMask) {
989 return ResultFromScode (E_FAIL);
990 }
991
992 // don't need to change anything since we're always safe
993 return ResultFromScode (S_OK);
994}
995
996void ActiveLedItControl::AboutBox ()
997{
998 OnAboutBoxCommand ();
999}
1000
1001Led_FileFormat ActiveLedItControl::GuessFormatFromName (LPCTSTR name)
1002{
1003 Led_FileFormat format = eUnknownFormat;
1004 SDKString pathName = name;
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;
1009 }
1010 else if (::_tcsicmp (suffix.c_str (), _T ("led")) == 0) {
1011 format = eLedPrivateFormat;
1012 }
1013 else if (::_tcsicmp (suffix.c_str (), _T ("rtf")) == 0) {
1014 format = eRTFFormat;
1015 }
1016 else if (::_tcsicmp (suffix.c_str (), _T ("htm")) == 0 or ::_tcsicmp (suffix.c_str (), _T ("html")) == 0) {
1017 format = eHTMLFormat;
1018 }
1019 return format;
1020}
1021
1022void ActiveLedItControl::DoReadFile (LPCTSTR filename, Memory::StackBuffer<char>* buffer, size_t* size)
1023{
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)
1027 try {
1028 if (fd < 0) {
1029 AfxThrowFileException (CFileException::fileNotFound, -1, filename);
1030 }
1031 long eof = ::_lseek (fd, 0, SEEK_END);
1032 if (eof < 0) {
1033 AfxThrowFileException (CFileException::badSeek, -1, filename);
1034 }
1035 buffer->GrowToSize (eof);
1036 if (size != NULL) {
1037 *size = eof;
1038 }
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);
1043 }
1044 (void)::_close (fd);
1045 }
1046 catch (...) {
1047 if (fd >= 0) {
1048 (void)::_close (fd);
1049 }
1050 throw;
1051 }
1052}
1053
1054void ActiveLedItControl::WriteBytesToFile (LPCTSTR filename, const void* buffer, size_t size)
1055{
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)
1060 try {
1061 if (fd < 0) {
1062 AfxThrowFileException (CFileException::fileNotFound, -1, filename);
1063 }
1064 int nBytes = ::_write (fd, buffer, static_cast<unsigned int> (size));
1065 if (nBytes != static_cast<int> (size)) {
1066 AfxThrowFileException (CFileException::genericException, -1, filename);
1067 }
1068 (void)::_close (fd);
1069 }
1070 catch (...) {
1071 if (fd >= 0) {
1072 (void)::_close (fd);
1073 }
1074 throw;
1075 }
1076}
1077
1078void ActiveLedItControl::LoadFile (LPCTSTR filename)
1079{
1080 fCommandHandler.Commit ();
1081 fEditor.Replace (0, fEditor.GetEnd (), LED_TCHAR_OF (""), 0);
1082
1083 Memory::StackBuffer<char> buffer{0};
1084 size_t size = 0;
1085 DoReadFile (filename, &buffer, &size);
1086
1087 StyledTextIOSrcStream_Memory source{buffer.data (), size};
1088 WordProcessorTextIOSinkStream sink (&fEditor);
1089
1090 Led_FileFormat format = GuessFormatFromName (filename);
1091
1092ReRead:
1093 switch (format) {
1094 case eTextFormat: {
1095 StyledTextIOReader_PlainText textReader (&source, &sink);
1096 textReader.Read ();
1097 } break;
1098
1099 case eLedPrivateFormat: {
1100 StyledTextIOReader_LedNativeFileFormat textReader (&source, &sink);
1101 textReader.Read ();
1102 } break;
1103
1104 case eRTFFormat: {
1105 StyledTextIOReader_RTF textReader (&source, &sink);
1106 textReader.Read ();
1107 } break;
1108
1109 case eHTMLFormat: {
1110 StyledTextIOReader_HTML textReader (&source, &sink, &fHTMLInfo);
1111 textReader.Read ();
1112 } break;
1113
1114 case eUnknownFormat: {
1115 /*
1116 * Should enhance this unknown/format reading code to take into account file suffix in our guess.
1117 */
1118
1119 // Try RTF
1120 try {
1121 StyledTextIOReader_RTF reader (&source, &sink);
1122 if (reader.QuickLookAppearsToBeRightFormat ()) {
1123 format = eRTFFormat;
1124 goto ReRead;
1125 }
1126 }
1127 catch (...) {
1128 // ignore any errors, and proceed to next file type
1129 }
1130
1131 // Try LedNativeFileFormat
1132 try {
1133 StyledTextIOReader_LedNativeFileFormat reader (&source, &sink);
1134 if (reader.QuickLookAppearsToBeRightFormat ()) {
1135 format = eLedPrivateFormat;
1136 goto ReRead;
1137 }
1138 }
1139 catch (...) {
1140 // ignore any errors, and proceed to next file type
1141 }
1142
1143 // Try HTML
1144 try {
1145 StyledTextIOReader_HTML reader (&source, &sink);
1146 if (reader.QuickLookAppearsToBeRightFormat ()) {
1147 format = eHTMLFormat;
1148 goto ReRead;
1149 }
1150 }
1151 catch (...) {
1152 // ignore any errors, and proceed to next file type
1153 }
1154
1155 // Nothing left todo but to read the text file as plain text, as best we can...
1156 format = eTextFormat;
1157 goto ReRead;
1158 } break;
1159
1160 default: {
1161 Assert (false); // don't support reading that format (yet?)!
1162 } break;
1163 }
1164 fEditor.SetEmptySelectionStyle ();
1165}
1166
1167void ActiveLedItControl::SaveFile (LPCTSTR filename)
1168{
1169 WordProcessorTextIOSrcStream source (&fEditor);
1170 StyledTextIOWriterSinkStream_Memory sink;
1171 switch (GuessFormatFromName (filename)) {
1172 case eTextFormat: {
1173 StyledTextIOWriter_PlainText textWriter (&source, &sink);
1174 textWriter.Write ();
1175 } break;
1176
1177 case eRTFFormat: {
1178 StyledTextIOWriter_RTF textWriter (&source, &sink);
1179 textWriter.Write ();
1180 } break;
1181
1182 case eHTMLFormat: {
1183 StyledTextIOWriter_HTML textWriter (&source, &sink, &fHTMLInfo);
1184 textWriter.Write ();
1185 } break;
1186
1187 case eLedPrivateFormat: {
1188 StyledTextIOWriter_LedNativeFileFormat textWriter (&source, &sink);
1189 textWriter.Write ();
1190 } break;
1191
1192 default: {
1193 StyledTextIOWriter_RTF textWriter (&source, &sink);
1194 textWriter.Write ();
1195 } break;
1196 }
1197 WriteBytesToFile (filename, sink.PeekAtData (), sink.GetLength ());
1198}
1199
1200void ActiveLedItControl::SaveFileCRLF (LPCTSTR filename)
1201{
1202 WordProcessorTextIOSrcStream source (&fEditor);
1203 StyledTextIOWriterSinkStream_Memory sink;
1204 StyledTextIOWriter_PlainText textWriter (&source, &sink);
1205 textWriter.Write ();
1206 WriteBytesToFile (filename, sink.PeekAtData (), sink.GetLength ());
1207}
1208
1209void ActiveLedItControl::SaveFileRTF (LPCTSTR filename)
1210{
1211 WordProcessorTextIOSrcStream source (&fEditor);
1212 StyledTextIOWriterSinkStream_Memory sink;
1213 StyledTextIOWriter_RTF textWriter (&source, &sink);
1214 textWriter.Write ();
1215 WriteBytesToFile (filename, sink.PeekAtData (), sink.GetLength ());
1216}
1217
1218void ActiveLedItControl::SaveFileHTML (LPCTSTR filename)
1219{
1220 WordProcessorTextIOSrcStream source (&fEditor);
1221 StyledTextIOWriterSinkStream_Memory sink;
1222 StyledTextIOWriter_HTML textWriter (&source, &sink);
1223 textWriter.Write ();
1224 WriteBytesToFile (filename, sink.PeekAtData (), sink.GetLength ());
1225}
1226
1227void ActiveLedItControl::Refresh ()
1228{
1229 fEditor.Refresh ();
1230}
1231
1232void ActiveLedItControl::ScrollToSelection ()
1233{
1234 fEditor.ScrollToSelection ();
1235}
1236
1237long ActiveLedItControl::OLE_GetMaxUndoLevel ()
1238{
1239 return static_cast<long> (fCommandHandler.GetMaxUnDoLevels ());
1240}
1241
1242void ActiveLedItControl::OLE_SetMaxUndoLevel (long maxUndoLevel)
1243{
1244 // sanity check arguments
1245 maxUndoLevel = max (0L, maxUndoLevel);
1246 maxUndoLevel = min (maxUndoLevel, 10L);
1247 fCommandHandler.SetMaxUnDoLevels (maxUndoLevel);
1248}
1249
1250BOOL ActiveLedItControl::OLE_GetCanUndo ()
1251{
1252 return fCommandHandler.CanUndo () or (fCommandHandler.GetMaxUnDoLevels () == 1 and fCommandHandler.CanRedo ());
1253}
1254
1255BOOL ActiveLedItControl::OLE_GetCanRedo ()
1256{
1257 return fCommandHandler.CanRedo ();
1258}
1259
1260void ActiveLedItControl::OLE_Undo ()
1261{
1262 if (fCommandHandler.CanUndo ()) {
1263 fCommandHandler.DoUndo (fEditor);
1264 }
1265 else if (fCommandHandler.GetMaxUnDoLevels () == 1 and fCommandHandler.CanRedo ()) {
1266 fCommandHandler.DoRedo (fEditor);
1267 }
1268 else {
1269 // ignore bad undo request - no ability to return errors here til we redo this in ATL
1270 }
1271}
1272
1273void ActiveLedItControl::OLE_Redo ()
1274{
1275 if (fCommandHandler.CanRedo ()) {
1276 fCommandHandler.DoRedo (fEditor);
1277 }
1278 else {
1279 // ignore bad undo request - no ability to return errors here til we redo this in ATL
1280 }
1281}
1282
1283void ActiveLedItControl::OLE_CommitUndo ()
1284{
1285 fCommandHandler.Commit ();
1286}
1287
1288void ActiveLedItControl::OLE_LaunchFontSettingsDialog ()
1289{
1290 fEditor.OnChooseFontCommand ();
1291}
1292
1293void ActiveLedItControl::OLE_LaunchParagraphSettingsDialog ()
1294{
1295 fEditor.OnParagraphSpacingChangeCommand ();
1296}
1297
1298void ActiveLedItControl::OLE_LaunchFindDialog ()
1299{
1300 fEditor.OnFindCommand ();
1301}
1302
1303long ActiveLedItControl::OLE_Find (long searchFrom, const VARIANT& findText, BOOL wrapSearch, BOOL wholeWordSearch, BOOL caseSensativeSearch)
1304{
1305 // don't have any better error checking technology here - should return E_INVALIDARG!!!
1306 if (searchFrom < 0) {
1307 return -1;
1308 }
1309 if (static_cast<size_t> (searchFrom) > fTextStore.GetEnd ()) {
1310 return -1;
1311 }
1312 if (findText.vt != VT_BSTR) {
1313 return -1;
1314 }
1315
1316 TextStore::SearchParameters parameters;
1317
1318 parameters.fMatchString = findText.bstrVal;
1319 parameters.fWrapSearch = !!wrapSearch;
1320 parameters.fWholeWordSearch = !!wholeWordSearch;
1321 parameters.fCaseSensativeSearch = !!caseSensativeSearch;
1322
1323 size_t whereTo = fTextStore.Find (parameters, searchFrom);
1324
1325 return static_cast<long> (whereTo);
1326}
1327
1328void ActiveLedItControl::OLE_LaunchReplaceDialog ()
1329{
1330 fEditor.OnReplaceCommand ();
1331}
1332
1333long ActiveLedItControl::OLE_FindReplace (long searchFrom, const VARIANT& findText, const VARIANT& replaceText, BOOL wrapSearch,
1334 BOOL wholeWordSearch, BOOL caseSensativeSearch)
1335{
1336 // don't have any better error checking technology here - should return E_INVALIDARG!!!
1337 if (searchFrom < 0) {
1338 return -1;
1339 }
1340 if (static_cast<size_t> (searchFrom) > fTextStore.GetEnd ()) {
1341 return -1;
1342 }
1343 if (findText.vt != VT_BSTR) {
1344 return -1;
1345 }
1346 if (replaceText.vt != VT_BSTR) {
1347 return -1;
1348 }
1349
1350 TextStore::SearchParameters parameters;
1351
1352 Led_tString findStr = findText.bstrVal;
1353 Led_tString replaceStr = replaceText.bstrVal;
1354 return fEditor.OLE_FindReplace (searchFrom, findStr, replaceStr, wrapSearch, wholeWordSearch, caseSensativeSearch);
1355}
1356
1357void ActiveLedItControl::OLE_PrinterSetupDialog ()
1358{
1359 fEditor.OnFilePrintSetup ();
1360}
1361
1362void ActiveLedItControl::OLE_PrintDialog ()
1363{
1364 fEditor.OnFilePrint ();
1365}
1366
1367void ActiveLedItControl::OLE_PrintOnce ()
1368{
1369 fEditor.OnFilePrintOnce ();
1370}
1371
1372long ActiveLedItControl::OLE_GetHeight (long from, long to)
1373{
1374 using RowReference = MultiRowTextImager::RowReference;
1375 if (from < 0) {
1376 from = 0;
1377 }
1378 if (to < 0) {
1379 to = static_cast<long> (fTextStore.GetEnd ());
1380 }
1381 if (from > to) {
1382 // throw invalid input
1383 return -1;
1384 }
1385 if (static_cast<size_t> (to) > fTextStore.GetEnd ()) {
1386 // throw invalid input
1387 return -1;
1388 }
1389 RowReference startingRow = fEditor.GetRowReferenceContainingPosition (from);
1390 RowReference endingRow = fEditor.GetRowReferenceContainingPosition (to);
1391 /*
1392 * Always take one more row than they asked for, since they will expect if you start and end on a given row - you'll get
1393 * the height of that row.
1394 */
1395 return fEditor.GetHeightOfRows (startingRow, fEditor.CountRowDifference (startingRow, endingRow) + 1);
1396}
1397
1398BOOL ActiveLedItControl::OLE_GetDirty ()
1399{
1400 return fDataDirty;
1401}
1402
1403void ActiveLedItControl::OLE_SetDirty (BOOL dirty)
1404{
1405 fDataDirty = !!dirty;
1406}
1407
1408void ActiveLedItControl::OnBrowseHelpCommand ()
1409{
1410 Led_URLManager::Get ().Open (MakeSophistsAppNameVersionURL ("/Led/ActiveLedIt/UserDocs.asp", kAppName, ""));
1411}
1412
1413void ActiveLedItControl::OnAboutBoxCommand ()
1414{
1415 class MyAboutBox : public Led_StdDialogHelper_AboutBox {
1416 private:
1417 using inherited = Led_StdDialogHelper_AboutBox;
1418
1419 public:
1420 MyAboutBox (HINSTANCE hInstance, HWND parentWnd)
1421 : inherited (hInstance, parentWnd)
1422 {
1423 }
1424
1425 public:
1426 virtual BOOL OnInitDialog () override
1427 {
1428 BOOL result = inherited::OnInitDialog ();
1429
1430 // Cuz of fact that dlog sizes specified in dlog units, and that doesn't work well for bitmaps
1431 // we must resize our dlog on the fly based on pict resource size...
1432 const int kPictWidth = 437; // must agree with ACTUAL bitmap size
1433 const int kButHSluff = 17;
1434 const int kButVSluff = 61;
1435 const int kPictHeight = 318;
1436
1437 {
1438 RECT windowRect;
1439 ::GetWindowRect (GetHWND (), &windowRect);
1440 // figure size of non-client area...
1441 int ncWidth = 0;
1442 int ncHeight = 0;
1443 {
1444 RECT clientRect;
1445 ::GetClientRect (GetHWND (), &clientRect);
1446 ncWidth = AsLedRect (windowRect).GetWidth () - AsLedRect (clientRect).GetWidth ();
1447 ncHeight = AsLedRect (windowRect).GetHeight () - AsLedRect (clientRect).GetHeight ();
1448 }
1449 ::MoveWindow (GetHWND (), windowRect.left, windowRect.top, kPictWidth + ncWidth, kPictHeight + ncHeight, false);
1450 }
1451
1452 // Place and fill in version information
1453 {
1454 HWND w = ::GetDlgItem (GetHWND (), kLedStdDlg_AboutBox_VersionFieldID);
1455 AssertNotNull (w);
1456 const int kVERWidth = 230;
1457 ::MoveWindow (w, kPictWidth / 2 - kVERWidth / 2, 35, 230, 14, false);
1458#if _UNICODE
1459#define kUNICODE_NAME_ADORNER L" [UNICODE]"
1460#else
1461#define kUNICODE_NAME_ADORNER " [Internal UNICODE]"
1462#endif
1463 ::SetWindowText (w, (SDKString{_T (qLed_ShortVersionString) kUNICODE_NAME_ADORNER _T (" (") _T (__DATE__) _T (")")}).c_str ());
1464 }
1465
1466 // Place hidden buttons which map to URLs
1467 {
1468 HWND w = ::GetDlgItem (GetHWND (), kLedStdDlg_AboutBox_InfoLedFieldID);
1469 AssertNotNull (w);
1470 ::MoveWindow (w, 15, 159, 142, 17, false);
1471 w = ::GetDlgItem (GetHWND (), kLedStdDlg_AboutBox_LedWebPageFieldID);
1472 AssertNotNull (w);
1473 ::MoveWindow (w, 227, 159, 179, 17, false);
1474 }
1475
1476 // Place OK button
1477 {
1478 HWND w = ::GetDlgItem (GetHWND (), IDOK);
1479 AssertNotNull (w);
1480 RECT tmp;
1481 ::GetWindowRect (w, &tmp);
1482 ::MoveWindow (w, kButHSluff, kPictHeight - AsLedRect (tmp).GetHeight () - kButVSluff, AsLedRect (tmp).GetWidth (),
1483 AsLedRect (tmp).GetHeight (), false); // width/height we should presevere
1484 }
1485
1486 ::SetWindowText (GetHWND (), _T ("About ActiveLedIt!"));
1487
1488 return (result);
1489 }
1490
1491 public:
1492 virtual void OnClickInInfoField () override
1493 {
1494 try {
1495 Led_URLManager::Get ().Open ("mailto:info-led@sophists.com");
1496 }
1497 catch (...) {
1498 // ignore for now - since errors here prent dialog from dismissing (on MacOSX)
1499 }
1500 inherited::OnClickInInfoField ();
1501 }
1502
1503 virtual void OnClickInLedWebPageField () override
1504 {
1505 try {
1506 Led_URLManager::Get ().Open (MakeSophistsAppNameVersionURL ("/Led/ActiveLedIt/", kAppName, ""));
1507 }
1508 catch (...) {
1509 // ignore for now - since errors here prent dialog from dismissing (on MacOSX)
1510 }
1511 inherited::OnClickInLedWebPageField ();
1512 }
1513 };
1514 MyAboutBox dlg (::AfxGetResourceHandle (), fEditor.GetHWND ());
1515 dlg.DoModal ();
1516}
1517
1518void ActiveLedItControl::ForceUIActive ()
1519{
1520 OnActivateInPlace (TRUE, NULL); // == UI-Activate the control
1521}
1522
1523void ActiveLedItControl::FireOLEEvent (DISPID eventID)
1524{
1525 FireOLEEvent (eventID, EVENT_PARAM (VTS_NONE));
1526}
1527
1528void ActiveLedItControl::FireOLEEvent (DISPID dispid, BYTE* pbParams, ...)
1529{
1530 // Clone of COleControl::FireEvent, but cannot call directly cuz of the va_list stuff.
1531 va_list argList;
1532 va_start (argList, pbParams);
1533 FireEventV (dispid, pbParams, argList);
1534 va_end (argList);
1535}
1536
1537void ActiveLedItControl::FireUpdateUserCommand (const wstring& internalCmdName, VARIANT_BOOL* enabled, VARIANT_BOOL* checked, wstring* name)
1538{
1539 try {
1540 CComObject<ActiveLedIt_CurrentEventArguments>* o = NULL;
1541 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_CurrentEventArguments>::CreateInstance (&o));
1542 o->fInternalName = internalCmdName;
1543 o->fName = *name;
1544 o->fEnabled = !!*enabled;
1545 o->fChecked = !!*checked;
1546 fCurrentEventArguments = o;
1547 FireOLEEvent (DISPID_UpdateUserCommand);
1548 *name = o->fName;
1549 *enabled = o->fEnabled;
1550 *checked = o->fChecked;
1551 }
1552 catch (...) {
1553 fCurrentEventArguments.Release ();
1554 throw;
1555 }
1556 fCurrentEventArguments.Release ();
1557}
1558
1559void ActiveLedItControl::FireUserCommand (const wstring& internalCmdName)
1560{
1561 try {
1562 CComObject<ActiveLedIt_CurrentEventArguments>* o = NULL;
1563 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_CurrentEventArguments>::CreateInstance (&o));
1564 o->fInternalName = internalCmdName;
1565 fCurrentEventArguments = o;
1566 FireOLEEvent (DISPID_UserCommand);
1567 }
1568 catch (...) {
1569 fCurrentEventArguments.Release ();
1570 throw;
1571 }
1572 fCurrentEventArguments.Release ();
1573}
1574
1575#if qFunnyDisplayInDesignMode
1576bool ActiveLedItControl::IsInDesignMode () const
1577{
1578 return not const_cast<ActiveLedItControl*> (this)->AmbientUserMode ();
1579}
1580
1581bool ActiveLedItControl::DrawExtraDesignModeBorder () const
1582{
1583 return const_cast<ActiveLedItControl*> (this)->GetAppearance () == 0 and const_cast<ActiveLedItControl*> (this)->GetBorderStyle () == 0;
1584}
1585#endif
1586
1587HMENU ActiveLedItControl::GenerateContextMenu ()
1588{
1589 if (fConextMenu != NULL) {
1590#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
1591 CComQIPtr<IALCommandList> cm = (IDispatch*)fConextMenu;
1592#else
1593 CComQIPtr<IALCommandList> cm = fConextMenu;
1594#endif
1595 if (cm != NULL) {
1596 HMENU menu = NULL;
1597 if (SUCCEEDED (cm->GeneratePopupMenu (fAcceleratorTable, &menu))) {
1598 return menu;
1599 }
1600 }
1601 }
1602 return NULL;
1603}
1604
1605int ActiveLedItControl::OnCreate (LPCREATESTRUCT lpCreateStruct)
1606{
1607 if (COleControl::OnCreate (lpCreateStruct) == -1) {
1608 return -1;
1609 }
1610
1611 fEditor.SetDefaultTextColor (TextImager::eDefaultBackgroundColor, Color (TranslateColor (GetBackColor ())));
1612
1613 CRect clientRect;
1614 GetClientRect (&clientRect);
1615 if (fEditor.Create (WS_CHILD | WS_VISIBLE, clientRect, this, kEditorWindowID) == 0) {
1616 return -1;
1617 }
1618
1619#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
1620 CComQIPtr<IALToolbarList> tbl = (IDispatch*)fToolbarList;
1621#else
1622 CComQIPtr<IALToolbarList> tbl = fToolbarList;
1623#endif
1624 if (tbl.p != NULL) {
1625 tbl->NotifyOfOwningActiveLedIt (CComQIPtr<IDispatch> (GetControllingUnknown ()), m_hWnd);
1626 }
1627
1628 if (fOnCreateExtras.get () != NULL) {
1629 OLE_SetReadOnly (fOnCreateExtras.get ()->fReadOnly);
1630 OLE_SetEnabled (fOnCreateExtras.get ()->fEnabled);
1631 fOnCreateExtras.release ();
1632 }
1633
1634 return 0;
1635}
1636
1637void ActiveLedItControl::OnWindowPosChanged (WINDOWPOS* lpwndpos)
1638{
1639 RequireNotNull (lpwndpos);
1640 DbgTrace ("ActiveLedItControl::OnWindowPosChanged (cx={}, cy={}, flags=0x{:x})"_f, lpwndpos->cx, lpwndpos->cy, lpwndpos->flags);
1641
1642 IdleManager::NonIdleContext nonIdleContext;
1643
1644 /*
1645 * Used to adjust bounds of fEditor in the OnSize () method. Not entire sure why that wasn't good
1646 * enough. But - doing it here, and redundantly like below - seems to make the display glitch in SPR#1168
1647 * go away. -- LGP 2003-05-06
1648 */
1649 COleControl::OnWindowPosChanged (lpwndpos);
1650
1651 Layout ();
1652}
1653
1654void ActiveLedItControl::OnSetFocus (CWnd* pOldWnd)
1655{
1656 IdleManager::NonIdleContext nonIdleContext;
1657 COleControl::OnSetFocus (pOldWnd);
1658 fEditor.SetFocus ();
1659}
1660
1661void ActiveLedItControl::Layout ()
1662{
1663 IdleManager::NonIdleContext nonIdleContext;
1664 if (m_hWnd != NULL) {
1665 DistanceType toolbarHeightUsed = 0;
1666
1667 CRect cr;
1668 GetClientRect (&cr);
1669
1670 try {
1671#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
1672 CComQIPtr<IALToolbarList> tbl = (IDispatch*)fToolbarList;
1673#else
1674 CComQIPtr<IALToolbarList> tbl = fToolbarList;
1675#endif
1676 if (tbl.p != NULL) {
1677 UINT preferredHeight = 0;
1678 ThrowIfErrorHRESULT (tbl->get_PreferredHeight (&preferredHeight));
1679 toolbarHeightUsed = preferredHeight;
1680 CRect tblRect = cr;
1681 tblRect.bottom = tblRect.top + preferredHeight;
1682 ThrowIfErrorHRESULT (tbl->SetRectangle (tblRect.left, tblRect.top, tblRect.Width (), tblRect.Height ()));
1683 }
1684 }
1685 catch (...) {
1686 }
1687
1688 CRect editRect = cr;
1689 editRect.top += toolbarHeightUsed;
1690 fEditor.MoveWindow (editRect);
1691 }
1692}
1693
1694void ActiveLedItControl::OLE_InvalidateLayout ()
1695{
1696 Layout ();
1697}
1698
1699#if qDontUIActivateOnOpen
1700HRESULT ActiveLedItControl::OnOpen (BOOL /*bTryInPlace*/, LPMSG pMsg)
1701{
1702 return OnActivateInPlace (false, pMsg);
1703}
1704#endif
1705
1706void ActiveLedItControl::OnBackColorChanged ()
1707{
1708 COleControl::OnBackColorChanged ();
1709
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);
1714 fEditor.Refresh ();
1715 }
1716}
1717
1718#if qFunnyDisplayInDesignMode
1719void ActiveLedItControl::OnAmbientPropertyChange (DISPID dispid)
1720{
1721 COleControl::OnAmbientPropertyChange (dispid);
1722 if (dispid == DISPID_AMBIENT_USERMODE) {
1723 InvalidateControl ();
1724 ::InvalidateRect (fEditor.GetHWND (), NULL, true); // so we get the border too
1725 }
1726}
1727#endif
1728
1729UINT ActiveLedItControl::OLE_VersionNumber ()
1730{
1731 return kActiveLedItDWORDVersion;
1732}
1733
1734BSTR ActiveLedItControl::OLE_ShortVersionString ()
1735{
1736 try {
1737 string result = qLed_ShortVersionString;
1738 return CString (result.c_str ()).AllocSysString ();
1739 }
1740 CATCH_AND_HANDLE_EXCEPTIONS ();
1741 Assert (false); /*NOTREACHED*/
1742 return NULL;
1743}
1744
1745BOOL ActiveLedItControl::OLE_GetReadOnly ()
1746{
1747 if (fEditor.m_hWnd == NULL) {
1748 // Avoid barfing if no window...
1749 if (fOnCreateExtras.get () == NULL) {
1750 return false;
1751 }
1752 else {
1753 return fOnCreateExtras.get ()->fReadOnly;
1754 }
1755 }
1756 try {
1757 bool result = !!(fEditor.GetStyle () & ES_READONLY);
1758 return result;
1759 }
1760 CATCH_AND_HANDLE_EXCEPTIONS ();
1761 return false;
1762}
1763
1764void ActiveLedItControl::OLE_SetReadOnly (BOOL bNewValue)
1765{
1766 try {
1767 if (fEditor.m_hWnd == NULL) {
1768 if (fOnCreateExtras.get () == NULL) {
1769 fOnCreateExtras = unique_ptr<OnCreateExtras> (new OnCreateExtras ());
1770 }
1771 fOnCreateExtras.get ()->fReadOnly = !!bNewValue;
1772 }
1773 else {
1774 fEditor.SetReadOnly (bNewValue);
1775 }
1776 }
1777 CATCH_AND_HANDLE_EXCEPTIONS ();
1778}
1779
1780BOOL ActiveLedItControl::OLE_GetEnabled ()
1781{
1782 if (fEditor.m_hWnd == NULL) {
1783 // Avoid barfing if no window...
1784 if (fOnCreateExtras.get () == NULL) {
1785 return true;
1786 }
1787 else {
1788 return fOnCreateExtras.get ()->fEnabled;
1789 }
1790 }
1791 try {
1792 return not(fEditor.GetStyle () & WS_DISABLED);
1793 }
1794 CATCH_AND_HANDLE_EXCEPTIONS ();
1795 return false;
1796}
1797
1798void ActiveLedItControl::OLE_SetEnabled (BOOL bNewValue)
1799{
1800 try {
1801 if (fEditor.m_hWnd == NULL) {
1802 if (fOnCreateExtras.get () == NULL) {
1803 fOnCreateExtras = unique_ptr<OnCreateExtras> (new OnCreateExtras ());
1804 }
1805 fOnCreateExtras.get ()->fEnabled = !!bNewValue;
1806 }
1807 else {
1808 if (bNewValue) {
1809 fEditor.ModifyStyle (WS_DISABLED, 0);
1810 }
1811 else {
1812 fEditor.ModifyStyle (0, WS_DISABLED);
1813 }
1814 fEditor.Refresh ();
1815 }
1816 }
1817 CATCH_AND_HANDLE_EXCEPTIONS ();
1818}
1819
1820BOOL ActiveLedItControl::OLE_GetEnableAutoChangesBackgroundColor ()
1821{
1822 return fEditor.fEnableAutoChangesBackgroundColor;
1823}
1824
1825void ActiveLedItControl::OLE_SetEnableAutoChangesBackgroundColor (BOOL bNewValue)
1826{
1827 try {
1828 IdleManager::NonIdleContext nonIdleContext;
1829 fEditor.fEnableAutoChangesBackgroundColor = !!bNewValue;
1830 fEditor.Refresh ();
1831 }
1832 CATCH_AND_HANDLE_EXCEPTIONS ();
1833}
1834
1835int ActiveLedItControl::OLE_GetWindowMarginTop ()
1836{
1837 return fEditor.GetDefaultWindowMargins ().GetTop ();
1838}
1839
1840void ActiveLedItControl::OLE_SetWindowMarginTop (int windowMarginTop)
1841{
1842 try {
1843 TWIPS_Rect margRect = fEditor.GetDefaultWindowMargins ();
1844 margRect.top = TWIPS (windowMarginTop);
1845 fEditor.SetDefaultWindowMargins (margRect);
1846 Invalidate ();
1847 fEditor.Invalidate ();
1848 }
1849 CATCH_AND_HANDLE_EXCEPTIONS ();
1850}
1851
1852int ActiveLedItControl::OLE_GetWindowMarginLeft ()
1853{
1854 return fEditor.GetDefaultWindowMargins ().GetLeft ();
1855}
1856
1857void ActiveLedItControl::OLE_SetWindowMarginLeft (int windowMarginLeft)
1858{
1859 try {
1860 TWIPS_Rect margRect = fEditor.GetDefaultWindowMargins ();
1861 margRect.left = TWIPS (windowMarginLeft);
1862 fEditor.SetDefaultWindowMargins (margRect);
1863 Invalidate ();
1864 fEditor.Invalidate ();
1865 }
1866 CATCH_AND_HANDLE_EXCEPTIONS ();
1867}
1868
1869int ActiveLedItControl::OLE_GetWindowMarginBottom ()
1870{
1871 return fEditor.GetDefaultWindowMargins ().GetBottom ();
1872}
1873
1874void ActiveLedItControl::OLE_SetWindowMarginBottom (int windowMarginBottom)
1875{
1876 try {
1877 TWIPS_Rect margRect = fEditor.GetDefaultWindowMargins ();
1878 margRect.SetBottom (TWIPS (windowMarginBottom));
1879 fEditor.SetDefaultWindowMargins (margRect);
1880 Invalidate ();
1881 fEditor.Invalidate ();
1882 }
1883 CATCH_AND_HANDLE_EXCEPTIONS ();
1884}
1885
1886int ActiveLedItControl::OLE_GetWindowMarginRight ()
1887{
1888 return fEditor.GetDefaultWindowMargins ().GetRight ();
1889}
1890
1891void ActiveLedItControl::OLE_SetWindowMarginRight (int windowMarginRight)
1892{
1893 try {
1894 TWIPS_Rect margRect = fEditor.GetDefaultWindowMargins ();
1895 margRect.SetRight (TWIPS (windowMarginRight));
1896 fEditor.SetDefaultWindowMargins (margRect);
1897 Invalidate ();
1898 fEditor.Invalidate ();
1899 }
1900 CATCH_AND_HANDLE_EXCEPTIONS ();
1901}
1902
1903int ActiveLedItControl::OLE_GetPrintMarginTop ()
1904{
1905 return fEditor.GetPrintMargins ().GetTop ();
1906}
1907
1908void ActiveLedItControl::OLE_SetPrintMarginTop (int printMarginTop)
1909{
1910 try {
1911 TWIPS_Rect margRect = fEditor.GetPrintMargins ();
1912 margRect.SetTop (TWIPS (printMarginTop));
1913 fEditor.SetPrintMargins (margRect);
1914 }
1915 CATCH_AND_HANDLE_EXCEPTIONS ();
1916}
1917
1918int ActiveLedItControl::OLE_GetPrintMarginLeft ()
1919{
1920 return fEditor.GetPrintMargins ().GetLeft ();
1921}
1922
1923void ActiveLedItControl::OLE_SetPrintMarginLeft (int printMarginLeft)
1924{
1925 try {
1926 TWIPS_Rect margRect = fEditor.GetPrintMargins ();
1927 margRect.SetLeft (TWIPS (printMarginLeft));
1928 fEditor.SetPrintMargins (margRect);
1929 }
1930 CATCH_AND_HANDLE_EXCEPTIONS ();
1931}
1932
1933int ActiveLedItControl::OLE_GetPrintMarginBottom ()
1934{
1935 return fEditor.GetPrintMargins ().GetBottom ();
1936}
1937
1938void ActiveLedItControl::OLE_SetPrintMarginBottom (int printMarginBottom)
1939{
1940 try {
1941 TWIPS_Rect margRect = fEditor.GetPrintMargins ();
1942 margRect.SetBottom (TWIPS (printMarginBottom));
1943 fEditor.SetPrintMargins (margRect);
1944 }
1945 CATCH_AND_HANDLE_EXCEPTIONS ();
1946}
1947
1948int ActiveLedItControl::OLE_GetPrintMarginRight ()
1949{
1950 return fEditor.GetPrintMargins ().GetRight ();
1951}
1952
1953void ActiveLedItControl::OLE_SetPrintMarginRight (int printMarginRight)
1954{
1955 try {
1956 TWIPS_Rect margRect = fEditor.GetPrintMargins ();
1957 margRect.SetRight (TWIPS (printMarginRight));
1958 fEditor.SetPrintMargins (margRect);
1959 }
1960 CATCH_AND_HANDLE_EXCEPTIONS ();
1961}
1962
1963UINT ActiveLedItControl::GetHasVerticalScrollBar ()
1964{
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;
1972 }
1973 return eNoScrollBar;
1974}
1975
1976void ActiveLedItControl::SetHasVerticalScrollBar (UINT bNewValue)
1977{
1978 if (bNewValue != GetHasVerticalScrollBar ()) {
1979 IdleManager::NonIdleContext nonIdleContext;
1980 SetModifiedFlag ();
1981 switch (bNewValue) {
1982 case eNoScrollBar:
1983 fEditor.SetScrollBarType (LedItView::v, LedItView::eScrollBarNever);
1984 break;
1985 case eShowScrollBar:
1986 fEditor.SetScrollBarType (LedItView::v, LedItView::eScrollBarAlways);
1987 break;
1988 case eShowScrollbarIfNeeded:
1989 fEditor.SetScrollBarType (LedItView::v, LedItView::eScrollBarAsNeeded);
1990 break;
1991 }
1992 }
1993}
1994
1995UINT ActiveLedItControl::GetHasHorizontalScrollBar ()
1996{
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;
2004 }
2005 return eNoScrollBar;
2006}
2007
2008void ActiveLedItControl::SetHasHorizontalScrollBar (UINT bNewValue)
2009{
2010 if (bNewValue != GetHasHorizontalScrollBar ()) {
2011 IdleManager::NonIdleContext nonIdleContext;
2012 SetModifiedFlag ();
2013 switch (bNewValue) {
2014 case eNoScrollBar:
2015 fEditor.SetScrollBarType (LedItView::h, LedItView::eScrollBarNever);
2016 break;
2017 case eShowScrollBar:
2018 fEditor.SetScrollBarType (LedItView::h, LedItView::eScrollBarAlways);
2019 break;
2020 case eShowScrollbarIfNeeded:
2021 fEditor.SetScrollBarType (LedItView::h, LedItView::eScrollBarAsNeeded);
2022 break;
2023 }
2024 }
2025}
2026
2027BSTR ActiveLedItControl::GetBufferText ()
2028{
2029 size_t len = fEditor.GetLength ();
2030 Memory::StackBuffer<Led_tChar> buf{Memory::eUninitialized, len + 1};
2031 fEditor.CopyOut (0, len, buf.data ());
2032 buf[len] = '\0';
2033 return CString (buf.data ()).AllocSysString ();
2034}
2035
2036void ActiveLedItControl::SetBufferText (LPCTSTR text)
2037{
2038 try {
2039 IdleManager::NonIdleContext nonIdleContext;
2040 fCommandHandler.Commit ();
2041#if _UNICODE
2042 size_t len = text == NULL ? 0 : ::_tcslen (text);
2043 Memory::StackBuffer<wchar_t> buf{Memory::eUninitialized, len + 1};
2044 buf[0] = 0xfeff;
2045 memcpy (&buf[1], text, len * sizeof (wchar_t));
2046 StyledTextIOSrcStream_Memory source (buf.data (), (len + 1) * sizeof (wchar_t));
2047#else
2048 StyledTextIOSrcStream_Memory source (text, text == NULL ? 0 : ::_tcslen (text));
2049#endif
2050 WordProcessorTextIOSinkStream sink (&fEditor);
2051 StyledTextIOReader_PlainText textReader (&source, &sink);
2052 fEditor.Replace (0, fEditor.GetEnd (), LED_TCHAR_OF (""), 0); // clear out current text
2053 textReader.Read ();
2054 fEditor.SetEmptySelectionStyle ();
2055 }
2056 CATCH_AND_HANDLE_EXCEPTIONS ();
2057}
2058
2059BSTR ActiveLedItControl::GetBufferTextCRLF ()
2060{
2061 try {
2062 size_t len = fEditor.GetLength ();
2063 Memory::StackBuffer<Led_tChar> buf{Memory::eUninitialized, len + 1};
2064 fEditor.CopyOut (0, len, buf.data ());
2065 buf[len] = '\0';
2066 Memory::StackBuffer<Led_tChar> buf2{Memory::eUninitialized, 2 * len + 1};
2067 len = Characters::NLToNative<Led_tChar> (buf.data (), len, buf2.data (), 2 * len + 1);
2068 buf2[len] = '\0';
2069 return CString (buf2.data ()).AllocSysString ();
2070 }
2071 CATCH_AND_HANDLE_EXCEPTIONS ();
2072 Assert (false); /*NOTREACHED*/
2073 return NULL;
2074}
2075
2076void ActiveLedItControl::SetBufferTextCRLF (LPCTSTR text)
2077{
2078 SetBufferText (text);
2079}
2080
2081BSTR ActiveLedItControl::GetBufferTextAsRTF ()
2082{
2083 try {
2084 return CString (GetBufferTextAsRTF_ ().c_str ()).AllocSysString ();
2085 }
2086 CATCH_AND_HANDLE_EXCEPTIONS ();
2087 Assert (false); /*NOTREACHED*/
2088 return NULL;
2089}
2090
2091string ActiveLedItControl::GetBufferTextAsRTF_ ()
2092{
2093 WordProcessorTextIOSrcStream source (&fEditor);
2094 StyledTextIOWriterSinkStream_Memory sink;
2095 StyledTextIOWriter_RTF textWriter (&source, &sink);
2096 textWriter.Write ();
2097 size_t len = sink.GetLength ();
2098 Memory::StackBuffer<char> buf{Memory::eUninitialized, len + 1};
2099 memcpy (buf.data (), sink.PeekAtData (), len);
2100 buf[len] = '\0';
2101 return string{static_cast<char*> (buf)};
2102}
2103
2104void ActiveLedItControl::SetBufferTextAsRTF (LPCTSTR text)
2105{
2106 try {
2107 IdleManager::NonIdleContext nonIdleContext;
2108 TextInteractor::TemporarilySetUpdateMode tsum (fEditor, m_hWnd == NULL ? TextInteractor::eNoUpdate : TextInteractor::eDefaultUpdate);
2109 fCommandHandler.Commit ();
2110
2111 string s = String::FromSDKString (text).AsNarrowSDKString ();
2112 StyledTextIOSrcStream_Memory source (s.c_str (), s.length ());
2113 WordProcessorTextIOSinkStream sink (&fEditor);
2114 StyledTextIOReader_RTF textReader (&source, &sink);
2115 fEditor.Replace (0, fEditor.GetEnd (), LED_TCHAR_OF (""), 0); // clear out current text
2116 textReader.Read ();
2117 fEditor.SetEmptySelectionStyle ();
2118 }
2119 CATCH_AND_HANDLE_EXCEPTIONS ();
2120}
2121
2122BSTR ActiveLedItControl::GetBufferTextAsHTML ()
2123{
2124 try {
2125 WordProcessorTextIOSrcStream source (&fEditor);
2126 StyledTextIOWriterSinkStream_Memory sink;
2127 StyledTextIOWriter_HTML textWriter (&source, &sink);
2128 textWriter.Write ();
2129 size_t len = sink.GetLength ();
2130 Memory::StackBuffer<char> buf{Memory::eUninitialized, len + 1};
2131 memcpy (buf.data (), sink.PeekAtData (), len);
2132 buf[len] = '\0';
2133 return CString{buf.data ()}.AllocSysString ();
2134 }
2135 CATCH_AND_HANDLE_EXCEPTIONS ();
2136 Assert (false); /*NOTREACHED*/
2137 return NULL;
2138}
2139
2140void ActiveLedItControl::SetBufferTextAsHTML (LPCTSTR text)
2141{
2142 try {
2143 IdleManager::NonIdleContext nonIdleContext;
2144 fCommandHandler.Commit ();
2145 string s = String::FromSDKString (text).AsNarrowSDKString ();
2146 StyledTextIOSrcStream_Memory source (s.c_str (), s.length ());
2147 WordProcessorTextIOSinkStream sink (&fEditor);
2148 StyledTextIOReader_HTML textReader (&source, &sink);
2149 fEditor.Replace (0, fEditor.GetEnd (), LED_TCHAR_OF (""), 0); // clear out current text
2150 textReader.Read ();
2151 fEditor.SetEmptySelectionStyle ();
2152 }
2153 CATCH_AND_HANDLE_EXCEPTIONS ();
2154}
2155
2156inline void PackBytesIntoVariantSAFEARRAY (const void* bytes, size_t nBytes, VARIANT* into)
2157{
2158 // Note: we must use SafeArrayCreate/SafeArrayAllocData instead of SafeArrayCreateVector
2159 // due to bugs with the OLE32.DLL marshalling code (apparantly manually deletes both pointers and
2160 // doesnt call SafeArrayDelete...
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);
2166 ThrowIfErrorHRESULT (::SafeArrayAllocData (ar));
2167 void* ptr = NULL;
2168 ThrowIfErrorHRESULT (::SafeArrayAccessData (ar, &ptr));
2169 (void)::memcpy (ptr, bytes, nBytes);
2170 ::SafeArrayUnaccessData (ar);
2171 ::VariantInit (into);
2172 into->vt = VT_ARRAY | VT_I1;
2173 into->parray = ar;
2174}
2175
2176VARIANT ActiveLedItControl::GetBufferTextAsDIB ()
2177{
2178 if (fEditor.m_hWnd == NULL) {
2179 VARIANT v;
2180 ::VariantInit (&v);
2181 return v;
2182 }
2183
2184 CWindowDC windowDC (&fEditor);
2185 Led_MFC_TabletFromCDC tabFromDC (&windowDC);
2186 Tablet* tablet = tabFromDC;
2187
2188 DistanceType rhsMargin = 0;
2189 {
2190 const int kRTF_SPEC_DefaultInches = 6; // HACK - see comments in SinkStreamDestination::SetRightMargin ()
2191 TWIPS rhsTWIPS = TWIPS (kRTF_SPEC_DefaultInches * 1440);
2192 rhsMargin = Led_CvtScreenPixelsFromTWIPSH (rhsTWIPS);
2193 }
2194
2195 size_t savedScrollPos = fEditor.GetMarkerPositionOfStartOfWindow ();
2196 Led_Rect savedWindowRect = fEditor.GetWindowRect ();
2197 Led_Rect offscreenRect (0, 0, 1000, rhsMargin); // height doesn't matter as long as more than one row - adjused below...
2198
2199 Bitmap memoryBitmap;
2200 try {
2201 {
2202 Again:
2203 unsigned nTimes = 0;
2204 fEditor.SetWindowRect (offscreenRect);
2205 offscreenRect.bottom = fEditor.GetHeightOfRows (0, fEditor.GetRowCount ()); // make sure extends far enuf down - and then reset the WindowRect accordingly...
2206 fEditor.SetWindowRect (offscreenRect);
2207
2208 DistanceType farthestRHSMargin = fEditor.CalculateFarthestRightMarginInWindow ();
2209 if (farthestRHSMargin != static_cast<DistanceType> (offscreenRect.GetRight ()) and farthestRHSMargin > 10) {
2210 offscreenRect.right = farthestRHSMargin;
2211 if (++nTimes > 5) {
2212 // don't think this can ever happen - but in case...
2213 Assert (false);
2214 }
2215 else {
2216 goto Again;
2217 }
2218 }
2219 }
2220
2221 Tablet memDC;
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);
2226
2227 LedItView::TemporarilyUseTablet tmpUseTablet (fEditor, &memDC, LedItView::TemporarilyUseTablet::eDontDoTextMetricsChangedCall);
2228 fEditor.Draw (offscreenRect, false);
2229
2230 fEditor.SetWindowRect (savedWindowRect);
2231 fEditor.SetTopRowInWindowByMarkerPosition (savedScrollPos);
2232 }
2233 catch (...) {
2234 fEditor.SetWindowRect (savedWindowRect);
2235 fEditor.SetTopRowInWindowByMarkerPosition (savedScrollPos);
2236 throw;
2237 }
2238
2239#define qCopyDIBToClipToTest 0
2240// #define qCopyDIBToClipToTest 1
2241#if qCopyDIBToClipToTest
2242 {
2243 Verify (::OpenClipboard (fEditor.m_hWnd));
2244 Verify (::EmptyClipboard ());
2245 HGLOBAL dataHandle = ::GlobalAlloc (GMEM_DDESHARE, dibRAMSize);
2246 Verify (dataHandle);
2247 ::memcpy (Led_StackBasedHandleLocker (dataHandle).GetPointer (), tmpDIB, dibRAMSize);
2248 Verify (::SetClipboardData (CF_DIB, dataHandle));
2249 Verify (::CloseClipboard ());
2250 ::GlobalFree (dataHandle); // MAYTBE must do a ::GlobalFree (dataHandle) here?? DOCS on SetClipboardData() are ambiguous... - but robert complained of mem-leak and this could be it! - LGP 2000-06-28
2251 }
2252#endif
2253
2254 VARIANT v;
2255 ::VariantInit (&v);
2256
2257 try {
2258 PICTDESC pictDesc;
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; // NOT SURE THIS IS RIGHT???
2264 CComQIPtr<IDispatch> result;
2265 ThrowIfErrorHRESULT (::OleCreatePictureIndirect (&pictDesc, IID_IDispatch, true, (void**)&result));
2266 v.vt = VT_DISPATCH;
2267 v.pdispVal = result.Detach ();
2268 }
2269 catch (...) {
2270 }
2271 return v;
2272}
2273
2274long ActiveLedItControl::GetBufferLength ()
2275{
2276 return static_cast<long> (fEditor.GetLength ());
2277}
2278
2279long ActiveLedItControl::GetMaxLength ()
2280{
2281 return fEditor.GetMaxLength ();
2282}
2283
2284void ActiveLedItControl::SetMaxLength (long maxLength)
2285{
2286 fEditor.SetMaxLength (maxLength < 0 ? -1 : maxLength);
2287}
2288
2289BOOL ActiveLedItControl::GetSupportContextMenu ()
2290{
2291 return fEditor.GetSupportContextMenu ();
2292}
2293
2294void ActiveLedItControl::SetSupportContextMenu (BOOL bNewValue)
2295{
2296 if (bNewValue != GetSupportContextMenu ()) {
2297 fEditor.SetSupportContextMenu (!!bNewValue);
2298 }
2299}
2300
2301BOOL ActiveLedItControl::OLE_GetHideDisabledContextMenuItems ()
2302{
2303 return fEditor.GetHideDisabledContextMenuItems ();
2304}
2305
2306void ActiveLedItControl::OLE_SetHideDisabledContextMenuItems (BOOL bNewValue)
2307{
2308 if (bNewValue != OLE_GetHideDisabledContextMenuItems ()) {
2309 fEditor.SetHideDisabledContextMenuItems (!!bNewValue);
2310 }
2311}
2312
2313BOOL ActiveLedItControl::GetSmartCutAndPaste ()
2314{
2315 return fEditor.GetSmartCutAndPasteMode ();
2316}
2317
2318void ActiveLedItControl::SetSmartCutAndPaste (BOOL bNewValue)
2319{
2320 if (bNewValue != GetSmartCutAndPaste ()) {
2321 fEditor.SetSmartCutAndPasteMode (!!bNewValue);
2322 }
2323}
2324
2325BOOL ActiveLedItControl::OLE_GetSmartQuoteMode ()
2326{
2327 return fEditor.GetSmartQuoteMode ();
2328}
2329
2330void ActiveLedItControl::OLE_SetSmartQuoteMode (BOOL bNewValue)
2331{
2332 if (bNewValue != OLE_GetSmartQuoteMode ()) {
2333 fEditor.SetSmartQuoteMode (!!bNewValue);
2334 }
2335}
2336
2337BOOL ActiveLedItControl::GetWrapToWindow ()
2338{
2339 return fEditor.GetWrapToWindow ();
2340}
2341
2342void ActiveLedItControl::SetWrapToWindow (BOOL bNewValue)
2343{
2344 if (bNewValue != GetWrapToWindow ()) {
2345 fEditor.SetWrapToWindow (!!bNewValue);
2346 }
2347}
2348
2349BOOL ActiveLedItControl::GetShowParagraphGlyphs ()
2350{
2351 return fEditor.GetShowParagraphGlyphs ();
2352}
2353
2354void ActiveLedItControl::SetShowParagraphGlyphs (BOOL bNewValue)
2355{
2356 if (bNewValue != GetShowParagraphGlyphs ()) {
2357 fEditor.SetShowParagraphGlyphs (!!bNewValue);
2358 }
2359}
2360
2361BOOL ActiveLedItControl::GetShowTabGlyphs ()
2362{
2363 return fEditor.GetShowTabGlyphs ();
2364}
2365
2366void ActiveLedItControl::SetShowTabGlyphs (BOOL bNewValue)
2367{
2368 if (bNewValue != GetShowTabGlyphs ()) {
2369 fEditor.SetShowTabGlyphs (!!bNewValue);
2370 }
2371}
2372
2373BOOL ActiveLedItControl::GetShowSpaceGlyphs ()
2374{
2375 return fEditor.GetShowSpaceGlyphs ();
2376}
2377
2378void ActiveLedItControl::SetShowSpaceGlyphs (BOOL bNewValue)
2379{
2380 if (bNewValue != GetShowSpaceGlyphs ()) {
2381 fEditor.SetShowSpaceGlyphs (!!bNewValue);
2382 }
2383}
2384
2385BOOL ActiveLedItControl::OLE_GetUseSelectEOLBOLRowHilightStyle ()
2386{
2387 return fEditor.GetUseSelectEOLBOLRowHilightStyle ();
2388}
2389
2390void ActiveLedItControl::OLE_SetUseSelectEOLBOLRowHilightStyle (BOOL bNewValue)
2391{
2392 if (bNewValue != OLE_GetUseSelectEOLBOLRowHilightStyle ()) {
2393 fEditor.SetUseSelectEOLBOLRowHilightStyle (!!bNewValue);
2394 fEditor.Refresh ();
2395 }
2396}
2397
2398BOOL ActiveLedItControl::OLE_GetShowSecondaryHilight ()
2399{
2400 return fEditor.GetUseSecondaryHilight ();
2401}
2402
2403void ActiveLedItControl::OLE_SetShowSecondaryHilight (BOOL bNewValue)
2404{
2405 if (bNewValue != OLE_GetShowSecondaryHilight ()) {
2406 fEditor.SetUseSecondaryHilight (!!bNewValue);
2407 fEditor.Refresh ();
2408 }
2409}
2410
2411BOOL ActiveLedItControl::OLE_GetShowHidableText ()
2412{
2414 dynamic_cast<ColoredUniformHidableTextMarkerOwner*> (static_cast<HidableTextMarkerOwner*> (fEditor.GetHidableTextDatabase ().get ()));
2415 AssertNotNull (uhtmo);
2416 return !uhtmo->IsHidden ();
2417}
2418
2419void ActiveLedItControl::OLE_SetShowHidableText (BOOL bNewValue)
2420{
2421 IdleManager::NonIdleContext nonIdleContext;
2422 if (bNewValue) {
2423 fEditor.GetHidableTextDatabase ()->ShowAll ();
2424 }
2425 else {
2426 fEditor.GetHidableTextDatabase ()->HideAll ();
2427 }
2428}
2429
2430OLE_COLOR ActiveLedItControl::OLE_GetHidableTextColor ()
2431{
2432 try {
2434 dynamic_cast<ColoredUniformHidableTextMarkerOwner*> (static_cast<HidableTextMarkerOwner*> (fEditor.GetHidableTextDatabase ().get ()));
2435 AssertNotNull (uhtmo);
2436 return uhtmo->GetColor ().GetOSRep ();
2437 }
2438 CATCH_AND_HANDLE_EXCEPTIONS ();
2439 Assert (false);
2440 return 0; // NOTREACHED
2441}
2442
2443void ActiveLedItControl::OLE_SetHidableTextColor (OLE_COLOR color)
2444{
2445 try {
2447 dynamic_cast<ColoredUniformHidableTextMarkerOwner*> (static_cast<HidableTextMarkerOwner*> (fEditor.GetHidableTextDatabase ().get ()));
2448 AssertNotNull (uhtmo);
2449 uhtmo->SetColor (Color (TranslateColor (color)));
2450 fEditor.Refresh ();
2451 }
2452 CATCH_AND_HANDLE_EXCEPTIONS ();
2453}
2454
2455BOOL ActiveLedItControl::OLE_GetHidableTextColored ()
2456{
2457 try {
2459 dynamic_cast<ColoredUniformHidableTextMarkerOwner*> (static_cast<HidableTextMarkerOwner*> (fEditor.GetHidableTextDatabase ().get ()));
2460 AssertNotNull (uhtmo);
2461 return uhtmo->GetColored ();
2462 }
2463 CATCH_AND_HANDLE_EXCEPTIONS ();
2464 Assert (false);
2465 return 0; // NOTREACHED
2466}
2467
2468void ActiveLedItControl::OLE_SetHidableTextColored (BOOL bNewValue)
2469{
2470 try {
2472 dynamic_cast<ColoredUniformHidableTextMarkerOwner*> (static_cast<HidableTextMarkerOwner*> (fEditor.GetHidableTextDatabase ().get ()));
2473 AssertNotNull (uhtmo);
2474 uhtmo->SetColored (!!bNewValue);
2475 fEditor.Refresh ();
2476 }
2477 CATCH_AND_HANDLE_EXCEPTIONS ();
2478}
2479
2480VARIANT ActiveLedItControl::OLE_GetSpellChecker ()
2481{
2482 try {
2483 VARIANT result;
2484 ::VariantInit (&result);
2485 if (fSpellChecker != NULL) {
2486 result.vt = VT_DISPATCH;
2487 result.pdispVal = fSpellChecker;
2488 result.pdispVal->AddRef ();
2489 }
2490 return result;
2491 }
2492 CATCH_AND_HANDLE_EXCEPTIONS ();
2493 return VARIANT{};
2494}
2495
2496void ActiveLedItControl::OLE_SetSpellChecker (VARIANT& newValue)
2497{
2498 // Note: the MSVC Class wizard for OLE / MFC in MSVC.Net 2003 creates the property setter as taking a 'VARIANT' argument. However
2499 // empirically - thats NOT what gets passed! This reference crap (or pointer) is necessary to get the right value assigned to
2500 // us - LGP 2003-06-11
2501 try {
2502 IdleManager::NonIdleContext nonIdleContext;
2503 if (fSpellChecker != NULL) {
2504 fSpellChecker->Release ();
2505 fSpellChecker = NULL;
2506 ChangedSpellCheckerCOMObject ();
2507 }
2508
2509 Assert (fSpellChecker == NULL);
2510 VARIANT tmpV;
2511 ::VariantInit (&tmpV);
2512 if (::VariantChangeType (&tmpV, &newValue, 0, VT_DISPATCH) == S_OK) {
2513 fSpellChecker = tmpV.pdispVal;
2514 if (fSpellChecker != NULL) {
2515 fSpellChecker->AddRef ();
2516 }
2517 ::VariantClear (&tmpV);
2518 ChangedSpellCheckerCOMObject ();
2519 }
2520 else if (::VariantChangeType (&tmpV, &newValue, 0, VT_BSTR) == S_OK) {
2521 // must be a CLSID or a PROGID. Either way - try to create the object
2522 HRESULT hr = S_OK;
2523 if (::SysStringLen (tmpV.bstrVal) != 0) {
2524 CLSID theCLSID;
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));
2528 }
2529 }
2530 ::VariantClear (&tmpV);
2531 ChangedSpellCheckerCOMObject ();
2533 }
2534 else {
2535 ThrowIfErrorHRESULT (DISP_E_TYPEMISMATCH);
2536 }
2537 }
2538 CATCH_AND_HANDLE_EXCEPTIONS ();
2539}
2540
2541void ActiveLedItControl::ChangedSpellCheckerCOMObject ()
2542{
2543 fEditor.SetSpellCheckEngine (NULL);
2544 fLedSpellCheckWrapper = COMBased_SpellCheckEngine (fSpellChecker);
2545 if (fSpellChecker != NULL) {
2546 fEditor.SetSpellCheckEngine (&fLedSpellCheckWrapper);
2547 }
2548}
2549
2550VARIANT ActiveLedItControl::OLE_GetContextMenu ()
2551{
2552 try {
2553 VARIANT result;
2554 ::VariantInit (&result);
2555 if (fConextMenu.p != NULL) {
2556 result.vt = VT_DISPATCH;
2557 result.pdispVal = fConextMenu;
2558 result.pdispVal->AddRef ();
2559 }
2560 return result;
2561 }
2562 CATCH_AND_HANDLE_EXCEPTIONS ();
2564 return VARIANT{};
2565}
2566
2567void ActiveLedItControl::OLE_SetContextMenu (VARIANT& newValue)
2568{
2569 // Note: the MSVC Class wizard for OLE / MFC in MSVC.Net 2003 creates the property setter as taking a 'VARIANT' argument. However
2570 // empirically - thats NOT what gets passed! This reference crap (or pointer) is necessary to get the right value assigned to
2571 // us - LGP 2003-06-11 (originally - but now copied for SetContextMenu - LGP 2004-01-14)
2572 try {
2573 fConextMenu.Release ();
2574 VARIANT tmpV;
2575 ::VariantInit (&tmpV);
2576 if (::VariantChangeType (&tmpV, &newValue, 0, VT_DISPATCH) == S_OK) {
2577 fConextMenu = tmpV.pdispVal;
2578 ::VariantClear (&tmpV);
2579 }
2580 else {
2581 ThrowIfErrorHRESULT (DISP_E_TYPEMISMATCH);
2582 }
2583 }
2584 CATCH_AND_HANDLE_EXCEPTIONS ();
2585}
2586
2587VARIANT ActiveLedItControl::OLE_GetToolbarList ()
2588{
2589 try {
2590 VARIANT result;
2591 ::VariantInit (&result);
2592 if (fToolbarList.p != NULL) {
2593 result.vt = VT_DISPATCH;
2594 result.pdispVal = fToolbarList;
2595 result.pdispVal->AddRef ();
2596 }
2597 return result;
2598 }
2599 CATCH_AND_HANDLE_EXCEPTIONS ();
2601 return VARIANT{};
2602}
2603
2604void ActiveLedItControl::OLE_SetToolbarList (VARIANT& newValue)
2605{
2606 // Note: the MSVC Class wizard for OLE / MFC in MSVC.Net 2003 creates the property setter as taking a 'VARIANT' argument. However
2607 // empirically - thats NOT what gets passed! This reference crap (or pointer) is necessary to get the right value assigned to
2608 // us - LGP 2003-06-11 (originally - but now copied for SetContextMenu - LGP 2004-01-14)
2609 try {
2610 IdleManager::NonIdleContext nonIdleContext;
2611 {
2612#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
2613 CComQIPtr<IALToolbarList> tbl = (IDispatch*)fToolbarList;
2614#else
2615 CComQIPtr<IALToolbarList> tbl = fToolbarList;
2616#endif
2617 if (tbl.p != NULL) {
2618 tbl->NotifyOfOwningActiveLedIt (NULL, NULL);
2619 }
2620 }
2621 fToolbarList.Release ();
2622 VARIANT tmpV;
2623 ::VariantInit (&tmpV);
2624 if (::VariantChangeType (&tmpV, &newValue, 0, VT_DISPATCH) == S_OK) {
2625 fToolbarList = tmpV.pdispVal;
2626 ::VariantClear (&tmpV);
2627 }
2628 else {
2629 ThrowIfErrorHRESULT (DISP_E_TYPEMISMATCH);
2630 }
2631 {
2632#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
2633 CComQIPtr<IALToolbarList> tbl = (IDispatch*)fToolbarList;
2634#else
2635 CComQIPtr<IALToolbarList> tbl = fToolbarList;
2636#endif
2637 if (tbl.p != NULL) {
2638 tbl->NotifyOfOwningActiveLedIt (CComQIPtr<IDispatch> (GetControllingUnknown ()), m_hWnd);
2639 }
2640 }
2641 }
2642 CATCH_AND_HANDLE_EXCEPTIONS ();
2643}
2644
2645VARIANT ActiveLedItControl::OLE_GetBuiltinCommands ()
2646{
2647 try {
2648 if (fBuiltinCommands.p == NULL) {
2649 fBuiltinCommands = GenerateBuiltinCommandsObject ();
2650 }
2651 VARIANT result;
2652 ::VariantInit (&result);
2653 {
2654 result.vt = VT_DISPATCH;
2655 result.pdispVal = fBuiltinCommands;
2656 result.pdispVal->AddRef ();
2657 }
2658 return result;
2659 }
2660 CATCH_AND_HANDLE_EXCEPTIONS ();
2662 return VARIANT{};
2663}
2664
2665namespace {
2666 CComPtr<IDispatch> mkMenu_Select ()
2667 {
2668 try {
2669 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2670 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_MenuItemPopup>::CreateInstance (&o));
2671 CComQIPtr<IDispatch> result = o->GetUnknown ();
2672
2673 o->put_Name (CComBSTR (L"Select"));
2674 o->put_InternalName (CComBSTR (kName_SelectMenu));
2675
2676 o->AppendBuiltinCmd (kCmd_SelectWord);
2677 o->AppendBuiltinCmd (kCmd_SelectTextRow);
2678 o->AppendBuiltinCmd (kCmd_SelectParagraph);
2679
2680 o->AppendBuiltinCmd (kCmd_Separator);
2681
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);
2687
2688 o->AppendBuiltinCmd (kCmd_Separator);
2689
2690 o->AppendBuiltinCmd (kCmd_SelectAll);
2691
2692 o->AppendBuiltinCmd (kCmd_Separator);
2693
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);
2699
2700 o->AppendBuiltinCmd (kCmd_Separator);
2701
2702 o->AppendBuiltinCmd (kCmd_CheckSpelling);
2703 return result;
2704 }
2705 CATCH_AND_HANDLE_EXCEPTIONS ();
2707 return CComPtr<IDispatch>{};
2708 }
2709
2710 CComPtr<IDispatch> mkMenu_Insert ()
2711 {
2712 try {
2713 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2714 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_MenuItemPopup>::CreateInstance (&o));
2715 CComQIPtr<IDispatch> result = o->GetUnknown ();
2716
2717 o->put_Name (CComBSTR (L"Insert"));
2718 o->put_InternalName (CComBSTR (kName_InsertMenu));
2719
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);
2725
2726 o->AppendBuiltinCmd (kCmd_Separator);
2727
2728 o->AppendBuiltinCmd (kCmd_InsertURL);
2729 o->AppendBuiltinCmd (kCmd_InsertSymbol);
2730 return result;
2731 }
2732 CATCH_AND_HANDLE_EXCEPTIONS ();
2734 return CComPtr<IDispatch>{};
2735 }
2736
2737 CComPtr<IDispatch> mkMenu_Font ()
2738 {
2739 try {
2740 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2741 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_MenuItemPopup>::CreateInstance (&o));
2742 CComQIPtr<IDispatch> result = o->GetUnknown ();
2743
2744 o->put_Name (CComBSTR (L"Font"));
2745 o->put_InternalName (CComBSTR (kName_FontNameMenu));
2746
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) {
2752 break; // asserted out before above - now just ignore extra font names...
2753 }
2754 ActiveLedIt_BuiltinCommand* c = ActiveLedIt_BuiltinCommand::mk (BuiltinCmdSpec (cmdNum, mkFontNameCMDName (fontNames[i]).c_str ()));
2755 c->SetName (String::FromSDKString (fontNames[i]).As<wstring> ());
2756 o->Insert (c);
2757 }
2758
2759 return result;
2760 }
2761 CATCH_AND_HANDLE_EXCEPTIONS ();
2763 return CComPtr<IDispatch>{};
2764 }
2765
2766 CComPtr<IDispatch> mkMenu_FontStyle ()
2767 {
2768 try {
2769 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2770 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_MenuItemPopup>::CreateInstance (&o));
2771 CComQIPtr<IDispatch> result = o->GetUnknown ();
2772
2773 o->put_Name (CComBSTR (L"Font Style"));
2774 o->put_InternalName (CComBSTR (kName_FontStyleMenu));
2775
2776 o->AppendBuiltinCmd (kCmd_FontStylePlain);
2777
2778 o->AppendBuiltinCmd (kCmd_Separator);
2779
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);
2786
2787 return result;
2788 }
2789 CATCH_AND_HANDLE_EXCEPTIONS ();
2791 return CComPtr<IDispatch>{};
2792 }
2793
2794 CComPtr<IDispatch> mkMenu_FontSize (bool forComboBox)
2795 {
2796 try {
2797 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2798 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_MenuItemPopup>::CreateInstance (&o));
2799 CComQIPtr<IDispatch> result = o->GetUnknown ();
2800
2801 o->put_Name (CComBSTR (L"Font Size"));
2802 o->put_InternalName (CComBSTR (kName_FontSizeMenu));
2803
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);
2813
2814 if (not forComboBox) {
2815 o->AppendBuiltinCmd (kCmd_Separator);
2816
2817 o->AppendBuiltinCmd (kCmd_FontSizeSmaller);
2818 o->AppendBuiltinCmd (kCmd_FontSizeLarger);
2819
2820 o->AppendBuiltinCmd (kCmd_Separator);
2821 }
2822
2823 o->AppendBuiltinCmd (kCmd_FontSizeOther);
2824
2825 return result;
2826 }
2827 CATCH_AND_HANDLE_EXCEPTIONS ();
2829 return CComPtr<IDispatch>{};
2830 }
2831
2832 CComPtr<IDispatch> mkMenu_FontColor ()
2833 {
2834 try {
2835 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2836 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_MenuItemPopup>::CreateInstance (&o));
2837 CComQIPtr<IDispatch> result = o->GetUnknown ();
2838
2839 o->put_Name (CComBSTR (L"Font Color"));
2840 o->put_InternalName (CComBSTR (kName_FontColorMenu));
2841
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);
2858
2859 o->AppendBuiltinCmd (kCmd_Separator);
2860
2861 o->AppendBuiltinCmd (kCmd_OtherColor);
2862
2863 return result;
2864 }
2865 CATCH_AND_HANDLE_EXCEPTIONS ();
2867 return CComPtr<IDispatch>{};
2868 }
2869
2870 CComPtr<IDispatch> mkMenu_ParagraphJustification ()
2871 {
2872 try {
2873 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2874 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_MenuItemPopup>::CreateInstance (&o));
2875 CComQIPtr<IDispatch> result = o->GetUnknown ();
2876
2877 o->put_Name (CComBSTR (L"Paragraph Justification"));
2878 o->put_InternalName (CComBSTR (kName_ParagraphJustification));
2879
2880 o->AppendBuiltinCmd (kCmd_JustifyLeft);
2881 o->AppendBuiltinCmd (kCmd_JustifyCenter);
2882 o->AppendBuiltinCmd (kCmd_JustifyRight);
2883 o->AppendBuiltinCmd (kCmd_JustifyFull);
2884
2885 return result;
2886 }
2887 CATCH_AND_HANDLE_EXCEPTIONS ();
2889 return CComPtr<IDispatch>{};
2890 }
2891
2892 CComPtr<IDispatch> mkMenu_ListStyle ()
2893 {
2894 try {
2895 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
2896 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_MenuItemPopup>::CreateInstance (&o));
2897 CComQIPtr<IDispatch> result = o->GetUnknown ();
2898
2899 o->put_Name (CComBSTR (L"List Style"));
2900 o->put_InternalName (CComBSTR (kName_ListStyle));
2901
2902 o->AppendBuiltinCmd (kCmd_ListStyle_None);
2903 o->AppendBuiltinCmd (kCmd_ListStyle_Bullet);
2904
2905 return result;
2906 }
2907 CATCH_AND_HANDLE_EXCEPTIONS ();
2909 return CComPtr<IDispatch>{};
2910 }
2911}
2912
2913VARIANT ActiveLedItControl::OLE_GetPredefinedMenus ()
2914{
2915 try {
2916 if (fPredefinedMenus.p == NULL) {
2917 CComObject<ActiveLedIt_StaticCommandList>* o = NULL;
2918 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_StaticCommandList>::CreateInstance (&o));
2919 CComPtr<IDispatch> saved = o; // so auto-deleted on exception
2920
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 ());
2929
2930 fPredefinedMenus = o;
2931 }
2932 VARIANT result;
2933 ::VariantInit (&result);
2934 {
2935 result.vt = VT_DISPATCH;
2936 result.pdispVal = fPredefinedMenus;
2937 result.pdispVal->AddRef ();
2938 }
2939 return result;
2940 }
2941 CATCH_AND_HANDLE_EXCEPTIONS ();
2942 return VARIANT{};
2943}
2944
2945VARIANT ActiveLedItControl::OLE_GetAcceleratorTable ()
2946{
2947 try {
2948 VARIANT result;
2949 ::VariantInit (&result);
2950 if (fAcceleratorTable.p != NULL) {
2951 result.vt = VT_DISPATCH;
2952 result.pdispVal = fAcceleratorTable;
2953 result.pdispVal->AddRef ();
2954 }
2955 return result;
2956 }
2957 CATCH_AND_HANDLE_EXCEPTIONS ();
2958 return VARIANT{};
2959}
2960
2961void ActiveLedItControl::OLE_SetAcceleratorTable (VARIANT& newValue)
2962{
2963 // Note: the MSVC Class wizard for OLE / MFC in MSVC.Net 2003 creates the property setter as taking a 'VARIANT' argument. However
2964 // empirically - thats NOT what gets passed! This reference crap (or pointer) is necessary to get the right value assigned to
2965 // us - LGP 2003-06-11 (originally - but now copied for SetContextMenu - LGP 2004-01-14)
2966 try {
2967 fAcceleratorTable.Release ();
2968 VARIANT tmpV;
2969 ::VariantInit (&tmpV);
2970 if (::VariantChangeType (&tmpV, &newValue, 0, VT_DISPATCH) == S_OK) {
2971 fAcceleratorTable = tmpV.pdispVal;
2972 ::VariantClear (&tmpV);
2973 }
2974 else {
2975 ThrowIfErrorHRESULT (DISP_E_TYPEMISMATCH);
2976 }
2977 }
2978 CATCH_AND_HANDLE_EXCEPTIONS ();
2979}
2980
2981HACCEL ActiveLedItControl::GetCurrentWin32AccelTable ()
2982{
2983 constexpr Time::DurationSeconds kTimeBetweenRecomputes = 10.0s;
2984 if (fWin32AccelTable == nullptr or Time::GetTickCount () - fLastAccelTableUpdateAt > kTimeBetweenRecomputes) {
2985 {
2986#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
2987 CComQIPtr<IALAcceleratorTable> accelTable = (IDispatch*)fAcceleratorTable;
2988#else
2989 CComQIPtr<IALAcceleratorTable> accelTable = fAcceleratorTable;
2990#endif
2991 if (accelTable.p != NULL) {
2992 HACCEL maybeNewAccelTable = NULL;
2993 accelTable->GenerateWin32AcceleratorTable (&maybeNewAccelTable);
2994 fLastAccelTableUpdateAt = Time::GetTickCount ();
2995
2996 // Now - to avoid causing problems with callers of GetCurrentWin32AccelTable () that might want to hang onto a
2997 // pointer (and wouldn't want it to get stale ;-)) - like OnGetControlInfo - try to avoid changing the handle
2998 // if not actually needed. See if the old and new handles are identical - and if so - delete the NEW one rather
2999 // than the old...
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))) {
3004 Memory::StackBuffer<ACCEL> oldOne{accelTableSize};
3005 Verify (::CopyAcceleratorTable (fWin32AccelTable, oldOne.data (), static_cast<int> (accelTableSize)) ==
3006 static_cast<int> (accelTableSize));
3007 Memory::StackBuffer<ACCEL> newOne{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) {
3011 keepOld = true;
3012 }
3013 }
3014 }
3015 if (keepOld) {
3016 ::DestroyAcceleratorTable (maybeNewAccelTable);
3017 }
3018 else {
3019 if (fWin32AccelTable != NULL) {
3020 ::DestroyAcceleratorTable (fWin32AccelTable);
3021 fWin32AccelTable = NULL;
3022 }
3023 fWin32AccelTable = maybeNewAccelTable;
3024 }
3025 }
3026 }
3027 }
3028 return fWin32AccelTable;
3029}
3030
3031IDispatch* ActiveLedItControl::OLE_GetDefaultContextMenu ()
3032{
3033 try {
3034 CComObject<ActiveLedIt_UserCommandList>* o = NULL;
3035 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_UserCommandList>::CreateInstance (&o));
3036 CComQIPtr<IDispatch> saved = o->GetUnknown (); // so deleted on exceptions during the subsequent add code
3037
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);
3046
3047 o->Insert (mkMenu_Select ());
3048 o->Insert (mkMenu_Insert ());
3049
3050 o->AppendBuiltinCmd (kCmd_Separator);
3051 o->AppendBuiltinCmd (kCmd_RemoveTableRows);
3052 o->AppendBuiltinCmd (kCmd_RemoveTableColumns);
3053 o->AppendBuiltinCmd (kCmd_Separator);
3054
3055 o->Insert (mkMenu_Font ());
3056 o->Insert (mkMenu_FontStyle ());
3057 o->Insert (mkMenu_FontSize (false));
3058 o->Insert (mkMenu_FontColor ());
3059
3060 o->AppendBuiltinCmd (kCmd_ChooseFontDialog);
3061 o->AppendBuiltinCmd (kCmd_Separator);
3062
3063 o->Insert (mkMenu_ParagraphJustification ());
3064
3065 o->AppendBuiltinCmd (kCmd_ParagraphIndents);
3066 o->AppendBuiltinCmd (kCmd_ParagraphSpacing);
3067 o->AppendBuiltinCmd (kCmd_Separator);
3068
3069 o->Insert (mkMenu_ListStyle ());
3070
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);
3077
3078 o->AppendBuiltinCmd (kCmd_Print);
3079 o->AppendBuiltinCmd (kCmd_PrintSetup);
3080
3081 o->AppendBuiltinCmd (kCmd_Separator);
3082
3083 o->AppendBuiltinCmd (kCmd_BrowseOnlineHelp);
3084 o->AppendBuiltinCmd (kCmd_CheckForUpdatesOnWeb);
3085
3086 o->AppendBuiltinCmd (kCmd_Separator);
3087
3088 o->AppendBuiltinCmd (kCmd_About);
3089
3090 o->AddRef (); // cuz returning a pointer
3091 return saved;
3092 }
3093 CATCH_AND_HANDLE_EXCEPTIONS ();
3095 return nullptr;
3096}
3097
3098IDispatch* ActiveLedItControl::OLE_GetDefaultAcceleratorTable ()
3099{
3100 try {
3101 CComObject<ActiveLedIt_AcceleratorTable>* o = NULL;
3102 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_AcceleratorTable>::CreateInstance (&o));
3103 CComQIPtr<IDispatch> saved = o->GetUnknown (); // so deleted on exceptions during the subsequent add code
3104
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);
3133#if 0
3134 o->AppendACCEL ("Help", static_cast<AcceleratorModifierFlag> (eVIRTKEY), VK_F1);
3135 o->AppendACCEL ("ContextHelp", static_cast<AcceleratorModifierFlag> (eVIRTKEY | eSHIFT), VK_F1);
3136#endif
3137 o->AddRef (); // cuz returning a pointer
3138 return saved;
3139 }
3140 CATCH_AND_HANDLE_EXCEPTIONS ();
3142 return nullptr;
3143}
3144
3145IDispatch* ActiveLedItControl::OLE_MakeNewPopupMenuItem ()
3146{
3147 try {
3148 CComObject<ActiveLedIt_MenuItemPopup>* o = NULL;
3149 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_MenuItemPopup>::CreateInstance (&o));
3150 o->AddRef (); // cuz returning a pointer
3151 CComQIPtr<IDispatch> result = o->GetUnknown ();
3152 return result;
3153 }
3154 CATCH_AND_HANDLE_EXCEPTIONS ();
3156 return nullptr;
3157}
3158
3159IDispatch* ActiveLedItControl::OLE_MakeNewUserMenuItem ()
3160{
3161 try {
3162 CComObject<ActiveLedIt_UserCommand>* o = NULL;
3163 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_UserCommand>::CreateInstance (&o));
3164 o->AddRef (); // cuz returning a pointer
3165 CComQIPtr<IDispatch> result = o->GetUnknown ();
3166 return result;
3167 }
3168 CATCH_AND_HANDLE_EXCEPTIONS ();
3170 return nullptr;
3171}
3172
3173IDispatch* ActiveLedItControl::OLE_MakeNewAcceleratorElement ()
3174{
3175 try {
3176 CComObject<ActiveLedIt_AcceleratorElement>* o = NULL;
3177 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_AcceleratorElement>::CreateInstance (&o));
3178 o->AddRef (); // cuz returning a pointer
3179 CComQIPtr<IDispatch> result = o->GetUnknown ();
3180 return result;
3181 }
3182 CATCH_AND_HANDLE_EXCEPTIONS ();
3184 return nullptr;
3185}
3186
3187void ActiveLedItControl::OLE_InvokeCommand (const VARIANT& command)
3188{
3189 try {
3190 IdleManager::NonIdleContext nonIdleContext;
3191 UINT32 cmdNum = CmdObjOrName2Num (command);
3192 if (cmdNum != 0) {
3193 (void)::SendMessage (fEditor.GetHWND (), WM_COMMAND, cmdNum, 0);
3194 return;
3195 }
3196 ThrowIfErrorHRESULT (TYPE_E_ELEMENTNOTFOUND);
3197 }
3198 CATCH_AND_HANDLE_EXCEPTIONS ();
3199}
3200
3201BOOL ActiveLedItControl::OLE_CommandEnabled (const VARIANT& command)
3202{
3203 try {
3204 UINT32 cmdNum = CmdObjOrName2Num (command);
3205
3206 struct MyCmdUI : CCmdUI {
3207 MyCmdUI ()
3208 : fEnabled{false}
3209 {
3210 }
3211 virtual void Enable (BOOL bOn) override
3212 {
3213 fEnabled = !!bOn;
3214 m_bEnableChanged = TRUE;
3215 }
3216 virtual void SetCheck (int /*nCheck*/) override
3217 {
3218 }
3219 virtual void SetText (LPCTSTR /*lpszText*/) override
3220 {
3221 }
3222
3223 bool fEnabled;
3224 };
3225 MyCmdUI state;
3226 state.m_nID = cmdNum;
3227 state.DoUpdate (&fEditor, true);
3228 return state.fEnabled;
3229 }
3230 CATCH_AND_HANDLE_EXCEPTIONS ();
3232 return false;
3233}
3234
3235BOOL ActiveLedItControl::OLE_CommandChecked (const VARIANT& command)
3236{
3237 try {
3238 UINT32 cmdNum = CmdObjOrName2Num (command);
3239
3240 struct MyCmdUI : CCmdUI {
3241 MyCmdUI ()
3242 : CCmdUI ()
3243 , fChecked (false)
3244 {
3245 }
3246 virtual void Enable ([[maybe_unused]] BOOL bOn) override
3247 {
3248 m_bEnableChanged = TRUE;
3249 }
3250 virtual void SetCheck (int nCheck) override
3251 {
3252 fChecked = nCheck != 0;
3253 }
3254 virtual void SetText (LPCTSTR /*lpszText*/) override
3255 {
3256 }
3257
3258 bool fChecked;
3259 };
3260 MyCmdUI state;
3261 state.m_nID = cmdNum;
3262 state.DoUpdate (&fEditor, true);
3263 return state.fChecked;
3264 }
3265 CATCH_AND_HANDLE_EXCEPTIONS ();
3267 return false;
3268}
3269
3270IDispatch* ActiveLedItControl::OLE_MakeNewToolbarList ()
3271{
3272 try {
3273 CComObject<ActiveLedIt_ToolbarList>* o = NULL;
3274 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_ToolbarList>::CreateInstance (&o));
3275 o->AddRef (); // cuz returning a pointer
3276 CComQIPtr<IDispatch> result = o->GetUnknown ();
3277 return result;
3278 }
3279 CATCH_AND_HANDLE_EXCEPTIONS ();
3281 return nullptr;
3282}
3283
3284CComPtr<IDispatch> ActiveLedItControl::MakeNewToolbar ()
3285{
3286 CComPtr<IDispatch> tmp;
3287 tmp.Attach (OLE_MakeNewToolbar ());
3288 return tmp;
3289}
3290
3291IDispatch* ActiveLedItControl::OLE_MakeNewToolbar ()
3292{
3293 try {
3294 CComObject<ActiveLedIt_Toolbar>* o = NULL;
3295 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_Toolbar>::CreateInstance (&o));
3296 o->AddRef (); // cuz returning a pointer
3297 CComQIPtr<IDispatch> result = o->GetUnknown ();
3298 return result;
3299 }
3300 CATCH_AND_HANDLE_EXCEPTIONS ();
3302 return nullptr;
3303}
3304
3305IDispatch* ActiveLedItControl::OLE_MakeIconButtonToolbarItem ()
3306{
3307 try {
3308 CComObject<ActiveLedIt_IconButtonToolbarElement>* o = NULL;
3309 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_IconButtonToolbarElement>::CreateInstance (&o));
3310 o->AddRef (); // cuz returning a pointer
3311 CComQIPtr<IDispatch> result = o->GetUnknown ();
3312 return result;
3313 }
3314 CATCH_AND_HANDLE_EXCEPTIONS ();
3316 return nullptr;
3317}
3318
3319CComPtr<IDispatch> ActiveLedItControl::MakeSeparatorToolbarItem ()
3320{
3321 CComPtr<IDispatch> tmp;
3322 tmp.Attach (OLE_MakeSeparatorToolbarItem ());
3323 return tmp;
3324}
3325
3326IDispatch* ActiveLedItControl::OLE_MakeSeparatorToolbarItem ()
3327{
3328 try {
3329 CComObject<ActiveLedIt_SeparatorToolbarElement>* o = NULL;
3330 ThrowIfErrorHRESULT (CComObject<ActiveLedIt_SeparatorToolbarElement>::CreateInstance (&o));
3331 o->AddRef (); // cuz returning a pointer
3332 CComQIPtr<IDispatch> result = o->GetUnknown ();
3333 return result;
3334 }
3335 CATCH_AND_HANDLE_EXCEPTIONS ();
3337 return nullptr;
3338}
3339
3340CComPtr<IDispatch> ActiveLedItControl::MakeBuiltinToolbar (LPCOLESTR builtinToolbarName)
3341{
3342 if (wstring{builtinToolbarName} == L"Standard") {
3343 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3344#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3345 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3346#else
3347 CComQIPtr<IALToolbar> tb = newTB;
3348#endif
3349 ThrowIfErrorHRESULT (tb->MergeAdd (MakeBuiltinToolbar (L"EditBar")));
3350 ThrowIfErrorHRESULT (tb->Add (MakeSeparatorToolbarItem ()));
3351 ThrowIfErrorHRESULT (tb->MergeAdd (MakeBuiltinToolbar (L"FormatBar")));
3352 ThrowIfErrorHRESULT (tb->Add (MakeSeparatorToolbarItem ()));
3353 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("Print"))));
3354 ThrowIfErrorHRESULT (tb->Add (MakeSeparatorToolbarItem ()));
3355 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("ActiveLedIt"))));
3356 return newTB;
3357 }
3358
3359 if (wstring{builtinToolbarName} == L"StandardToolsOnly") { // not including format bar - assumes will be added separately
3360 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3361#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3362 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3363#else
3364 CComQIPtr<IALToolbar> tb = newTB;
3365#endif
3366 ThrowIfErrorHRESULT (tb->MergeAdd (MakeBuiltinToolbar (L"EditBar")));
3367 ThrowIfErrorHRESULT (tb->Add (MakeSeparatorToolbarItem ()));
3368 ThrowIfErrorHRESULT (tb->MergeAdd (MakeBuiltinToolbar (L"SelectBar")));
3369 ThrowIfErrorHRESULT (tb->Add (MakeSeparatorToolbarItem ()));
3370 ThrowIfErrorHRESULT (tb->MergeAdd (MakeBuiltinToolbar (L"InsertBar")));
3371 ThrowIfErrorHRESULT (tb->Add (MakeSeparatorToolbarItem ()));
3372 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("Print"))));
3373 ThrowIfErrorHRESULT (tb->Add (MakeSeparatorToolbarItem ()));
3374 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("ActiveLedIt"))));
3375 return newTB;
3376 }
3377
3378 if (wstring{builtinToolbarName} == L"FormatBar") {
3379 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3380#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3381 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3382#else
3383 CComQIPtr<IALToolbar> tb = newTB;
3384#endif
3385 ThrowIfErrorHRESULT (tb->MergeAdd (MakeBuiltinToolbar (L"CharacterFormatBar")));
3386 ThrowIfErrorHRESULT (tb->Add (MakeSeparatorToolbarItem ()));
3387 ThrowIfErrorHRESULT (tb->MergeAdd (MakeBuiltinToolbar (L"ParagraphFormatBar")));
3388 return newTB;
3389 }
3390
3391 if (wstring{builtinToolbarName} == L"EditBar") {
3392 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3393#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3394 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3395#else
3396 CComQIPtr<IALToolbar> tb = newTB;
3397#endif
3398 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("Undo"))));
3399 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("Redo"))));
3400 ThrowIfErrorHRESULT (tb->Add (MakeSeparatorToolbarItem ()));
3401 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("Cut"))));
3402 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("Copy"))));
3403 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("Paste"))));
3404 return newTB;
3405 }
3406
3407 if (wstring{builtinToolbarName} == L"SelectBar") {
3408 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3409#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3410 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3411#else
3412 CComQIPtr<IALToolbar> tb = newTB;
3413#endif
3414 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("Find"))));
3415 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("Replace"))));
3416 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("CheckSpelling"))));
3417 return newTB;
3418 }
3419
3420 if (wstring{builtinToolbarName} == L"InsertBar") {
3421 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3422#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3423 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3424#else
3425 CComQIPtr<IALToolbar> tb = newTB;
3426#endif
3427 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("InsertTable"))));
3428 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("InsertURL"))));
3429 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("InsertSymbol"))));
3430 return newTB;
3431 }
3432
3433 if (wstring{builtinToolbarName} == L"CharacterFormatBar") {
3434 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3435#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3436 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3437#else
3438 CComQIPtr<IALToolbar> tb = newTB;
3439#endif
3440 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("FontNameComboBox"))));
3441 ThrowIfErrorHRESULT (tb->Add (MakeSeparatorToolbarItem ()));
3442 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("FontSizeComboBox"))));
3443 ThrowIfErrorHRESULT (tb->Add (MakeSeparatorToolbarItem ()));
3444 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("Bold"))));
3445 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("Italic"))));
3446 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("Underline"))));
3447 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("FontColor"))));
3448 return newTB;
3449 }
3450
3451 if (wstring{builtinToolbarName} == L"ParagraphFormatBar") {
3452 CComPtr<IDispatch> newTB = MakeNewToolbar ();
3453#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3454 CComQIPtr<IALToolbar> tb = (IDispatch*)newTB;
3455#else
3456 CComQIPtr<IALToolbar> tb = newTB;
3457#endif
3458 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("JustifyLeft"))));
3459 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("JustifyCenter"))));
3460 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("JustifyRight"))));
3461 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("JustifyFull"))));
3462 ThrowIfErrorHRESULT (tb->Add (MakeSeparatorToolbarItem ()));
3463 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("ParagraphIndents"))));
3464 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("ParagraphSpacing"))));
3465 ThrowIfErrorHRESULT (tb->Add (MakeSeparatorToolbarItem ()));
3466 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("ListStyle_None"))));
3467 ThrowIfErrorHRESULT (tb->Add (MakeBuiltinToolbarItem (CComBSTR ("ListStyle_Bullet"))));
3468 return newTB;
3469 }
3470
3471 // if name doesn't match - return NULL
3472 return CComPtr<IDispatch> ();
3473}
3474
3475IDispatch* ActiveLedItControl::OLE_MakeBuiltinToolbar (LPCOLESTR builtinToolbarName)
3476{
3477 try {
3478 return MakeBuiltinToolbar (builtinToolbarName).Detach ();
3479 }
3480 CATCH_AND_HANDLE_EXCEPTIONS ();
3482 return nullptr;
3483}
3484
3485CComPtr<IDispatch> ActiveLedItControl::MakeBuiltinToolbarItem (LPCOLESTR builtinToolbarItemName)
3486{
3487 CComPtr<IDispatch> tmp;
3488 tmp.Attach (OLE_MakeBuiltinToolbarItem (builtinToolbarItemName));
3489 return tmp;
3490}
3491
3492IDispatch* ActiveLedItControl::OLE_MakeBuiltinToolbarItem (LPCOLESTR builtinToolbarItemName)
3493{
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},
3518 };
3519
3520 try {
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 ();
3524 }
3525 }
3526
3527 if (wstring (builtinToolbarItemName) == wstring (L"FontNameComboBox")) {
3528 return MakeBuiltinComboBoxToolbarItem (mkMenu_Font ()).Detach ();
3529 }
3530 else if (wstring (builtinToolbarItemName) == wstring (L"FontSizeComboBox")) {
3531 return MakeBuiltinComboBoxToolbarItem (mkMenu_FontSize (true)).Detach ();
3532 }
3533 else if (wstring (builtinToolbarItemName) == wstring (L"FontColor")) {
3534 return mkIconElement (kToolbarButton_FontColor_ResID, mkMenu_FontColor ()).Detach ();
3535 }
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 ();
3540 }
3541 return NULL;
3542 }
3543 CATCH_AND_HANDLE_EXCEPTIONS ();
3545 return nullptr;
3546}
3547
3548CComPtr<IDispatch> ActiveLedItControl::mkIconElement (int iconResID)
3549{
3550 CComPtr<IDispatch> item;
3551 item.Attach (OLE_MakeIconButtonToolbarItem ());
3552#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3553 CComQIPtr<IALIconButtonToolbarElement> newIconButton = (IDispatch*)item;
3554#else
3555 CComQIPtr<IALIconButtonToolbarElement> newIconButton = item;
3556#endif
3557
3558 CComPtr<IDispatch> picture;
3559 {
3560 PICTDESC pictDesc;
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));
3566 }
3567
3568 ThrowIfErrorHRESULT (newIconButton->put_ButtonImage (picture));
3569 return item;
3570}
3571
3572CComPtr<IDispatch> ActiveLedItControl::mkIconElement (const ToolBarIconSpec& s)
3573{
3574 CComPtr<IDispatch> item = mkIconElement (s.fIconResId);
3575#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3576 CComQIPtr<IALIconButtonToolbarElement> iconButton = (IDispatch*)item;
3577#else
3578 CComQIPtr<IALIconButtonToolbarElement> iconButton = item;
3579#endif
3580
3581 ThrowIfErrorHRESULT (iconButton->put_Command (CComVariant{s.fCmdName}));
3582 ThrowIfErrorHRESULT (iconButton->put_ButtonStyle (s.fButtonStyle));
3583 return item;
3584}
3585
3586CComPtr<IDispatch> ActiveLedItControl::mkIconElement (int iconResID, CComPtr<IDispatch> cmdList)
3587{
3588 CComPtr<IDispatch> item = mkIconElement (iconResID);
3589#if qCompilerAndStdLib_altComPtrCvt2ComQIPtrRequiresExtraCast_Buggy
3590 CComQIPtr<IALIconButtonToolbarElement> iconButton = (IDispatch*)item;
3591#else
3592 CComQIPtr<IALIconButtonToolbarElement> iconButton = item;
3593#endif
3594
3595 ThrowIfErrorHRESULT (iconButton->put_Command (CComVariant{cmdList}));
3596 return item;
3597}
3598
3599CComPtr<IDispatch> ActiveLedItControl::MakeBuiltinComboBoxToolbarItem (CComPtr<IDispatch> cmdList)
3600{
3601 try {
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;
3607#else
3608 CComQIPtr<IALComboBoxToolbarElement> alcomboBox = result;
3609#endif
3610 ThrowIfErrorHRESULT (alcomboBox->put_CommandList (cmdList));
3611 return result;
3612 }
3613 CATCH_AND_HANDLE_EXCEPTIONS ();
3615 return CComPtr<IDispatch>{};
3616}
3617
3618VARIANT ActiveLedItControl::OLE_GetCurrentEventArguments ()
3619{
3620 VARIANT result;
3621 ::VariantInit (&result);
3622 {
3623 result.vt = VT_DISPATCH;
3624 result.pdispVal = fCurrentEventArguments;
3625 if (result.pdispVal != NULL) {
3626 result.pdispVal->AddRef ();
3627 }
3628 }
3629 return result;
3630}
3631
3632long ActiveLedItControl::GetSelStart ()
3633{
3634 return static_cast<long> (fEditor.GetSelectionStart ());
3635}
3636
3637void ActiveLedItControl::SetSelStart (long start)
3638{
3639 size_t s;
3640 size_t e;
3641 fEditor.GetSelection (&s, &e);
3642 size_t l = e - s;
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);
3647}
3648
3649long ActiveLedItControl::GetSelLength ()
3650{
3651 size_t s;
3652 size_t e;
3653 fEditor.GetSelection (&s, &e);
3654 return static_cast<long> (e - s);
3655}
3656
3657void ActiveLedItControl::SetSelLength (long length)
3658{
3659 if (length == -1) {
3660 length = INT_MAX;
3661 }
3662 if (length < 0) {
3663 length = 0;
3664 }
3665 size_t s;
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);
3671}
3672
3673BSTR ActiveLedItControl::GetSelText ()
3674{
3675 try {
3676 size_t s;
3677 size_t e;
3678 fEditor.GetSelection (&s, &e);
3679 size_t len = e - s;
3680 Memory::StackBuffer<Led_tChar> buf{Memory::eUninitialized, len + 1};
3681 fEditor.CopyOut (s, len, buf.data ());
3682 buf[len] = '\0';
3683 return CString{buf.data ()}.AllocSysString ();
3684 }
3685 CATCH_AND_HANDLE_EXCEPTIONS ();
3686 Assert (false); /*NOTREACHED*/
3687 return NULL;
3688}
3689
3690void ActiveLedItControl::SetSelText (LPCTSTR text)
3691{
3692 try {
3693 size_t len = ::_tcslen (text);
3694 Memory::StackBuffer<Led_tChar> buf{Memory::eUninitialized, len + 1};
3695 len = Characters::NativeToNL<Led_tChar> (Led_SDKString2tString (text).c_str (), len, buf.data (), len + 1);
3696 size_t s;
3697 size_t e;
3698 fEditor.GetSelection (&s, &e);
3699 fEditor.Replace (s, e, buf.data (), len);
3700 if (s != e) {
3701 fEditor.SetSelection (s, s + len);
3702 }
3703 }
3704 CATCH_AND_HANDLE_EXCEPTIONS ();
3705}
3706
3707BSTR ActiveLedItControl::GetSelTextAsRTF ()
3708{
3709 try {
3710 WordProcessorTextIOSrcStream source (&fEditor, fEditor.GetSelectionStart (), fEditor.GetSelectionEnd ());
3711 StyledTextIOWriterSinkStream_Memory sink;
3712 StyledTextIOWriter_RTF textWriter (&source, &sink);
3713 textWriter.Write ();
3714 size_t len = sink.GetLength ();
3715 Memory::StackBuffer<char> buf{Memory::eUninitialized, len + 1};
3716 ::memcpy (buf.data (), sink.PeekAtData (), len);
3717 buf[len] = '\0';
3718 return CString (buf.data ()).AllocSysString ();
3719 }
3720 CATCH_AND_HANDLE_EXCEPTIONS ();
3721 Assert (false); /*NOTREACHED*/
3722 return NULL;
3723}
3724
3725void ActiveLedItControl::SetSelTextAsRTF (LPCTSTR text)
3726{
3727 try {
3728 IdleManager::NonIdleContext nonIdleContext;
3729 fCommandHandler.Commit ();
3730 StyledTextIOSrcStream_Memory source (text, text == NULL ? 0 : ::_tcslen (text));
3731 WordProcessorTextIOSinkStream sink (&fEditor, fEditor.GetSelectionStart ());
3732 StyledTextIOReader_RTF textReader (&source, &sink);
3733 fEditor.Replace (fEditor.GetSelectionStart (), fEditor.GetSelectionEnd (), LED_TCHAR_OF (""), 0);
3734 textReader.Read ();
3735 fEditor.SetEmptySelectionStyle ();
3736 }
3737 CATCH_AND_HANDLE_EXCEPTIONS ();
3738
3739 // SHOULD FIX THIS CODE TO ASSURE OUTPUTTED TEXT REMAINS SELECTED!!!
3740}
3741
3742BSTR ActiveLedItControl::GetSelTextAsHTML ()
3743{
3744 try {
3745 WordProcessorTextIOSrcStream source (&fEditor, fEditor.GetSelectionStart (), fEditor.GetSelectionEnd ());
3746 StyledTextIOWriterSinkStream_Memory sink;
3747 StyledTextIOWriter_HTML textWriter (&source, &sink);
3748 textWriter.Write ();
3749 size_t len = sink.GetLength ();
3750 Memory::StackBuffer<char> buf{Memory::eUninitialized, len + 1};
3751 ::memcpy (buf.data (), sink.PeekAtData (), len);
3752 buf[len] = '\0';
3753 return CString (buf.data ()).AllocSysString ();
3754 }
3755 CATCH_AND_HANDLE_EXCEPTIONS ();
3756 Assert (false);
3757 return 0; // NOTREACHED
3758}
3759
3760void ActiveLedItControl::SetSelTextAsHTML (LPCTSTR text)
3761{
3762 try {
3763 IdleManager::NonIdleContext nonIdleContext;
3764 fCommandHandler.Commit ();
3765 StyledTextIOSrcStream_Memory source (text, text == NULL ? 0 : ::_tcslen (text));
3766 WordProcessorTextIOSinkStream sink (&fEditor, fEditor.GetSelectionStart ());
3767 StyledTextIOReader_HTML textReader (&source, &sink);
3768 fEditor.Replace (fEditor.GetSelectionStart (), fEditor.GetSelectionEnd (), LED_TCHAR_OF (""), 0);
3769 textReader.Read ();
3770 fEditor.SetEmptySelectionStyle ();
3771 // SHOULD FIX THIS CODE TO ASSURE OUTPUTTED TEXT REMAINS SELECTED!!!
3772 }
3773 CATCH_AND_HANDLE_EXCEPTIONS ();
3774}
3775
3776OLE_COLOR ActiveLedItControl::GetSelColor ()
3777{
3778 try {
3779 Assert (fEditor.GetSelectionEnd () >= fEditor.GetSelectionStart ());
3780 size_t selectionLength = fEditor.GetSelectionEnd () - fEditor.GetSelectionStart ();
3781 IncrementalFontSpecification fsp = fEditor.GetContinuousStyleInfo (fEditor.GetSelectionStart (), selectionLength);
3782 //HOW DO YOU SAY RETURNS ERROR??? LIKE YOU CAN WITH ATL???
3783 if (not fsp.GetTextColor_Valid ()) {
3784 //HACK!!!
3785 fsp = fEditor.GetContinuousStyleInfo (fEditor.GetSelectionStart (), 0);
3786 Assert (fsp.GetTextColor_Valid ());
3787 }
3788 return fsp.GetTextColor ().GetOSRep ();
3789 }
3790 CATCH_AND_HANDLE_EXCEPTIONS ();
3791 Assert (false);
3792 return 0; // NOTREACHED
3793}
3794
3795void ActiveLedItControl::SetSelColor (OLE_COLOR color)
3796{
3797 try {
3798 IdleManager::NonIdleContext nonIdleContext;
3799 fCommandHandler.Commit ();
3800 IncrementalFontSpecification applyFontSpec;
3801 applyFontSpec.SetTextColor (Color (TranslateColor (color)));
3802 fEditor.InteractiveSetFont (applyFontSpec);
3803 }
3804 CATCH_AND_HANDLE_EXCEPTIONS ();
3805}
3806
3807BSTR ActiveLedItControl::GetSelFontFace ()
3808{
3809 try {
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 ();
3815 }
3816 return CString (fsp.GetFontName ().c_str ()).AllocSysString ();
3817 }
3818 CATCH_AND_HANDLE_EXCEPTIONS ();
3819 Assert (false);
3820 return 0; // NOTREACHED
3821}
3822
3823void ActiveLedItControl::SetSelFontFace (LPCTSTR fontFace)
3824{
3825 try {
3826 IdleManager::NonIdleContext nonIdleContext;
3827 fCommandHandler.Commit ();
3828 IncrementalFontSpecification applyFontSpec;
3829 applyFontSpec.SetFontName (fontFace);
3830 fEditor.InteractiveSetFont (applyFontSpec);
3831 }
3832 CATCH_AND_HANDLE_EXCEPTIONS ();
3833}
3834
3835long ActiveLedItControl::GetSelFontSize ()
3836{
3837 try {
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 ()) {
3842 return 0;
3843 }
3844 return fsp.GetPointSize ();
3845 }
3846 CATCH_AND_HANDLE_EXCEPTIONS ();
3847 Assert (false);
3848 return 0; // NOTREACHED
3849}
3850
3851void ActiveLedItControl::SetSelFontSize (long size)
3852{
3853 try {
3854 IdleManager::NonIdleContext nonIdleContext;
3855 fCommandHandler.Commit ();
3856 IncrementalFontSpecification applyFontSpec;
3857 if (size <= 0) {
3858 size = 2; // minsize?
3859 }
3860 if (size >= 128) {
3861 size = 128;
3862 }
3863 applyFontSpec.SetPointSize (static_cast<unsigned short> (size));
3864 fEditor.InteractiveSetFont (applyFontSpec);
3865 }
3866 CATCH_AND_HANDLE_EXCEPTIONS ();
3867}
3868
3869long ActiveLedItControl::GetSelBold ()
3870{
3871 try {
3872 size_t selStart;
3873 size_t selEnd;
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 ()) {
3879 return 2;
3880 }
3881 return fsp.GetStyle_Bold () ? 1 : 0;
3882 }
3883 CATCH_AND_HANDLE_EXCEPTIONS ();
3884 Assert (false);
3885 return 0; // NOTREACHED
3886}
3887
3888void ActiveLedItControl::SetSelBold (long bold)
3889{
3890 try {
3891 IdleManager::NonIdleContext nonIdleContext;
3892 fCommandHandler.Commit ();
3893 IncrementalFontSpecification applyFontSpec;
3894 applyFontSpec.SetStyle_Bold (!!bold);
3895 fEditor.InteractiveSetFont (applyFontSpec);
3896 }
3897 CATCH_AND_HANDLE_EXCEPTIONS ();
3898}
3899
3900long ActiveLedItControl::GetSelItalic ()
3901{
3902 try {
3903 size_t selStart;
3904 size_t selEnd;
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 ()) {
3910 return 2;
3911 }
3912 return fsp.GetStyle_Italic () ? 1 : 0;
3913 }
3914 CATCH_AND_HANDLE_EXCEPTIONS ();
3915 Assert (false);
3916 return 0; // NOTREACHED
3917}
3918
3919void ActiveLedItControl::SetSelItalic (long italic)
3920{
3921 try {
3922 IdleManager::NonIdleContext nonIdleContext;
3923 fCommandHandler.Commit ();
3924 IncrementalFontSpecification applyFontSpec;
3925 applyFontSpec.SetStyle_Italic (!!italic);
3926 fEditor.InteractiveSetFont (applyFontSpec);
3927 }
3928 CATCH_AND_HANDLE_EXCEPTIONS ();
3929}
3930
3931long ActiveLedItControl::GetSelStrikeThru ()
3932{
3933 try {
3934 size_t selStart;
3935 size_t selEnd;
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 ()) {
3941 return 2;
3942 }
3943 return fsp.GetStyle_Strikeout () ? 1 : 0;
3944 }
3945 CATCH_AND_HANDLE_EXCEPTIONS ();
3946 Assert (false);
3947 return 0; // NOTREACHED
3948}
3949
3950void ActiveLedItControl::SetSelStrikeThru (long strikeThru)
3951{
3952 try {
3953 IdleManager::NonIdleContext nonIdleContext;
3954 fCommandHandler.Commit ();
3955 IncrementalFontSpecification applyFontSpec;
3956 applyFontSpec.SetStyle_Strikeout (!!strikeThru);
3957 fEditor.InteractiveSetFont (applyFontSpec);
3958 }
3959 CATCH_AND_HANDLE_EXCEPTIONS ();
3960}
3961
3962long ActiveLedItControl::GetSelUnderline ()
3963{
3964 try {
3965 size_t selStart;
3966 size_t selEnd;
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 ()) {
3972 return 2;
3973 }
3974 return fsp.GetStyle_Underline () ? 1 : 0;
3975 }
3976 CATCH_AND_HANDLE_EXCEPTIONS ();
3977 Assert (false);
3978 return 0; // NOTREACHED
3979}
3980
3981void ActiveLedItControl::SetSelUnderline (long underline)
3982{
3983 try {
3984 IdleManager::NonIdleContext nonIdleContext;
3985 fCommandHandler.Commit ();
3986 IncrementalFontSpecification applyFontSpec;
3987 applyFontSpec.SetStyle_Underline (!!underline);
3988 fEditor.InteractiveSetFont (applyFontSpec);
3989 }
3990 CATCH_AND_HANDLE_EXCEPTIONS ();
3991}
3992
3993UINT ActiveLedItControl::OLE_GetSelJustification ()
3994{
3995 try {
3996 Justification justification = eLeftJustify;
3997 size_t selStart;
3998 size_t selEnd;
3999 fEditor.GetSelection (&selStart, &selEnd);
4000 Assert (selStart <= selEnd);
4001 if (fEditor.GetJustification (selStart, selEnd, &justification)) {
4002 switch (justification) {
4003 case eLeftJustify:
4004 return eLeftJustification;
4005 case eRightJustify:
4006 return eRightJustification;
4007 case eCenterJustify:
4008 return eCenterJustification;
4009 case eFullyJustify:
4010 return eFullJustification;
4011 default:
4012 return eLeftJustification; // what should we return here?
4013 }
4014 }
4015 else {
4016 return eNoCommonJustification;
4017 }
4018 }
4019 CATCH_AND_HANDLE_EXCEPTIONS ();
4020 Assert (false);
4021 return 0; // NOTREACHED
4022}
4023
4024void ActiveLedItControl::OLE_SetSelJustification (UINT justification)
4025{
4026 try {
4027 IdleManager::NonIdleContext nonIdleContext;
4028 Justification lh = eLeftJustify;
4029 switch (justification) {
4030 case eLeftJustification:
4031 lh = eLeftJustify;
4032 break;
4033 case eCenterJustification:
4034 lh = eCenterJustify;
4035 break;
4036 case eRightJustification:
4037 lh = eRightJustify;
4038 break;
4039 case eFullJustification:
4040 lh = eFullyJustify;
4041 break;
4042 default:
4043 return; // should be an error - but no error reporting supported here- should return E_INVALIDARG;
4044 }
4045 fEditor.InteractiveSetJustification (lh);
4046 }
4047 CATCH_AND_HANDLE_EXCEPTIONS ();
4048}
4049
4050UINT ActiveLedItControl::OLE_GetSelListStyle ()
4051{
4052 try {
4053 Led::ListStyle listStyle = Led::eListStyle_None;
4054 size_t selStart;
4055 size_t selEnd;
4056 fEditor.GetSelection (&selStart, &selEnd);
4057 Assert (selStart <= selEnd);
4058 if (fEditor.GetListStyle (selStart, selEnd, &listStyle)) {
4059 // take advantage of (assumption) that OLE list style enum is the same as the Led
4060 // one... NB: cast REALLY not necessary as these are all cast to 'int' - but done
4061 // for clarity that we are really intionally mixing enum types here - LGP 2003-06-03
4062 return static_cast<::ListStyle> (listStyle);
4063 }
4064 else {
4065 return static_cast<UINT> (eNoCommonListStyle);
4066 }
4067 }
4068 CATCH_AND_HANDLE_EXCEPTIONS ();
4069 Assert (false);
4070 return 0; // NOTREACHED
4071}
4072
4073void ActiveLedItControl::OLE_SetSelListStyle (UINT listStyle)
4074{
4075 try {
4076 IdleManager::NonIdleContext nonIdleContext;
4077 ::ListStyle ls1 = static_cast<::ListStyle> (listStyle);
4078 Led::ListStyle ls2 = static_cast<Led::ListStyle> (ls1); // take advantage of assumption that Led list style
4079 // enum is idential to one used in OLE API
4080 fEditor.InteractiveSetListStyle (ls2);
4081 }
4082 CATCH_AND_HANDLE_EXCEPTIONS ();
4083}
4084
4085UINT ActiveLedItControl::OLE_GetSelHidable ()
4086{
4087 try {
4088 size_t selStart;
4089 size_t selEnd;
4090 fEditor.GetSelection (&selStart, &selEnd);
4091 Assert (selStart <= selEnd);
4092 if (fEditor.GetHidableTextDatabase ()->GetHidableRegionsContiguous (selStart, selEnd, true)) {
4093 return true;
4094 }
4095 else if (fEditor.GetHidableTextDatabase ()->GetHidableRegionsContiguous (selStart, selEnd, false)) {
4096 return false;
4097 }
4098 }
4099 CATCH_AND_HANDLE_EXCEPTIONS ();
4100 return 2;
4101}
4102
4103void ActiveLedItControl::OLE_SetSelHidable (UINT hidable)
4104{
4105 try {
4106 IdleManager::NonIdleContext nonIdleContext;
4107 size_t selStart;
4108 size_t selEnd;
4109 fEditor.GetSelection (&selStart, &selEnd);
4110 Assert (selStart <= selEnd);
4111 if (hidable) {
4112 fEditor.GetHidableTextDatabase ()->MakeRegionHidable (selStart, selEnd);
4113 }
4114 else {
4115 fEditor.GetHidableTextDatabase ()->MakeRegionUnHidable (selStart, selEnd);
4116 }
4117 }
4118 CATCH_AND_HANDLE_EXCEPTIONS ();
4119}
#define AssertNotNull(p)
Definition Assertions.h:333
#define RequireNotNull(p)
Definition Assertions.h:347
#define AssertNotReached()
Definition Assertions.h:355
#define Verify(c)
Definition Assertions.h:419
chrono::duration< double > DurationSeconds
chrono::duration<double> - a time span (length of time) measured in seconds, but high precision.
Definition Realtime.h:57
#define DbgTrace
Definition Trace.h:309
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Definition String.h:201
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
Definition SDKString.h:38