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");
27DISABLE_COMPILER_MSC_WARNING_START (4459)
28DISABLE_COMPILER_MSC_WARNING_START (5054)
30DISABLE_COMPILER_MSC_WARNING_END (5054)
31DISABLE_COMPILER_MSC_WARNING_END (4459)
36#include "Stroika/Frameworks/Led/IdleManager.h"
37#include "Stroika/Frameworks/Led/Platform/Windows.h"
38#include "Stroika/Frameworks/Led/TextInteractor.h"
40namespace Stroika::Frameworks::Led::Platform {
58#ifndef qLedAssertsDefaultToMFCAsserts
59#define qLedAssertsDefaultToMFCAsserts 0
69#ifndef qSupportDrawTextGetTextExtent
70#define qSupportDrawTextGetTextExtent 0
93#ifndef qProvideLedStubsForOLEACCDLL
94#define qProvideLedStubsForOLEACCDLL 0
111#ifndef qMFCRequiresCWndLeftmostBaseClass
112#define qMFCRequiresCWndLeftmostBaseClass 1
115 CPoint AsCPoint (Led_Point p);
116 Led_Point AsLedPoint (CPoint p);
118 CRect AsCRect (Led_Rect r);
119 Led_Rect AsLedRect (CRect r);
121 CSize AsCSize (Led_Size s);
131 class Led_MFC_CDCFromTablet {
133 Led_MFC_CDCFromTablet (Tablet* t);
134 ~Led_MFC_CDCFromTablet ();
149 class Led_MFC_TabletFromCDC {
151 Led_MFC_TabletFromCDC (CDC* pDC);
152 ~Led_MFC_TabletFromCDC ();
156 Tablet* operator->();
172 template <
typename MFC_BASE_CLASS = CWnd,
typename BASE_INTERACTOR = TextInteractor>
173 class Led_MFC_Helper :
174#if qMFCRequiresCWndLeftmostBaseClass
175 public MFC_BASE_CLASS,
176 public Led_Win32_Helper<BASE_INTERACTOR>
178 public Led_Win32_Helper<BASE_INTERACTOR>,
179 public MFC_BASE_CLASS
183 using inherited =
void*;
185 using LED_WIN32_HELPER = Led_Win32_Helper<BASE_INTERACTOR>;
188 using UpdateInfo = MarkerOwner::UpdateInfo;
194 virtual ~Led_MFC_Helper ();
197 nonvirtual BOOL ReplaceWindow (HWND hWnd);
201 virtual HWND GetHWND ()
const override;
205 afx_msg
int OnCreate (LPCREATESTRUCT lpCreateStruct);
206 afx_msg
void OnPaint ();
207 afx_msg BOOL OnSetCursor (CWnd* pWnd, UINT nHitTest, UINT message);
208 afx_msg UINT OnGetDlgCode ();
209 afx_msg
void OnChar (UINT nChar, UINT nRepCnt, UINT );
210 afx_msg LRESULT OnUniChar (WPARAM wParam, LPARAM lParam);
211 afx_msg LRESULT OnIMEChar (WPARAM wParam, LPARAM lParam);
212 afx_msg LRESULT OnIME_COMPOSITION (WPARAM wParam, LPARAM lParam);
213 afx_msg LRESULT OnIME_ENDCOMPOSITION (WPARAM wParam, LPARAM lParam);
214 afx_msg
void OnKeyDown (UINT nChar, UINT nRepCnt, UINT );
215 afx_msg
void OnMouseMove (UINT , CPoint oPoint);
216 afx_msg
void OnLButtonDown (UINT nFlags, CPoint oPoint);
217 afx_msg
void OnLButtonUp (UINT , CPoint oPoint);
218 afx_msg
void OnLButtonDblClk (UINT , CPoint oPoint);
219 afx_msg
void OnSetFocus (CWnd* pOldWnd);
220 afx_msg
void OnKillFocus (CWnd* pNewWnd);
221 afx_msg
void OnSize (UINT nType,
int cx,
int cy);
222 afx_msg BOOL OnEraseBkgnd (CDC* pDC);
223 afx_msg
void OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
224 afx_msg
void OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
225 afx_msg BOOL OnMouseWheel (UINT fFlags,
short zDelta, CPoint point);
226 afx_msg
void OnEnable (BOOL bEnable);
227 afx_msg
void OnTimer (UINT_PTR nEventID);
231 virtual Led_Rect GetWindowRect ()
const;
232 nonvirtual
void GetWindowRect (LPRECT lpRect)
const;
235 nonvirtual DWORD GetStyle ()
const;
239 afx_msg
void OnUpdateCommand_MSG (CCmdUI* pCmdUI);
240 afx_msg
void OnPerformCommand_MSG (UINT commandNumber);
243 DECLARE_MESSAGE_MAP ()
256 template <
typename BASECLASS = Led_MFC_Helper<>>
257 class Led_MFC_MimicMFCAPIHelper :
public BASECLASS {
259 Led_MFC_MimicMFCAPIHelper () =
default;
262 nonvirtual BOOL Create (DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID);
263 nonvirtual BOOL CanUndo ()
const;
264 nonvirtual
int GetLineCount_CEdit ()
const;
265 nonvirtual BOOL GetModify ()
const;
266 nonvirtual
void SetModify (BOOL bModified = TRUE);
267 nonvirtual
void GetRect (LPRECT lpRect)
const;
268 nonvirtual DWORD GetSel ()
const;
269 nonvirtual
void GetSel (
int& nStartChar,
int& nEndChar)
const;
270 nonvirtual
int GetLine (
int nIndex, LPTSTR lpszBuffer)
const;
271 nonvirtual
int GetLine (
int nIndex, LPTSTR lpszBuffer,
int nMaxLength)
const;
272 nonvirtual
void EmptyUndoBuffer ();
273 nonvirtual BOOL FmtLines (BOOL bAddEOL);
274 nonvirtual
void LimitText (
int nChars = 0);
275 nonvirtual
int LineFromChar (
int nIndex = -1)
const;
276 nonvirtual
int LineIndex (
int nLine = -1)
const;
277 nonvirtual
int LineLength (
int nLine = -1)
const;
278 nonvirtual
void LineScroll (
int nLines,
int nChars = 0);
279 nonvirtual
void ReplaceSel (LPCTSTR lpszNewText);
280 nonvirtual
void SetPasswordChar (TCHAR ch);
281 nonvirtual
void SetRect (LPCRECT lpRect);
282 nonvirtual
void SetRectNP (LPCRECT lpRect);
283 nonvirtual
void SetSel (DWORD dwSelection, BOOL bNoScroll = FALSE);
284 nonvirtual
void SetSel (
int nStartChar,
int nEndChar, BOOL bNoScroll = FALSE);
285 nonvirtual BOOL SetTabStops (
int nTabStops, LPINT rgTabStops);
286 nonvirtual
void SetTabStops ();
287 nonvirtual BOOL SetTabStops (
const int& cxEachStop);
288 nonvirtual BOOL Undo ();
289 nonvirtual
void Clear ();
290 nonvirtual
void Copy ();
291 nonvirtual
void Cut ();
292 nonvirtual
void Paste ();
293 nonvirtual BOOL SetReadOnly (BOOL bReadOnly = TRUE);
294 nonvirtual
int GetFirstVisibleLine ()
const;
295 nonvirtual TCHAR GetPasswordChar ()
const;
305 template <
typename BASECLASS = Led_MFC_Helper<>>
306 class Led_MFC_OptionalWin32SDKMessageMimicHelper :
public Led_Win32_Win32SDKMessageMimicHelper<BASECLASS> {
308 using inherited = Led_Win32_Win32SDKMessageMimicHelper<BASECLASS>;
311 Led_MFC_OptionalWin32SDKMessageMimicHelper () =
default;
314 template <
int MESSAGE_NUMBER>
315 afx_msg LRESULT OnMFCSDKMessageDispatcher (WPARAM wParam, LPARAM lParam)
318 Verify (this->HandleMessage (MESSAGE_NUMBER, wParam, lParam, &result));
323 DECLARE_MESSAGE_MAP ()
334 template <
typename BASECLASS = Led_MFC_Helper<>>
335 class Led_MFC_DragAndDropWindow :
public BASECLASS {
337 using inherited = BASECLASS;
340 Led_MFC_DragAndDropWindow ();
343 ~Led_MFC_DragAndDropWindow ();
360 struct CommandNames {
362 : fDragCommandName (Led_SDK_TCHAROF (
"Drag"))
363 , fDropCommandName (Led_SDK_TCHAROF (
"Drop"))
364 , fDragNDropCommandName (Led_SDK_TCHAROF (
"Drag and Drop"))
378 static const CommandNames& GetCommandNames ();
379 static void SetCommandNames (
const CommandNames& cmdNames);
382 static CommandNames sCommandNames;
385 COleDropTarget fDropTarget;
388 afx_msg
int OnCreate (LPCREATESTRUCT lpCreateStruct);
392 virtual bool IsADragSelect (Led_Point clickedWhere)
const;
393 nonvirtual
void HandleDragSelect (UINT nFlags, CPoint oPoint);
394 nonvirtual
void HandleSharedDragOverUpdateSelCode ();
395 nonvirtual DROPEFFECT HelperDragEnter (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
396 nonvirtual DROPEFFECT HelperDragOver (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
397 nonvirtual BOOL HelperDrop (COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point);
398 nonvirtual
void HelperDragLeave ();
404 DROPEFFECT fPrevDropEffect;
407 nonvirtual
bool GetObjectInfo (COleDataObject* pDataObject, CSize* pSize, CSize* pOffset);
410 afx_msg
void OnTimer (UINT_PTR nEventID);
413 nonvirtual
void StartDragAutoscrollTimer ();
414 nonvirtual
void StopDragAutoscrollTimer ();
416 eAutoscrolling4DragTimerEventID = 435
418 UINT_PTR fDragAutoScrollTimerID;
421 struct LedStartDragAndDropContext {
423 LedStartDragAndDropContext (Led_MFC_DragAndDropWindow<BASECLASS>* ledMFCView)
427 , fWeRecievedDrop (false)
428 , fLedMFCView (ledMFCView)
429 , fOrigSelection (ledMFCView->GetTextStore (), ledMFCView->GetSelectionStart (), ledMFCView->GetSelectionEnd ())
435 size_t fOurDragStart;
437 bool fWeRecievedDrop;
438 Led_MFC_DragAndDropWindow<BASECLASS>* fLedMFCView;
439 TempMarker fOrigSelection;
442 static LedStartDragAndDropContext* sCurrentDragInfo;
445 DECLARE_MESSAGE_MAP ()
453 template <
typename BASECLASS = Led_MFC_DragAndDropWindow<>>
454 class Led_MFC_CViewHelper :
public BASECLASS {
456 using inherited = BASECLASS;
459 Led_MFC_CViewHelper ();
462 virtual ~Led_MFC_CViewHelper ();
466 virtual void DeleteContents ();
467 virtual void Serialize (CArchive& ar);
468 nonvirtual
void SerializeRaw (CArchive& ar);
469 nonvirtual
void ReadFromArchive (CArchive& ar, UINT nLen);
470 nonvirtual
void WriteToArchive (CArchive& ar);
473 afx_msg
void OnPaint ();
474 virtual void OnDraw (CDC* pDC)
override;
475 afx_msg
void OnLButtonDown (UINT nFlags, CPoint oPoint);
476 afx_msg
int OnCreate (LPCREATESTRUCT lpCreateStruct);
477 afx_msg
void OnVScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
478 afx_msg
void OnHScroll (UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
481 nonvirtual TWIPS_Rect GetPrintMargins ()
const;
482 nonvirtual
void SetPrintMargins (
const TWIPS_Rect& printMargins);
485 TWIPS_Rect fPrintMargins;
488 virtual BOOL OnPreparePrinting (CPrintInfo* pInfo)
override;
489 virtual void OnBeginPrinting (CDC* pDC, CPrintInfo* pInfo)
override;
490 virtual void OnPrint (CDC* pDC, CPrintInfo* pInfo)
override;
491 virtual void OnEndPrinting (CDC* pDC, CPrintInfo* pInfo)
override;
494 virtual void OnPrepareDC (CDC* pDC, CPrintInfo* pInfo)
override;
497 virtual Led_Rect CalculatePrintingRect (CDC* pDC)
const;
501 PrintInfo (BASECLASS& editor, CDC* useTablet, Led_Rect oldWindowRect,
size_t savedScrollPos,
bool savedForceAlLRowsFlag)
502 : fTmpTablet{useTablet}
503 , fOldUpdateTablet{editor, fTmpTablet, BASECLASS::TemporarilyUseTablet::eDontDoTextMetricsChangedCall}
504 , fOldWindowRect{oldWindowRect}
505 , fSavedScrollPos{savedScrollPos}
506 , fSavedForceAllRowsFlag{savedForceAlLRowsFlag}
509 Led_MFC_TabletFromCDC fTmpTablet;
510 typename BASECLASS::TemporarilyUseTablet fOldUpdateTablet;
511 Led_Rect fOldWindowRect;
512 size_t fSavedScrollPos;
513 bool fSavedForceAllRowsFlag;
514 vector<size_t> fWindowStarts;
516 PrintInfo* fPrintInfo;
520 virtual DROPEFFECT OnDragEnter (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
override;
521 virtual DROPEFFECT OnDragOver (COleDataObject* pDataObject, DWORD dwKeyState, CPoint point)
override;
522 virtual BOOL OnDrop (COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point)
override;
523 virtual void OnDragLeave ()
override;
526 virtual void InvalidateScrollBarParameters ()
override;
529 virtual void UpdateScrollBars ()
override;
532 DECLARE_MESSAGE_MAP ()
543 Led_MFC_CViewHelper<Led_MFC_DragAndDropWindow<Led_MFC_OptionalWin32SDKMessageMimicHelper<Led_MFC_MimicMFCAPIHelper<Led_MFC_Helper<CView, TextInteractor>>>>>;
550 template <
typename BASECLASS = Led_MFC_DragAndDropWindow<>>
551 class Led_MFC_COleControlHelper :
public BASECLASS {
553 using inherited = BASECLASS;
556 using UpdateMode = TextInteractor::UpdateMode;
559 Led_MFC_COleControlHelper ()
564 virtual ~Led_MFC_COleControlHelper ()
569 nonvirtual
void Refresh (UpdateMode updateMode = TextInteractor::eDefaultUpdate)
const
571 const TextInteractor* ti =
this;
572 ti->Refresh (updateMode);
574 nonvirtual
void Refresh (
const Led_Rect& area, UpdateMode updateMode = TextInteractor::eDefaultUpdate)
const
576 const TextInteractor* ti =
this;
577 ti->Refresh (area, updateMode);
579 nonvirtual
void Refresh (
size_t from,
size_t to, UpdateMode updateMode = TextInteractor::eDefaultUpdate)
const
581 const TextInteractor* ti =
this;
582 ti->Refresh (from, to, updateMode);
584 nonvirtual
void Refresh (
const Marker* range, UpdateMode updateMode = TextInteractor::eDefaultUpdate)
const
586 const TextInteractor* ti =
this;
587 ti->Refresh (range, updateMode);
591 DISABLE_COMPILER_MSC_WARNING_START (4250)
600 template <typename BASECLASS = Led_MFC>
601 class Led_MFC_ExceptionHandlerHelper : public BASECLASS {
603 using inherited = BASECLASS;
606 virtual void HandleException ()
const;
609 afx_msg
void OnChar (UINT nChar, UINT nRepCnt, UINT nFlags);
610 afx_msg LRESULT OnIMEChar (WPARAM wParam, LPARAM lParam);
611 afx_msg
void OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags);
612 afx_msg LRESULT OnMsgPaste (WPARAM wParam, LPARAM lParam);
613 afx_msg
void OnLButtonDown (UINT nFlags, CPoint oPoint);
614 afx_msg
void OnLButtonUp (UINT , CPoint oPoint);
615 afx_msg
void OnLButtonDblClk (UINT , CPoint oPoint);
616 afx_msg BOOL OnCmdMsg (UINT nID,
int nCode,
void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
619 DECLARE_MESSAGE_MAP ()
621 DISABLE_COMPILER_MSC_WARNING_END (4250)
623 DISABLE_COMPILER_MSC_WARNING_START (4250)
630 template <typename ChosenInteractor, typename LEDMFC = Led_MFC>
632#if qMFCRequiresCWndLeftmostBaseClass
634 public ChosenInteractor
636 public ChosenInteractor,
644 virtual void AboutToUpdateText (
const MarkerOwner::UpdateInfo& updateInfo)
override;
645 virtual void DidUpdateText (
const MarkerOwner::UpdateInfo& updateInfo)
noexcept override;
647 DISABLE_COMPILER_MSC_WARNING_END (4250)
655 class Led_MFCReaderDAndDFlavorPackage : public ReaderFlavorPackage {
657 Led_MFCReaderDAndDFlavorPackage (COleDataObject* dataObject);
659 virtual bool GetFlavorAvailable (Led_ClipFormat clipFormat)
const override;
660 virtual size_t GetFlavorSize (Led_ClipFormat clipFormat)
const override;
661 virtual size_t ReadFlavorData (Led_ClipFormat clipFormat,
size_t bufSize,
void* buf)
const override;
663 nonvirtual COleDataObject* GetOleDataObject ()
const;
666 COleDataObject* fDataObject;
675 class Led_MFCWriterDAndDFlavorPackage :
public WriterFlavorPackage {
677 Led_MFCWriterDAndDFlavorPackage (COleDataSource* dataObject);
679 virtual void AddFlavorData (Led_ClipFormat clipFormat,
size_t bufSize,
const void* buf)
override;
681 nonvirtual COleDataSource* GetOleDataSource ()
const;
684 COleDataSource* fDataObject;
687 template <
typename TRIVIALWORDWRAPPEDTEXTIMAGER,
typename SIMPLETEXTIMAGER,
typename TEXTSTORE>
688 CSize Led_GetTextExtent (CDC* cdc,
const Led_tString& text, CRect r,
bool wordWrap);
690 template <
typename TRIVIALWORDWRAPPEDTEXTIMAGER,
typename SIMPLETEXTIMAGER,
typename TEXTSTORE>
691 void Led_DrawText (CDC* cdc,
const Led_tString& text, CRect r,
bool wordWrap);
693#if qSupportDrawTextGetTextExtent
694 CSize Led_GetTextExtent (CDC* cdc,
const Led_tString& text, CRect r,
bool wordWrap);
695 void Led_DrawText (CDC* cdc,
const Led_tString& text, CRect r,
bool wordWrap);
702 class MFC_CommandNumberMapping :
public CommandNumberMapping<UINT> {
704 MFC_CommandNumberMapping ();
712 class Led_MFC_TmpCmdUpdater :
public TextInteractor::CommandUpdater {
714 explicit Led_MFC_TmpCmdUpdater (CCmdUI* pCmdUI);
717 virtual CommandNumber GetCmdID ()
const override;
718 virtual bool GetEnabled ()
const override;
719 virtual void SetEnabled (
bool enabled)
override;
720 virtual void SetChecked (
bool checked)
override;
721 virtual void SetText (
const SDKChar* text)
override;
725 operator Led_MFC_TmpCmdUpdater* ();
728 CommandNumber fCmdNum;
737#define LED_MFC_HANDLE_COMMAND(A) \
738 ON_COMMAND_RANGE (A, A, &ThisClass::OnPerformCommand_MSG) \
739 ON_UPDATE_COMMAND_UI (A, &ThisClass::OnUpdateCommand_MSG)
745#define LED_MFC_HANDLE_COMMAND_RANGE(A, B) \
746 ON_COMMAND_RANGE (A, B, &ThisClass::OnPerformCommand_MSG) \
747 ON_UPDATE_COMMAND_UI_RANGE (A, B, &ThisClass::OnUpdateCommand_MSG)
753#define LED_MFC_HANDLE_COMMAND_M(A) LED_MFC_HANDLE_COMMAND (MFC_CommandNumberMapping::Get ().ReverseLookup (A))
759#define LED_MFC_HANDLE_COMMAND_RANGE_M(A, B) \
760 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