4#ifndef _Stroika_Frameworks_Led_Platform_MFC_h_
5#define _Stroika_Frameworks_Led_Platform_MFC_h_ 1
7#include "Stroika/Frameworks/StroikaPreComp.h"
24static_assert (qStroika_HasComponent_ATLMFC,
25 "Error: Stroika::Framework::Led::Platform MFC code requires the ATLMFC feature to be set true");
32#include "Stroika/Frameworks/Led/IdleManager.h"
33#include "Stroika/Frameworks/Led/Platform/Windows.h"
34#include "Stroika/Frameworks/Led/TextInteractor.h"
36namespace Stroika::Frameworks::Led::Platform {
54#ifndef qStroika_Frameworks_Led_AssertsDefaultToMFCAsserts
55#define qStroika_Frameworks_Led_AssertsDefaultToMFCAsserts 0
65#ifndef qSupportDrawTextGetTextExtent
66#define qSupportDrawTextGetTextExtent 0
83#ifndef qStroika_Frameworks_Led_MFCRequiresCWndLeftmostBaseClass
84#define qStroika_Frameworks_Led_MFCRequiresCWndLeftmostBaseClass 1
87 CPoint AsCPoint (Led_Point p);
88 Led_Point AsLedPoint (CPoint p);
90 CRect AsCRect (Led_Rect r);
91 Led_Rect AsLedRect (CRect r);
93 CSize AsCSize (Led_Size s);
103 class Led_MFC_CDCFromTablet {
105 Led_MFC_CDCFromTablet (Tablet* t);
106 ~Led_MFC_CDCFromTablet ();
121 class Led_MFC_TabletFromCDC {
123 Led_MFC_TabletFromCDC (CDC* pDC);
124 ~Led_MFC_TabletFromCDC ();
128 Tablet* operator->();
144 template <
typename MFC_BASE_CLASS = CWnd,
typename BASE_INTERACTOR = TextInteractor>
145 class Led_MFC_Helper :
146#if qStroika_Frameworks_Led_MFCRequiresCWndLeftmostBaseClass
147 public MFC_BASE_CLASS,
148 public Led_Win32_Helper<BASE_INTERACTOR>
150 public Led_Win32_Helper<BASE_INTERACTOR>,
151 public MFC_BASE_CLASS
155 using inherited =
void*;
157 using LED_WIN32_HELPER = Led_Win32_Helper<BASE_INTERACTOR>;
160 using UpdateInfo = MarkerOwner::UpdateInfo;
166 virtual ~Led_MFC_Helper ();
169 nonvirtual BOOL ReplaceWindow (HWND hWnd);
173 virtual HWND GetHWND ()
const override;
177 afx_msg
int OnCreate (LPCREATESTRUCT lpCreateStruct);
178 afx_msg
void OnPaint ();
179 afx_msg BOOL OnSetCursor (CWnd* pWnd, UINT nHitTest, UINT message);
180 afx_msg UINT OnGetDlgCode ();
181 afx_msg
void OnChar (UINT nChar, UINT nRepCnt, UINT );
182 afx_msg LRESULT OnUniChar (WPARAM wParam, LPARAM lParam);
183 afx_msg LRESULT OnIMEChar (WPARAM wParam, LPARAM lParam);
184 afx_msg LRESULT OnIME_COMPOSITION (WPARAM wParam, LPARAM lParam);
185 afx_msg LRESULT OnIME_ENDCOMPOSITION (WPARAM wParam, LPARAM lParam);
186 afx_msg
void OnKeyDown (UINT nChar, UINT nRepCnt, UINT );
187 afx_msg
void OnMouseMove (UINT , CPoint oPoint);
188 afx_msg
void OnLButtonDown (UINT nFlags, CPoint oPoint);
189 afx_msg
void OnLButtonUp (UINT , CPoint oPoint);
190 afx_msg
void OnLButtonDblClk (UINT , CPoint oPoint);
191 afx_msg
void OnSetFocus (CWnd* pOldWnd);
192 afx_msg
void OnKillFocus (CWnd* pNewWnd);
193 afx_msg
void OnSize (UINT nType,
int cx,
int cy);
194 afx_msg BOOL OnEraseBkgnd (CDC* pDC);
195 afx_msg
void OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
196 afx_msg
void OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
197 afx_msg BOOL OnMouseWheel (UINT fFlags,
short zDelta, CPoint point);
198 afx_msg
void OnEnable (BOOL bEnable);
199 afx_msg
void OnTimer (UINT_PTR nEventID);
203 virtual Led_Rect GetWindowRect ()
const;
204 nonvirtual
void GetWindowRect (LPRECT lpRect)
const;
207 nonvirtual DWORD GetStyle ()
const;
211 afx_msg
void OnUpdateCommand_MSG (CCmdUI* pCmdUI);
212 afx_msg
void OnPerformCommand_MSG (UINT commandNumber);
215 DECLARE_MESSAGE_MAP ()
228 template <
typename BASECLASS = Led_MFC_Helper<>>
229 class Led_MFC_MimicMFCAPIHelper :
public BASECLASS {
231 Led_MFC_MimicMFCAPIHelper () =
default;
234 nonvirtual BOOL Create (DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID);
235 nonvirtual BOOL CanUndo ()
const;
236 nonvirtual
int GetLineCount_CEdit ()
const;
237 nonvirtual BOOL GetModify ()
const;
238 nonvirtual
void SetModify (BOOL bModified = TRUE);
239 nonvirtual
void GetRect (LPRECT lpRect)
const;
240 nonvirtual DWORD GetSel ()
const;
241 nonvirtual
void GetSel (
int& nStartChar,
int& nEndChar)
const;
242 nonvirtual
int GetLine (
int nIndex, LPTSTR lpszBuffer)
const;
243 nonvirtual
int GetLine (
int nIndex, LPTSTR lpszBuffer,
int nMaxLength)
const;
244 nonvirtual
void EmptyUndoBuffer ();
245 nonvirtual BOOL FmtLines (BOOL bAddEOL);
246 nonvirtual
void LimitText (
int nChars = 0);
247 nonvirtual
int LineFromChar (
int nIndex = -1)
const;
248 nonvirtual
int LineIndex (
int nLine = -1)
const;
249 nonvirtual
int LineLength (
int nLine = -1)
const;
250 nonvirtual
void LineScroll (
int nLines,
int nChars = 0);
251 nonvirtual
void ReplaceSel (LPCTSTR lpszNewText);
252 nonvirtual
void SetPasswordChar (TCHAR ch);
253 nonvirtual
void SetRect (LPCRECT lpRect);
254 nonvirtual
void SetRectNP (LPCRECT lpRect);
255 nonvirtual
void SetSel (DWORD dwSelection, BOOL bNoScroll = FALSE);
256 nonvirtual
void SetSel (
int nStartChar,
int nEndChar, BOOL bNoScroll = FALSE);
257 nonvirtual BOOL SetTabStops (
int nTabStops, LPINT rgTabStops);
258 nonvirtual
void SetTabStops ();
259 nonvirtual BOOL SetTabStops (
const int& cxEachStop);
260 nonvirtual BOOL Undo ();
261 nonvirtual
void Clear ();
262 nonvirtual
void Copy ();
263 nonvirtual
void Cut ();
264 nonvirtual
void Paste ();
265 nonvirtual BOOL SetReadOnly (BOOL bReadOnly = TRUE);
266 nonvirtual
int GetFirstVisibleLine ()
const;
267 nonvirtual TCHAR GetPasswordChar ()
const;
277 template <
typename BASECLASS = Led_MFC_Helper<>>
278 class Led_MFC_OptionalWin32SDKMessageMimicHelper :
public Led_Win32_Win32SDKMessageMimicHelper<BASECLASS> {
280 using inherited = Led_Win32_Win32SDKMessageMimicHelper<BASECLASS>;
283 Led_MFC_OptionalWin32SDKMessageMimicHelper () =
default;
286 template <
int MESSAGE_NUMBER>
287 afx_msg LRESULT OnMFCSDKMessageDispatcher (WPARAM wParam, LPARAM lParam)
290 Verify (this->HandleMessage (MESSAGE_NUMBER, wParam, lParam, &result));
295 DECLARE_MESSAGE_MAP ()
306 template <
typename BASECLASS = Led_MFC_Helper<>>
307 class Led_MFC_DragAndDropWindow :
public BASECLASS {
309 using inherited = BASECLASS;
312 Led_MFC_DragAndDropWindow ();
315 ~Led_MFC_DragAndDropWindow ();
332 struct CommandNames {
334 : fDragCommandName (Led_SDK_TCHAROF (
"Drag"))
335 , fDropCommandName (Led_SDK_TCHAROF (
"Drop"))
336 , fDragNDropCommandName (Led_SDK_TCHAROF (
"Drag and Drop"))
350 static const CommandNames& GetCommandNames ();
351 static void SetCommandNames (
const CommandNames& cmdNames);
354 static CommandNames sCommandNames;
357 COleDropTarget fDropTarget;
360 afx_msg
int OnCreate (LPCREATESTRUCT lpCreateStruct);
364 virtual bool IsADragSelect (Led_Point clickedWhere)
const;
365 nonvirtual
void HandleDragSelect (UINT nFlags, CPoint oPoint);
366 nonvirtual
void HandleSharedDragOverUpdateSelCode ();
367 nonvirtual DROPEFFECT HelperDragEnter (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
368 nonvirtual DROPEFFECT HelperDragOver (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
369 nonvirtual BOOL HelperDrop (COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point);
370 nonvirtual
void HelperDragLeave ();
376 DROPEFFECT fPrevDropEffect;
379 nonvirtual
bool GetObjectInfo (COleDataObject* pDataObject, CSize* pSize, CSize* pOffset);
382 afx_msg
void OnTimer (UINT_PTR nEventID);
385 nonvirtual
void StartDragAutoscrollTimer ();
386 nonvirtual
void StopDragAutoscrollTimer ();
388 eAutoscrolling4DragTimerEventID = 435
390 UINT_PTR fDragAutoScrollTimerID;
393 struct LedStartDragAndDropContext {
395 LedStartDragAndDropContext (Led_MFC_DragAndDropWindow<BASECLASS>* ledMFCView)
399 , fWeRecievedDrop (false)
400 , fLedMFCView (ledMFCView)
401 , fOrigSelection (ledMFCView->GetTextStore (), ledMFCView->GetSelectionStart (), ledMFCView->GetSelectionEnd ())
407 size_t fOurDragStart;
409 bool fWeRecievedDrop;
410 Led_MFC_DragAndDropWindow<BASECLASS>* fLedMFCView;
411 TempMarker fOrigSelection;
414 static LedStartDragAndDropContext* sCurrentDragInfo;
417 DECLARE_MESSAGE_MAP ()
425 template <
typename BASECLASS = Led_MFC_DragAndDropWindow<>>
426 class Led_MFC_CViewHelper :
public BASECLASS {
428 using inherited = BASECLASS;
431 Led_MFC_CViewHelper ();
434 virtual ~Led_MFC_CViewHelper ();
438 virtual void DeleteContents ();
439 virtual void Serialize (CArchive& ar);
440 nonvirtual
void SerializeRaw (CArchive& ar);
441 nonvirtual
void ReadFromArchive (CArchive& ar, UINT nLen);
442 nonvirtual
void WriteToArchive (CArchive& ar);
445 afx_msg
void OnPaint ();
446 virtual void OnDraw (CDC* pDC)
override;
447 afx_msg
void OnLButtonDown (UINT nFlags, CPoint oPoint);
448 afx_msg
int OnCreate (LPCREATESTRUCT lpCreateStruct);
449 afx_msg
void OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
450 afx_msg
void OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
453 nonvirtual TWIPS_Rect GetPrintMargins ()
const;
454 nonvirtual
void SetPrintMargins (
const TWIPS_Rect& printMargins);
457 TWIPS_Rect fPrintMargins;
460 virtual BOOL OnPreparePrinting (CPrintInfo* pInfo)
override;
461 virtual void OnBeginPrinting (CDC* pDC, CPrintInfo* pInfo)
override;
462 virtual void OnPrint (CDC* pDC, CPrintInfo* pInfo)
override;
463 virtual void OnEndPrinting (CDC* pDC, CPrintInfo* pInfo)
override;
466 virtual void OnPrepareDC (CDC* pDC, CPrintInfo* pInfo)
override;
469 virtual Led_Rect CalculatePrintingRect (CDC* pDC)
const;
473 PrintInfo (BASECLASS& editor, CDC* useTablet, Led_Rect oldWindowRect,
size_t savedScrollPos,
bool savedForceAlLRowsFlag)
474 : fTmpTablet{useTablet}
475 , fOldUpdateTablet{editor, fTmpTablet, BASECLASS::TemporarilyUseTablet::eDontDoTextMetricsChangedCall}
476 , fOldWindowRect{oldWindowRect}
477 , fSavedScrollPos{savedScrollPos}
478 , fSavedForceAllRowsFlag{savedForceAlLRowsFlag}
481 Led_MFC_TabletFromCDC fTmpTablet;
482 typename BASECLASS::TemporarilyUseTablet fOldUpdateTablet;
483 Led_Rect fOldWindowRect;
484 size_t fSavedScrollPos;
485 bool fSavedForceAllRowsFlag;
486 vector<size_t> fWindowStarts;
488 PrintInfo* fPrintInfo;
492 virtual DROPEFFECT OnDragEnter (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
override;
493 virtual DROPEFFECT OnDragOver (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
override;
494 virtual BOOL OnDrop (COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
override;
495 virtual void OnDragLeave ()
override;
498 virtual void InvalidateScrollBarParameters ()
override;
501 virtual void UpdateScrollBars ()
override;
504 DECLARE_MESSAGE_MAP ()
515 Led_MFC_CViewHelper<Led_MFC_DragAndDropWindow<Led_MFC_OptionalWin32SDKMessageMimicHelper<Led_MFC_MimicMFCAPIHelper<Led_MFC_Helper<CView, TextInteractor>>>>>;
522 template <
typename BASECLASS = Led_MFC_DragAndDropWindow<>>
523 class Led_MFC_COleControlHelper :
public BASECLASS {
525 using inherited = BASECLASS;
528 using UpdateMode = TextInteractor::UpdateMode;
531 Led_MFC_COleControlHelper ()
536 virtual ~Led_MFC_COleControlHelper ()
541 nonvirtual
void Refresh (UpdateMode updateMode = TextInteractor::eDefaultUpdate)
const
543 const TextInteractor* ti =
this;
544 ti->Refresh (updateMode);
546 nonvirtual
void Refresh (
const Led_Rect& area, UpdateMode updateMode = TextInteractor::eDefaultUpdate)
const
548 const TextInteractor* ti =
this;
549 ti->Refresh (area, updateMode);
551 nonvirtual
void Refresh (
size_t from,
size_t to, UpdateMode updateMode = TextInteractor::eDefaultUpdate)
const
553 const TextInteractor* ti =
this;
554 ti->Refresh (from, to, updateMode);
556 nonvirtual
void Refresh (
const Marker* range, UpdateMode updateMode = TextInteractor::eDefaultUpdate)
const
558 const TextInteractor* ti =
this;
559 ti->Refresh (range, updateMode);
571 template <
typename BASECLASS = Led_MFC>
572 class Led_MFC_ExceptionHandlerHelper :
public BASECLASS {
574 using inherited = BASECLASS;
577 virtual void HandleException ()
const;
580 afx_msg
void OnChar (UINT nChar, UINT nRepCnt, UINT nFlags);
581 afx_msg LRESULT OnIMEChar (WPARAM wParam, LPARAM lParam);
582 afx_msg
void OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags);
583 afx_msg LRESULT OnMsgPaste (WPARAM wParam, LPARAM lParam);
584 afx_msg
void OnLButtonDown (UINT nFlags, CPoint oPoint);
585 afx_msg
void OnLButtonUp (UINT , CPoint oPoint);
586 afx_msg
void OnLButtonDblClk (UINT , CPoint oPoint);
587 afx_msg BOOL OnCmdMsg (UINT nID,
int nCode,
void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
590 DECLARE_MESSAGE_MAP ()
593 DISABLE_COMPILER_MSC_WARNING_START (4250)
600 template <typename ChosenInteractor, typename LEDMFC = Led_MFC>
602#if qStroika_Frameworks_Led_MFCRequiresCWndLeftmostBaseClass
604 public ChosenInteractor
606 public ChosenInteractor,
614 virtual void AboutToUpdateText (
const MarkerOwner::UpdateInfo& updateInfo)
override;
615 virtual void DidUpdateText (
const MarkerOwner::UpdateInfo& updateInfo)
noexcept override;
617 DISABLE_COMPILER_MSC_WARNING_END (4250)
625 class Led_MFCReaderDAndDFlavorPackage : public ReaderFlavorPackage {
627 Led_MFCReaderDAndDFlavorPackage (COleDataObject* dataObject);
629 virtual bool GetFlavorAvailable (Led_ClipFormat clipFormat)
const override;
630 virtual size_t GetFlavorSize (Led_ClipFormat clipFormat)
const override;
631 virtual size_t ReadFlavorData (Led_ClipFormat clipFormat,
size_t bufSize,
void* buf)
const override;
633 nonvirtual COleDataObject* GetOleDataObject ()
const;
636 COleDataObject* fDataObject;
645 class Led_MFCWriterDAndDFlavorPackage :
public WriterFlavorPackage {
647 Led_MFCWriterDAndDFlavorPackage (COleDataSource* dataObject);
649 virtual void AddFlavorData (Led_ClipFormat clipFormat,
size_t bufSize,
const void* buf)
override;
651 nonvirtual COleDataSource* GetOleDataSource ()
const;
654 COleDataSource* fDataObject;
657 template <
typename TRIVIALWORDWRAPPEDTEXTIMAGER,
typename SIMPLETEXTIMAGER,
typename TEXTSTORE>
658 CSize Led_GetTextExtent (CDC* cdc,
const Led_tString& text, CRect r,
bool wordWrap);
660 template <
typename TRIVIALWORDWRAPPEDTEXTIMAGER,
typename SIMPLETEXTIMAGER,
typename TEXTSTORE>
661 void Led_DrawText (CDC* cdc,
const Led_tString& text, CRect r,
bool wordWrap);
663#if qSupportDrawTextGetTextExtent
664 CSize Led_GetTextExtent (CDC* cdc,
const Led_tString& text, CRect r,
bool wordWrap);
665 void Led_DrawText (CDC* cdc,
const Led_tString& text, CRect r,
bool wordWrap);
672 class MFC_CommandNumberMapping :
public CommandNumberMapping<UINT> {
674 MFC_CommandNumberMapping ();
682 class Led_MFC_TmpCmdUpdater :
public TextInteractor::CommandUpdater {
684 explicit Led_MFC_TmpCmdUpdater (CCmdUI* pCmdUI);
687 virtual CommandNumber GetCmdID ()
const override;
688 virtual bool GetEnabled ()
const override;
689 virtual void SetEnabled (
bool enabled)
override;
690 virtual void SetChecked (
bool checked)
override;
691 virtual void SetText (
const SDKChar* text)
override;
695 operator Led_MFC_TmpCmdUpdater*();
698 CommandNumber fCmdNum;
707#define LED_MFC_HANDLE_COMMAND(A) \
708 ON_COMMAND_RANGE (A, A, &ThisClass::OnPerformCommand_MSG) \
709 ON_UPDATE_COMMAND_UI (A, &ThisClass::OnUpdateCommand_MSG)
715#define LED_MFC_HANDLE_COMMAND_RANGE(A, B) \
716 ON_COMMAND_RANGE (A, B, &ThisClass::OnPerformCommand_MSG) \
717 ON_UPDATE_COMMAND_UI_RANGE (A, B, &ThisClass::OnUpdateCommand_MSG)
723#define LED_MFC_HANDLE_COMMAND_M(A) LED_MFC_HANDLE_COMMAND (MFC_CommandNumberMapping::Get ().ReverseLookup (A))
729#define LED_MFC_HANDLE_COMMAND_RANGE_M(A, B) \
730 LED_MFC_HANDLE_COMMAND_RANGE (MFC_CommandNumberMapping::Get ().ReverseLookup (A), MFC_CommandNumberMapping::Get ().ReverseLookup (B))
void Copy(T *dest, size_t nEltsInDest, const T *src)
Safe variant of strncpy() - which always NUL-terminates the string.
basic_string< SDKChar > SDKString