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 return MFC_BASE_CLASS::Default ();
299 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
300 inline LRESULT Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnIME_COMPOSITION ([[maybe_unused]] WPARAM wParam, [[maybe_unused]] LPARAM lParam)
302 return MFC_BASE_CLASS::Default ();
304 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
305 inline LRESULT Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnIME_ENDCOMPOSITION ([[maybe_unused]] WPARAM wParam, [[maybe_unused]] LPARAM lParam)
307 return MFC_BASE_CLASS::Default ();
309 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
310 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnUpdateCommand_MSG (CCmdUI* pCmdUI)
313 if (not this->OnUpdateCommand (Led_MFC_TmpCmdUpdater (pCmdUI))) {
314 pCmdUI->Enable (
false);
317 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
318 void Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::OnPerformCommand_MSG (UINT commandNumber)
322 IdleManager::NonIdleContext nonIdleContext;
324 (void)this->OnPerformCommand (MFC_CommandNumberMapping::Get ().Lookup (commandNumber));
327 DbgTrace (
"Ignoring / suppressing uncaught exception in PerformCommand: {}"_f, current_exception ());
330 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
331 const AFX_MSGMAP* Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::GetMessageMap ()
const
333 return this->GetThisMessageMap ();
335 template <
typename MFC_BASE_CLASS,
typename BASE_INTERACTOR>
336 const AFX_MSGMAP* PASCAL Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>::GetThisMessageMap ()
338 using ThisClass = Led_MFC_Helper<MFC_BASE_CLASS, BASE_INTERACTOR>;
339 using TheBaseClass = MFC_BASE_CLASS;
340 DISABLE_COMPILER_MSC_WARNING_START (4407)
341 static const AFX_MSGMAP_ENTRY _messageEntries[] = {
342 ON_WM_CREATE () ON_WM_CHAR () ON_WM_TIMER () ON_WM_KEYDOWN () ON_WM_PAINT () ON_WM_MOUSEMOVE () ON_WM_LBUTTONDOWN ()
343 ON_WM_SETCURSOR () ON_WM_GETDLGCODE () ON_WM_LBUTTONUP () ON_WM_LBUTTONDBLCLK () ON_WM_SETFOCUS () ON_WM_KILLFOCUS ()
344 ON_WM_SIZE () ON_WM_ERASEBKGND () ON_WM_VSCROLL () ON_WM_HSCROLL () ON_WM_MOUSEWHEEL () ON_WM_ENABLE () ON_MESSAGE (
345 WM_UNICHAR, &OnUniChar) ON_MESSAGE (WM_IME_CHAR, &OnIMEChar) ON_MESSAGE (WM_IME_COMPOSITION, &OnIME_COMPOSITION)
346 ON_MESSAGE (WM_IME_ENDCOMPOSITION, &OnIME_ENDCOMPOSITION) LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kUndo_CmdID)
347 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kRedo_CmdID) LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kSelectAll_CmdID)
348 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kSelectWord_CmdID) LED_MFC_HANDLE_COMMAND_M (
349 BASE_INTERACTOR::kSelectTextRow_CmdID) LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kSelectParagraph_CmdID)
350 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kCut_CmdID) LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kCopy_CmdID)
351 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kPaste_CmdID) LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kClear_CmdID)
352 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kFind_CmdID) LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kFindAgain_CmdID)
353 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kEnterFindString_CmdID)
354 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kReplace_CmdID)
355 LED_MFC_HANDLE_COMMAND_M (BASE_INTERACTOR::kReplaceAgain_CmdID) LED_MFC_HANDLE_COMMAND_M (
356 BASE_INTERACTOR::kSpellCheck_CmdID){0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0}};
357 DISABLE_COMPILER_MSC_WARNING_END (4407)
358 static const AFX_MSGMAP messageMap = {&TheBaseClass::GetThisMessageMap, &_messageEntries[0]};
363 template <
typename BASECLASS>
364 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::Create (DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID)
366 return BASECLASS::Create (NULL, NULL, dwStyle, rect, pParentWnd, nID);
368 template <
typename BASECLASS>
369 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::CanUndo ()
const
371 Assert (::IsWindow (this->m_hWnd));
372 return (BOOL)::SendMessage (this->m_hWnd, EM_CANUNDO, 0, 0);
374 template <
typename BASECLASS>
375 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetLineCount_CEdit ()
const
377 Assert (::IsWindow (this->m_hWnd));
378 return (
int)::SendMessage (this->m_hWnd, EM_GETLINECOUNT, 0, 0);
380 template <
typename BASECLASS>
381 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetModify ()
const
385 Assert (::IsWindow (this->m_hWnd));
386 return (BOOL)::SendMessage (this->m_hWnd, EM_GETMODIFY, 0, 0);
388 template <
typename BASECLASS>
389 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetModify (BOOL bModified)
393 Assert (::IsWindow (this->m_hWnd));
394 ::SendMessage (this->m_hWnd, EM_SETMODIFY, bModified, 0);
396 template <
typename BASECLASS>
397 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetRect (LPRECT lpRect)
const
401 Assert (::IsWindow (this->m_hWnd));
402 ::SendMessage (this->m_hWnd, EM_GETRECT, 0, (LPARAM)lpRect);
404 template <
typename BASECLASS>
405 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetSel (
int& nStartChar,
int& nEndChar)
const
407 Assert (::IsWindow (this->m_hWnd));
408 ::SendMessage (this->m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar);
410 template <
typename BASECLASS>
411 inline DWORD Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetSel ()
const
413 Assert (::IsWindow (this->m_hWnd));
414 return ::SendMessage (this->m_hWnd, EM_GETSEL, 0, 0);
416 template <
typename BASECLASS>
417 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetLine (
int nIndex, LPTSTR lpszBuffer)
const
421 Assert (::IsWindow (this->m_hWnd));
422 return (
int)::SendMessage (this->m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer);
424 template <
typename BASECLASS>
425 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetLine (
int nIndex, LPTSTR lpszBuffer,
int nMaxLength)
const
429 Assert (::IsWindow (this->m_hWnd));
430 *(LPWORD)lpszBuffer = (WORD)nMaxLength;
431 return (
int)::SendMessage (this->m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer);
433 template <
typename BASECLASS>
434 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::EmptyUndoBuffer ()
436 Assert (::IsWindow (this->m_hWnd));
437 ::SendMessage (this->m_hWnd, EM_EMPTYUNDOBUFFER, 0, 0);
439 template <
typename BASECLASS>
440 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::FmtLines (BOOL bAddEOL)
444 Assert (::IsWindow (this->m_hWnd));
445 return (BOOL)::SendMessage (this->m_hWnd, EM_FMTLINES, bAddEOL, 0);
447 template <
typename BASECLASS>
448 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::LimitText (
int nChars)
452 Assert (::IsWindow (this->m_hWnd));
453 ::SendMessage (this->m_hWnd, EM_LIMITTEXT, nChars, 0);
455 template <
typename BASECLASS>
456 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::LineFromChar (
int nIndex)
const
458 Assert (::IsWindow (this->m_hWnd));
459 return (
int)::SendMessage (this->m_hWnd, EM_LINEFROMCHAR, nIndex, 0);
461 template <
typename BASECLASS>
462 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::LineIndex (
int nLine)
const
464 Assert (::IsWindow (this->m_hWnd));
465 return (
int)::SendMessage (this->m_hWnd, EM_LINEINDEX, nLine, 0);
467 template <
typename BASECLASS>
468 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::LineLength (
int nLine)
const
470 Assert (::IsWindow (this->m_hWnd));
471 return (
int)::SendMessage (this->m_hWnd, EM_LINELENGTH, nLine, 0);
473 template <
typename BASECLASS>
474 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::LineScroll (
int nLines,
int nChars)
476 Assert (::IsWindow (this->m_hWnd));
477 ::SendMessage (this->m_hWnd, EM_LINESCROLL, nChars, nLines);
479 template <
typename BASECLASS>
480 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::ReplaceSel (LPCTSTR lpszNewText)
483 Assert (::IsWindow (this->m_hWnd));
484 ::SendMessage (this->m_hWnd, EM_REPLACESEL, 0, (LPARAM)lpszNewText);
486 template <
typename BASECLASS>
487 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetPasswordChar (TCHAR ch)
491 Assert (::IsWindow (this->m_hWnd));
492 ::SendMessage (this->m_hWnd, EM_SETPASSWORDCHAR, ch, 0);
494 template <
typename BASECLASS>
495 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetRect (LPCRECT lpRect)
499 Assert (::IsWindow (this->m_hWnd));
500 ::SendMessage (this->m_hWnd, EM_SETRECT, 0, (LPARAM)lpRect);
502 template <
typename BASECLASS>
503 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetRectNP (LPCRECT lpRect)
507 Assert (::IsWindow (this->m_hWnd));
508 ::SendMessage (this->m_hWnd, EM_SETRECTNP, 0, (LPARAM)lpRect);
510 template <
typename BASECLASS>
511 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetSel (DWORD dwSelection, BOOL bNoScroll)
513 Assert (::IsWindow (this->m_hWnd));
514 ::SendMessage (this->m_hWnd, EM_SETSEL, LOWORD (dwSelection), HIWORD (dwSelection));
516 ::SendMessage (this->m_hWnd, EM_SCROLLCARET, 0, 0);
519 template <
typename BASECLASS>
520 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetSel (
int nStartChar,
int nEndChar, BOOL bNoScroll)
522 Assert (::IsWindow (this->m_hWnd));
523 ::SendMessage (this->m_hWnd, EM_SETSEL, nStartChar, nEndChar);
525 ::SendMessage (this->m_hWnd, EM_SCROLLCARET, 0, 0);
528 template <
typename BASECLASS>
529 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetTabStops (
int nTabStops, LPINT rgTabStops)
533 Assert (::IsWindow (this->m_hWnd));
534 return (BOOL)::SendMessage (this->m_hWnd, EM_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops);
536 template <
typename BASECLASS>
537 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetTabStops ()
541 Assert (::IsWindow (this->m_hWnd));
542 Verify (::SendMessage (this->m_hWnd, EM_SETTABSTOPS, 0, 0));
544 template <
typename BASECLASS>
545 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetTabStops (
const int& cxEachStop)
549 Assert (::IsWindow (this->m_hWnd));
550 return (BOOL)::SendMessage (this->m_hWnd, EM_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop);
552 template <
typename BASECLASS>
553 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::Undo ()
555 Assert (::IsWindow (this->m_hWnd));
556 return (BOOL)::SendMessage (this->m_hWnd, EM_UNDO, 0, 0);
558 template <
typename BASECLASS>
559 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::Clear ()
561 Assert (::IsWindow (this->m_hWnd));
562 ::SendMessage (this->m_hWnd, WM_CLEAR, 0, 0);
564 template <
typename BASECLASS>
565 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::Copy ()
567 Assert (::IsWindow (this->m_hWnd));
568 ::SendMessage (this->m_hWnd, WM_COPY, 0, 0);
570 template <
typename BASECLASS>
571 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::Cut ()
573 Assert (::IsWindow (this->m_hWnd));
574 ::SendMessage (this->m_hWnd, WM_CUT, 0, 0);
576 template <
typename BASECLASS>
577 inline void Led_MFC_MimicMFCAPIHelper<BASECLASS>::Paste ()
579 Assert (::IsWindow (this->m_hWnd));
580 ::SendMessage (this->m_hWnd, WM_PASTE, 0, 0);
582 template <
typename BASECLASS>
583 inline BOOL Led_MFC_MimicMFCAPIHelper<BASECLASS>::SetReadOnly (BOOL bReadOnly)
585 Assert (::IsWindow (this->m_hWnd));
586 return (BOOL)::SendMessage (this->m_hWnd, EM_SETREADONLY, bReadOnly, 0L);
588 template <
typename BASECLASS>
589 inline int Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetFirstVisibleLine ()
const
591 Assert (::IsWindow (this->m_hWnd));
592 return (
int)::SendMessage (this->m_hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L);
594 template <
typename BASECLASS>
595 inline TCHAR Led_MFC_MimicMFCAPIHelper<BASECLASS>::GetPasswordChar ()
const
599 Assert (::IsWindow (this->m_hWnd));
600 return (TCHAR)::SendMessage (this->m_hWnd, EM_GETPASSWORDCHAR, 0, 0L);
604 template <
typename BASECLASS>
605 const AFX_MSGMAP* Led_MFC_OptionalWin32SDKMessageMimicHelper<BASECLASS>::GetMessageMap ()
const
607 return GetThisMessageMap ();
609 template <
typename BASECLASS>
610 const AFX_MSGMAP* PASCAL Led_MFC_OptionalWin32SDKMessageMimicHelper<BASECLASS>::GetThisMessageMap ()
612 using ThisClass = Led_MFC_OptionalWin32SDKMessageMimicHelper<BASECLASS>;
613 using TheBaseClass = BASECLASS;
614 DISABLE_COMPILER_MSC_WARNING_START (4407)
615 static const AFX_MSGMAP_ENTRY _messageEntries[] = {
616 ON_MESSAGE (WM_SETTEXT, &OnMFCSDKMessageDispatcher<WM_SETTEXT>) ON_MESSAGE (WM_GETTEXT, &OnMFCSDKMessageDispatcher<WM_GETTEXT>)
617 ON_MESSAGE (WM_GETTEXTLENGTH, &OnMFCSDKMessageDispatcher<WM_GETTEXTLENGTH>) ON_MESSAGE (
618 EM_GETSEL, &OnMFCSDKMessageDispatcher<EM_GETSEL>) ON_MESSAGE (EM_SETREADONLY, &OnMFCSDKMessageDispatcher<EM_SETREADONLY>)
619 ON_MESSAGE (EM_GETFIRSTVISIBLELINE, &OnMFCSDKMessageDispatcher<EM_GETFIRSTVISIBLELINE>) ON_MESSAGE (
620 EM_LINEINDEX, &OnMFCSDKMessageDispatcher<EM_LINEINDEX>) ON_MESSAGE (EM_GETLINECOUNT, &OnMFCSDKMessageDispatcher<EM_GETLINECOUNT>)
621 ON_MESSAGE (EM_CANUNDO, &OnMFCSDKMessageDispatcher<EM_CANUNDO>) ON_MESSAGE (EM_UNDO, &OnMFCSDKMessageDispatcher<EM_UNDO>)
622 ON_MESSAGE (EM_EMPTYUNDOBUFFER, &OnMFCSDKMessageDispatcher<EM_EMPTYUNDOBUFFER>)
623 ON_MESSAGE (WM_CLEAR, &OnMFCSDKMessageDispatcher<WM_CLEAR>) ON_MESSAGE (WM_CUT, &OnMFCSDKMessageDispatcher<WM_CUT>)
624 ON_MESSAGE (WM_COPY, &OnMFCSDKMessageDispatcher<WM_COPY>) ON_MESSAGE (WM_PASTE, &OnMFCSDKMessageDispatcher<WM_PASTE>)
625 ON_MESSAGE (EM_LINEFROMCHAR, &OnMFCSDKMessageDispatcher<EM_LINEFROMCHAR>)
626 ON_MESSAGE (EM_LINELENGTH, &OnMFCSDKMessageDispatcher<EM_LINELENGTH>)
627 ON_MESSAGE (EM_LINESCROLL, &OnMFCSDKMessageDispatcher<EM_LINESCROLL>)
628 ON_MESSAGE (EM_REPLACESEL, &OnMFCSDKMessageDispatcher<EM_REPLACESEL>)
629 ON_MESSAGE (EM_SETSEL, &OnMFCSDKMessageDispatcher<EM_SETSEL>)
630 ON_MESSAGE (EM_SCROLLCARET, &OnMFCSDKMessageDispatcher<EM_SCROLLCARET>)
631 ON_MESSAGE (WM_GETFONT, &OnMFCSDKMessageDispatcher<WM_GETFONT>)
632 ON_MESSAGE (WM_SETFONT, &OnMFCSDKMessageDispatcher<WM_SETFONT>){
633 0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0}};
634 DISABLE_COMPILER_MSC_WARNING_END (4407)
635 static const AFX_MSGMAP messageMap = {&TheBaseClass::GetThisMessageMap, &_messageEntries[0]};
640 template <
typename BASECLASS>
641 typename Led_MFC_DragAndDropWindow<BASECLASS>::LedStartDragAndDropContext* Led_MFC_DragAndDropWindow<BASECLASS>::sCurrentDragInfo = NULL;
642 template <
typename BASECLASS>
643 Led_MFC_DragAndDropWindow<BASECLASS>::Led_MFC_DragAndDropWindow ()
649 , fPrevDropEffect (DROPEFFECT_NONE)
650 , fDragAutoScrollTimerID (0)
653 template <
typename BASECLASS>
654 Led_MFC_DragAndDropWindow<BASECLASS>::~Led_MFC_DragAndDropWindow ()
656 Assert (fDragAutoScrollTimerID == 0);
658 template <
typename BASECLASS>
669 inline const Led_MFC_DragAndDropWindow<BASECLASS>::CommandNames& Led_MFC_DragAndDropWindow<BASECLASS>::GetCommandNames ()
671 return sCommandNames;
673 template <
typename BASECLASS>
678 inline void Led_MFC_DragAndDropWindow<BASECLASS>::SetCommandNames (
const typename Led_MFC_DragAndDropWindow<BASECLASS>::CommandNames& cmdNames)
680 sCommandNames = cmdNames;
682 template <
typename BASECLASS>
683 typename Led_MFC_DragAndDropWindow<BASECLASS>::CommandNames Led_MFC_DragAndDropWindow<BASECLASS>::sCommandNames;
684 template <
typename BASECLASS>
685 int Led_MFC_DragAndDropWindow<BASECLASS>::OnCreate (LPCREATESTRUCT lpCreateStruct)
687 if (inherited::OnCreate (lpCreateStruct) != 0) {
690 if (not fDropTarget.Register (
this)) {
695 TRACE (_T (
"Warning: failed to register window as drop target\n"));
700 template <
typename BASECLASS>
701 bool Led_MFC_DragAndDropWindow<BASECLASS>::IsADragSelect (Led_Point clickedWhere)
const
713 this->GetSelectionWindowRegion (&r, this->GetSelectionStart (), this->GetSelectionEnd ());
714 return !!r.PtInRegion (AsCPoint (clickedWhere));
716 template <
typename BASECLASS>
717 void Led_MFC_DragAndDropWindow<BASECLASS>::HandleDragSelect (UINT , CPoint oPoint)
721 using TextInteractor::eDefaultUpdate;
723 if (this->GetStyle () & WS_DISABLED) {
726 if (this->GetFocus () !=
this) {
734 this->fMouseTrackingLastPoint = AsLedPoint (oPoint);
735 this->fDragAnchor = this->GetCharAtClickLocation (this->fMouseTrackingLastPoint);
737 Assert (sCurrentDragInfo == NULL);
738 sCurrentDragInfo =
new LedStartDragAndDropContext{
this};
740 sCurrentDragInfo->fOurDragStart = this->GetSelectionStart ();
741 sCurrentDragInfo->fOurDragEnd = this->GetSelectionEnd ();
744 COleDataSource dataSrc;
745 Led_MFCWriterDAndDFlavorPackage flavorPackage (&dataSrc);
746 this->ExternalizeFlavors (flavorPackage);
748 Region selectionRegion;
749 this->GetSelectionWindowRegion (&selectionRegion, this->GetSelectionStart (), this->GetSelectionEnd ());
752 ::DROPEFFECT dropResult = DROPEFFECT_COPY;
753 if (not(this->GetStyle () & ES_READONLY)) {
755 dropResult |= DROPEFFECT_MOVE;
757 dropResult = dataSrc.DoDragDrop (dropResult);
759 if (this->GetStyle () & ES_READONLY) {
760 Assert (not(dropResult & DROPEFFECT_MOVE));
763 switch (dropResult) {
764 case DROPEFFECT_NONE: {
766 if (Foundation::Time::GetTickCount () - startDragSelectAt > kTimeEnoughToRestoreSelection) {
771 this->SetSelection (sCurrentDragInfo->fOurDragStart, sCurrentDragInfo->fOurDragEnd);
777 (void)this->ProcessSimpleClick (this->fMouseTrackingLastPoint, 1,
false, &ignored);
780 case DROPEFFECT_MOVE: {
784 TextInteractor::InteractiveModeUpdater iuMode{*
this};
786 TextInteractor::UndoableContextHelper undoContext (
787 *
this, sCurrentDragInfo->fWeRecievedDrop ?
SDKString{} : GetCommandNames ().fDragCommandName,
788 sCurrentDragInfo->fOrigSelection.GetStart (), sCurrentDragInfo->fOrigSelection.GetEnd (), true);
790 TextInteractor::InteractiveReplace_ (undoContext.GetUndoRegionStart (), undoContext.GetUndoRegionEnd (),
791 LED_TCHAR_OF (
""), 0,
false,
false, eDefaultUpdate);
793 undoContext.CommandComplete (sCurrentDragInfo->fOrigSelection.GetEnd ());
801 this->BreakInGroupedCommands ();
804 delete sCurrentDragInfo;
805 sCurrentDragInfo = NULL;
809 delete sCurrentDragInfo;
810 sCurrentDragInfo = NULL;
812 template <
typename BASECLASS>
813 void Led_MFC_DragAndDropWindow<BASECLASS>::HandleSharedDragOverUpdateSelCode ()
815 using TextInteractor::eImmediateUpdate;
817 if (fPrevDropEffect != DROPEFFECT_NONE) {
819 dc.DrawFocusRect (CRect (fDragPoint, fDragSize));
822 size_t newPos = this->GetCharAtClickLocation (AsLedPoint (fDragPoint));
825 if (newPos < this->GetMarkerPositionOfStartOfWindow ()) {
826 this->ScrollByIfRoom (-1, eImmediateUpdate);
828 else if (newPos > this->GetMarkerPositionOfEndOfWindow ()) {
829 this->ScrollByIfRoom (1, eImmediateUpdate);
832 if (fPrevDropEffect != DROPEFFECT_NONE) {
834 dc.DrawFocusRect (CRect (fDragPoint, fDragSize));
837 template <
typename BASECLASS>
838 DROPEFFECT Led_MFC_DragAndDropWindow<BASECLASS>::HelperDragEnter (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
841 this->StartDragAutoscrollTimer ();
842 if (not GetObjectInfo (pDataObject, &fDragSize, &fDragOffset)) {
843 return DROPEFFECT_NONE;
846 dc.HIMETRICtoDP (&fDragSize);
847 dc.HIMETRICtoDP (&fDragOffset);
848 DROPEFFECT result = this->HelperDragOver (pDataObject, dwKeyState, point);
851 template <
typename BASECLASS>
852 DROPEFFECT Led_MFC_DragAndDropWindow<BASECLASS>::HelperDragOver (COleDataObject* , DWORD dwKeyState, CPoint point)
854 using TextInteractor::eImmediateUpdate;
855 point -= fDragOffset;
860 DROPEFFECT de = DROPEFFECT_NONE;
862 if ((dwKeyState & (MK_CONTROL | MK_SHIFT)) == (MK_CONTROL | MK_SHIFT)) {
863 de = DROPEFFECT_NONE;
865 else if ((dwKeyState & MK_CONTROL) == MK_CONTROL) {
866 de = DROPEFFECT_COPY;
868 else if ((dwKeyState & MK_ALT) == MK_ALT) {
869 de = DROPEFFECT_MOVE;
872 de = DROPEFFECT_MOVE;
875 if (point != fDragPoint) {
878 if (fPrevDropEffect != DROPEFFECT_NONE) {
880 dc.DrawFocusRect (CRect (fDragPoint, fDragSize));
883 size_t newPos = this->GetCharAtClickLocation (AsLedPoint (point));
886 if (sCurrentDragInfo != NULL and sCurrentDragInfo->fLedMFCView ==
this and
887 (newPos >= sCurrentDragInfo->fOurDragStart and newPos <= sCurrentDragInfo->fOurDragEnd)) {
888 this->SetSelection (sCurrentDragInfo->fOurDragStart, sCurrentDragInfo->fOurDragEnd);
890 fPrevDropEffect = DROPEFFECT_NONE;
891 return DROPEFFECT_NONE;
895 if (newPos < this->GetMarkerPositionOfStartOfWindow ()) {
896 this->ScrollByIfRoom (-1, eImmediateUpdate);
898 else if (newPos > this->GetMarkerPositionOfEndOfWindow ()) {
899 this->ScrollByIfRoom (1, eImmediateUpdate);
902 if (newPos >= this->GetMarkerPositionOfStartOfWindow () and newPos <= this->GetMarkerPositionOfEndOfWindow ()) {
903 this->SetSelection (newPos, newPos);
907 fPrevDropEffect = de;
908 if (fPrevDropEffect != DROPEFFECT_NONE) {
911 dc.DrawFocusRect (CRect (fDragPoint, fDragSize));
917 template <
typename BASECLASS>
918 BOOL Led_MFC_DragAndDropWindow<BASECLASS>::HelperDrop (COleDataObject* pDataObject, DROPEFFECT , CPoint )
926 if (sCurrentDragInfo != NULL and sCurrentDragInfo->fLedMFCView ==
this) {
927 sCurrentDragInfo->fWeRecievedDrop =
true;
934 pDataObject->BeginEnumFormats ();
936 while (pDataObject->GetNextFormat (&formatC)) {
938 int nChars = ::GetClipboardFormatName (formatC.cfFormat, buf,
sizeof buf);
946 Led_MFCReaderDAndDFlavorPackage flavors (pDataObject);
948 bool doSmartCNP = this->GetSmartCutAndPasteMode () and flavors.GetFlavorAvailable_TEXT ();
949 TextInteractor::SmartCNPInfo smartCNPInfo;
951 size_t length = flavors.GetFlavorSize (kTEXTClipFormat);
952 Led_ClipFormat textFormat = kTEXTClipFormat;
954 length = flavors.ReadFlavorData (textFormat, length, buf.data ());
956 size_t nTChars = length /
sizeof (Led_tChar);
960 doSmartCNP = this->LooksLikeSmartPastableText (buf.data (), nTChars, &smartCNPInfo);
964 this->BreakInGroupedCommands ();
966 TextInteractor::InteractiveModeUpdater iuMode (*
this);
967 size_t ucSelStart = (sCurrentDragInfo !=
nullptr and sCurrentDragInfo->fLedMFCView ==
this) ? sCurrentDragInfo->fOrigSelection.GetStart ()
968 : this->GetSelectionStart ();
969 size_t ucSelEnd = (sCurrentDragInfo !=
nullptr and sCurrentDragInfo->fLedMFCView ==
this) ? sCurrentDragInfo->fOrigSelection.GetEnd ()
970 : this->GetSelectionEnd ();
971 TextInteractor::UndoableContextHelper undoContext (*
this,
972 (sCurrentDragInfo !=
nullptr and sCurrentDragInfo->fLedMFCView ==
this)
973 ? GetCommandNames ().fDragNDropCommandName
974 : GetCommandNames ().fDropCommandName,
975 this->GetSelectionStart (), this->GetSelectionEnd (), ucSelStart, ucSelEnd, false);
978 this->InternalizeBestFlavor (flavors);
986#pragma message("See if MFC has fixed this bug yet")
995 this->OptionallyAddExtraSpaceForSmartCutAndPasteModeAdds (undoContext.GetUndoRegionStart (), smartCNPInfo);
998 undoContext.CommandComplete ();
1001 if (sCurrentDragInfo ==
nullptr or sCurrentDragInfo->fLedMFCView !=
this) {
1002 this->BreakInGroupedCommands ();
1007 template <
typename BASECLASS>
1008 void Led_MFC_DragAndDropWindow<BASECLASS>::HelperDragLeave ()
1010 StopDragAutoscrollTimer ();
1011 if (fPrevDropEffect != DROPEFFECT_NONE) {
1012 CClientDC dc (
this);
1014 dc.DrawFocusRect (CRect (fDragPoint, fDragSize));
1015 fPrevDropEffect = DROPEFFECT_NONE;
1018 template <
typename BASECLASS>
1019 bool Led_MFC_DragAndDropWindow<BASECLASS>::GetObjectInfo (COleDataObject* pDataObject, CSize* pSize, CSize* pOffset)
1025 static CLIPFORMAT kObjectDescriptorFormatTag = (CLIPFORMAT)::RegisterClipboardFormat (_T(
"Object Descriptor"));
1027 HGLOBAL hObjDesc = pDataObject->GetGlobalData (kObjectDescriptorFormatTag);
1028 if (hObjDesc ==
nullptr) {
1029 *pSize = CSize{0, 0};
1030 *pOffset = CSize{0, 0};
1034 LPOBJECTDESCRIPTOR pObjDesc = (LPOBJECTDESCRIPTOR)::GlobalLock (hObjDesc);
1035 if (pObjDesc ==
nullptr) {
1036 memset (pSize, 0,
sizeof (*pSize));
1037 memset (pOffset, 0,
sizeof (*pOffset));
1040 pSize->cx = (int)pObjDesc->sizel.cx;
1041 pSize->cy = (int)pObjDesc->sizel.cy;
1042 pOffset->cx = (int)pObjDesc->pointl.x;
1043 pOffset->cy = (int)pObjDesc->pointl.y;
1045 ::GlobalUnlock (hObjDesc);
1046 ::GlobalFree (hObjDesc);
1050 template <
typename BASECLASS>
1051 void Led_MFC_DragAndDropWindow<BASECLASS>::StartDragAutoscrollTimer ()
1053 Assert (fDragAutoScrollTimerID == 0);
1054 if (fDragAutoScrollTimerID == 0) {
1056 const int kTimeout = 20;
1058 Verify ((fDragAutoScrollTimerID = this->SetTimer (eAutoscrolling4DragTimerEventID, kTimeout, NULL)) != 0);
1061 template <
typename BASECLASS>
1062 void Led_MFC_DragAndDropWindow<BASECLASS>::StopDragAutoscrollTimer ()
1064 if (fDragAutoScrollTimerID != 0) {
1065 Verify (this->KillTimer (eAutoscrolling4DragTimerEventID));
1066 fDragAutoScrollTimerID = 0;
1069 template <
typename BASECLASS>
1070 void Led_MFC_DragAndDropWindow<BASECLASS>::OnTimer (UINT_PTR nEventID)
1072 if (nEventID == eAutoscrolling4DragTimerEventID) {
1073 this->HandleSharedDragOverUpdateSelCode ();
1076 inherited::OnTimer (nEventID);
1079 template <
typename BASECLASS>
1080 const AFX_MSGMAP* Led_MFC_DragAndDropWindow<BASECLASS>::GetMessageMap ()
const
1082 return GetThisMessageMap ();
1084 template <
typename BASECLASS>
1085 const AFX_MSGMAP* PASCAL Led_MFC_DragAndDropWindow<BASECLASS>::GetThisMessageMap ()
1087 using ThisClass = Led_MFC_DragAndDropWindow<BASECLASS>;
1088 using TheBaseClass = BASECLASS;
1089 DISABLE_COMPILER_MSC_WARNING_START (4407)
1090 static const AFX_MSGMAP_ENTRY _messageEntries[] = {ON_WM_CREATE () ON_WM_TIMER (){0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0}};
1091 DISABLE_COMPILER_MSC_WARNING_END (4407)
1092 static const AFX_MSGMAP messageMap = {&TheBaseClass::GetThisMessageMap, &_messageEntries[0]};
1097 template <
typename BASECLASS>
1098 Led_MFC_CViewHelper<BASECLASS>::Led_MFC_CViewHelper ()
1102 fPrintMargins (TWIPS_Rect (TWIPS{1440}, TWIPS{1440}, TWIPS{0}, TWIPS{0}))
1103 , fPrintInfo{nullptr}
1106 template <
typename BASECLASS>
1107 Led_MFC_CViewHelper<BASECLASS>::~Led_MFC_CViewHelper ()
1109 Assert (fPrintInfo ==
nullptr);
1111 template <
typename BASECLASS>
1117 TWIPS_Rect Led_MFC_CViewHelper<BASECLASS>::GetPrintMargins ()
const
1119 return fPrintMargins;
1121 template <
typename BASECLASS>
1126 void Led_MFC_CViewHelper<BASECLASS>::SetPrintMargins (
const TWIPS_Rect& printMargins)
1128 fPrintMargins = printMargins;
1130 template <
typename BASECLASS>
1136 BOOL Led_MFC_CViewHelper<BASECLASS>::OnPreparePrinting (CPrintInfo* pInfo)
1139 return this->DoPreparePrinting (pInfo);
1141 template <
typename BASECLASS>
1148 void Led_MFC_CViewHelper<BASECLASS>::OnBeginPrinting (CDC* pDC, CPrintInfo* pInfo)
1151 Assert (fPrintInfo ==
nullptr);
1152 BASECLASS::OnBeginPrinting (pDC, pInfo);
1153 fPrintInfo =
new PrintInfo (*
this, pDC, this->GetWindowRect (), this->GetMarkerPositionOfStartOfWindow (), this->GetForceAllRowsShowing ());
1154 this->SetForceAllRowsShowing (
false);
1156 template <
typename BASECLASS>
1157 void Led_MFC_CViewHelper<BASECLASS>::OnPrint (CDC* pDC, CPrintInfo* )
1164 Led_MFC_TabletFromCDC tablet (pDC);
1165 typename BASECLASS::TemporarilyUseTablet tmpUseTablet{*
this, tablet, BASECLASS::TemporarilyUseTablet::eDontDoTextMetricsChangedCall};
1166 CRect boundsRect = CRect (0, 0, 0, 0);
1167 Verify (pDC->GetClipBox (&boundsRect) != ERROR);
1168 this->Draw (AsLedRect (boundsRect),
true);
1170 template <
typename BASECLASS>
1171 void Led_MFC_CViewHelper<BASECLASS>::OnEndPrinting (CDC* pDC, CPrintInfo* pInfo)
1173 if (fPrintInfo ==
nullptr) {
1175 BASECLASS::OnEndPrinting (pDC, pInfo);
1178 this->SetForceAllRowsShowing (fPrintInfo->fSavedForceAllRowsFlag);
1179 this->SetWindowRect (fPrintInfo->fOldWindowRect);
1180 this->SetTopRowInWindowByMarkerPosition (fPrintInfo->fSavedScrollPos);
1182 fPrintInfo =
nullptr;
1183 BASECLASS::OnEndPrinting (pDC, pInfo);
1186 template <
typename BASECLASS>
1187 void Led_MFC_CViewHelper<BASECLASS>::OnPrepareDC (CDC* pDC, CPrintInfo* pInfo)
1189 if (pInfo != NULL and pDC->IsPrinting ()) {
1191 WindowDC screenDC (NULL);
1192 (void)pDC->SetMapMode (MM_ANISOTROPIC);
1193 (void)pDC->SetWindowExt (screenDC.GetDeviceCaps (LOGPIXELSX), screenDC.GetDeviceCaps (LOGPIXELSY));
1194 (void)pDC->SetViewportExt (pDC->GetDeviceCaps (LOGPIXELSX), pDC->GetDeviceCaps (LOGPIXELSY));
1202 Led_Rect oldWR = this->GetWindowRect ();
1203 Led_Rect newWR = this->CalculatePrintingRect (pDC);
1204 this->SetWindowRect (newWR);
1206 CView::OnPrepareDC (pDC, pInfo);
1207 if (fPrintInfo->fWindowStarts.size () == 0) {
1208 fPrintInfo->fWindowStarts.push_back (0);
1209 this->SetTopRowInWindowByMarkerPosition (0, TextInteractor::eNoUpdate);
1211 pInfo->m_bContinuePrinting =
true;
1215 while (fPrintInfo->fWindowStarts.size () < pInfo->m_nCurPage) {
1217 if (this->GetMarkerPositionOfEndOfWindow () == this->GetTextStore ().GetEnd ()) {
1218 pInfo->m_bContinuePrinting =
false;
1221 this->SetTopRowInWindowByMarkerPosition (this->FindNextCharacter (this->GetMarkerPositionOfEndOfWindow ()), TextInteractor::eNoUpdate);
1222 size_t newStart = this->GetMarkerPositionOfStartOfWindow ();
1223 if (newStart == fPrintInfo->fWindowStarts.back ()) {
1224 pInfo->m_bContinuePrinting =
false;
1228 fPrintInfo->fWindowStarts.push_back (newStart);
1232 this->SetTopRowInWindowByMarkerPosition (fPrintInfo->fWindowStarts[pInfo->m_nCurPage - 1]);
1233 if (this->GetMarkerPositionOfEndOfWindow () == this->GetTextStore ().GetEnd ()) {
1234 pInfo->SetMaxPage (pInfo->m_nCurPage);
1239 template <
typename BASECLASS>
1248 Led_Rect Led_MFC_CViewHelper<BASECLASS>::CalculatePrintingRect (CDC* pDC)
const
1254 CRect winRect = CRect (0, 0, pDC->GetDeviceCaps (HORZRES), pDC->GetDeviceCaps (VERTRES));
1255 pDC->DPtoLP (&winRect);
1256 Led_Rect useRect = AsLedRect (winRect);
1257 Led_Rect marginRect = Led_MFC_TabletFromCDC (pDC)->CvtFromTWIPS (fPrintMargins);
1258 useRect = Led_Rect (useRect.GetTop () + marginRect.GetTop (), useRect.GetLeft () + marginRect.GetLeft (),
1259 useRect.GetHeight () - (marginRect.GetTop () + marginRect.GetBottom ()),
1260 useRect.GetWidth () - (marginRect.GetLeft () + marginRect.GetRight ()));
1263 template <
typename BASECLASS>
1264 void Led_MFC_CViewHelper<BASECLASS>::InvalidateScrollBarParameters ()
1266 if (fPrintInfo ==
nullptr) {
1267 inherited::InvalidateScrollBarParameters ();
1270 template <
typename BASECLASS>
1275 void Led_MFC_CViewHelper<BASECLASS>::UpdateScrollBars ()
1277 if (fPrintInfo !=
nullptr) {
1280 inherited::UpdateScrollBars ();
1282 template <
typename BASECLASS>
1288 void Led_MFC_CViewHelper<BASECLASS>::DeleteContents ()
1290 ASSERT_VALID (
this);
1292 this->SetWindowText (
nullptr);
1293 ASSERT_VALID (
this);
1295 template <
typename BASECLASS>
1296 void Led_MFC_CViewHelper<BASECLASS>::Serialize (CArchive& ar)
1299 this->SerializeRaw (ar);
1301 template <
typename BASECLASS>
1302 void Led_MFC_CViewHelper<BASECLASS>::SerializeRaw (CArchive& ar)
1304 ASSERT_VALID (
this);
1306 if (ar.IsStoring ()) {
1307 this->WriteToArchive (ar);
1310 CFile* file = ar.GetFile ();
1311 ASSERT_VALID (file);
1312 DWORD dwLen =
static_cast<DWORD
> (file->GetLength ());
1313 this->ReadFromArchive (ar, (UINT)dwLen);
1315 ASSERT_VALID (
this);
1317 template <
typename BASECLASS>
1318 void Led_MFC_CViewHelper<BASECLASS>::ReadFromArchive (CArchive& ar, UINT nLen)
1321 ASSERT_VALID (
this);
1324 if (ar.Read (buf.data (), nLen * sizeof (Led_tChar)) != nLen *
sizeof (Led_tChar)) {
1325 AfxThrowArchiveException (CArchiveException::endOfFile);
1328 nLen =
static_cast<UINT
> (Characters::NormalizeTextToNL<Led_tChar> (buf.data (), nLen, buf.data (), nLen));
1329 if (ValidateTextForCharsetConformance (buf.data (), nLen)) {
1330 this->Replace (0, 0, buf.data (), nLen);
1333 this->OnBadUserInput ();
1336 this->Invalidate ();
1338 ASSERT_VALID (
this);
1340 template <
typename BASECLASS>
1341 void Led_MFC_CViewHelper<BASECLASS>::WriteToArchive (CArchive& ar)
1343 using namespace Foundation;
1344 ASSERT_VALID (
this);
1346 size_t nLen = this->GetLength ();
1348 this->CopyOut (0, nLen, buf.data ());
1350 nLen = Characters::NLToNative<Led_tChar> (buf.data (), nLen, buf2.data (), 2 * nLen);
1351 ar.Write (buf2.data (),
static_cast<UINT
> (nLen * sizeof (Led_tChar)));
1353 ASSERT_VALID (
this);
1355 template <
typename BASECLASS>
1356 void Led_MFC_CViewHelper<BASECLASS>::OnLButtonDown (UINT nFlags, CPoint oPoint)
1358 this->UpdateClickCount (Foundation::Time::GetTickCount (), AsLedPoint (oPoint));
1360 if (this->m_pDocument != NULL and
dynamic_cast<COleDocument*
> (this->m_pDocument) != NULL) {
1365 COleDocument& doc = *(COleDocument*)this->m_pDocument;
1366 COleClientItem* pItem = doc.GetInPlaceActiveItem (
this);
1367 if (pItem != NULL) {
1373 if (this->GetCurClickCount () == 1 and this->IsADragSelect (AsLedPoint (oPoint))) {
1374 this->HandleDragSelect (nFlags, oPoint);
1377 this->OnNormalLButtonDown (nFlags, AsLedPoint (oPoint));
1380 template <
typename BASECLASS>
1381 DROPEFFECT Led_MFC_CViewHelper<BASECLASS>::OnDragEnter (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
1383 return this->HelperDragEnter (pDataObject, dwKeyState, point);
1385 template <
typename BASECLASS>
1386 DROPEFFECT Led_MFC_CViewHelper<BASECLASS>::OnDragOver (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
1388 return this->HelperDragOver (pDataObject, dwKeyState, point);
1390 template <
typename BASECLASS>
1391 BOOL Led_MFC_CViewHelper<BASECLASS>::OnDrop (COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
1393 return this->HelperDrop (pDataObject, dropEffect, point);
1395 template <
typename BASECLASS>
1396 void Led_MFC_CViewHelper<BASECLASS>::OnDragLeave ()
1398 this->HelperDragLeave ();
1400 template <
typename BASECLASS>
1401 void Led_MFC_CViewHelper<BASECLASS>::OnPaint ()
1405 template <
typename BASECLASS>
1410 void Led_MFC_CViewHelper<BASECLASS>::OnDraw (CDC* pDC)
1420 if (fPrintInfo !=
nullptr) {
1424 CRect boundsRect = CRect (0, 0, 0, 0);
1425 Verify (pDC->GetClipBox (&boundsRect) != ERROR);
1426 this->WindowDrawHelper (Led_MFC_TabletFromCDC (pDC), AsLedRect (boundsRect),
false);
1428 template <
typename BASECLASS>
1429 int Led_MFC_CViewHelper<BASECLASS>::OnCreate (::LPCREATESTRUCT lpCreateStruct)
1431 if (inherited::OnCreate (lpCreateStruct) != 0) {
1434 this->TabletChangedMetrics ();
1437 template <
typename BASECLASS>
1438 void Led_MFC_CViewHelper<BASECLASS>::OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
1440 if (this->m_pDocument != NULL and
dynamic_cast<COleDocument*
> (this->m_pDocument) != NULL) {
1447 COleDocument& doc = *(COleDocument*)this->m_pDocument;
1448 COleClientItem* pItem = doc.GetInPlaceActiveItem (
this);
1449 if (pItem != NULL) {
1454 inherited::OnVScroll (nSBCode, nPos, pScrollBar);
1456 template <
typename BASECLASS>
1457 void Led_MFC_CViewHelper<BASECLASS>::OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
1459 if (this->m_pDocument != NULL and
dynamic_cast<COleDocument*
> (this->m_pDocument) != NULL) {
1466 COleDocument& doc = *(COleDocument*)this->m_pDocument;
1467 COleClientItem* pItem = doc.GetInPlaceActiveItem (
this);
1468 if (pItem != NULL) {
1473 inherited::OnHScroll (nSBCode, nPos, pScrollBar);
1475 template <
typename BASECLASS>
1476 const AFX_MSGMAP* Led_MFC_CViewHelper<BASECLASS>::GetMessageMap ()
const
1478 return GetThisMessageMap ();
1480 template <
typename BASECLASS>
1481 const AFX_MSGMAP* PASCAL Led_MFC_CViewHelper<BASECLASS>::GetThisMessageMap ()
1483 using ThisClass = Led_MFC_CViewHelper<BASECLASS>;
1484 using TheBaseClass = BASECLASS;
1485 DISABLE_COMPILER_MSC_WARNING_START (4407)
1486 static const AFX_MSGMAP_ENTRY _messageEntries[] = {ON_WM_PAINT () ON_WM_LBUTTONDOWN () ON_WM_CREATE () ON_WM_VSCROLL ()
1487 ON_WM_HSCROLL (){0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0}};
1488 DISABLE_COMPILER_MSC_WARNING_END (4407)
1489 static const AFX_MSGMAP messageMap = {&TheBaseClass::GetThisMessageMap, &_messageEntries[0]};
1494 template <
typename BASECLASS>
1499 void Led_MFC_ExceptionHandlerHelper<BASECLASS>::HandleException ()
const
1503 template <
typename BASECLASS>
1504 void Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)
1507 inherited::OnChar (nChar, nRepCnt, nFlags);
1510 this->HandleException ();
1513 template <
typename BASECLASS>
1514 LRESULT Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnIMEChar (WPARAM wParam, LPARAM lParam)
1517 return inherited::OnIMEChar (wParam, lParam);
1520 this->HandleException ();
1524 template <
typename BASECLASS>
1525 void Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags)
1528 inherited::OnKeyDown (nChar, nRepCnt, nFlags);
1531 this->HandleException ();
1534 template <
typename BASECLASS>
1535 LRESULT Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnMsgPaste (WPARAM wParam, LPARAM lParam)
1538 return inherited::OnMsgPaste (wParam, lParam);
1541 this->HandleException ();
1545 template <
typename BASECLASS>
1546 void Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnLButtonDown (UINT nFlags, CPoint oPoint)
1549 inherited::OnLButtonDown (nFlags, oPoint);
1552 this->HandleException ();
1555 template <
typename BASECLASS>
1556 void Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnLButtonUp (UINT nFlags, CPoint oPoint)
1559 inherited::OnLButtonUp (nFlags, oPoint);
1562 this->HandleException ();
1565 template <
typename BASECLASS>
1566 void Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnLButtonDblClk (UINT nFlags, CPoint oPoint)
1569 inherited::OnLButtonDblClk (nFlags, oPoint);
1572 this->HandleException ();
1575 template <
typename BASECLASS>
1576 BOOL Led_MFC_ExceptionHandlerHelper<BASECLASS>::OnCmdMsg (UINT nID,
int nCode,
void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
1579 return inherited::OnCmdMsg (nID, nCode, pExtra, pHandlerInfo);
1582 this->HandleException ();
1586 template <
typename BASECLASS>
1587 const AFX_MSGMAP* Led_MFC_ExceptionHandlerHelper<BASECLASS>::GetMessageMap ()
const
1589 return GetThisMessageMap ();
1591 template <
typename BASECLASS>
1592 const AFX_MSGMAP* PASCAL Led_MFC_ExceptionHandlerHelper<BASECLASS>::GetThisMessageMap ()
1594 using ThisClass = Led_MFC_ExceptionHandlerHelper<BASECLASS>;
1595 using TheBaseClass = BASECLASS;
1596 static const AFX_MSGMAP_ENTRY _messageEntries[] = {ON_WM_CHAR () ON_MESSAGE (WM_IME_CHAR, &OnIMEChar) ON_WM_KEYDOWN () ON_MESSAGE (
1597 WM_PASTE, &OnMsgPaste) ON_WM_LBUTTONDOWN () ON_WM_LBUTTONUP () ON_WM_LBUTTONDBLCLK (){0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0}};
1598 static const AFX_MSGMAP messageMap = {&TheBaseClass::GetThisMessageMap, &_messageEntries[0]};
1603 template <
typename ChosenInteractor,
typename LEDMFC>
1604 inline Led_MFC_X<ChosenInteractor, LEDMFC>::Led_MFC_X ()
1605 : ChosenInteractor ()
1613 template <
typename ChosenInteractor,
typename LEDMFC>
1614 void Led_MFC_X<ChosenInteractor, LEDMFC>::AboutToUpdateText (
const MarkerOwner::UpdateInfo& updateInfo)
1616 LEDMFC::AboutToUpdateText (updateInfo);
1617 ChosenInteractor::AboutToUpdateText (updateInfo);
1623 template <
typename ChosenInteractor,
typename LEDMFC>
1624 void Led_MFC_X<ChosenInteractor, LEDMFC>::DidUpdateText (
const MarkerOwner::UpdateInfo& updateInfo)
noexcept
1626 LEDMFC::DidUpdateText_ (updateInfo);
1627 ChosenInteractor::DidUpdateText (updateInfo);
1642 template <
typename TRIVIALWORDWRAPPEDTEXTIMAGER,
typename SIMPLETEXTIMAGER,
typename TEXTSTORE>
1643 CSize Led_GetTextExtent (CDC* cdc,
const Led_tString& text, CRect r,
bool wordWrap)
1646 Led_MFC_TabletFromCDC tmpTablet (cdc);
1647 return AsCSize (GetTextExtent<TRIVIALWORDWRAPPEDTEXTIMAGER, SIMPLETEXTIMAGER, TEXTSTORE> (tmpTablet, text, AsLedRect (r), wordWrap));
1662 template <
typename TRIVIALWORDWRAPPEDTEXTIMAGER,
typename SIMPLETEXTIMAGER,
typename TEXTSTORE>
1663 void Led_DrawText (CDC* cdc,
const Led_tString& text, CRect r,
bool wordWrap)
1666 Led_MFC_TabletFromCDC tmpTablet (cdc);
1667 DrawTextBox<TRIVIALWORDWRAPPEDTEXTIMAGER, SIMPLETEXTIMAGER, TEXTSTORE> (tmpTablet, text, AsLedRect (r), wordWrap);
1671 inline Led_MFC_TmpCmdUpdater::Led_MFC_TmpCmdUpdater (CCmdUI* pCmdUI)
1673 , fCmdNum (MFC_CommandNumberMapping::Get ().Lookup (pCmdUI->m_nID))
1678 inline Led_MFC_TmpCmdUpdater::operator Led_MFC_TmpCmdUpdater*()
1682 inline Led_MFC_TmpCmdUpdater::operator CCmdUI*()
1690 qStroika_Frameworks_Led_MFCRequiresCWndLeftmostBaseClass)
#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) - a F...
basic_string< SDKChar > SDKString