4#include "Stroika/Foundation/Characters/LineEndings.h"
8namespace Stroika::Frameworks::Led::Platform {
15 inline CPoint AsCPoint (Led_Point p)
17 return CPoint (p.h, p.v);
24 inline Led_Point AsLedPoint (CPoint p)
26 return Led_Point (p.y, p.x);
33 inline CRect AsCRect (Led_Rect r)
35 return CRect (r.left, r.top, r.right, r.bottom);
42 inline Led_Rect AsLedRect (CRect r)
44 return Led_Rect (r.top, r.left, r.Height (), r.Width ());
50 inline CSize AsCSize (Led_Size s)
52 return CSize (s.h, s.v);
56 inline Led_MFC_CDCFromTablet::Led_MFC_CDCFromTablet (Tablet* t)
60 fCDC.m_hDC = t->m_hDC;
61 fCDC.m_hAttribDC = t->m_hAttribDC;
62 fCDC.m_bPrinting = t->m_bPrinting;
64 inline Led_MFC_CDCFromTablet::~Led_MFC_CDCFromTablet ()
68 inline Led_MFC_CDCFromTablet::operator CDC* ()
74 inline Led_MFC_TabletFromCDC::Led_MFC_TabletFromCDC (CDC* pDC)
78 fTablet.m_hDC = pDC->m_hDC;
79 fTablet.m_hAttribDC = pDC->m_hAttribDC;
80 fTablet.m_bPrinting = pDC->m_bPrinting;
82 inline Led_MFC_TabletFromCDC::~Led_MFC_TabletFromCDC ()
86 inline Led_MFC_TabletFromCDC::operator Tablet* ()
90 inline Tablet* Led_MFC_TabletFromCDC::operator->()
95 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
96 inline Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::Led_MFC_Helper ()
101 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
102 inline Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::~Led_MFC_Helper ()
105 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
106 HWND Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::GetHWND ()
const
110 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
111 int Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnCreate (LPCREATESTRUCT lpCreateStruct)
114 if (MFC_BASE_CLASS::OnCreate (lpCreateStruct) != 0) {
117 this->TabletChangedMetrics ();
118 if ((lpCreateStruct->style & WS_VSCROLL) and this->GetScrollBarType (TextInteractor::v) == TextInteractor::eScrollBarNever) {
119 this->SetScrollBarType (TextInteractor::v, TextInteractor::eScrollBarAlways);
121 if ((lpCreateStruct->style & WS_HSCROLL) and this->GetScrollBarType (TextInteractor::h) == TextInteractor::eScrollBarNever) {
122 this->SetScrollBarType (TextInteractor::h, TextInteractor::eScrollBarAlways);
126 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
127 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnPaint ()
130 CRect boundsRect = CRect (0, 0, 0, 0);
131 Verify (dc.GetClipBox (&boundsRect) != ERROR);
132 this->WindowDrawHelper (Led_MFC_TabletFromCDC (&dc), AsLedRect (boundsRect),
false);
134 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
140 BOOL Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnSetCursor (CWnd* pWnd, UINT nHitTest, UINT message)
142 return this->OnSetCursor_Msg (pWnd->GetSafeHwnd (), nHitTest, message);
144 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
145 UINT Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnGetDlgCode ()
147 return this->OnGetDlgCode_Msg ();
149 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
150 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)
152 this->OnChar_Msg (nChar, nRepCnt + (nFlags << 16));
154 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
155 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags)
157 this->OnKeyDown_Msg (nChar, nRepCnt + (nFlags << 16));
159 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
160 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnMouseMove (UINT nFlags, CPoint oPoint)
162 this->OnMouseMove_Msg (nFlags, oPoint.x, oPoint.y);
164 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
171 BOOL Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::ReplaceWindow (HWND hWnd)
173 CWnd* parent = MFC_BASE_CLASS::FromHandle (hWnd)->GetParent ();
174 HWND hwndParent = parent->GetSafeHwnd ();
175 if (hwndParent == NULL) {
179 int id = ::GetWindowLong (hWnd, GWL_ID);
181 HWND hwndEdit = ::GetDlgItem (hwndParent,
id);
184 DWORD dwStyle = ::GetWindowLong (hwndEdit, GWL_STYLE);
185 DWORD exStyle = ::GetWindowLong (hwndEdit, GWL_EXSTYLE);
189 memset (&wp, 0,
sizeof (wp));
190 wp.length =
sizeof (wp);
191 Verify (::GetWindowPlacement (hwndEdit, &wp));
194 ::DestroyWindow (hwndEdit);
196 return MFC_BASE_CLASS::CreateEx (exStyle, NULL, NULL, dwStyle | WS_CHILD, wp.rcNormalPosition.left, wp.rcNormalPosition.top,
197 wp.rcNormalPosition.right - wp.rcNormalPosition.left,
198 wp.rcNormalPosition.bottom - wp.rcNormalPosition.top, parent->GetSafeHwnd (), (HMENU)
id, NULL);
200 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
209 inline Led_Rect Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::GetWindowRect ()
const
211 return TextImager::GetWindowRect ();
213 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
214 inline void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::GetWindowRect (LPRECT lpRect)
const
217 const CWnd* cwnd =
this;
218 CWnd* wnd =
const_cast<CWnd*
> (cwnd);
219 wnd->GetWindowRect (lpRect);
221 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
222 inline DWORD Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::GetStyle ()
const
224 return MFC_BASE_CLASS::GetStyle ();
226 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
227 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnLButtonDown (UINT nFlags, CPoint oPoint)
229 this->OnLButtonDown_Msg (nFlags, oPoint.x, oPoint.y);
231 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
232 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnLButtonUp (UINT nFlags, CPoint oPoint)
234 this->OnLButtonUp_Msg (nFlags, oPoint.x, oPoint.y);
236 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
237 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnLButtonDblClk (UINT nFlags, CPoint oPoint)
239 this->OnLButtonDblClk_Msg (nFlags, oPoint.x, oPoint.y);
241 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
242 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnSetFocus (CWnd* pOldWnd)
244 MFC_BASE_CLASS::OnSetFocus (pOldWnd);
245 this->OnSetFocus_Msg (pOldWnd->GetSafeHwnd ());
247 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
248 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnKillFocus (CWnd* pNewWnd)
250 this->OnKillFocus_Msg (pNewWnd->GetSafeHwnd ());
251 MFC_BASE_CLASS::OnKillFocus (pNewWnd);
253 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
254 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnSize (UINT nType,
int cx,
int cy)
256 MFC_BASE_CLASS::OnSize (nType, cx, cy);
259 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
260 BOOL Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnEraseBkgnd (CDC* pDC)
262 return this->OnEraseBkgnd_Msg (pDC->GetSafeHdc ());
264 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
265 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
267 this->OnVScroll_Msg (nSBCode, nPos, pScrollBar->GetSafeHwnd ());
269 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
270 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
272 this->OnHScroll_Msg (nSBCode, nPos, pScrollBar->GetSafeHwnd ());
274 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
275 BOOL Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnMouseWheel (UINT fFlags,
short zDelta, CPoint point)
277 return this->OnMouseWheel_Msg (MAKEWPARAM (fFlags, zDelta), MAKELPARAM (point.x, point.y));
279 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
280 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnEnable (BOOL bEnable)
282 this->OnEnable_Msg (!!bEnable);
284 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
285 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnTimer (UINT_PTR nEventID)
287 this->OnTimer_Msg (nEventID, NULL);
289 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
290 inline LRESULT Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnUniChar ([[maybe_unused]] WPARAM wParam, [[maybe_unused]] LPARAM lParam)
292 return LED_WIN32_HELPER::OnUniChar_Msg (wParam, lParam);
294 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
295 inline LRESULT Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnIMEChar ([[maybe_unused]] WPARAM wParam, [[maybe_unused]] LPARAM lParam)
297#if qHookIMEEndCompositionMessageToWorkAroundWin2KIMEForNonUNICODEBug
298 return LED_WIN32_HELPER::OnIMEChar_Msg (wParam, lParam);
300 return MFC_BASE_CLASS::Default ();
303 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
304 inline LRESULT Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnIME_COMPOSITION ([[maybe_unused]] WPARAM wParam, [[maybe_unused]] LPARAM lParam)
306#if qHookIMEEndCompositionMessageToWorkAroundWin2KIMEForNonUNICODEBug
307 return LED_WIN32_HELPER::OnIME_COMPOSITION_Msg (wParam, lParam);
309 return MFC_BASE_CLASS::Default ();
312 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
313 inline LRESULT Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnIME_ENDCOMPOSITION ([[maybe_unused]] WPARAM wParam, [[maybe_unused]] LPARAM lParam)
315#if qHookIMEEndCompositionMessageToWorkAroundWin2KIMEForNonUNICODEBug
316 return LED_WIN32_HELPER::OnIME_ENDCOMPOSITION_Msg (wParam, lParam);
318 return MFC_BASE_CLASS::Default ();
321 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
322 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnUpdateCommand_MSG (CCmdUI* pCmdUI)
325 if (not this->OnUpdateCommand (Led_MFC_TmpCmdUpdater (pCmdUI))) {
326 pCmdUI->Enable (
false);
329 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
330 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnPerformCommand_MSG (UINT commandNumber)
334 IdleManager::NonIdleContext nonIdleContext;
336 (void)this->OnPerformCommand (MFC_CommandNumberMapping::Get ().Lookup (commandNumber));
339 DbgTrace (
"Ignoring / suppressing uncaught exception in PerformCommand: {}"_f, current_exception ());
342 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
343 const AFX_MSGMAP* Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::GetMessageMap ()
const
345 return this->GetThisMessageMap ();
347 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
348 const AFX_MSGMAP* PASCAL Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::GetThisMessageMap ()
350 using ThisClass = Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>;
351 using TheBaseClass = MFC_BASE_CLASS;
352 DISABLE_COMPILER_MSC_WARNING_START (4407)
353 static const AFX_MSGMAP_ENTRY _messageEntries[] = {
354 ON_WM_CREATE () ON_WM_CHAR () ON_WM_TIMER () ON_WM_KEYDOWN () ON_WM_PAINT () ON_WM_MOUSEMOVE () ON_WM_LBUTTONDOWN ()
355 ON_WM_SETCURSOR () ON_WM_GETDLGCODE () ON_WM_LBUTTONUP () ON_WM_LBUTTONDBLCLK () ON_WM_SETFOCUS () ON_WM_KILLFOCUS ()
356 ON_WM_SIZE () ON_WM_ERASEBKGND () ON_WM_VSCROLL () ON_WM_HSCROLL () ON_WM_MOUSEWHEEL () ON_WM_ENABLE () ON_MESSAGE (
357 WM_UNICHAR, &OnUniChar) ON_MESSAGE (WM_IME_CHAR, &OnIMEChar) ON_MESSAGE (WM_IME_COMPOSITION, &OnIME_COMPOSITION)
358 ON_MESSAGE (WM_IME_ENDCOMPOSITION, &OnIME_ENDCOMPOSITION) LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kUndo_CmdID)
359 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kRedo_CmdID) LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kSelectAll_CmdID)
360 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kSelectWord_CmdID) LED_MFC_HANDLE_COMMAND_M (
361 BASE_INTERACTOR::kSelectTextRow_CmdID) LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kSelectParagraph_CmdID)
362 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kCut_CmdID) LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kCopy_CmdID)
363 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kPaste_CmdID) LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kClear_CmdID)
364 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kFind_CmdID) LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kFindAgain_CmdID)
365 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kEnterFindString_CmdID)
366 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kReplace_CmdID)
367 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kReplaceAgain_CmdID) LED_MFC_HANDLE_COMMAND_M (
368 BASE_INTERACTOR::kSpellCheck_CmdID){0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0}};
369 DISABLE_COMPILER_MSC_WARNING_END (4407)
370 static const AFX_MSGMAP messageMap = {&TheBaseClass::GetThisMessageMap, &_messageEntries[0]};
375 template <
typename BASECLASS>
376 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::Create (DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID)
378 return BASECLASS::Create (NULL, NULL, dwStyle, rect, pParentWnd, nID);
380 template <
typename BASECLASS>
381 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::CanUndo ()
const
383 Assert (::IsWindow (this->m_hWnd));
384 return (BOOL)::SendMessage (this->m_hWnd, EM_CANUNDO, 0, 0);
386 template <
typename BASECLASS>
387 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetLineCount_CEdit ()
const
389 Assert (::IsWindow (this->m_hWnd));
390 return (
int)::SendMessage (this->m_hWnd, EM_GETLINECOUNT, 0, 0);
392 template <
typename BASECLASS>
393 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetModify ()
const
397 Assert (::IsWindow (this->m_hWnd));
398 return (BOOL)::SendMessage (this->m_hWnd, EM_GETMODIFY, 0, 0);
400 template <
typename BASECLASS>
401 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetModify (BOOL bModified)
405 Assert (::IsWindow (this->m_hWnd));
406 ::SendMessage (this->m_hWnd, EM_SETMODIFY, bModified, 0);
408 template <
typename BASECLASS>
409 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetRect (LPRECT lpRect)
const
413 Assert (::IsWindow (this->m_hWnd));
414 ::SendMessage (this->m_hWnd, EM_GETRECT, 0, (LPARAM)lpRect);
416 template <
typename BASECLASS>
417 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetSel (
int& nStartChar,
int& nEndChar)
const
419 Assert (::IsWindow (this->m_hWnd));
420 ::SendMessage (this->m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar);
422 template <
typename BASECLASS>
423 inline DWORD Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetSel ()
const
425 Assert (::IsWindow (this->m_hWnd));
426 return ::SendMessage (this->m_hWnd, EM_GETSEL, 0, 0);
428 template <
typename BASECLASS>
429 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetLine (
int nIndex, LPTSTR lpszBuffer)
const
433 Assert (::IsWindow (this->m_hWnd));
434 return (
int)::SendMessage (this->m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer);
436 template <
typename BASECLASS>
437 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetLine (
int nIndex, LPTSTR lpszBuffer,
int nMaxLength)
const
441 Assert (::IsWindow (this->m_hWnd));
442 *(LPWORD)lpszBuffer = (WORD)nMaxLength;
443 return (
int)::SendMessage (this->m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer);
445 template <
typename BASECLASS>
446 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::EmptyUndoBuffer ()
448 Assert (::IsWindow (this->m_hWnd));
449 ::SendMessage (this->m_hWnd, EM_EMPTYUNDOBUFFER, 0, 0);
451 template <
typename BASECLASS>
452 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::FmtLines (BOOL bAddEOL)
456 Assert (::IsWindow (this->m_hWnd));
457 return (BOOL)::SendMessage (this->m_hWnd, EM_FMTLINES, bAddEOL, 0);
459 template <
typename BASECLASS>
460 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::LimitText (
int nChars)
464 Assert (::IsWindow (this->m_hWnd));
465 ::SendMessage (this->m_hWnd, EM_LIMITTEXT, nChars, 0);
467 template <
typename BASECLASS>
468 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::LineFromChar (
int nIndex)
const
470 Assert (::IsWindow (this->m_hWnd));
471 return (
int)::SendMessage (this->m_hWnd, EM_LINEFROMCHAR, nIndex, 0);
473 template <
typename BASECLASS>
474 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::LineIndex (
int nLine)
const
476 Assert (::IsWindow (this->m_hWnd));
477 return (
int)::SendMessage (this->m_hWnd, EM_LINEINDEX, nLine, 0);
479 template <
typename BASECLASS>
480 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::LineLength (
int nLine)
const
482 Assert (::IsWindow (this->m_hWnd));
483 return (
int)::SendMessage (this->m_hWnd, EM_LINELENGTH, nLine, 0);
485 template <
typename BASECLASS>
486 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::LineScroll (
int nLines,
int nChars)
488 Assert (::IsWindow (this->m_hWnd));
489 ::SendMessage (this->m_hWnd, EM_LINESCROLL, nChars, nLines);
491 template <
typename BASECLASS>
492 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::ReplaceSel (LPCTSTR lpszNewText)
495 Assert (::IsWindow (this->m_hWnd));
496 ::SendMessage (this->m_hWnd, EM_REPLACESEL, 0, (LPARAM)lpszNewText);
498 template <
typename BASECLASS>
499 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetPasswordChar (TCHAR ch)
503 Assert (::IsWindow (this->m_hWnd));
504 ::SendMessage (this->m_hWnd, EM_SETPASSWORDCHAR, ch, 0);
506 template <
typename BASECLASS>
507 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetRect (LPCRECT lpRect)
511 Assert (::IsWindow (this->m_hWnd));
512 ::SendMessage (this->m_hWnd, EM_SETRECT, 0, (LPARAM)lpRect);
514 template <
typename BASECLASS>
515 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetRectNP (LPCRECT lpRect)
519 Assert (::IsWindow (this->m_hWnd));
520 ::SendMessage (this->m_hWnd, EM_SETRECTNP, 0, (LPARAM)lpRect);
522 template <
typename BASECLASS>
523 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetSel (DWORD dwSelection, BOOL bNoScroll)
525 Assert (::IsWindow (this->m_hWnd));
526 ::SendMessage (this->m_hWnd, EM_SETSEL, LOWORD (dwSelection), HIWORD (dwSelection));
528 ::SendMessage (this->m_hWnd, EM_SCROLLCARET, 0, 0);
531 template <
typename BASECLASS>
532 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetSel (
int nStartChar,
int nEndChar, BOOL bNoScroll)
534 Assert (::IsWindow (this->m_hWnd));
535 ::SendMessage (this->m_hWnd, EM_SETSEL, nStartChar, nEndChar);
537 ::SendMessage (this->m_hWnd, EM_SCROLLCARET, 0, 0);
540 template <
typename BASECLASS>
541 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetTabStops (
int nTabStops, LPINT rgTabStops)
545 Assert (::IsWindow (this->m_hWnd));
546 return (BOOL)::SendMessage (this->m_hWnd, EM_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops);
548 template <
typename BASECLASS>
549 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetTabStops ()
553 Assert (::IsWindow (this->m_hWnd));
554 Verify (::SendMessage (this->m_hWnd, EM_SETTABSTOPS, 0, 0));
556 template <
typename BASECLASS>
557 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetTabStops (
const int& cxEachStop)
561 Assert (::IsWindow (this->m_hWnd));
562 return (BOOL)::SendMessage (this->m_hWnd, EM_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop);
564 template <
typename BASECLASS>
565 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::Undo ()
567 Assert (::IsWindow (this->m_hWnd));
568 return (BOOL)::SendMessage (this->m_hWnd, EM_UNDO, 0, 0);
570 template <
typename BASECLASS>
571 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::Clear ()
573 Assert (::IsWindow (this->m_hWnd));
574 ::SendMessage (this->m_hWnd, WM_CLEAR, 0, 0);
576 template <
typename BASECLASS>
577 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::Copy ()
579 Assert (::IsWindow (this->m_hWnd));
580 ::SendMessage (this->m_hWnd, WM_COPY, 0, 0);
582 template <
typename BASECLASS>
583 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::Cut ()
585 Assert (::IsWindow (this->m_hWnd));
586 ::SendMessage (this->m_hWnd, WM_CUT, 0, 0);
588 template <
typename BASECLASS>
589 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::Paste ()
591 Assert (::IsWindow (this->m_hWnd));
592 ::SendMessage (this->m_hWnd, WM_PASTE, 0, 0);
594 template <
typename BASECLASS>
595 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetReadOnly (BOOL bReadOnly)
597 Assert (::IsWindow (this->m_hWnd));
598 return (BOOL)::SendMessage (this->m_hWnd, EM_SETREADONLY, bReadOnly, 0L);
600 template <
typename BASECLASS>
601 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetFirstVisibleLine ()
const
603 Assert (::IsWindow (this->m_hWnd));
604 return (
int)::SendMessage (this->m_hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L);
606 template <
typename BASECLASS>
607 inline TCHAR Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetPasswordChar ()
const
611 Assert (::IsWindow (this->m_hWnd));
612 return (TCHAR)::SendMessage (this->m_hWnd, EM_GETPASSWORDCHAR, 0, 0L);
616 template <
typename BASECLASS>
617 const AFX_MSGMAP* Led_MFC_OptionalWin32SDKMessageMimicHelper<BASECLASS>::GetMessageMap ()
const
619 return GetThisMessageMap ();
621 template <
typename BASECLASS>
622 const AFX_MSGMAP* PASCAL Led_MFC_OptionalWin32SDKMessageMimicHelper<BASECLASS>::GetThisMessageMap ()
624 using ThisClass = Led_MFC_OptionalWin32SDKMessageMimicHelper<BASECLASS>;
625 using TheBaseClass = BASECLASS;
626 DISABLE_COMPILER_MSC_WARNING_START (4407)
627 static const AFX_MSGMAP_ENTRY _messageEntries[] = {
628 ON_MESSAGE (WM_SETTEXT, &OnMFCSDKMessageDispatcher<WM_SETTEXT>) ON_MESSAGE (WM_GETTEXT, &OnMFCSDKMessageDispatcher<WM_GETTEXT>)
629 ON_MESSAGE (WM_GETTEXTLENGTH, &OnMFCSDKMessageDispatcher<WM_GETTEXTLENGTH>) ON_MESSAGE (
630 EM_GETSEL, &OnMFCSDKMessageDispatcher<EM_GETSEL>) ON_MESSAGE (EM_SETREADONLY, &OnMFCSDKMessageDispatcher<EM_SETREADONLY>)
631 ON_MESSAGE (EM_GETFIRSTVISIBLELINE, &OnMFCSDKMessageDispatcher<EM_GETFIRSTVISIBLELINE>) ON_MESSAGE (
632 EM_LINEINDEX, &OnMFCSDKMessageDispatcher<EM_LINEINDEX>) ON_MESSAGE (EM_GETLINECOUNT, &OnMFCSDKMessageDispatcher<EM_GETLINECOUNT>)
633 ON_MESSAGE (EM_CANUNDO, &OnMFCSDKMessageDispatcher<EM_CANUNDO>) ON_MESSAGE (EM_UNDO, &OnMFCSDKMessageDispatcher<EM_UNDO>)
634 ON_MESSAGE (EM_EMPTYUNDOBUFFER, &OnMFCSDKMessageDispatcher<EM_EMPTYUNDOBUFFER>)
635 ON_MESSAGE (WM_CLEAR, &OnMFCSDKMessageDispatcher<WM_CLEAR>) ON_MESSAGE (WM_CUT, &OnMFCSDKMessageDispatcher<WM_CUT>)
636 ON_MESSAGE (WM_COPY, &OnMFCSDKMessageDispatcher<WM_COPY>) ON_MESSAGE (WM_PASTE, &OnMFCSDKMessageDispatcher<WM_PASTE>)
637 ON_MESSAGE (EM_LINEFROMCHAR, &OnMFCSDKMessageDispatcher<EM_LINEFROMCHAR>)
638 ON_MESSAGE (EM_LINELENGTH, &OnMFCSDKMessageDispatcher<EM_LINELENGTH>)
639 ON_MESSAGE (EM_LINESCROLL, &OnMFCSDKMessageDispatcher<EM_LINESCROLL>)
640 ON_MESSAGE (EM_REPLACESEL, &OnMFCSDKMessageDispatcher<EM_REPLACESEL>)
641 ON_MESSAGE (EM_SETSEL, &OnMFCSDKMessageDispatcher<EM_SETSEL>)
642 ON_MESSAGE (EM_SCROLLCARET, &OnMFCSDKMessageDispatcher<EM_SCROLLCARET>)
643 ON_MESSAGE (WM_GETFONT, &OnMFCSDKMessageDispatcher<WM_GETFONT>)
644 ON_MESSAGE (WM_SETFONT, &OnMFCSDKMessageDispatcher<WM_SETFONT>){
645 0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0}};
646 DISABLE_COMPILER_MSC_WARNING_END (4407)
647 static const AFX_MSGMAP messageMap = {&TheBaseClass::GetThisMessageMap, &_messageEntries[0]};
652 template <
typename BASECLASS>
653 typename Led_MFC_DragAndDropWindow<BASECLASS>::LedStartDragAndDropContext* Led_MFC_DragAndDropWindow<BASECLASS>::sCurrentDragInfo = NULL;
654 template <
typename BASECLASS>
655 Led_MFC_DragAndDropWindow<BASECLASS>::Led_MFC_DragAndDropWindow ()
661 , fPrevDropEffect (DROPEFFECT_NONE)
662 , fDragAutoScrollTimerID (0)
665 template <
typename BASECLASS>
666 Led_MFC_DragAndDropWindow<BASECLASS>::~Led_MFC_DragAndDropWindow ()
668 Assert (fDragAutoScrollTimerID == 0);
670 template <
typename BASECLASS>
681 inline const Led_MFC_DragAndDropWindow<BASECLASS>::CommandNames& Led_MFC_DragAndDropWindow<BASECLASS>::GetCommandNames ()
683 return sCommandNames;
685 template <
typename BASECLASS>
690 inline void Led_MFC_DragAndDropWindow<BASECLASS>::SetCommandNames (
const typename Led_MFC_DragAndDropWindow<BASECLASS>::CommandNames& cmdNames)
692 sCommandNames = cmdNames;
694 template <
typename BASECLASS>
695 typename Led_MFC_DragAndDropWindow<BASECLASS>::CommandNames Led_MFC_DragAndDropWindow<BASECLASS>::sCommandNames;
696 template <
typename BASECLASS>
697 int Led_MFC_DragAndDropWindow<BASECLASS>::OnCreate (LPCREATESTRUCT lpCreateStruct)
699 if (inherited::OnCreate (lpCreateStruct) != 0) {
702 if (not fDropTarget.Register (
this)) {
707 TRACE (_T (
"Warning: failed to register window as drop target\n"));
712 template <
typename BASECLASS>
713 bool Led_MFC_DragAndDropWindow<BASECLASS>::IsADragSelect (Led_Point clickedWhere)
const
725 this->GetSelectionWindowRegion (&r, this->GetSelectionStart (), this->GetSelectionEnd ());
726 return !!r.PtInRegion (AsCPoint (clickedWhere));
728 template <
typename BASECLASS>
729 void Led_MFC_DragAndDropWindow<BASECLASS>::HandleDragSelect (UINT , CPoint oPoint)
733 using TextInteractor::eDefaultUpdate;
735 if (this->GetStyle () & WS_DISABLED) {
738 if (this->GetFocus () !=
this) {
746 this->fMouseTrackingLastPoint = AsLedPoint (oPoint);
747 this->fDragAnchor = this->GetCharAtClickLocation (this->fMouseTrackingLastPoint);
749 Assert (sCurrentDragInfo == NULL);
750 sCurrentDragInfo =
new LedStartDragAndDropContext{
this};
752 sCurrentDragInfo->fOurDragStart = this->GetSelectionStart ();
753 sCurrentDragInfo->fOurDragEnd = this->GetSelectionEnd ();
756 COleDataSource dataSrc;
757 Led_MFCWriterDAndDFlavorPackage flavorPackage (&dataSrc);
758 this->ExternalizeFlavors (flavorPackage);
760 Region selectionRegion;
761 this->GetSelectionWindowRegion (&selectionRegion, this->GetSelectionStart (), this->GetSelectionEnd ());
764 ::DROPEFFECT dropResult = DROPEFFECT_COPY;
765 if (not(this->GetStyle () & ES_READONLY)) {
767 dropResult |= DROPEFFECT_MOVE;
769 dropResult = dataSrc.DoDragDrop (dropResult);
771 if (this->GetStyle () & ES_READONLY) {
772 Assert (not(dropResult & DROPEFFECT_MOVE));
775 switch (dropResult) {
776 case DROPEFFECT_NONE: {
778 if (Foundation::Time::GetTickCount () - startDragSelectAt > kTimeEnoughToRestoreSelection) {
783 this->SetSelection (sCurrentDragInfo->fOurDragStart, sCurrentDragInfo->fOurDragEnd);
789 (void)this->ProcessSimpleClick (this->fMouseTrackingLastPoint, 1,
false, &ignored);
792 case DROPEFFECT_MOVE: {
796 TextInteractor::InteractiveModeUpdater iuMode{*
this};
798 TextInteractor::UndoableContextHelper undoContext (
799 *
this, sCurrentDragInfo->fWeRecievedDrop ?
SDKString{} : GetCommandNames ().fDragCommandName,
800 sCurrentDragInfo->fOrigSelection.GetStart (), sCurrentDragInfo->fOrigSelection.GetEnd (), true);
802 TextInteractor::InteractiveReplace_ (undoContext.GetUndoRegionStart (), undoContext.GetUndoRegionEnd (),
803 LED_TCHAR_OF (
""), 0,
false,
false, eDefaultUpdate);
805 undoContext.CommandComplete (sCurrentDragInfo->fOrigSelection.GetEnd ());
813 this->BreakInGroupedCommands ();
816 delete sCurrentDragInfo;
817 sCurrentDragInfo = NULL;
821 delete sCurrentDragInfo;
822 sCurrentDragInfo = NULL;
824 template <
typename BASECLASS>
825 void Led_MFC_DragAndDropWindow<BASECLASS>::HandleSharedDragOverUpdateSelCode ()
827 using TextInteractor::eImmediateUpdate;
829 if (fPrevDropEffect != DROPEFFECT_NONE) {
831 dc.DrawFocusRect (CRect (fDragPoint, fDragSize));
834 size_t newPos = this->GetCharAtClickLocation (AsLedPoint (fDragPoint));
837 if (newPos < this->GetMarkerPositionOfStartOfWindow ()) {
838 this->ScrollByIfRoom (-1, eImmediateUpdate);
840 else if (newPos > this->GetMarkerPositionOfEndOfWindow ()) {
841 this->ScrollByIfRoom (1, eImmediateUpdate);
844 if (fPrevDropEffect != DROPEFFECT_NONE) {
846 dc.DrawFocusRect (CRect (fDragPoint, fDragSize));
849 template <
typename BASECLASS>
850 DROPEFFECT Led_MFC_DragAndDropWindow<BASECLASS>::HelperDragEnter (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
853 this->StartDragAutoscrollTimer ();
854 if (not GetObjectInfo (pDataObject, &fDragSize, &fDragOffset)) {
855 return DROPEFFECT_NONE;
858 dc.HIMETRICtoDP (&fDragSize);
859 dc.HIMETRICtoDP (&fDragOffset);
860 DROPEFFECT result = this->HelperDragOver (pDataObject, dwKeyState, point);
863 template <
typename BASECLASS>
864 DROPEFFECT Led_MFC_DragAndDropWindow<BASECLASS>::HelperDragOver (COleDataObject* , DWORD dwKeyState, CPoint point)
866 using TextInteractor::eImmediateUpdate;
867 point -= fDragOffset;
872 DROPEFFECT de = DROPEFFECT_NONE;
874 if ((dwKeyState & (MK_CONTROL | MK_SHIFT)) == (MK_CONTROL | MK_SHIFT)) {
875 de = DROPEFFECT_NONE;
877 else if ((dwKeyState & MK_CONTROL) == MK_CONTROL) {
878 de = DROPEFFECT_COPY;
880 else if ((dwKeyState & MK_ALT) == MK_ALT) {
881 de = DROPEFFECT_MOVE;
884 de = DROPEFFECT_MOVE;
887 if (point != fDragPoint) {
890 if (fPrevDropEffect != DROPEFFECT_NONE) {
892 dc.DrawFocusRect (CRect (fDragPoint, fDragSize));
895 size_t newPos = this->GetCharAtClickLocation (AsLedPoint (point));
898 if (sCurrentDragInfo != NULL and sCurrentDragInfo->fLedMFCView ==
this and
899 (newPos >= sCurrentDragInfo->fOurDragStart and newPos <= sCurrentDragInfo->fOurDragEnd)) {
900 this->SetSelection (sCurrentDragInfo->fOurDragStart, sCurrentDragInfo->fOurDragEnd);
902 fPrevDropEffect = DROPEFFECT_NONE;
903 return DROPEFFECT_NONE;
907 if (newPos < this->GetMarkerPositionOfStartOfWindow ()) {
908 this->ScrollByIfRoom (-1, eImmediateUpdate);
910 else if (newPos > this->GetMarkerPositionOfEndOfWindow ()) {
911 this->ScrollByIfRoom (1, eImmediateUpdate);
914 if (newPos >= this->GetMarkerPositionOfStartOfWindow () and newPos <= this->GetMarkerPositionOfEndOfWindow ()) {
915 this->SetSelection (newPos, newPos);
919 fPrevDropEffect = de;
920 if (fPrevDropEffect != DROPEFFECT_NONE) {
923 dc.DrawFocusRect (CRect (fDragPoint, fDragSize));
929 template <
typename BASECLASS>
930 BOOL Led_MFC_DragAndDropWindow<BASECLASS>::HelperDrop (COleDataObject* pDataObject, DROPEFFECT , CPoint )
938 if (sCurrentDragInfo != NULL and sCurrentDragInfo->fLedMFCView ==
this) {
939 sCurrentDragInfo->fWeRecievedDrop =
true;
946 pDataObject->BeginEnumFormats ();
948 while (pDataObject->GetNextFormat (&formatC)) {
950 int nChars = ::GetClipboardFormatName (formatC.cfFormat, buf,
sizeof buf);
958 Led_MFCReaderDAndDFlavorPackage flavors (pDataObject);
960 bool doSmartCNP = this->GetSmartCutAndPasteMode () and flavors.GetFlavorAvailable_TEXT ();
961 TextInteractor::SmartCNPInfo smartCNPInfo;
963 size_t length = flavors.GetFlavorSize (kTEXTClipFormat);
964 Led_ClipFormat textFormat = kTEXTClipFormat;
966 length = flavors.ReadFlavorData (textFormat, length, buf.data ());
968 size_t nTChars = length /
sizeof (Led_tChar);
972 doSmartCNP = this->LooksLikeSmartPastableText (buf.data (), nTChars, &smartCNPInfo);
976 this->BreakInGroupedCommands ();
978 TextInteractor::InteractiveModeUpdater iuMode (*
this);
979 size_t ucSelStart = (sCurrentDragInfo !=
nullptr and sCurrentDragInfo->fLedMFCView ==
this) ? sCurrentDragInfo->fOrigSelection.GetStart ()
980 : this->GetSelectionStart ();
981 size_t ucSelEnd = (sCurrentDragInfo !=
nullptr and sCurrentDragInfo->fLedMFCView ==
this) ? sCurrentDragInfo->fOrigSelection.GetEnd ()
982 : this->GetSelectionEnd ();
983 TextInteractor::UndoableContextHelper undoContext (*
this,
984 (sCurrentDragInfo !=
nullptr and sCurrentDragInfo->fLedMFCView ==
this)
985 ? GetCommandNames ().fDragNDropCommandName
986 : GetCommandNames ().fDropCommandName,
987 this->GetSelectionStart (), this->GetSelectionEnd (), ucSelStart, ucSelEnd, false);
990 this->InternalizeBestFlavor (flavors);
998#pragma message("See if MFC has fixed this bug yet")
1007 this->OptionallyAddExtraSpaceForSmartCutAndPasteModeAdds (undoContext.GetUndoRegionStart (), smartCNPInfo);
1010 undoContext.CommandComplete ();
1013 if (sCurrentDragInfo ==
nullptr or sCurrentDragInfo->fLedMFCView !=
this) {
1014 this->BreakInGroupedCommands ();
1019 template <
typename BASECLASS>
1020 void Led_MFC_DragAndDropWindow<BASECLASS>::HelperDragLeave ()
1022 StopDragAutoscrollTimer ();
1023 if (fPrevDropEffect != DROPEFFECT_NONE) {
1024 CClientDC dc (
this);
1026 dc.DrawFocusRect (CRect (fDragPoint, fDragSize));
1027 fPrevDropEffect = DROPEFFECT_NONE;
1030 template <
typename BASECLASS>
1031 bool Led_MFC_DragAndDropWindow<BASECLASS>::GetObjectInfo (COleDataObject* pDataObject, CSize* pSize, CSize* pOffset)
1037 static CLIPFORMAT kObjectDescriptorFormatTag = (CLIPFORMAT)::RegisterClipboardFormat (_T(
"Object Descriptor"));
1039 HGLOBAL hObjDesc = pDataObject->GetGlobalData (kObjectDescriptorFormatTag);
1040 if (hObjDesc ==
nullptr) {
1041 *pSize = CSize{0, 0};
1042 *pOffset = CSize{0, 0};
1046 LPOBJECTDESCRIPTOR pObjDesc = (LPOBJECTDESCRIPTOR)::GlobalLock (hObjDesc);
1047 if (pObjDesc ==
nullptr) {
1048 memset (pSize, 0,
sizeof (*pSize));
1049 memset (pOffset, 0,
sizeof (*pOffset));
1052 pSize->cx = (int)pObjDesc->sizel.cx;
1053 pSize->cy = (int)pObjDesc->sizel.cy;
1054 pOffset->cx = (int)pObjDesc->pointl.x;
1055 pOffset->cy = (int)pObjDesc->pointl.y;
1057 ::GlobalUnlock (hObjDesc);
1058 ::GlobalFree (hObjDesc);
1062 template <
typename BASECLASS>
1063 void Led_MFC_DragAndDropWindow<BASECLASS>::StartDragAutoscrollTimer ()
1065 Assert (fDragAutoScrollTimerID == 0);
1066 if (fDragAutoScrollTimerID == 0) {
1068 const int kTimeout = 20;
1070 Verify ((fDragAutoScrollTimerID = this->SetTimer (eAutoscrolling4DragTimerEventID, kTimeout, NULL)) != 0);
1073 template <
typename BASECLASS>
1074 void Led_MFC_DragAndDropWindow<BASECLASS>::StopDragAutoscrollTimer ()
1076 if (fDragAutoScrollTimerID != 0) {
1077 Verify (this->KillTimer (eAutoscrolling4DragTimerEventID));
1078 fDragAutoScrollTimerID = 0;
1081 template <
typename BASECLASS>
1082 void Led_MFC_DragAndDropWindow<BASECLASS>::OnTimer (UINT_PTR nEventID)
1084 if (nEventID == eAutoscrolling4DragTimerEventID) {
1085 this->HandleSharedDragOverUpdateSelCode ();
1088 inherited::OnTimer (nEventID);
1091 template <
typename BASECLASS>
1092 const AFX_MSGMAP* Led_MFC_DragAndDropWindow<BASECLASS>::GetMessageMap ()
const
1094 return GetThisMessageMap ();
1096 template <
typename BASECLASS>
1097 const AFX_MSGMAP* PASCAL Led_MFC_DragAndDropWindow<BASECLASS>::GetThisMessageMap ()
1099 using ThisClass = Led_MFC_DragAndDropWindow<BASECLASS>;
1100 using TheBaseClass = BASECLASS;
1101 DISABLE_COMPILER_MSC_WARNING_START (4407)
1102 static const AFX_MSGMAP_ENTRY _messageEntries[] = {ON_WM_CREATE () ON_WM_TIMER (){0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0}};
1103 DISABLE_COMPILER_MSC_WARNING_END (4407)
1104 static const AFX_MSGMAP messageMap = {&TheBaseClass::GetThisMessageMap, &_messageEntries[0]};
1109 template <
typename BASECLASS>
1110 Led_MFC_CViewHelper<BASECLASS>::Led_MFC_CViewHelper ()
1114 fPrintMargins (TWIPS_Rect (TWIPS{1440}, TWIPS{1440}, TWIPS{0}, TWIPS{0}))
1115 , fPrintInfo{nullptr}
1118 template <
typename BASECLASS>
1119 Led_MFC_CViewHelper<BASECLASS>::~Led_MFC_CViewHelper ()
1121 Assert (fPrintInfo ==
nullptr);
1123 template <
typename BASECLASS>
1129 TWIPS_Rect Led_MFC_CViewHelper<BASECLASS>::GetPrintMargins ()
const
1131 return fPrintMargins;
1133 template <
typename BASECLASS>
1138 void Led_MFC_CViewHelper<BASECLASS>::SetPrintMargins (
const TWIPS_Rect& printMargins)
1140 fPrintMargins = printMargins;
1142 template <
typename BASECLASS>
1148 BOOL Led_MFC_CViewHelper<BASECLASS>::OnPreparePrinting (CPrintInfo* pInfo)
1151 return this->DoPreparePrinting (pInfo);
1153 template <
typename BASECLASS>
1160 void Led_MFC_CViewHelper<BASECLASS>::OnBeginPrinting (CDC* pDC, CPrintInfo* pInfo)
1163 Assert (fPrintInfo ==
nullptr);
1164 BASECLASS::OnBeginPrinting (pDC, pInfo);
1165 fPrintInfo =
new PrintInfo (*
this, pDC, this->GetWindowRect (), this->GetMarkerPositionOfStartOfWindow (), this->GetForceAllRowsShowing ());
1166 this->SetForceAllRowsShowing (
false);
1168 template <
typename BASECLASS>
1169 void Led_MFC_CViewHelper<BASECLASS>::OnPrint (CDC* pDC, CPrintInfo* )
1176 Led_MFC_TabletFromCDC tablet (pDC);
1177 typename BASECLASS::TemporarilyUseTablet tmpUseTablet{*
this, tablet, BASECLASS::TemporarilyUseTablet::eDontDoTextMetricsChangedCall};
1178 CRect boundsRect = CRect (0, 0, 0, 0);
1179 Verify (pDC->GetClipBox (&boundsRect) != ERROR);
1180 this->Draw (AsLedRect (boundsRect),
true);
1182 template <
typename BASECLASS>
1183 void Led_MFC_CViewHelper<BASECLASS>::OnEndPrinting (CDC* pDC, CPrintInfo* pInfo)
1185 if (fPrintInfo ==
nullptr) {
1187 BASECLASS::OnEndPrinting (pDC, pInfo);
1190 this->SetForceAllRowsShowing (fPrintInfo->fSavedForceAllRowsFlag);
1191 this->SetWindowRect (fPrintInfo->fOldWindowRect);
1192 this->SetTopRowInWindowByMarkerPosition (fPrintInfo->fSavedScrollPos);
1194 fPrintInfo =
nullptr;
1195 BASECLASS::OnEndPrinting (pDC, pInfo);
1198 template <
typename BASECLASS>
1199 void Led_MFC_CViewHelper<BASECLASS>::OnPrepareDC (CDC* pDC, CPrintInfo* pInfo)
1201 if (pInfo != NULL and pDC->IsPrinting ()) {
1203 WindowDC screenDC (NULL);
1204 (void)pDC->SetMapMode (MM_ANISOTROPIC);
1205 (void)pDC->SetWindowExt (screenDC.GetDeviceCaps (LOGPIXELSX), screenDC.GetDeviceCaps (LOGPIXELSY));
1206 (void)pDC->SetViewportExt (pDC->GetDeviceCaps (LOGPIXELSX), pDC->GetDeviceCaps (LOGPIXELSY));
1214 Led_Rect oldWR = this->GetWindowRect ();
1215 Led_Rect newWR = this->CalculatePrintingRect (pDC);
1216 this->SetWindowRect (newWR);
1218 CView::OnPrepareDC (pDC, pInfo);
1219 if (fPrintInfo->fWindowStarts.size () == 0) {
1220 fPrintInfo->fWindowStarts.push_back (0);
1221 this->SetTopRowInWindowByMarkerPosition (0, TextInteractor::eNoUpdate);
1223 pInfo->m_bContinuePrinting =
true;
1227 while (fPrintInfo->fWindowStarts.size () < pInfo->m_nCurPage) {
1229 if (this->GetMarkerPositionOfEndOfWindow () == this->GetTextStore ().GetEnd ()) {
1230 pInfo->m_bContinuePrinting =
false;
1233 this->SetTopRowInWindowByMarkerPosition (this->FindNextCharacter (this->GetMarkerPositionOfEndOfWindow ()), TextInteractor::eNoUpdate);
1234 size_t newStart = this->GetMarkerPositionOfStartOfWindow ();
1235 if (newStart == fPrintInfo->fWindowStarts.back ()) {
1236 pInfo->m_bContinuePrinting =
false;
1240 fPrintInfo->fWindowStarts.push_back (newStart);
1244 this->SetTopRowInWindowByMarkerPosition (fPrintInfo->fWindowStarts[pInfo->m_nCurPage - 1]);
1245 if (this->GetMarkerPositionOfEndOfWindow () == this->GetTextStore ().GetEnd ()) {
1246 pInfo->SetMaxPage (pInfo->m_nCurPage);
1251 template <
typename BASECLASS>
1260 Led_Rect Led_MFC_CViewHelper<BASECLASS>::CalculatePrintingRect (CDC* pDC)
const
1266 CRect winRect = CRect (0, 0, pDC->GetDeviceCaps (HORZRES), pDC->GetDeviceCaps (VERTRES));
1267 pDC->DPtoLP (&winRect);
1268 Led_Rect useRect = AsLedRect (winRect);
1269 Led_Rect marginRect = Led_MFC_TabletFromCDC (pDC)->CvtFromTWIPS (fPrintMargins);
1270 useRect = Led_Rect (useRect.GetTop () + marginRect.GetTop (), useRect.GetLeft () + marginRect.GetLeft (),
1271 useRect.GetHeight () - (marginRect.GetTop () + marginRect.GetBottom ()),
1272 useRect.GetWidth () - (marginRect.GetLeft () + marginRect.GetRight ()));
1275 template <
typename BASECLASS>
1276 void Led_MFC_CViewHelper<BASECLASS>::InvalidateScrollBarParameters ()
1278 if (fPrintInfo ==
nullptr) {
1279 inherited::InvalidateScrollBarParameters ();
1282 template <
typename BASECLASS>
1287 void Led_MFC_CViewHelper<BASECLASS>::UpdateScrollBars ()
1289 if (fPrintInfo !=
nullptr) {
1292 inherited::UpdateScrollBars ();
1294 template <
typename BASECLASS>
1300 void Led_MFC_CViewHelper<BASECLASS>::DeleteContents ()
1302 ASSERT_VALID (
this);
1304 this->SetWindowText (
nullptr);
1305 ASSERT_VALID (
this);
1307 template <
typename BASECLASS>
1308 void Led_MFC_CViewHelper<BASECLASS>::Serialize (CArchive& ar)
1311 this->SerializeRaw (ar);
1313 template <
typename BASECLASS>
1314 void Led_MFC_CViewHelper<BASECLASS>::SerializeRaw (CArchive& ar)
1316 ASSERT_VALID (
this);
1318 if (ar.IsStoring ()) {
1319 this->WriteToArchive (ar);
1322 CFile* file = ar.GetFile ();
1323 ASSERT_VALID (file);
1324 DWORD dwLen =
static_cast<DWORD
> (file->GetLength ());
1325 this->ReadFromArchive (ar, (UINT)dwLen);
1327 ASSERT_VALID (
this);
1329 template <
typename BASECLASS>
1330 void Led_MFC_CViewHelper<BASECLASS>::ReadFromArchive (CArchive& ar, UINT nLen)
1333 ASSERT_VALID (
this);
1336 if (ar.Read (buf.data (), nLen * sizeof (Led_tChar)) != nLen *
sizeof (Led_tChar)) {
1337 AfxThrowArchiveException (CArchiveException::endOfFile);
1340 nLen =
static_cast<UINT
> (Characters::NormalizeTextToNL<Led_tChar> (buf.data (), nLen, buf.data (), nLen));
1341 if (ValidateTextForCharsetConformance (buf.data (), nLen)) {
1342 this->Replace (0, 0, buf.data (), nLen);
1345 this->OnBadUserInput ();
1348 this->Invalidate ();
1350 ASSERT_VALID (
this);
1352 template <
typename BASECLASS>
1353 void Led_MFC_CViewHelper<BASECLASS>::WriteToArchive (CArchive& ar)
1355 using namespace Foundation;
1356 ASSERT_VALID (
this);
1358 size_t nLen = this->GetLength ();
1360 this->CopyOut (0, nLen, buf.data ());
1362 nLen = Characters::NLToNative<Led_tChar> (buf.data (), nLen, buf2.data (), 2 * nLen);
1363 ar.Write (buf2.data (),
static_cast<UINT
> (nLen * sizeof (Led_tChar)));
1365 ASSERT_VALID (
this);
1367 template <
typename BASECLASS>
1368 void Led_MFC_CViewHelper<BASECLASS>::OnLButtonDown (UINT nFlags, CPoint oPoint)
1370 this->UpdateClickCount (Foundation::Time::GetTickCount (), AsLedPoint (oPoint));
1372 if (this->m_pDocument != NULL and
dynamic_cast<COleDocument*
> (this->m_pDocument) != NULL) {
1377 COleDocument& doc = *(COleDocument*)this->m_pDocument;
1378 COleClientItem* pItem = doc.GetInPlaceActiveItem (
this);
1379 if (pItem != NULL) {
1385 if (this->GetCurClickCount () == 1 and this->IsADragSelect (AsLedPoint (oPoint))) {
1386 this->HandleDragSelect (nFlags, oPoint);
1389 this->OnNormalLButtonDown (nFlags, AsLedPoint (oPoint));
1392 template <
typename BASECLASS>
1393 DROPEFFECT Led_MFC_CViewHelper<BASECLASS>::OnDragEnter (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
1395 return this->HelperDragEnter (pDataObject, dwKeyState, point);
1397 template <
typename BASECLASS>
1398 DROPEFFECT Led_MFC_CViewHelper<BASECLASS>::OnDragOver (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
1400 return this->HelperDragOver (pDataObject, dwKeyState, point);
1402 template <
typename BASECLASS>
1403 BOOL Led_MFC_CViewHelper<BASECLASS>::OnDrop (COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
1405 return this->HelperDrop (pDataObject, dropEffect, point);
1407 template <
typename BASECLASS>
1408 void Led_MFC_CViewHelper<BASECLASS>::OnDragLeave ()
1410 this->HelperDragLeave ();
1412 template <
typename BASECLASS>
1413 void Led_MFC_CViewHelper<BASECLASS>::OnPaint ()
1417 template <
typename BASECLASS>
1422 void Led_MFC_CViewHelper<BASECLASS>::OnDraw (CDC* pDC)
1432 if (fPrintInfo !=
nullptr) {
1436 CRect boundsRect = CRect (0, 0, 0, 0);
1437 Verify (pDC->GetClipBox (&boundsRect) != ERROR);
1438 this->WindowDrawHelper (Led_MFC_TabletFromCDC (pDC), AsLedRect (boundsRect),
false);
1440 template <
typename BASECLASS>
1441 int Led_MFC_CViewHelper<BASECLASS>::OnCreate (::LPCREATESTRUCT lpCreateStruct)
1443 if (inherited::OnCreate (lpCreateStruct) != 0) {
1446 this->TabletChangedMetrics ();
1449 template <
typename BASECLASS>
1450 void Led_MFC_CViewHelper<BASECLASS>::OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
1452 if (this->m_pDocument != NULL and
dynamic_cast<COleDocument*
> (this->m_pDocument) != NULL) {
1459 COleDocument& doc = *(COleDocument*)this->m_pDocument;
1460 COleClientItem* pItem = doc.GetInPlaceActiveItem (
this);
1461 if (pItem != NULL) {
1466 inherited::OnVScroll (nSBCode, nPos, pScrollBar);
1468 template <
typename BASECLASS>
1469 void Led_MFC_CViewHelper<BASECLASS>::OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
1471 if (this->m_pDocument != NULL and
dynamic_cast<COleDocument*
> (this->m_pDocument) != NULL) {
1478 COleDocument& doc = *(COleDocument*)this->m_pDocument;
1479 COleClientItem* pItem = doc.GetInPlaceActiveItem (
this);
1480 if (pItem != NULL) {
1485 inherited::OnHScroll (nSBCode, nPos, pScrollBar);
1487 template <
typename BASECLASS>
1488 const AFX_MSGMAP* Led_MFC_CViewHelper<BASECLASS>::GetMessageMap ()
const
1490 return GetThisMessageMap ();
1492 template <
typename BASECLASS>
1493 const AFX_MSGMAP* PASCAL Led_MFC_CViewHelper<BASECLASS>::GetThisMessageMap ()
1495 using ThisClass = Led_MFC_CViewHelper<BASECLASS>;
1496 using TheBaseClass = BASECLASS;
1497 DISABLE_COMPILER_MSC_WARNING_START (4407)
1498 static const AFX_MSGMAP_ENTRY _messageEntries[] = {ON_WM_PAINT () ON_WM_LBUTTONDOWN () ON_WM_CREATE () ON_WM_VSCROLL ()
1499 ON_WM_HSCROLL (){0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0}};
1500 DISABLE_COMPILER_MSC_WARNING_END (4407)
1501 static const AFX_MSGMAP messageMap = {&TheBaseClass::GetThisMessageMap, &_messageEntries[0]};
1506 template <
typename BASECLASS>
1511 void Led_MFC_ExceptionHandlerHelper<BASECLASS>::HandleException ()
const
1515 template <
typename BASECLASS>
1516 void Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)
1519 inherited::OnChar (nChar, nRepCnt, nFlags);
1522 this->HandleException ();
1525 template <
typename BASECLASS>
1526 LRESULT Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnIMEChar (WPARAM wParam, LPARAM lParam)
1529 return inherited::OnIMEChar (wParam, lParam);
1532 this->HandleException ();
1536 template <
typename BASECLASS>
1537 void Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags)
1540 inherited::OnKeyDown (nChar, nRepCnt, nFlags);
1543 this->HandleException ();
1546 template <
typename BASECLASS>
1547 LRESULT Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnMsgPaste (WPARAM wParam, LPARAM lParam)
1550 return inherited::OnMsgPaste (wParam, lParam);
1553 this->HandleException ();
1557 template <
typename BASECLASS>
1558 void Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnLButtonDown (UINT nFlags, CPoint oPoint)
1561 inherited::OnLButtonDown (nFlags, oPoint);
1564 this->HandleException ();
1567 template <
typename BASECLASS>
1568 void Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnLButtonUp (UINT nFlags, CPoint oPoint)
1571 inherited::OnLButtonUp (nFlags, oPoint);
1574 this->HandleException ();
1577 template <
typename BASECLASS>
1578 void Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnLButtonDblClk (UINT nFlags, CPoint oPoint)
1581 inherited::OnLButtonDblClk (nFlags, oPoint);
1584 this->HandleException ();
1587 template <
typename BASECLASS>
1588 BOOL Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnCmdMsg (UINT nID,
int nCode,
void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
1591 return inherited::OnCmdMsg (nID, nCode, pExtra, pHandlerInfo);
1594 this->HandleException ();
1598 template <
typename BASECLASS>
1599 const AFX_MSGMAP* Led_MFC_ExceptionHandlerHelper<BASECLASS>::GetMessageMap ()
const
1601 return GetThisMessageMap ();
1603 template <
typename BASECLASS>
1604 const AFX_MSGMAP* PASCAL Led_MFC_ExceptionHandlerHelper<BASECLASS>::GetThisMessageMap ()
1606 using ThisClass = Led_MFC_ExceptionHandlerHelper<BASECLASS>;
1607 using TheBaseClass = BASECLASS;
1608 DISABLE_COMPILER_MSC_WARNING_START (4407)
1609 static const AFX_MSGMAP_ENTRY _messageEntries[] = {ON_WM_CHAR () ON_MESSAGE (WM_IME_CHAR, &OnIMEChar) ON_WM_KEYDOWN () ON_MESSAGE (
1610 WM_PASTE, &OnMsgPaste) ON_WM_LBUTTONDOWN () ON_WM_LBUTTONUP () ON_WM_LBUTTONDBLCLK (){0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0}};
1611 DISABLE_COMPILER_MSC_WARNING_END (4407)
1612 static const AFX_MSGMAP messageMap = {&TheBaseClass::GetThisMessageMap, &_messageEntries[0]};
1617 template <
typename ChosenInteractor,
typename LEDMFC>
1618 inline Led_MFC_X<ChosenInteractor, LEDMFC>::Led_MFC_X ()
1619 : ChosenInteractor ()
1627 template <
typename ChosenInteractor,
typename LEDMFC>
1628 void Led_MFC_X<ChosenInteractor, LEDMFC>::AboutToUpdateText (
const MarkerOwner::UpdateInfo& updateInfo)
1630 LEDMFC::AboutToUpdateText (updateInfo);
1631 ChosenInteractor::AboutToUpdateText (updateInfo);
1637 template <
typename ChosenInteractor,
typename LEDMFC>
1638 void Led_MFC_X<ChosenInteractor, LEDMFC>::DidUpdateText (
const MarkerOwner::UpdateInfo& updateInfo)
noexcept
1640 LEDMFC::DidUpdateText_ (updateInfo);
1641 ChosenInteractor::DidUpdateText (updateInfo);
1656 template <
typename TRIVIALWORDWRAPPEDTEXTIMAGER,
typename SIMPLETEXTIMAGER,
typename TEXTSTORE>
1657 CSize Led_GetTextExtent (CDC* cdc,
const Led_tString& text, CRect r,
bool wordWrap)
1660 Led_MFC_TabletFromCDC tmpTablet (cdc);
1661 return AsCSize (GetTextExtent<TRIVIALWORDWRAPPEDTEXTIMAGER, SIMPLETEXTIMAGER, TEXTSTORE> (tmpTablet, text, AsLedRect (r), wordWrap));
1676 template <
typename TRIVIALWORDWRAPPEDTEXTIMAGER,
typename SIMPLETEXTIMAGER,
typename TEXTSTORE>
1677 void Led_DrawText (CDC* cdc,
const Led_tString& text, CRect r,
bool wordWrap)
1680 Led_MFC_TabletFromCDC tmpTablet (cdc);
1681 DrawTextBox<TRIVIALWORDWRAPPEDTEXTIMAGER, SIMPLETEXTIMAGER, TEXTSTORE> (tmpTablet, text, AsLedRect (r), wordWrap);
1685 inline Led_MFC_TmpCmdUpdater::Led_MFC_TmpCmdUpdater (CCmdUI* pCmdUI)
1687 , fCmdNum (MFC_CommandNumberMapping::Get ().Lookup (pCmdUI->m_nID))
1692 inline Led_MFC_TmpCmdUpdater::operator Led_MFC_TmpCmdUpdater* ()
1696 inline Led_MFC_TmpCmdUpdater::operator CCmdUI* ()
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
#define RequireNotNull(p)
#define AssertMember(p, c)
#define CompileTimeFlagChecker_HEADER(NS_PREFIX, NAME, VALUE)
CompileTimeFlagChecker_HEADER () will generate a LINK ERROR if you ever compile a header with one val...
time_point< RealtimeClock, DurationSeconds > TimePointSeconds
TimePointSeconds is a simpler approach to chrono::time_point, which doesn't require using templates e...
chrono::duration< double > DurationSeconds
chrono::duration<double> - a time span (length of time) measured in seconds, but high precision.
Logically halfway between std::array and std::vector; Smart 'direct memory array' - which when needed...
Create a format-string (see std::wformat_string or Stroika FormatString, or python 'f' strings.
basic_string< SDKChar > SDKString