diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4f8c5104..5fd7ff50 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,6 @@
# Copyright (c) 2023 By William Su, All Rights Reserved.
-cmake_minimum_required(VERSION 2.8.12)
+cmake_minimum_required(VERSION 3.10...4.1)
# set VERSION variables
cmake_policy(SET CMP0048 NEW)
# provide CMAKE_MSVC_RUNTIME_LIBRARY
diff --git a/GHelp/CMakeLists.txt b/GHelp/CMakeLists.txt
index 6983893a..4636daca 100644
--- a/GHelp/CMakeLists.txt
+++ b/GHelp/CMakeLists.txt
@@ -46,7 +46,7 @@ file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/fixhhc.bat "if errorlevel 1 exit /b 0\n"
file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/fixhhc.bat "exit /b 1\n")
add_custom_command(
- OUTPUT CBoard.chm
+ OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/CBoard.chm
COMMENT "Make CBoard.chm"
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/gmhelp.h ${CMAKE_CURRENT_SOURCE_DIR}/gmhelpidmap.h
@@ -57,4 +57,4 @@ add_custom_command(
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
-add_custom_target(CBHelp ALL DEPENDS cboard.chm)
+add_custom_target(CBHelp ALL DEPENDS CBoard.chm)
diff --git a/GM/CBDesign.fbp b/GM/CBDesign.fbp
index ad6e88a2..77771262 100644
--- a/GM/CBDesign.fbp
+++ b/GM/CBDesign.fbp
@@ -20509,7 +20509,7 @@
wxID_ANY
wxITEM_NORMAL
&Delete
- wxID_DELETE
+ wxID_CLEAR
none
Del
diff --git a/GM/CBDesign.xrc b/GM/CBDesign.xrc
index c71d01b9..a5e3fba2 100644
--- a/GM/CBDesign.xrc
+++ b/GM/CBDesign.xrc
@@ -3894,7 +3894,7 @@
Ctrl+M
Move clipboard objects to new locations\nMove
-
+
0
wxAUI_MGR_DEFAULT
@@ -7934,13 +8089,13 @@
wxALL
0
- wxID_ANY
Snap Grid
sbSizer2
wxVERTICAL
1
none
+
5
wxEXPAND
@@ -8669,13 +8824,13 @@
wxALL
0
- wxID_ANY
Cells
sbSizer3
wxVERTICAL
1
none
+
5
wxTOP|wxRIGHT|wxLEFT
@@ -8822,13 +8977,13 @@
wxEXPAND|wxALL
0
- wxID_ANY
Auto Stack
sbSizer4
wxVERTICAL
1
none
+
5
wxEXPAND
@@ -9232,13 +9387,13 @@
wxEXPAND|wxALL
0
- wxID_ANY
Plotted Moves
sbSizer5
wxVERTICAL
1
none
+
5
wxEXPAND
@@ -14202,37 +14357,33 @@
-
+
0
wxAUI_MGR_DEFAULT
- wxBOTH
1
0
1
impl_virtual
-
0
wxID_ANY
- CTrayPropDialog
+ CTrayPalette
-
- wxDEFAULT_DIALOG_STYLE
+ 500,300
; ; forward_declare
- Tray Properties
0
-
+ wxTAB_TRAVERSAL
- bSizer76
+ bSizer85
wxVERTICAL
none
@@ -14241,64 +14392,308 @@
0
- bSizer77
+ bSizer86
wxHORIZONTAL
none
5
wxEXPAND
- 1
-
+ 0
+
+ 1
+ 1
+ 1
+ 1
+ 0
+
+ 0
+ 0
+ 0
+
+
+
+
+ 1
+ 0
+ 1
+
+ 1
+
+ 0
+ 0
+
+ Dock
+ 0
+ Left
+ 0
+ 1
+
+ 1
+
+
+ 0
+ 0
+ wxID_ANY
+ MyButton
+
+ 0
+
+ 0
+
+
+ 0
- bSizer78
- wxVERTICAL
- none
-
- 5
- wxTOP|wxRIGHT|wxLEFT
- 0
-
- 1
- 1
- 1
- 1
- 0
-
- 0
- 0
-
-
-
- 1
- 0
- 1
-
- 1
- 0
- Dock
- 0
- Left
- 0
- 1
-
- 1
-
- 0
- 0
- wxID_ANY
- Name for Playing Piece Tray:
- 0
-
- 0
-
-
- 0
-
- 1
- m_staticText53
- 1
-
-
+ 1
+ m_bpMenuBtn
+ 1
+
+
+ protected
+ 1
+
+
+
+ Resizable
+ 1
+
+
+ ; ; forward_declare
+ 0
+
+
+ wxFILTER_NONE
+ wxDefaultValidator
+
+
+
+
+
+
+
+ 5
+ wxALIGN_CENTER_VERTICAL
+ 1
+
+ 1
+ 1
+ 1
+ 1
+ 0
+
+ 0
+ 0
+
+
+
+ 1
+ 0
+
+ 1
+
+ 1
+ 0
+ Dock
+ 0
+ Left
+ 0
+ 1
+
+ 1
+
+ 0
+ 0
+ wxID_ANY
+
+ 0
+
+
+ 0
+
+ 1
+ m_comboYGrp
+ 1
+
+
+ protected
+ 1
+
+ Resizable
+ 0
+ 1
+
+
+ ; ; forward_declare
+ 0
+
+
+ wxFILTER_NONE
+ wxDefaultValidator
+
+
+
+
+
+
+
+
+
+ 5
+ wxEXPAND
+ 1
+
+ 1
+ 1
+ 1
+ 1
+ 0
+
+ 0
+ 0
+
+
+
+ 1
+ 0
+ 1
+
+ 1
+ 0
+ Dock
+ 0
+ Left
+ 0
+ 1
+
+ 1
+
+ 0
+ 0
+ wxID_ANY
+
+ 0
+
+
+ 0
+
+ 1
+ m_listTray
+ 1
+
+
+ protected
+ 1
+
+ Resizable
+ 1
+
+ wxLB_MULTIPLE
+ CTrayListBoxWx; forward_declare
+ 0
+
+
+
+
+
+
+
+
+
+ 0
+ wxAUI_MGR_DEFAULT
+
+ wxBOTH
+
+ 1
+ 0
+ 1
+ impl_virtual
+
+
+
+ 0
+ wxID_ANY
+
+
+ CTrayPropDialog
+
+
+ wxDEFAULT_DIALOG_STYLE
+ ; ; forward_declare
+ Tray Properties
+
+ 0
+
+
+
+
+
+ bSizer76
+ wxVERTICAL
+ none
+
+ 5
+ wxEXPAND
+ 0
+
+
+ bSizer77
+ wxHORIZONTAL
+ none
+
+ 5
+ wxEXPAND
+ 1
+
+
+ bSizer78
+ wxVERTICAL
+ none
+
+ 5
+ wxTOP|wxRIGHT|wxLEFT
+ 0
+
+ 1
+ 1
+ 1
+ 1
+ 0
+
+ 0
+ 0
+
+
+
+ 1
+ 0
+ 1
+
+ 1
+ 0
+ Dock
+ 0
+ Left
+ 0
+ 1
+
+ 1
+
+ 0
+ 0
+ wxID_ANY
+ Name for Playing Piece Tray:
+ 0
+
+ 0
+
+
+ 0
+
+ 1
+ m_staticText53
+ 1
+
+
protected
1
@@ -14870,13 +15265,13 @@
wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT
0
- wxID_ANY
Tray content visibility
sbSizer5
wxVERTICAL
1
none
+
5
wxALL
@@ -15629,16 +16024,1701 @@
0=PV_MOVEMODE
MENU_PV_MOVEMODE
protected
-
-
-
+
+
diff --git a/GP/CBPlay.xrc b/GP/CBPlay.xrc
index 40590c72..f49e421f 100644
--- a/GP/CBPlay.xrc
+++ b/GP/CBPlay.xrc
@@ -1074,6 +1074,30 @@
+
+
+
+ wxVERTICAL
+
+ wxEXPAND
+ 5
+
+
+
+ 0
+
+
+
+
+ wxEXPAND
+ 5
+
+
+
+
+
+
+
Enter Move Description
@@ -2708,6 +2732,48 @@
+
+ 500,300
+
+
+ wxVERTICAL
+
+ wxEXPAND
+ 5
+
+
+ wxHORIZONTAL
+
+ wxEXPAND
+ 5
+
+
+ 0
+ 0
+
+
+
+
+ wxALIGN_CENTER_VERTICAL
+ 5
+
+
+ 0
+
+
+
+
+
+
+ wxEXPAND
+ 5
+
+
+
+
+
+
+
Tray Properties
@@ -2960,12 +3026,670 @@
diff --git a/GP/DlgRotpc.cpp b/GP/DlgRotpc.cpp
index 04397174..0e039ad7 100644
--- a/GP/DlgRotpc.cpp
+++ b/GP/DlgRotpc.cpp
@@ -1,6 +1,6 @@
// DlgRotpc.cpp : implementation file
//
-// Copyright (c) 1994-2025 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -35,11 +35,10 @@ static char THIS_FILE[] = __FILE__;
/////////////////////////////////////////////////////////////////////////////
// CRotatePieceDialog dialog
-CRotatePieceDialog::CRotatePieceDialog(CWnd& v, wxWindow* pParent /*= &CB::GetMainWndWx()*/) :
- CB_XRC_BEGIN_CTRLS_DEFN(pParent, CRotatePieceDialog)
+CRotatePieceDialog::CRotatePieceDialog(wxWindow& pParent) :
+ CB_XRC_BEGIN_CTRLS_DEFN(&pParent, CRotatePieceDialog)
CB_XRC_CTRL_VAL(m_editCurVal, m_nRelativeRotation, -359, 359, wxNUM_VAL_SIGN_PLUS)
- CB_XRC_END_CTRLS_DEFN(),
- view(&v)
+ CB_XRC_END_CTRLS_DEFN()
{
// KLUDGE: don't see a way to use GetSizeFromText() in .xrc
wxSize size = m_editCurVal->GetSizeFromText("+999"_cbstring);
@@ -104,7 +103,8 @@ void CRotatePieceDialog::OnContextMenu(CWnd* pWnd, CPoint point)
void CRotatePieceDialog::ApplyOffset(int nOffset)
{
m_nRelativeRotation = (m_nRelativeRotation + nOffset) % 360;
- view->SendMessage(WM_ROTATEPIECE_DELTA, (WPARAM)m_nRelativeRotation);
+ RotatePieceDeltaEvent event(m_nRelativeRotation);
+ GetParent()->ProcessWindowEvent(event);
TransferDataToWindow();
}
diff --git a/GP/DlgRotpc.h b/GP/DlgRotpc.h
index 7bc339bf..e817ea64 100644
--- a/GP/DlgRotpc.h
+++ b/GP/DlgRotpc.h
@@ -36,10 +36,7 @@ class CRotatePieceDialog : public wxDialog
{
// Construction
public:
- /* TEMPORARY: this needs to send msgs to the view, but that
- hasn't been converted to wx yet, so can't be passed as
- parent */
- CRotatePieceDialog(CWnd& v, wxWindow* pParent = &CB::GetMainWndWx()); // standard constructor
+ CRotatePieceDialog(wxWindow& pParent); // standard constructor
// Dialog Data
int m_nRelativeRotation;
@@ -68,9 +65,6 @@ class CRotatePieceDialog : public wxDialog
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
#endif
wxDECLARE_EVENT_TABLE();
-
-private:
- RefPtr view;
};
#endif
diff --git a/GP/FrmDockMark.cpp b/GP/FrmDockMark.cpp
index 15adceac..28bdbed1 100644
--- a/GP/FrmDockMark.cpp
+++ b/GP/FrmDockMark.cpp
@@ -56,7 +56,7 @@ CDockMarkPalette::~CDockMarkPalette()
/////////////////////////////////////////////////////////////////////////////
-void CDockMarkPalette::SetChild(CMarkerPalette* pChildWnd)
+void CDockMarkPalette::SetChild(CMarkerPaletteContainer* pChildWnd)
{
if (m_pChildWnd == pChildWnd)
return;
@@ -98,6 +98,7 @@ void CDockMarkPalette::OnSize(UINT nType, int cx, int cy)
void CDockMarkPalette::OnDestroy()
{
+ wxASSERT(!m_pChildWnd);
m_pChildWnd = NULL;
CDockablePane::OnDestroy();
}
diff --git a/GP/FrmDockMark.h b/GP/FrmDockMark.h
index 848933a7..6213157b 100644
--- a/GP/FrmDockMark.h
+++ b/GP/FrmDockMark.h
@@ -1,6 +1,6 @@
// FrmDockMark.h - container window for the marker palette.
//
-// Copyright (c) 1994-2020 By Dale L. Larson, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -27,7 +27,7 @@
/////////////////////////////////////////////////////////////////////////////
// CDockMarkPalette window
-class CMarkerPalette;
+class CMarkerPaletteContainer;
class CDockMarkPalette : public CDockablePane
{
@@ -37,16 +37,16 @@ class CDockMarkPalette : public CDockablePane
CDockMarkPalette();
// Attributes
-public:
- CMarkerPalette* m_pChildWnd;
+private:
+ CB::propagate_const m_pChildWnd;
// Operations
public:
- void SetChild(CMarkerPalette* pChildWnd);
+ void SetChild(CMarkerPaletteContainer* pChildWnd);
// Implementation
public:
- virtual ~CDockMarkPalette();
+ ~CDockMarkPalette() override;
// Generated message map functions
protected:
diff --git a/GP/FrmDockTray.cpp b/GP/FrmDockTray.cpp
index a661b633..ca10475f 100644
--- a/GP/FrmDockTray.cpp
+++ b/GP/FrmDockTray.cpp
@@ -56,7 +56,7 @@ CDockTrayPalette::~CDockTrayPalette()
/////////////////////////////////////////////////////////////////////////////
-void CDockTrayPalette::SetChild(CTrayPalette* pChildWnd)
+void CDockTrayPalette::SetChild(CTrayPaletteContainer* pChildWnd)
{
if (m_pChildWnd == pChildWnd)
return;
diff --git a/GP/FrmDockTray.h b/GP/FrmDockTray.h
index 4a84f5aa..ac37c9b2 100644
--- a/GP/FrmDockTray.h
+++ b/GP/FrmDockTray.h
@@ -27,7 +27,7 @@
/////////////////////////////////////////////////////////////////////////////
// CDockTrayPalette window
-class CTrayPalette;
+class CTrayPaletteContainer;
class CDockTrayPalette : public CDockablePane
{
@@ -38,11 +38,11 @@ class CDockTrayPalette : public CDockablePane
// Attributes
public:
- CTrayPalette* m_pChildWnd;
+ CTrayPaletteContainer* m_pChildWnd;
// Operations
public:
- void SetChild(CTrayPalette* pChildWnd);
+ void SetChild(CTrayPaletteContainer* pChildWnd);
// Overrides
// ClassWizard generated virtual function overrides
diff --git a/GP/FrmMain.cpp b/GP/FrmMain.cpp
index f7b0cdae..8b4e9cdc 100644
--- a/GP/FrmMain.cpp
+++ b/GP/FrmMain.cpp
@@ -1,6 +1,6 @@
// FrmMain.cpp : implementation of the CMainFrame class
//
-// Copyright (c) 1994-2024 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -399,18 +399,32 @@ void CMainFrame::OnIdle()
}
}
+namespace {
+ /* CB is currently a mix of MFC and wx,
+ so need to send both kinds of msg */
+ BOOL OnClosePalette(CWnd& pWnd)
+ {
+ pWnd.SendMessage(WM_PALETTE_HIDE);
+ pWnd.SendMessageToDescendants(WM_PALETTE_HIDE, true, true);
+ wxWindow* wxWnd = CB::FindWxWindow(pWnd);
+ if (wxWnd)
+ {
+ wxCommandEvent event(WM_PALETTE_HIDE_WX);
+ wxWnd->GetEventHandler()->ProcessEventLocally(event);
+ CB::SendEventToDescendants(*wxWnd, event, true);
+ }
+ return true;
+ }
+}
+
BOOL CMainFrame::OnCloseMiniFrame(CPaneFrameWnd* pWnd)
{
- pWnd->SendMessage(WM_PALETTE_HIDE);
- pWnd->SendMessageToDescendants(WM_PALETTE_HIDE, true, true);
- return true;
+ return OnClosePalette(CheckedDeref(pWnd));
}
BOOL CMainFrame::OnCloseDockingPane(CDockablePane* pWnd)
{
- pWnd->SendMessage(WM_PALETTE_HIDE);
- pWnd->SendMessageToDescendants(WM_PALETTE_HIDE, true, true);
- return true;
+ return OnClosePalette(CheckedDeref(pWnd));
}
void CMainFrame::ShowPalettePanes(BOOL bShow)
@@ -423,36 +437,36 @@ void CMainFrame::ShowPalettePanes(BOOL bShow)
///////////////////////////////////////////////////////////////////////
-void CMainFrame::UpdatePaletteWindow(CWnd* pWnd, BOOL bIsOn)
+void CMainFrame::UpdatePaletteWindow(CWnd& pWnd, BOOL bIsOn)
{
- if (pWnd->m_hWnd != NULL) // Handle exists if palette allowed
+ if (pWnd.m_hWnd != NULL) // Handle exists if palette allowed
{
- BOOL bIsControlBar = pWnd->IsKindOf(RUNTIME_CLASS(CBasePane));
- BOOL bVisible = ((pWnd->GetStyle() & WS_VISIBLE) != 0);
+ BOOL bIsControlBar = pWnd.IsKindOf(RUNTIME_CLASS(CBasePane));
+ BOOL bVisible = ((pWnd.GetStyle() & WS_VISIBLE) != 0);
CMDIChildWndEx* pMDIChild = (CMDIChildWndEx*)MDIGetActive();
if (pMDIChild == NULL || pMDIChild->IsIconic())
{
if (!bIsControlBar && bVisible)
- pWnd->ShowWindow(SW_HIDE);
+ pWnd.ShowWindow(SW_HIDE);
else if (bIsControlBar && bVisible)
- ShowPane((CBasePane*)pWnd, FALSE, FALSE, FALSE);
+ ShowPane(&dynamic_cast(pWnd), FALSE, FALSE, FALSE);
}
else
{
if (bIsOn && !bVisible)
{
if (!bIsControlBar)
- pWnd->ShowWindow(SW_SHOW);
+ pWnd.ShowWindow(SW_SHOW);
else
- ShowPane((CBasePane*)pWnd, TRUE, FALSE, FALSE);
+ ShowPane(&dynamic_cast(pWnd), TRUE, FALSE, FALSE);
}
else if (!bIsOn && bVisible)
{
if (!bIsControlBar)
- pWnd->ShowWindow(SW_HIDE);
+ pWnd.ShowWindow(SW_HIDE);
else
- ShowPane((CBasePane*)pWnd, FALSE, FALSE, FALSE);
+ ShowPane(&dynamic_cast(pWnd), FALSE, FALSE, FALSE);
}
}
}
diff --git a/GP/FrmMain.h b/GP/FrmMain.h
index ee8894e6..b1326a35 100644
--- a/GP/FrmMain.h
+++ b/GP/FrmMain.h
@@ -1,6 +1,6 @@
// FrmMain.h : interface of the CMainFrame class
//
-// Copyright (c) 1994-2020 By Dale L. Larson, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -51,17 +51,17 @@ class CMainFrame : public CMDIFrameWndExCb,
public:
CDocument* GetCurrentDocument();
- CDockMarkPalette* GetDockingMarkerWindow() { return &m_wndMarkPal; }
- CDockTrayPalette* GetDockingTrayAWindow() { return &m_wndTrayPalA; }
- CDockTrayPalette* GetDockingTrayBWindow() { return &m_wndTrayPalB; }
+ CDockMarkPalette& GetDockingMarkerWindow() { return m_wndMarkPal; }
+ CDockTrayPalette& GetDockingTrayAWindow() { return m_wndTrayPalA; }
+ CDockTrayPalette& GetDockingTrayBWindow() { return m_wndTrayPalB; }
- CReadMsgWnd* GetMessageWindow() { return &m_wndMessage; }
+ CReadMsgWnd& GetMessageWindow() { return m_wndMessage; }
CMFCStatusBar* GetStatusBar() { return &m_wndStatusBar; }
// Operations
public:
- void UpdatePaletteWindow(CWnd* pWnd, BOOL bIsOn);
+ void UpdatePaletteWindow(CWnd& pWnd, BOOL bIsOn);
void ShowPalettePanes(BOOL bShow);
void OnIdle();
BOOL OnCloseMiniFrame(CPaneFrameWnd* pWnd) override;
diff --git a/GP/FrmPbrd.cpp b/GP/FrmPbrd.cpp
index eda068ca..676523ef 100644
--- a/GP/FrmPbrd.cpp
+++ b/GP/FrmPbrd.cpp
@@ -1,6 +1,6 @@
// FrmPbrd.cpp : implementation file
//
-// Copyright (c) 1994-2023 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -48,11 +48,14 @@ IMPLEMENT_DYNCREATE(CPlayBoardFrame, CMDIChildWndEx)
BEGIN_MESSAGE_MAP(CPlayBoardFrame, CMDIChildWndEx)
//{{AFX_MSG_MAP(CPlayBoardFrame)
+#if 0
ON_COMMAND(ID_VIEW_HALFSCALEBRD, OnViewHalfScaleBrd)
ON_UPDATE_COMMAND_UI(ID_VIEW_HALFSCALEBRD, OnUpdateViewHalfScaleBrd)
ON_COMMAND(ID_VIEW_FULLSCALEBRD, OnViewFullScaleBrd)
ON_UPDATE_COMMAND_UI(ID_VIEW_FULLSCALEBRD, OnUpdateViewFullScaleBrd)
+#endif
ON_WM_CLOSE()
+#if 0
ON_COMMAND(ID_VIEW_SNAPGRID, OnViewSnapGrid)
ON_UPDATE_COMMAND_UI(ID_VIEW_SNAPGRID, OnUpdateViewSnapGrid)
ON_COMMAND(ID_EDIT_SELALLMARKERS, OnEditSelAllMarkers)
@@ -74,6 +77,7 @@ BEGIN_MESSAGE_MAP(CPlayBoardFrame, CMDIChildWndEx)
ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER, OnUpdateActTurnOver)
ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER_PREV, OnUpdateActTurnOver)
ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER_RANDOM, OnUpdateActTurnOver)
+#endif
ON_COMMAND(ID_PTOOL_PLOTMOVE, OnActPlotMove)
ON_UPDATE_COMMAND_UI(ID_PTOOL_PLOTMOVE, OnUpdateActPlotMove)
ON_COMMAND(ID_ACT_PLOTDONE, OnActPlotDone)
@@ -85,8 +89,10 @@ BEGIN_MESSAGE_MAP(CPlayBoardFrame, CMDIChildWndEx)
ON_COMMAND(ID_VIEW_SPLITBOARDCOLS, OnViewSplitBoardCols)
ON_UPDATE_COMMAND_UI(ID_VIEW_SPLITBOARDCOLS, OnUpdateViewSplitBoardCols)
//}}AFX_MSG_MAP
+#if 0
ON_COMMAND_RANGE(ID_MRKGROUP_FIRST, ID_MRKGROUP_FIRST + 64, OnSelectGroupMarkers)
ON_UPDATE_COMMAND_UI_RANGE(ID_MRKGROUP_FIRST, ID_MRKGROUP_FIRST + 64, OnUpdateSelectGroupMarkers)
+#endif
// Other messages
ON_MESSAGE(WM_CENTERBOARDONPOINT, OnMessageCenterBoardOnPoint)
ON_MESSAGE(WM_WINSTATE, OnMessageWindowState)
@@ -213,14 +219,14 @@ BOOL CPlayBoardFrame::OnCreateClient(LPCREATESTRUCT lpcs,
}
if (!m_wndSplitter2.CreateView(0, 0,
- RUNTIME_CLASS(CSelectedPieceView),
+ RUNTIME_CLASS(CSelectedPieceViewContainer),
CSize(rct.Width() - xSize, ySize), pContext))
{
TRACE("Failed to create second Selected Piece pane\n");
return FALSE;
}
if (!m_wndSplitter2.CreateView(1, 0,
- RUNTIME_CLASS(CTinyBoardView),
+ RUNTIME_CLASS(CTinyBoardViewContainer),
CSize(rct.Width() - xSize, rct.Height() - ySize), pContext))
{
TRACE("Failed to create small scale map pane\n");
@@ -413,8 +419,13 @@ LRESULT CPlayBoardFrame::OnMessageWindowState(WPARAM wParam, LPARAM lParam)
LRESULT CPlayBoardFrame::SendMessageToActiveBoardPane(UINT nMsg, WPARAM wParam,
LPARAM lParam)
{
- CWnd& pWnd = GetActiveBoardView();
- return pWnd.SendMessage(nMsg, wParam, lParam);
+ CPlayBoardView& pWnd = GetActiveBoardView();
+ wxASSERT(nMsg == WM_SELECT_BOARD_OBJLIST);
+ const CPlayBoard* board = reinterpret_cast(wParam);
+ const std::vector>* objList = reinterpret_cast>*>(lParam);
+ SelectBoardObjListEvent event(CheckedDeref(board), CheckedDeref(objList));
+ pWnd.ProcessWindowEvent(event);
+ return 1;
}
/////////////////////////////////////////////////////////////////////////////
@@ -424,7 +435,10 @@ LRESULT CPlayBoardFrame::OnMessageCenterBoardOnPoint(WPARAM wParam, LPARAM lPara
{
// Route the message to the active board view.
CPlayBoardView& pView = GetActiveBoardView();
- return pView.SendMessage(WM_CENTERBOARDONPOINT, wParam, lParam);
+ const POINT* point = reinterpret_cast(wParam);
+ CenterBoardOnPointEvent event(CB::Convert(CheckedDeref(point)));
+ pView.ProcessWindowEvent(event);
+ return 0;
}
// Send these on to the main view so they can be process no
@@ -443,9 +457,20 @@ CCbSplitterWnd& CPlayBoardFrame::GetBoardSplitter()
const CPlayBoardView& CPlayBoardFrame::GetActiveBoardView() const
{
CCbSplitterWnd& pSplitWnd = CheckedDeref((CCbSplitterWnd*)m_wndSplitter1.GetPane(0, 0));
- return CheckedDeref((CPlayBoardView*)pSplitWnd.GetActivePane());
+ const CWnd* view = GetActiveView();
+ if (view &&
+ view->IsKindOf(RUNTIME_CLASS(CPlayBoardViewContainer)) &&
+ view->GetParent() == &pSplitWnd)
+ {
+ return static_cast(*view);
+ }
+ wxASSERT(!"dead code?");
+ const CWnd& wnd = CheckedDeref(pSplitWnd.GetActivePane());
+ const CPlayBoardViewContainer& container = dynamic_cast(wnd);
+ return static_cast(container);
}
+#if 0
void CPlayBoardFrame::OnViewHalfScaleBrd()
{
GetActiveBoardView().OnViewHalfScaleBrd();
@@ -560,35 +585,45 @@ void CPlayBoardFrame::OnUpdateActTurnOver(CCmdUI* pCmdUI)
{
GetActiveBoardView().OnUpdateActTurnOver(pCmdUI);
}
+#endif
void CPlayBoardFrame::OnActPlotMove()
{
- GetActiveBoardView().OnActPlotMove();
+ wxASSERT(!"dead code?");
+ wxCommandEvent dummy;
+ GetActiveBoardView().OnActPlotMove(dummy);
}
void CPlayBoardFrame::OnUpdateActPlotMove(CCmdUI* pCmdUI)
{
- GetActiveBoardView().OnUpdateActPlotMove(pCmdUI);
+ wxASSERT(!"dead code?");
+ CB_VERIFY(CB::RelayOnCmdMsg(GetActiveBoardView(), ID_PTOOL_PLOTMOVE, CN_UPDATE_COMMAND_UI, pCmdUI, nullptr));
}
void CPlayBoardFrame::OnActPlotDone()
{
- GetActiveBoardView().OnActPlotDone();
+ wxASSERT(!"dead code?");
+ wxCommandEvent dummy;
+ GetActiveBoardView().OnActPlotDone(dummy);
}
void CPlayBoardFrame::OnUpdateActPlotDone(CCmdUI* pCmdUI)
{
- GetActiveBoardView().OnUpdateActPlotDone(pCmdUI);
+ wxASSERT(!"dead code?");
+ CB_VERIFY(CB::RelayOnCmdMsg(GetActiveBoardView(), ID_ACT_PLOTDONE, CN_UPDATE_COMMAND_UI, pCmdUI, nullptr));
}
void CPlayBoardFrame::OnActPlotDiscard()
{
- GetActiveBoardView().OnActPlotDiscard();
+ wxASSERT(!"dead code?");
+ wxCommandEvent dummy;
+ GetActiveBoardView().OnActPlotDiscard(dummy);
}
void CPlayBoardFrame::OnUpdateActPlotDiscard(CCmdUI* pCmdUI)
{
- GetActiveBoardView().OnUpdateActPlotDiscard(pCmdUI);
+ wxASSERT(!"dead code?");
+ CB_VERIFY(CB::RelayOnCmdMsg(GetActiveBoardView(), ID_ACT_PLOTDISCARD, CN_UPDATE_COMMAND_UI, pCmdUI, nullptr));
}
void CPlayBoardFrame::OnViewSplitBoardRows()
diff --git a/GP/GamDoc.cpp b/GP/GamDoc.cpp
index 626b1874..c1a36264 100644
--- a/GP/GamDoc.cpp
+++ b/GP/GamDoc.cpp
@@ -1,6 +1,6 @@
// GamDoc.cpp
//
-// Copyright (c) 1994-2025 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -195,9 +195,7 @@ END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGamDoc construction/destruction
-CGamDoc::CGamDoc() :
- m_palTrayA(*this),
- m_palTrayB(*this)
+CGamDoc::CGamDoc()
{
m_nSeedCarryOver = (UINT)GetTickCount();
@@ -228,9 +226,6 @@ CGamDoc::CGamDoc() :
m_bKeepMoveHist = TRUE;
m_bVrfyGameState = TRUE;
m_bVrfySaveState = TRUE;
- m_palTrayA.SetPaletteID(0);
- m_palTrayB.SetPaletteID(1);
- m_palMark.SetDocument(this);
m_wDocRand = GetTimeBasedRandomNumber(FALSE); // Non zero random number
m_nMoveInterlock = 0;
m_bQuietPlayback = FALSE;
@@ -355,6 +350,37 @@ BOOL CGamDoc::OnSaveDocument(LPCTSTR pszPathName)
void CGamDoc::DeleteContents()
{
+ /* close may trigger paint of other windows,
+ so close before delete */
+ if (m_palTrayA)
+ {
+ CDockTrayPalette* pFrame = m_palTrayA->GetDockingFrame();
+ if (pFrame)
+ {
+ pFrame->SetChild(NULL); // Need to remove pointer from Tray's UI Frame.
+ }
+ m_palTrayA = nullptr;
+ }
+ if (m_palTrayB)
+ {
+ CDockTrayPalette* pFrame = m_palTrayB->GetDockingFrame();
+ if (pFrame)
+ {
+ pFrame->SetChild(NULL); // Need to remove pointer from Tray's UI Frame.
+ }
+ m_palTrayB = nullptr;
+ }
+ if (m_palMark)
+ {
+ CDockMarkPalette* pFrame = static_cast(m_palMark->GetDockingFrame());
+ if (pFrame)
+ {
+ ASSERT_KINDOF(CDockMarkPalette, pFrame);
+ pFrame->SetChild(NULL); // Need to remove pointer from Marker's UI Frame.
+ }
+ m_palMark = nullptr;
+ }
+
// m_wReserved1 = 0;
m_wReserved2 = 0;
m_wReserved3 = 0;
@@ -399,37 +425,6 @@ void CGamDoc::DeleteContents()
m_nMoveInterlock = 0;
m_bQuietPlayback = FALSE;
- if (m_palTrayA.m_hWnd != NULL)
- {
- CDockTrayPalette* pFrame = (CDockTrayPalette*)m_palTrayA.GetDockingFrame();
- if (pFrame)
- {
- ASSERT_KINDOF(CDockTrayPalette, pFrame);
- pFrame->SetChild(NULL); // Need to remove pointer from Tray's UI Frame.
- }
- m_palTrayA.DestroyWindow();
- }
- if (m_palTrayB.m_hWnd != NULL)
- {
- CDockTrayPalette* pFrame = (CDockTrayPalette*)m_palTrayB.GetDockingFrame();
- if (pFrame)
- {
- ASSERT_KINDOF(CDockTrayPalette, pFrame);
- pFrame->SetChild(NULL); // Need to remove pointer from Tray's UI Frame.
- }
- m_palTrayB.DestroyWindow();
- }
- if (m_palMark.m_hWnd != NULL)
- {
- CDockMarkPalette* pFrame = (CDockMarkPalette*)m_palMark.GetDockingFrame();
- if (pFrame)
- {
- ASSERT_KINDOF(CDockMarkPalette, pFrame);
- pFrame->SetChild(NULL); // Need to remove pointer from Marker's UI Frame.
- }
- m_palMark.DestroyWindow();
- }
-
DiscardWindowState();
if (m_pPlayerMgr != NULL) delete m_pPlayerMgr;
@@ -449,21 +444,21 @@ void CGamDoc::OnIdle(BOOL bActive)
{
CMainFrame* pMFrame = GetMainFrame();
- CDockMarkPalette* pDockMark = pMFrame->GetDockingMarkerWindow();
- pDockMark->SetChild(&m_palMark);
+ CDockMarkPalette& pDockMark = pMFrame->GetDockingMarkerWindow();
+ pDockMark.SetChild(&*m_palMark);
pMFrame->UpdatePaletteWindow(pDockMark, m_bMarkPalVisible);
- CDockTrayPalette* pDockTrayA = pMFrame->GetDockingTrayAWindow();
- pDockTrayA->SetChild(&m_palTrayA);
+ CDockTrayPalette& pDockTrayA = pMFrame->GetDockingTrayAWindow();
+ pDockTrayA.SetChild(&*m_palTrayA);
pMFrame->UpdatePaletteWindow(pDockTrayA, m_bTrayAVisible);
- CDockTrayPalette* pDockTrayB = pMFrame->GetDockingTrayBWindow();
- pDockTrayB->SetChild(&m_palTrayB);
+ CDockTrayPalette& pDockTrayB = pMFrame->GetDockingTrayBWindow();
+ pDockTrayB.SetChild(&*m_palTrayB);
pMFrame->UpdatePaletteWindow(pDockTrayB, m_bTrayBVisible);
- CReadMsgWnd* pDocMsg = pMFrame->GetMessageWindow();
+ CReadMsgWnd& pDocMsg = pMFrame->GetMessageWindow();
pMFrame->UpdatePaletteWindow(pDocMsg, m_bMsgWinVisible && !IsScenario());
- pDocMsg->SetText(this);
+ pDocMsg.SetText(this);
}
}
@@ -475,8 +470,8 @@ void CGamDoc::OnIdle(BOOL bActive)
void CGamDoc::DoInitialUpdate()
{
- m_palTrayA.UpdatePaletteContents(NULL);
- m_palTrayB.UpdatePaletteContents(NULL);
+ (*m_palTrayA)->UpdatePaletteContents(NULL);
+ (*m_palTrayB)->UpdatePaletteContents(NULL);
}
void CGamDoc::UpdateAllViews(CView* pSender, LPARAM lHint, CObject* pHint)
@@ -484,13 +479,13 @@ void CGamDoc::UpdateAllViews(CView* pSender, LPARAM lHint, CObject* pHint)
CGamDocHint* ph = static_cast(pHint);
if (lHint == HINT_TRAYCHANGE)
{
- m_palTrayA.UpdatePaletteContents(ph->GetArgs().m_pTray);
- m_palTrayB.UpdatePaletteContents(ph->GetArgs().m_pTray);
+ (*m_palTrayA)->UpdatePaletteContents(ph->GetArgs().m_pTray);
+ (*m_palTrayB)->UpdatePaletteContents(ph->GetArgs().m_pTray);
}
else if (lHint == HINT_GAMESTATEUSED)
{
- m_palTrayA.UpdatePaletteContents();
- m_palTrayB.UpdatePaletteContents();
+ (*m_palTrayA)->UpdatePaletteContents();
+ (*m_palTrayB)->UpdatePaletteContents();
}
CDocument::UpdateAllViews(pSender, lHint, pHint);
}
@@ -533,7 +528,7 @@ CGamProjView& CGamDoc::FindProjectView() const
AfxThrowNotSupportedException();
}
-CView* CGamDoc::FindPBoardView(const CPlayBoard& pPBoard) const
+CPlayBoardView* CGamDoc::FindPBoardView(const CPlayBoard& pPBoard) const
{
if (!IsScenario() &&
pPBoard.IsPrivate() &&
@@ -546,11 +541,12 @@ CView* CGamDoc::FindPBoardView(const CPlayBoard& pPBoard) const
POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
- CPlayBoardView* pView = (CPlayBoardView*)GetNextView(pos);
- if (pView->IsKindOf(RUNTIME_CLASS(CPlayBoardView)))
+ CPlayBoardViewContainer* pCont = static_cast(GetNextView(pos));
+ if (pCont->IsKindOf(RUNTIME_CLASS(CPlayBoardViewContainer)))
{
- if (pView->GetPlayBoard() == &pPBoard)
- return pView;
+ CPlayBoardView& pView = *pCont;
+ if (&pView.GetPlayBoard() == &pPBoard)
+ return &pView;
}
}
return NULL;
@@ -637,9 +633,15 @@ BOOL CGamDoc::OnNewScenario()
m_pYMgr->SetTileManager(m_pGbx->GetTileManager());
// Finally set up the tray palettes
- m_palTrayA.Create(GetMainFrame()->GetDockingTrayAWindow());
- m_palTrayB.Create(GetMainFrame()->GetDockingTrayBWindow());
- m_palMark.Create(GetMainFrame()->GetDockingMarkerWindow());
+ wxASSERT(!m_palTrayA);
+ m_palTrayA = new CTrayPaletteContainer(*this, ID_VIEW_TRAYA);
+ m_palTrayA->Create(GetMainFrame()->GetDockingTrayAWindow());
+ wxASSERT(!m_palTrayB);
+ m_palTrayB = new CTrayPaletteContainer(*this, ID_VIEW_TRAYB);
+ m_palTrayB->Create(GetMainFrame()->GetDockingTrayBWindow());
+ wxASSERT(!m_palMark);
+ m_palMark = new CMarkerPaletteContainer(*this);
+ m_palMark->Create(GetMainFrame()->GetDockingMarkerWindow());
return TRUE;
}
@@ -963,7 +965,7 @@ const CTileManager& CGamDoc::GetTileManager() const
return CheckedDeref(CheckedDeref(m_pGbx).GetTileManager());
}
-CMarkManager& CGamDoc::GetMarkManager()
+const CMarkManager& CGamDoc::GetMarkManager() const
{
return CheckedDeref(CheckedDeref(m_pGbx).GetMarkManager());
}
@@ -1629,7 +1631,7 @@ void CGamDoc::OnEditSelectBoards()
pPBMgr.FindPBoardsNotInList(dlg.m_tblBrds, tblNotInList);
for (size_t i = size_t(0); i < tblNotInList.size(); i++)
{
- CView* pView = FindPBoardView(*tblNotInList.at(i));
+ CPlayBoardView* pView = FindPBoardView(*tblNotInList.at(i));
if (pView != NULL)
{
CFrameWnd* pFrame = pView->GetParentFrame();
diff --git a/GP/GamDoc.h b/GP/GamDoc.h
index e32537cf..908c0668 100644
--- a/GP/GamDoc.h
+++ b/GP/GamDoc.h
@@ -1,6 +1,6 @@
// GamDoc.h
//
-// Copyright (c) 1994-2025 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -127,6 +127,13 @@ class CGamDocHint : public CObject
DECLARE_DYNCREATE(CGamDocHint);
public:
CGamDocHint() : hint(HINT_INVALID) {}
+ ~CGamDocHint()
+ {
+ if (hint == HINT_POINTINVIEW)
+ {
+ args.m_pointInView.~Args();
+ }
+ }
template
struct Args
@@ -143,14 +150,14 @@ class CGamDocHint : public CObject
struct Args
{
const CPlayBoard* m_pPBoard;
- CDrawObj* m_pDrawObj;
+ const CDrawObj* m_pDrawObj;
};
template<>
struct Args
{
CPlayBoard* m_pPBoard;
- const std::vector>* m_pPtrList;
+ const std::vector>* m_pPtrList;
};
template<>
@@ -177,7 +184,7 @@ class CGamDocHint : public CObject
struct Args
{
CPlayBoard* m_pPBoard;
- POINT m_point;
+ wxPoint m_point;
};
template<>
@@ -200,6 +207,10 @@ class CGamDocHint : public CObject
if (hint == HINT_INVALID)
{
hint = HINT;
+ if (hint == HINT_POINTINVIEW)
+ {
+ new (&args.m_pointInView) Args;
+ }
}
else if (HINT != hint)
{
@@ -210,7 +221,7 @@ class CGamDocHint : public CObject
private:
EGamDocHint hint;
- union {
+ union U {
Args m_trayChange;
Args m_updateObject;
Args m_updateObjList;
@@ -220,6 +231,7 @@ class CGamDocHint : public CObject
Args m_pointInView;
Args m_selectObj;
Args m_selectObjList;
+ U() {}
} args;
};
@@ -316,7 +328,11 @@ class CGamDoc : public CDocument
// Major game related objects...
const CTileManager& GetTileManager() const;
CTileManager& GetTileManager() { return const_cast(std::as_const(*this).GetTileManager()); }
- CMarkManager& GetMarkManager();
+ const CMarkManager& GetMarkManager() const;
+ CMarkManager& GetMarkManager()
+ {
+ return const_cast(std::as_const(*this).GetMarkManager());
+ }
const CBoardManager& GetBoardManager() const;
CBoardManager& GetBoardManager()
{
@@ -347,8 +363,8 @@ class CGamDoc : public CDocument
BOOL CreateNewFrame(CDocTemplate* pTemplate, const CB::string& pszTitle,
LPVOID lpvCreateParam);
CGamProjView& FindProjectView() const;
- CView* FindPBoardView(const CPlayBoard& pPBoard) const;
- CView* MakeSurePBoardVisible(CPlayBoard& pPBoard);
+ CPlayBoardView* FindPBoardView(const CPlayBoard& pPBoard) const;
+ CPlayBoardView* MakeSurePBoardVisible(CPlayBoard& pPBoard);
void GetDocumentFrameList(std::vector>& tblFrames) const;
BOOL IsWindowStateAvailable() const { return m_pWinState != NULL; }
@@ -374,7 +390,7 @@ class CGamDoc : public CDocument
CB::string GetGameElementString(GameElement gelem) const;
BOOL HasGameElementString(GameElement gelem) const;
void SetGameElementString(GameElement gelem, const CB::string* pszString);
- void GetTipTextForObject(const CDrawObj& pDObj, CB::string &strTip, CB::string* pStrTitle = NULL) const;
+ void GetTipTextForObject(const CDrawObj& pDObj, CB::string &strTip) const;
// Invalid_v = top
GameElement GetGameElementCodeForObject(const CDrawObj& pDObj, size_t nSide = Invalid_v) const;
GameElement GetVerifiedGameElementCodeForObject(const CDrawObj& pDObj, size_t nSide = Invalid_v) const;
@@ -428,7 +444,7 @@ class CGamDoc : public CDocument
void PlacePieceListOnBoard(CPoint pnt, const std::vector& pTbl,
int xStagger, int yStagger, CPlayBoard *pPBrd);
size_t PlacePieceListInTray(const std::vector& pTbl, CTraySet& pYGrp, size_t nPos = Invalid_v);
- size_t PlaceObjectTableInTray(const std::vector> & pTbl, CTraySet& pYGrp, size_t nPos = Invalid_v);
+ size_t PlaceObjectTableInTray(const std::vector>& pTbl, CTraySet& pYGrp, size_t nPos = Invalid_v);
void PlaceObjectTableOnBoard(const std::vector>& pLst, CPoint pntUpLeft,
CPlayBoard* pPBrd, PlacePos ePos = placeDefault);
void PlaceObjectTableOnBoard(CPoint pnt, const std::vector>& pTbl,
@@ -438,7 +454,7 @@ class CGamDoc : public CDocument
CSize sizeDelta, PlacePos ePos = placeDefault);
void InvertPlayingPieceInTray(PieceID pid, CPieceTable::Flip flip, size_t side, bool bOkToNotifyTray, bool forceHide);
- void InvertPlayingPieceOnBoard(CPieceObj& pObj, const CPlayBoard& pPBrd, CPieceTable::Flip flip, size_t side = Invalid_v);
+ void InvertPlayingPieceOnBoard(const CPieceObj& pObj, const CPlayBoard& pPBrd, CPieceTable::Flip flip, size_t side = Invalid_v);
void InvertPlayingPieceTableOnBoard(const std::vector>& pLst, const CPlayBoard& pPBrd, CPieceTable::Flip flip);
void ChangePlayingPieceFacingOnBoard(CPieceObj& pObj, CPlayBoard* pPBrd,
@@ -457,18 +473,18 @@ class CGamDoc : public CDocument
CPoint ptEnd, UINT nLineWd, COLORREF crLine, ObjectID dwObjID = ObjectID());
void ModifyLineObject(CPlayBoard* pPBrd, CPoint ptBeg, CPoint ptEnd,
UINT nLineWd, COLORREF crLine, CLine* pObj);
- void ReorgObjsInDrawList(CPlayBoard *pPBrd, std::vector>& pList, BOOL bToFront);
- void DeleteObjectsInTable(const std::vector>& pList);
+ void ReorgObjsInDrawList(CPlayBoard *pPBrd, std::vector>& pList, BOOL bToFront);
+ void DeleteObjectsInTable(const std::vector>& pList);
void SetObjectText(GameElement elem, const CB::string* pszObjText);
void SetObjectLockdownTable(const std::vector>& pLst, BOOL bLockState);
void SetObjectLockdown(CDrawObj& pDObj, BOOL bLockState);
BOOL RemovePieceFromCurrentLocation(PieceID pid, BOOL bDeleteIfBoard,
BOOL bTrayHintAllowed = TRUE);
- void RemoveObjectFromCurrentLocation(CDrawObj* pObj);
+ void RemoveObjectFromCurrentLocation(const CDrawObj& pObj);
void ExpungeUnusedPiecesFromBoards();
- void FindObjectTableUnionRect(const std::vector>& pLst, CRect& rct) const;
+ void FindObjectTableUnionRect(const std::vector>& pLst, CRect& rct) const;
// Object and piece locator methods...
BOOL FindPieceCurrentLocation(PieceID pid, const CTraySet*& pTraySet,
@@ -496,12 +512,12 @@ class CGamDoc : public CDocument
{
return const_cast(std::as_const(*this).FindObjectOnBoard(dwObjID, const_cast(ppObj)));
}
- CPlayBoard* FindObjectOnBoard(CDrawObj* pObj);
+ CPlayBoard* FindObjectOnBoard(const CDrawObj& pObj);
// Support for playback...
void EnsureBoardVisible(CPlayBoard& pPBoard);
void EnsureBoardLocationVisible(CPlayBoard& pPBoard, CPoint point);
- void EnsureTrayIndexVisible(const CTraySet& pYSet, int nPos);
+ void EnsureTrayIndexVisible(const CTraySet& pYSet, size_t nPos);
void SelectObjectOnBoard(CPlayBoard& pPBoard, CDrawObj* pObj);
void SelectObjectListOnBoard(CPlayBoard& pPBoard, const std::vector>& pList);
void SelectTrayItem(const CTraySet& pYSet, PieceID pid, UINT nResourceID);
@@ -678,13 +694,24 @@ class CGamDoc : public CDocument
CTileFacingMap* m_pTileFacingMap; // Map of temp tile rotations (NOT SERIALIZED)
+private:
+ class WindowDestroy
+ {
+ public:
+ void operator()(CWnd* p) const
+ {
+ p->DestroyWindow();
+ delete p;
+ }
+ };
+
// Some document related windows...
public:
// Tray Palettes...
- CTrayPalette m_palTrayA;
- CTrayPalette m_palTrayB;
+ CB::propagate_const> m_palTrayA;
+ CB::propagate_const> m_palTrayB;
// Marker Palette...
- CMarkerPalette m_palMark;
+ CB::propagate_const> m_palMark;
// Implementation
protected:
diff --git a/GP/GamDoc1.cpp b/GP/GamDoc1.cpp
index 19de48e8..e07af438 100644
--- a/GP/GamDoc1.cpp
+++ b/GP/GamDoc1.cpp
@@ -1,6 +1,6 @@
// GamDoc1.cpp - Command and Control for document wide operations
//
-// Copyright (c) 1994-2025 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -144,7 +144,7 @@ void CGamDoc::PlaceObjectOnBoard(CPlayBoard *pPBrd, CDrawObj::OwnerPtr opObj,
}
}
else
- RemoveObjectFromCurrentLocation(&pObj);
+ RemoveObjectFromCurrentLocation(pObj);
pObj.MoveObject(pObj.GetRect().TopLeft() + sizeDelta);
@@ -186,7 +186,7 @@ void CGamDoc::PlaceObjectTableOnBoard(const std::vector>
CDrawList* pDwg = pPBrd->GetPieceList();
ASSERT(pDwg);
CRect rct;
- FindObjectTableUnionRect(pLst, rct);
+ FindObjectTableUnionRect(ToRefPtr(pLst), rct);
CSize size(pntUpLeft.x - rct.left, pntUpLeft.y - rct.top);
if (pPBrd->GetPlotMoveMode())
@@ -291,14 +291,14 @@ void CGamDoc::PlaceObjectTableOnBoard(const std::vector>
// Record processing
if (pObj.GetType() == CDrawObj::drawPieceObj)
{
- CPieceObj& pPObj = static_cast(pObj);
+ const CPieceObj& pPObj = static_cast(pObj);
CRect rctPce = pPObj.GetRect();
RecordPieceMoveToBoard(pPBrd, pPObj.m_pid, GetMidRect(rctPce) +
size, ePos);
}
else if (pObj.GetType() == CDrawObj::drawMarkObj)
{
- CMarkObj& pMObj = static_cast(pObj);
+ const CMarkObj& pMObj = static_cast(pObj);
CRect rctMrk = pMObj.GetRect();
RecordMarkMoveToBoard(pPBrd, pMObj.GetObjectID(), pMObj.m_mid,
GetMidRect(rctMrk) + size, ePos);
@@ -317,7 +317,7 @@ void CGamDoc::PlaceObjectTableOnBoard(const std::vector>
}
}
else
- RemoveObjectFromCurrentLocation(&pObj);
+ RemoveObjectFromCurrentLocation(pObj);
pObj.MoveObject(pObj.GetRect().TopLeft() + size);
@@ -446,17 +446,17 @@ size_t CGamDoc::PlacePieceListInTray(const std::vector& pTbl, CTraySet&
//////////////////////////////////////////////////////////////////////
// Returns index of last piece inserted.
-size_t CGamDoc::PlaceObjectTableInTray(const std::vector>& pLst, CTraySet& pYGrp, size_t nPos)
+size_t CGamDoc::PlaceObjectTableInTray(const std::vector>& pLst, CTraySet& pYGrp, size_t nPos)
{
// Scan this list in reverse order so they show up in the
// same visual order.
for (size_t i = pLst.size() ; i != size_t(0) ; --i)
{
- CDrawObj& pObj = *pLst[i - size_t(1)];
+ const CDrawObj& pObj = *pLst[i - size_t(1)];
// Only pieces are placed. Other objects are left as they were.
if (pObj.GetType() == CDrawObj::drawPieceObj)
{
- PlacePieceInTray(static_cast(pObj).m_pid, pYGrp, nPos);
+ PlacePieceInTray(static_cast(pObj).m_pid, pYGrp, nPos);
if (nPos != Invalid_v)
nPos++;
}
@@ -466,7 +466,7 @@ size_t CGamDoc::PlaceObjectTableInTray(const std::vector
//////////////////////////////////////////////////////////////////////
// (RECORDS)
-void CGamDoc::InvertPlayingPieceOnBoard(CPieceObj& pObj, const CPlayBoard& pPBrd, CPieceTable::Flip flip, size_t side /*= Invalid_v*/)
+void CGamDoc::InvertPlayingPieceOnBoard(const CPieceObj& pObj, const CPlayBoard& pPBrd, CPieceTable::Flip flip, size_t side /*= Invalid_v*/)
{
if (m_pPTbl->GetSides(pObj.m_pid) <= size_t(1))
return;
@@ -618,18 +618,18 @@ void CGamDoc::ChangeMarkerFacingOnBoard(CMarkObj& pObj, CPlayBoard* pPBrd,
//////////////////////////////////////////////////////////////////////
// (RECORDS)
-void CGamDoc::DeleteObjectsInTable(const std::vector>& pLst)
+void CGamDoc::DeleteObjectsInTable(const std::vector>& pLst)
{
for (auto pos = pLst.begin() ; pos != pLst.end() ; ++pos)
{
- CDrawObj& pObj = **pos;
+ const CDrawObj& pObj = **pos;
// Only nonpieces are deleted. Pieces are left as they were.
if (pObj.GetType() != CDrawObj::drawPieceObj)
{
if (pObj.GetType() == CDrawObj::drawMarkObj)
RecordObjectDelete(pObj.GetObjectID());
- CPlayBoard* pPBrd = FindObjectOnBoard(&pObj);
+ CPlayBoard* pPBrd = FindObjectOnBoard(pObj);
ASSERT(pPBrd != NULL);
pPBrd->RemoveObject(pObj);
@@ -824,7 +824,7 @@ void CGamDoc::ModifyLineObject(CPlayBoard* pPBrd, CPoint ptBeg,
//////////////////////////////////////////////////////////////////////
-void CGamDoc::ReorgObjsInDrawList(CPlayBoard *pPBrd, std::vector>& pList,
+void CGamDoc::ReorgObjsInDrawList(CPlayBoard *pPBrd, std::vector>& pList,
BOOL bToFront)
{
CDrawList* pDwg = pPBrd->GetPieceList();
@@ -866,10 +866,10 @@ const CPlayBoard* CGamDoc::FindObjectOnBoard(ObjectID dwObjID, const CDrawObj*&
return m_pPBMgr->FindObjectOnBoard(dwObjID, ppObj);
}
-CPlayBoard* CGamDoc::FindObjectOnBoard(CDrawObj* pObj)
+CPlayBoard* CGamDoc::FindObjectOnBoard(const CDrawObj& pObj)
{
ASSERT(m_pPBMgr != NULL);
- return m_pPBMgr->FindObjectOnBoard(*pObj);
+ return m_pPBMgr->FindObjectOnBoard(pObj);
}
const CPlayBoard* CGamDoc::FindPieceOnBoard(PieceID pid, const CPieceObj*& ppObj) const
@@ -944,18 +944,18 @@ BOOL CGamDoc::FindPieceCurrentLocation(PieceID pid, const CTraySet*& pTraySet,
////////////////////////////////////////////////////////////////////
-void CGamDoc::RemoveObjectFromCurrentLocation(CDrawObj* pObj)
+void CGamDoc::RemoveObjectFromCurrentLocation(const CDrawObj& pObj)
{
CPlayBoard* pPBoard = FindObjectOnBoard(pObj);
if (pPBoard != NULL)
{
- pPBoard->RemoveObject(*pObj);
+ pPBoard->RemoveObject(pObj);
if (!IsQuietPlayback())
{
// Cause it's former location to be invalidated...
CGamDocHint hint;
hint.GetArgs().m_pPBoard = pPBoard;
- hint.GetArgs().m_pDrawObj = pObj;
+ hint.GetArgs().m_pDrawObj = &pObj;
UpdateAllViews(NULL, HINT_UPDATEOBJECT, &hint);
}
}
@@ -963,13 +963,13 @@ void CGamDoc::RemoveObjectFromCurrentLocation(CDrawObj* pObj)
////////////////////////////////////////////////////////////////////
-void CGamDoc::FindObjectTableUnionRect(const std::vector>& pLst, CRect& rct) const
+void CGamDoc::FindObjectTableUnionRect(const std::vector>& pLst, CRect& rct) const
{
rct.SetRectEmpty();
for (auto pos = pLst.begin() ; pos != pLst.end() ; ++pos)
{
- CDrawObj& pObj = **pos;
+ const CDrawObj& pObj = **pos;
if (rct.IsRectEmpty())
rct = pObj.GetRect();
else
diff --git a/GP/GamDoc2.cpp b/GP/GamDoc2.cpp
index 20d93cad..1944f792 100644
--- a/GP/GamDoc2.cpp
+++ b/GP/GamDoc2.cpp
@@ -184,7 +184,7 @@ void CGamDoc::SaveRecordedMoves()
m_strCurMsg.clear();
m_astrMsgHist.clear();
- GetMainFrame()->GetMessageWindow()->SetText(NULL);
+ GetMainFrame()->GetMessageWindow().SetText(NULL);
// Save was ok..add to game history
AddMovesToGameHistoryTable(pHist);
diff --git a/GP/GamDoc3.cpp b/GP/GamDoc3.cpp
index 10194e4d..9c51dba9 100644
--- a/GP/GamDoc3.cpp
+++ b/GP/GamDoc3.cpp
@@ -1,6 +1,6 @@
// GamDoc3.cpp -- serialization support for the document.
//
-// Copyright (c) 1994-2025 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -526,7 +526,7 @@ void CGamDoc::SerializeGame(CArchive& ar)
}
GetTrayManager().PropagateOwnerMaskToAllPieces(this);
GetPBoardManager().PropagateOwnerMaskToAllPieces();
- GetMainFrame()->GetMessageWindow()->SetText(this);
+ GetMainFrame()->GetMessageWindow().SetText(this);
}
}
@@ -688,11 +688,11 @@ void CGamDoc::SerializeScenarioOrGame(CArchive& ar, uint64_t& offsetOffsetFeatur
ar << (BYTE)0; // 0 -> no win state serialize // V2.0
ar << (WORD)m_bTrayAVisible;
- m_palTrayA.Serialize(ar); // Save tray position on screen
+ (*m_palTrayA)->Serialize(ar); // Save tray position on screen
ar << (WORD)m_bTrayBVisible;
- m_palTrayB.Serialize(ar); // Save tray position on screen
+ (*m_palTrayB)->Serialize(ar); // Save tray position on screen
ar << (WORD)m_bMarkPalVisible;
- m_palMark.Serialize(ar); // Save tray position on screen
+ (*m_palMark)->Serialize(ar); // Save tray position on screen
// Main content serialization....
@@ -848,11 +848,17 @@ void CGamDoc::SerializeScenarioOrGame(CArchive& ar, uint64_t& offsetOffsetFeatur
}
ar >> wTmp; m_bTrayAVisible = (BOOL)wTmp;
- m_palTrayA.Serialize(ar); // Restore tray position on screen
+ wxASSERT(!m_palTrayA);
+ m_palTrayA = new CTrayPaletteContainer(*this, ID_VIEW_TRAYA);
+ (*m_palTrayA)->Serialize(ar); // Restore tray position on screen
ar >> wTmp; m_bTrayBVisible = (BOOL)wTmp;
- m_palTrayB.Serialize(ar); // Restore tray position on screen
+ wxASSERT(!m_palTrayB);
+ m_palTrayB = new CTrayPaletteContainer(*this, ID_VIEW_TRAYB);
+ (*m_palTrayB)->Serialize(ar); // Restore tray position on screen
ar >> wTmp; m_bMarkPalVisible = (BOOL)wTmp;
- m_palMark.Serialize(ar); // Restore tray position on screen
+ wxASSERT(!m_palMark);
+ m_palMark = new CMarkerPaletteContainer(*this);
+ (*m_palMark)->Serialize(ar); // Restore tray position on screen
// OK....retrieve the file offset of the game data...
if (NumVersion(verMajor, verMinor) < NumVersion(2, 90))
@@ -877,9 +883,9 @@ void CGamDoc::SerializeScenarioOrGame(CArchive& ar, uint64_t& offsetOffsetFeatur
m_pYMgr->SetTileManager(m_pGbx->GetTileManager());
// Finally set up the tray palettes
- m_palTrayA.Create(GetMainFrame()->GetDockingTrayAWindow());
- m_palTrayB.Create(GetMainFrame()->GetDockingTrayBWindow());
- m_palMark.Create(GetMainFrame()->GetDockingMarkerWindow());
+ m_palTrayA->Create(GetMainFrame()->GetDockingTrayAWindow());
+ m_palTrayB->Create(GetMainFrame()->GetDockingTrayBWindow());
+ m_palMark->Create(GetMainFrame()->GetDockingMarkerWindow());
// Main content serialization....
m_pPBMgr->Serialize(ar); // Board contents
diff --git a/GP/GamDoc4.cpp b/GP/GamDoc4.cpp
index cb8a0a1c..f8a03190 100644
--- a/GP/GamDoc4.cpp
+++ b/GP/GamDoc4.cpp
@@ -1,6 +1,6 @@
// GamDoc4.cpp - various game playback support routines
//
-// Copyright (c) 1994-2025 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -468,7 +468,7 @@ void CGamDoc::EnsureBoardLocationVisible(CPlayBoard& pPBoard, CPoint point)
// near the center of the view.
CGamDocHint hint;
hint.GetArgs().m_pPBoard = &pPBoard;
- hint.GetArgs().m_point = point;
+ hint.GetArgs().m_point = CB::Convert(point);
UpdateAllViews(NULL, HINT_POINTINVIEW, &hint);
}
@@ -484,7 +484,7 @@ void CGamDoc::EnsureBoardVisible(CPlayBoard& pPBoard)
/////////////////////////////////////////////////////////////////////////////
-void CGamDoc::EnsureTrayIndexVisible(const CTraySet& pYSet, int nPos)
+void CGamDoc::EnsureTrayIndexVisible(const CTraySet& pYSet, size_t nPos)
{
if (IsQuietPlayback()) return;
if (!m_bTrayAVisible)
@@ -492,8 +492,8 @@ void CGamDoc::EnsureTrayIndexVisible(const CTraySet& pYSet, int nPos)
// Make sure item nPos is visible.
size_t nGroup = GetTrayManager().FindTrayByRef(pYSet);
- ASSERT(nGroup != Invalid_v);
- m_palTrayA.ShowTrayIndex(nGroup, nPos);
+ wxASSERT(nGroup != Invalid_v);
+ (*m_palTrayA)->ShowTrayIndex(nGroup, nPos);
}
/////////////////////////////////////////////////////////////////////////////
@@ -546,7 +546,7 @@ void CGamDoc::SelectTrayItem(const CTraySet& pYSet, PieceID pid,
// Select the piece in the appropriate trayset.
size_t nGroup = GetTrayManager().FindTrayByRef(pYSet);
ASSERT(nGroup != Invalid_v);
- m_palTrayA.SelectTrayPiece(nGroup, pid, pszNotificationTip ? pszNotificationTip : nullptr);
+ (*m_palTrayA)->SelectTrayPiece(nGroup, pid, pszNotificationTip ? pszNotificationTip : nullptr);
}
void CGamDoc::SelectMarkerPaletteItem(MarkID mid)
@@ -556,12 +556,12 @@ void CGamDoc::SelectMarkerPaletteItem(MarkID mid)
if (!m_bMarkPalVisible)
OnViewMarkPalette();
// Select the marker in the appropriate group.
- m_palMark.SelectMarker(mid);
+ (*m_palMark)->SelectMarker(mid);
}
/////////////////////////////////////////////////////////////////////////////
-CView* CGamDoc::MakeSurePBoardVisible(CPlayBoard& pPBoard)
+CPlayBoardView* CGamDoc::MakeSurePBoardVisible(CPlayBoard& pPBoard)
{
if (IsQuietPlayback()) return NULL;
if (pPBoard.IsPrivate() &&
@@ -577,7 +577,7 @@ CView* CGamDoc::MakeSurePBoardVisible(CPlayBoard& pPBoard)
return nullptr;
}
- CView* pView = FindPBoardView(pPBoard);
+ CPlayBoardView* pView = FindPBoardView(pPBoard);
if (pView != NULL)
{
// This board already has a view. Activate that view.
@@ -664,19 +664,20 @@ void CGamDoc::IndicateTextTipOnBoard(const CPlayBoard& pPBoard,
// Shows a balloon tip so person knows what happened.
void CGamDoc::IndicateTextTipOnBoard(const CPlayBoard& pPBoard,
- CPoint pointWorkspace, const CB::string& pszStr)
+ CPoint pointWorkspaceMfc, const CB::string& pszStr)
{
+ wxPoint pointWorkspace = CB::Convert(pointWorkspaceMfc);
if (IsQuietPlayback()) return;
- CPlayBoardView* pView = (CPlayBoardView*)FindPBoardView(pPBoard);
+ CPlayBoardView* pView = FindPBoardView(pPBoard);
ASSERT(pView != NULL);
- pView->WorkspaceToClient(pointWorkspace);
- pView->SetNotificationTip(pointWorkspace, &pszStr);
+ pointWorkspace = pView->WorkspaceToClient(pointWorkspace);
+ pView->SetNotificationTip(pointWorkspace, pszStr);
}
void CGamDoc::FlushAllSelections()
{
- m_palTrayA.DeselectAll();
- m_palTrayB.DeselectAll();
+ (*m_palTrayA)->DeselectAll();
+ (*m_palTrayB)->DeselectAll();
// Use hint to flush select lists.
CGamDocHint hint;
@@ -687,8 +688,8 @@ void CGamDoc::FlushAllSelections()
void CGamDoc::FlushAllIndicators()
{
- m_palTrayA.DeselectAll();
- m_palTrayB.DeselectAll();
+ (*m_palTrayA)->DeselectAll();
+ (*m_palTrayB)->DeselectAll();
for (size_t i = 0; i < m_pPBMgr->GetNumPBoards(); i++)
{
diff --git a/GP/GamDoc5.cpp b/GP/GamDoc5.cpp
index a18bd17d..c7bb8a97 100644
--- a/GP/GamDoc5.cpp
+++ b/GP/GamDoc5.cpp
@@ -1,6 +1,6 @@
// GamDoc5.cpp : just plain miscellaneous stuff
//
-// Copyright (c) 1994-2025 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -198,8 +198,7 @@ GameElement CGamDoc::GetVerifiedGameElementCodeForObject(const CDrawObj& pDObj,
return elem;
}
-void CGamDoc::GetTipTextForObject(const CDrawObj& pDObj, CB::string &strTip,
- CB::string* pStrTitle /* = NULL */) const
+void CGamDoc::GetTipTextForObject(const CDrawObj& pDObj, CB::string &strTip) const
{
if (pDObj.GetType() == CDrawObj::drawPieceObj)
{
@@ -235,7 +234,7 @@ void CGamDoc::DoEditPieceText(PieceID pid)
{
GameElement elemDown = MakePieceElement(pid, value_preserving_cast(i));
CB::string strDown = GetGameElementString(elemDown);
- if (strDown != dlg.m_strText)
+ if (strDown.empty() || strDown != dlg.m_strText)
{
dlg.m_bSetAllSides = FALSE;
break;
@@ -273,7 +272,7 @@ void CGamDoc::DoEditObjectText(const CDrawObj& pDObj)
CEditElementTextDialog dlg;
CB::string strTip;
- GetTipTextForObject(pDObj, strTip, NULL);
+ GetTipTextForObject(pDObj, strTip);
dlg.m_strText = strTip;
@@ -322,18 +321,17 @@ void CGamDoc::EventShowBoardNotification(BoardID nBrdSerNum, CPoint pntTipLoc, c
if (pntTipLoc.x == -1 || pntTipLoc.y == -1)
{
EnsureBoardVisible(*pPBoard);
- pView = (CPlayBoardView*)FindPBoardView(*pPBoard);
- CRect rct;
- pView->GetClientRect(rct);
+ pView = FindPBoardView(*pPBoard);
+ CRect rct = CB::Convert(pView->GetClientRect());
pntTipLoc = rct.CenterPoint();
}
else
{
EnsureBoardLocationVisible(*pPBoard, pntTipLoc);
- pView = (CPlayBoardView*)FindPBoardView(*pPBoard);
- pView->WorkspaceToClient(pntTipLoc);
+ pView = FindPBoardView(*pPBoard);
+ pntTipLoc = CB::Convert(pView->WorkspaceToClient(CB::Convert(pntTipLoc)));
}
- pView->SetNotificationTip(pntTipLoc, &strMsg);
+ pView->SetNotificationTip(CB::Convert(pntTipLoc), strMsg);
}
////////////////////////////////////////////////////////////////////////////
@@ -366,7 +364,7 @@ void CGamDoc::MsgSetMessageText(const CB::string& str)
else
m_strCurMsg = str;
- GetMainFrame()->GetMessageWindow()->SetText(this);
+ GetMainFrame()->GetMessageWindow().SetText(this);
if (!IsQuietPlayback() && !m_bMsgWinVisible)
m_bMsgWinVisible = TRUE;
}
diff --git a/GP/Gp.cpp b/GP/Gp.cpp
index eab940e2..11a1c469 100644
--- a/GP/Gp.cpp
+++ b/GP/Gp.cpp
@@ -1,6 +1,6 @@
// Gp.cpp : Defines the class behaviors for the application.
//
-// Copyright (c) 1994-2025 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -48,8 +48,12 @@ static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif
+wxDEFINE_EVENT(WM_ROTATEPIECE_DELTA_WX, RotatePieceDeltaEvent);
+wxDEFINE_EVENT(WM_CENTERBOARDONPOINT_WX, CenterBoardOnPointEvent);
wxDEFINE_EVENT(WM_SHOWPLAYINGBOARD_WX, ShowPlayingBoardEvent);
wxDEFINE_EVENT(WM_WINSTATE_RESTORE_WX, WinStateRestoreEvent);
+wxDEFINE_EVENT(WM_SELECT_BOARD_OBJLIST_WX, SelectBoardObjListEvent);
+wxDEFINE_EVENT(WM_PALETTE_HIDE_WX, wxCommandEvent);
/////////////////////////////////////////////////////////////////////////////
// Registry keys...
@@ -177,6 +181,42 @@ namespace {
return true;
}
+
+ protected:
+ /* for safety, and to approximate MFC,
+ disable MFC toolbar/menu commands that aren't
+ explicitly enabled */
+ bool TryAfter(wxEvent& event) override
+ {
+ if (wxAppWithMFC::TryAfter(event))
+ {
+ return true;
+ }
+
+ /* for safety, and to approximate MFC,
+ disable toolbar/menu commands that aren't
+ explicitly enabled */
+ if (event.GetEventType() == wxEVT_UPDATE_UI)
+ {
+ wxUpdateUIEvent& pCmdUI = static_cast(event);
+ wxString xrcid = wxXmlResource::FindXRCIDById(pCmdUI.GetId());
+ // !event.obj suggests MFC
+ /* if xrcid is empty, then id is something
+ wx-internal (e.g., wxAUI_BUTTON_WINDOWLIST),
+ so don't interfere with it */
+ if (!event.GetEventObject() && !xrcid.empty())
+ {
+ if (pCmdUI.IsCheckable())
+ {
+ pCmdUI.Check(false);
+ }
+ pCmdUI.Enable(false);
+ return true;
+ }
+ }
+
+ return false;
+ }
};
}
wxDECLARE_APP(wxCGpApp);
@@ -265,7 +305,7 @@ BOOL CGpApp::InitInstance()
IDR_GP_BOARDVIEW,
RUNTIME_CLASS(CGamDoc),
RUNTIME_CLASS(CPlayBoardFrame),
- RUNTIME_CLASS(CPlayBoardView));
+ RUNTIME_CLASS(CPlayBoardViewContainer));
EnableLoadWindowPlacement(FALSE);
diff --git a/GP/Gp.h b/GP/Gp.h
index 7f07452e..f9d01ec0 100644
--- a/GP/Gp.h
+++ b/GP/Gp.h
@@ -1,6 +1,6 @@
// Gp.h : main header file for the GP application
//
-// Copyright (c) 1994-2020 By Dale L. Larson, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -22,6 +22,9 @@
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
+#if !defined(GP_H_)
+#define GP_H_
+
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif
@@ -33,6 +36,9 @@
#include "versions.h"
#include "FrmMain.h"
+class CPlayBoard;
+class CDrawObj;
+
/////////////////////////////////////////////////////////////////////////////
#define IDW_TOOLBAR_MAIN AFX_IDW_TOOLBAR
@@ -47,7 +53,52 @@
/////////////////////////////////////////////////////////////////////////////
#define WM_ROTATEPIECE_DELTA (WM_USER + 210) // WPARAM = (int)relative rotation delta
+class RotatePieceDeltaEvent : public wxEvent
+{
+public:
+ RotatePieceDeltaEvent(int delta);
+
+ int GetDelta() const { return delta; }
+
+ wxEvent* Clone() const override { return new RotatePieceDeltaEvent(*this); }
+
+private:
+ const int delta;
+};
+wxDECLARE_EVENT(WM_ROTATEPIECE_DELTA_WX, RotatePieceDeltaEvent);
+inline RotatePieceDeltaEvent::RotatePieceDeltaEvent(int d) :
+ wxEvent(wxID_ANY, WM_ROTATEPIECE_DELTA_WX),
+ delta(d)
+{
+}
+typedef void (wxEvtHandler::* RotatePieceDeltaEventFunction)(RotatePieceDeltaEvent&);
+#define RotatePieceDeltaEventHandler(func) wxEVENT_HANDLER_CAST(RotatePieceDeltaEventFunction, func)
+#define EVT_ROTATEPIECE_DELTA(func) \
+ wx__DECLARE_EVT0(WM_ROTATEPIECE_DELTA_WX, RotatePieceDeltaEventHandler(func))
+
#define WM_CENTERBOARDONPOINT (WM_USER + 211) // WPARAM = POINT* in board coords
+class CenterBoardOnPointEvent : public wxEvent
+{
+public:
+ CenterBoardOnPointEvent(const wxPoint& point);
+
+ const wxPoint& GetPoint() const { return point; }
+
+ wxEvent* Clone() const override { return new CenterBoardOnPointEvent(*this); }
+
+private:
+ const wxPoint point;
+};
+wxDECLARE_EVENT(WM_CENTERBOARDONPOINT_WX, CenterBoardOnPointEvent);
+inline CenterBoardOnPointEvent::CenterBoardOnPointEvent(const wxPoint& p) :
+ wxEvent(wxID_ANY, WM_CENTERBOARDONPOINT_WX),
+ point(p)
+{
+}
+typedef void (wxEvtHandler::* CenterBoardOnPointEventFunction)(CenterBoardOnPointEvent&);
+#define CenterBoardOnPointEventHandler(func) wxEVENT_HANDLER_CAST(CenterBoardOnPointEventFunction, func)
+#define EVT_CENTERBOARDONPOINT(func) \
+ wx__DECLARE_EVT0(WM_CENTERBOARDONPOINT_WX, CenterBoardOnPointEventHandler(func))
#define WM_SHOWPLAYINGBOARD (WM_USER + 212) // WPARAM = size_t Playing Board Index
class ShowPlayingBoardEvent : public wxEvent
@@ -92,6 +143,36 @@ typedef void (wxEvtHandler::* WinStateRestoreEventFunction)(WinStateRestoreEvent
wx__DECLARE_EVT0(WM_WINSTATE_RESTORE_WX, WinStateRestoreEventHandler(func))
#define WM_SELECT_BOARD_OBJLIST (WM_USER + 214) // WPARAM = CPlayBoard*, LPARAM = const std::vector>*
+class SelectBoardObjListEvent : public wxEvent
+{
+public:
+ SelectBoardObjListEvent(const CPlayBoard& b,
+ const std::vector>& l);
+
+ const CPlayBoard& GetBoard() const { return board; }
+ const std::vector>& GetObjList() const
+ {
+ return objList;
+ }
+
+ wxEvent* Clone() const override { return new SelectBoardObjListEvent(*this); }
+
+private:
+ const CPlayBoard& board;
+ const std::vector>& objList;
+};
+wxDECLARE_EVENT(WM_SELECT_BOARD_OBJLIST_WX, SelectBoardObjListEvent);
+inline SelectBoardObjListEvent::SelectBoardObjListEvent(const CPlayBoard& b,
+ const std::vector>& l) :
+ wxEvent(wxID_ANY, WM_SELECT_BOARD_OBJLIST_WX),
+ board(b),
+ objList(l)
+{
+}
+typedef void (wxEvtHandler::* SelectBoardObjListEventFunction)(SelectBoardObjListEvent&);
+#define SelectBoardObjListEventHandler(func) wxEVENT_HANDLER_CAST(SelectBoardObjListEventFunction, func)
+#define EVT_SELECT_BOARD_OBJLIST(func) \
+ wx__DECLARE_EVT0(WM_SELECT_BOARD_OBJLIST_WX, SelectBoardObjListEventHandler(func))
#define WM_MESSAGEBOX (WM_USER + 215) // WPARAM = Opts. LPARAM = Msg ID or Ptr
enum
@@ -103,6 +184,7 @@ enum
};
#define WM_PALETTE_HIDE (WM_USER + 216)
+wxDECLARE_EVENT(WM_PALETTE_HIDE_WX, wxCommandEvent);
/////////////////////////////////////////////////////////////////////////////
// Context menu offset definitions.
@@ -180,3 +262,4 @@ inline CMainFrame* GetMainFrame() { return (CMainFrame*)(GetApp()->m_pMainWnd);
/////////////////////////////////////////////////////////////////////////////
+#endif
diff --git a/GP/LBoxSlct.cpp b/GP/LBoxSlct.cpp
index d03e283d..60e145cd 100644
--- a/GP/LBoxSlct.cpp
+++ b/GP/LBoxSlct.cpp
@@ -1,6 +1,6 @@
// LBoxSlct.cpp
//
-// Copyright (c) 1994-2025 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -44,35 +44,36 @@ const int tileGap = 6;
/////////////////////////////////////////////////////////////////////////////
-BEGIN_MESSAGE_MAP(CSelectListBox, CTileBaseListBox2)
- //{{AFX_MSG_MAP(CSelectListBox)
- ON_REGISTERED_MESSAGE(WM_DRAGDROP, OnDragItem)
- ON_WM_CONTEXTMENU()
- ON_WM_INITMENUPOPUP()
- ON_COMMAND_EX(ID_ACT_TURNOVER, OnActTurnOver)
- ON_COMMAND_EX(ID_ACT_TURNOVER_PREV, OnActTurnOver)
- ON_COMMAND_EX(ID_ACT_TURNOVER_RANDOM, OnActTurnOver)
- ON_COMMAND_EX(ID_ACT_TURNOVER_SELECT, OnActTurnOver)
- ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER, OnUpdateActTurnOver)
- ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER_PREV, OnUpdateActTurnOver)
- ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER_RANDOM, OnUpdateActTurnOver)
- ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER_SELECT, OnUpdateActTurnOver)
- //}}AFX_MSG_MAP
-END_MESSAGE_MAP()
+wxIMPLEMENT_DYNAMIC_CLASS(CSelectListBox, CTileBaseListBox2);
+
+wxBEGIN_EVENT_TABLE(CSelectListBox, CTileBaseListBox2)
+ EVT_DRAGDROP(OnDragItem)
+ EVT_CONTEXT_MENU(OnContextMenu)
+ EVT_MENU_OPEN(OnInitMenuPopup)
+ EVT_MENU(XRCID("ID_ACT_TURNOVER"), OnActTurnOver)
+ EVT_MENU(XRCID("ID_ACT_TURNOVER_PREV"), OnActTurnOver)
+ EVT_MENU(XRCID("ID_ACT_TURNOVER_RANDOM"), OnActTurnOver)
+ EVT_MENU(XRCID("ID_ACT_TURNOVER_SELECT"), OnActTurnOver)
+ EVT_UPDATE_UI(XRCID("ID_ACT_TURNOVER"), OnUpdateActTurnOver)
+ EVT_UPDATE_UI(XRCID("ID_ACT_TURNOVER_PREV"), OnUpdateActTurnOver)
+ EVT_UPDATE_UI(XRCID("ID_ACT_TURNOVER_RANDOM"), OnUpdateActTurnOver)
+ EVT_UPDATE_UI(XRCID("ID_ACT_TURNOVER_SELECT"), OnUpdateActTurnOver)
+wxEND_EVENT_TABLE()
/////////////////////////////////////////////////////////////////////////////
const CTileManager& CSelectListBox::GetTileManager() const
{
- ASSERT(m_pDoc != NULL);
+ wxASSERT(m_pDoc != NULL);
return m_pDoc->GetTileManager();
}
/////////////////////////////////////////////////////////////////////////////
-BOOL CSelectListBox::OnDragSetup(DragInfo& pDI) const
+BOOL CSelectListBox::OnDragSetup(DragInfoWx& pDI) const
{
- ASSERT(!"untested code");
+ wxASSERT(!"untested code");
+#if 0
if (GetCount() <= 1)
{
pDI.SetDragType(DRAG_INVALID);
@@ -81,7 +82,7 @@ BOOL CSelectListBox::OnDragSetup(DragInfo& pDI) const
if (!IsMultiSelect())
{
- ASSERT(!"unreachable code");
+ wxASSERT(!"unreachable code");
/* if this ever happens, rewrite like LBoxGrfx w/
list/single distinction
m_multiSelList.clear();
@@ -91,24 +92,27 @@ BOOL CSelectListBox::OnDragSetup(DragInfo& pDI) const
pDI.SetDragType(DRAG_SELECTVIEW);
pDI.GetSubInfo().m_ptrArray = &GetMappedMultiSelectList();
pDI.m_hcsrSuggest = g_res.hcrDragTile;
- pDI.GetSubInfo().m_gamDoc = m_pDoc;
+ pDI.GetSubInfo().m_gamDoc = &*m_pDoc;
+#endif
return TRUE;
}
-LRESULT CSelectListBox::OnDragItem(WPARAM wParam, LPARAM lParam)
+void CSelectListBox::OnDragItem(DragDropEvent& event)
{
- if (wParam != GetProcessId(GetCurrentProcess()))
+ if (event.GetProcessId() != wxGetProcessId())
{
- return -1;
+ wxASSERT(!"bad event process");
+ return;
}
- const DragInfo& pdi = CheckedDeref(reinterpret_cast(lParam));
+ const DragInfoWx& pdi = event.GetDragInfo();
DoInsertLineProcessing(pdi);
if (pdi.GetDragType() != DRAG_SELECTVIEW)
- return -1; // Only our drops allowed
+ return; // Only our drops allowed
ASSERT(!"untested code");
+#if 0
if (pdi.GetSubInfo().m_gamDoc != m_pDoc)
return -1; // Only pieces from our document.
@@ -129,40 +133,44 @@ LRESULT CSelectListBox::OnDragItem(WPARAM wParam, LPARAM lParam)
}
}
return 1;
+#endif
}
-void CSelectListBox::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
+void CSelectListBox::OnContextMenu(wxContextMenuEvent& event)
{
+ const wxPoint& point = event.GetPosition();
// remember clicked side in case of ID_ACT_TURNOVER_SELECT
- CPoint clientPoint(point);
- ScreenToClient(&clientPoint);
- CRect rect;
+ wxPoint clientPoint(point);
+ clientPoint = ScreenToClient(clientPoint);
+ wxRect rect;
menuGameElement = OnGetHitItemCodeAtPoint(&CGamDoc::GetGameElementCodeForObject, clientPoint, rect);
- CMenu bar;
- if (bar.LoadMenuW(IDR_MENU_PLAYER_POPUPS))
+ std::unique_ptr bar(wxXmlResource::Get()->LoadMenuBar("IDR_MENU_PLAYER_POPUPS"));
+ if (bar)
{
- CMenu& popup = *bar.GetSubMenu(MENU_PV_SELCT_BOX);
- ASSERT(popup.m_hMenu != NULL);
+ int index = bar->FindMenu("8=PV_SELCT_BOX");
+ wxASSERT(index != wxNOT_FOUND);
+ std::unique_ptr popup(bar->Remove(value_preserving_cast(index)));
// Make sure we clean up even if exception is tossed.
- TRY
+ try
{
- popup.TrackPopupMenu(TPM_LEFTBUTTON |
- TPM_LEFTALIGN |
- TPM_RIGHTBUTTON,
- point.x, point.y, this); // Route commands through tray window
+ PopupMenu(&*popup, clientPoint);
+ }
+ catch (...)
+ {
+ wxASSERT(!"exception");
}
- END_TRY
}
else
{
- ASSERT(!"LoadMenu error");
+ wxASSERT(!"LoadMenuBar error");
}
}
-void CSelectListBox::OnInitMenuPopup(CMenu* pMenu, UINT /*nIndex*/, BOOL bSysMenu)
+void CSelectListBox::OnInitMenuPopup(wxMenuEvent& event)
{
+#if 0
// based on CFrameWnd::OnInitMenuPopup()
ASSERT(!bSysMenu);
@@ -215,77 +223,82 @@ void CSelectListBox::OnInitMenuPopup(CMenu* pMenu, UINT /*nIndex*/, BOOL bSysMen
}
state.m_nIndexMax = nCount;
}
+#else
+ event.Skip();
+#endif
}
-BOOL CSelectListBox::OnActTurnOver(UINT id)
+void CSelectListBox::OnActTurnOver(wxCommandEvent& event)
{
+ int id = event.GetId();
CPlayBoardView& view = GetBoardView();
- switch (id)
+ if (id == XRCID("ID_ACT_TURNOVER") ||
+ id == XRCID("ID_ACT_TURNOVER_PREV") ||
+ id == XRCID("ID_ACT_TURNOVER_RANDOM"))
{
- case ID_ACT_TURNOVER:
- case ID_ACT_TURNOVER_PREV:
- case ID_ACT_TURNOVER_RANDOM:
- {
- bool b = view.OnCmdMsg(id, CN_COMMAND, nullptr, nullptr);
- ASSERT(b);
- return b;
- }
- case ID_ACT_TURNOVER_SELECT:
- {
- const CPlayBoard& playBoard = CheckedDeref(view.GetPlayBoard());
+ CB_VERIFY(CB::RelayProcessEvent(view, event));
+ return;
+ }
+ else if (id == XRCID("ID_ACT_TURNOVER_SELECT"))
+ {
+ const CPlayBoard& playBoard = view.GetPlayBoard();
- m_pDoc->AssignNewMoveGroup();
+ m_pDoc->AssignNewMoveGroup();
- PieceID pid = static_cast(menuGameElement);
- auto it = std::find_if(GetItemMap()->begin(),
- GetItemMap()->end(),
- [pid](CB::not_null drawObj)
+ PieceID pid = static_cast(menuGameElement);
+ auto it = std::find_if(GetItemMap()->begin(),
+ GetItemMap()->end(),
+ [pid](const RefPtr& drawObj)
+ {
+ if (drawObj->GetType() != CDrawObj::drawPieceObj)
{
- if (drawObj->GetType() != CDrawObj::drawPieceObj)
- {
- return false;
- }
- CPieceObj& pieceObj = static_cast(*drawObj);
- return pieceObj.m_pid == pid;
- });
- ASSERT(it != GetItemMap()->end());
- CDrawObj& drawObj = **it;
- ASSERT(drawObj.GetType() == CDrawObj::drawPieceObj);
- CPieceObj& pieceObj = static_cast(drawObj);
- size_t side = menuGameElement.GetSide();
- m_pDoc->InvertPlayingPieceOnBoard(pieceObj, playBoard, CPieceTable::fSelect, side);
-
- return true;
- }
- default:
- AfxThrowInvalidArgException();
+ return false;
+ }
+ const CPieceObj& pieceObj = static_cast(*drawObj);
+ return pieceObj.m_pid == pid;
+ });
+ wxASSERT(it != GetItemMap()->end());
+ const CDrawObj& drawObj = **it;
+ wxASSERT(drawObj.GetType() == CDrawObj::drawPieceObj);
+ const CPieceObj& pieceObj = static_cast(drawObj);
+ size_t side = menuGameElement.GetSide();
+ m_pDoc->InvertPlayingPieceOnBoard(pieceObj, playBoard, CPieceTable::fSelect, side);
+
+ return;
+ }
+ else
+ {
+ AfxThrowInvalidArgException();
}
}
-void CSelectListBox::OnUpdateActTurnOver(CCmdUI* pCmdUI)
+void CSelectListBox::OnUpdateActTurnOver(wxUpdateUIEvent& pCmdUI)
{
- switch (pCmdUI->m_nID)
+ int id = pCmdUI.GetId();
+ if (id == XRCID("ID_ACT_TURNOVER") ||
+ id == XRCID("ID_ACT_TURNOVER_PREV") ||
+ id == XRCID("ID_ACT_TURNOVER_RANDOM"))
{
- case ID_ACT_TURNOVER:
- case ID_ACT_TURNOVER_PREV:
- case ID_ACT_TURNOVER_RANDOM:
- pCmdUI->DoUpdate(&GetBoardView(), TRUE);
- break;
- case ID_ACT_TURNOVER_SELECT:
+ CB_VERIFY(CB::RelayProcessEvent(GetBoardView(), pCmdUI));
+ return;
+ }
+ else if (id == XRCID("ID_ACT_TURNOVER_SELECT"))
+ {
+ bool enable = menuGameElement != Invalid_v &&
+ menuGameElement.IsAPiece();
+ pCmdUI.Enable(enable);
+#if 0
+ if (pCmdUI->m_pSubMenu != NULL)
{
- bool enable = menuGameElement != Invalid_v &&
- menuGameElement.IsAPiece();
- pCmdUI->Enable(enable);
- if (pCmdUI->m_pSubMenu != NULL)
- {
- // Need to handle menu that the submenu is connected to.
- pCmdUI->m_pMenu->EnableMenuItem(pCmdUI->m_nIndex,
- MF_BYPOSITION | (enable ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
- }
- break;
+ // Need to handle menu that the submenu is connected to.
+ pCmdUI->m_pMenu->EnableMenuItem(pCmdUI->m_nIndex,
+ MF_BYPOSITION | (enable ? MF_ENABLED : (MF_DISABLED | MF_GRAYED)));
}
- default:
- AfxThrowInvalidArgException();
+#endif
+ }
+ else
+ {
+ AfxThrowInvalidArgException();
}
}
@@ -297,42 +310,43 @@ BOOL CSelectListBox::OnIsToolTipsEnabled() const
return m_pDoc->IsShowingObjectTips();
}
-GameElement CSelectListBox::OnGetHitItemCodeAtPoint(CPoint point, CRect& rct) const
+GameElement CSelectListBox::OnGetHitItemCodeAtPoint(wxPoint point, wxRect& rct) const
{
return OnGetHitItemCodeAtPoint(&CGamDoc::GetVerifiedGameElementCodeForObject, point, rct);
}
-GameElement CSelectListBox::OnGetHitItemCodeAtPoint(GetGameElementCodeForObject_t func, CPoint point, CRect& rct) const
+GameElement CSelectListBox::OnGetHitItemCodeAtPoint(GetGameElementCodeForObject_t func, wxPoint point, wxRect& rct) const
{
point = ClientToItem(point);
- BOOL bOutsideClient;
- UINT nIndex = ItemFromPoint(point, bOutsideClient);
- if (nIndex >= 65535 || GetCount() <= 0)
+ int nIndex = VirtualHitTest(point.y);
+ if (nIndex == wxNOT_FOUND)
+ {
return Invalid_v;
+ }
- std::vector tids = GetTileIDs(nIndex);
- ASSERT(!tids.empty() && tids[size_t(0)] != nullTid);
+ std::vector tids = GetTileIDs(value_preserving_cast(nIndex));
+ wxASSERT(!tids.empty() && tids[size_t(0)] != nullTid);
- std::vector rcts = GetTileRectsForItem(value_preserving_cast(nIndex), tids);
+ std::vector rcts = GetTileRectsForItem(value_preserving_cast(nIndex), tids);
for (size_t i = size_t(0); i < rcts.size(); ++i)
{
- ASSERT(!rcts[i].IsRectEmpty());
- if (rcts[i].PtInRect(point))
+ wxASSERT(!rcts[i].IsEmpty());
+ if (rcts[i].Contains(point))
{
rct = ItemToClient(rcts[i]);
- const CDrawObj& pObj = MapIndexToItem(nIndex);
+ const CDrawObj& pObj = MapIndexToItem(value_preserving_cast(nIndex));
if (pObj.GetType() == CDrawObj::drawPieceObj)
{
const CPieceObj& pieceObj = static_cast(pObj);
- CPieceTable& pieceTbl = m_pDoc->GetPieceTable();
+ const CPieceTable& pieceTbl = m_pDoc->GetPieceTable();
uint8_t side = pieceTbl.GetSide(pieceObj.m_pid, i);
- return (m_pDoc->*func)(pieceObj, side);
+ return ((*m_pDoc).*func)(pieceObj, side);
}
else
{
- return (m_pDoc->*func)(pObj, Invalid_v);
+ return ((*m_pDoc).*func)(pObj, Invalid_v);
}
}
}
@@ -340,12 +354,14 @@ GameElement CSelectListBox::OnGetHitItemCodeAtPoint(GetGameElementCodeForObject_
return Invalid_v;
}
-void CSelectListBox::OnGetTipTextForItemCode(GameElement nItemCode,
- CB::string& strTip) const
+CB::string CSelectListBox::OnGetTipTextForItemCode(GameElement nItemCode) const
{
if (nItemCode == Invalid_v)
- return;
- strTip = m_pDoc->GetGameElementString(nItemCode);
+ {
+ wxASSERT(!"invalid gameelement");
+ return CB::string();
+ }
+ return m_pDoc->GetGameElementString(nItemCode);
}
/////////////////////////////////////////////////////////////////////////////
@@ -356,7 +372,7 @@ BOOL CSelectListBox::OnDoesItemHaveTipText(size_t nItem) const
if (pDObj.GetType() == CDrawObj::drawPieceObj)
{
const CPieceObj& pObj = static_cast(pDObj);
- CPieceTable& pieceTbl = m_pDoc->GetPieceTable();
+ const CPieceTable& pieceTbl = m_pDoc->GetPieceTable();
size_t sides = pieceTbl.GetSides(pObj.m_pid);
for (size_t i = size_t(0); i < sides; ++i)
{
@@ -395,26 +411,21 @@ CB::string CSelectListBox::OnGetItemDebugString(size_t nIndex) const
/////////////////////////////////////////////////////////////////////////////
-CSize CSelectListBox::OnItemSize(size_t nIndex) const
+wxSize CSelectListBox::GetItemSize(size_t nIndex) const
{
- ASSERT(m_pDoc != NULL);
+ wxASSERT(m_pDoc != NULL);
std::vector tids = GetTileIDs(nIndex);
- ASSERT(!tids.empty() && tids[size_t(0)] != nullTid);
+ wxASSERT(!tids.empty() && tids[size_t(0)] != nullTid);
return DoOnItemSize(nIndex, tids);
}
-void CSelectListBox::OnItemDraw(CDC& pDC, size_t nIndex, UINT nAction, UINT nState,
- CRect rctItem) const
+void CSelectListBox::OnDrawItem(wxDC& pDC, const wxRect& rctItem, size_t nIndex) const
{
- // see https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-drawitemstruct
- if (nIndex == size_t(UINT(-1)))
- return; // Nothing to draw.
-
std::vector tids = GetTileIDs(nIndex);
- ASSERT(!tids.empty() && tids[size_t(0)] != nullTid);
- DoOnDrawItem(pDC, nIndex, nAction, nState, rctItem, tids);
+ wxASSERT(!tids.empty() && tids[size_t(0)] != nullTid);
+ DoOnDrawItem(pDC, nIndex, rctItem, tids);
}
// retval[0] is active face, followed by inactives
@@ -424,7 +435,7 @@ std::vector CSelectListBox::GetTileIDs(size_t nIndex) const
if (pDObj.GetType() == CDrawObj::drawPieceObj)
{
- CPieceTable& pPTbl = m_pDoc->GetPieceTable();
+ const CPieceTable& pPTbl = m_pDoc->GetPieceTable();
PieceID pid = static_cast(pDObj).m_pid;
@@ -458,21 +469,24 @@ std::vector CSelectListBox::GetTileIDs(size_t nIndex) const
else if (pDObj.GetType() == CDrawObj::drawMarkObj)
{
MarkID mid = static_cast(pDObj).m_mid;
- CMarkManager& pMMgr = m_pDoc->GetMarkManager();
+ const CMarkManager& pMMgr = m_pDoc->GetMarkManager();
std::vector retval;
retval.push_back(pMMgr.GetMark(mid).m_tid);
return retval;
}
else
{
- ASSERT(FALSE); // Shouldn't happen
+ wxASSERT(FALSE); // Shouldn't happen
return std::vector();
}
}
const CPlayBoardView& CSelectListBox::GetBoardView() const
{
- CFrameWnd& frame = CheckedDeref(AFXGetParentFrame(this));
+ wxWindow& view = CheckedDeref(GetParent());
+ wxWindow& container = CheckedDeref(view.GetParent());
+ CWnd& cwndContainer = CheckedDeref(CB::ToCWnd(container));
+ CFrameWnd& frame = CheckedDeref(AFXGetParentFrame(&cwndContainer));
const CPlayBoardFrame& pbrdFrame = CheckedDeref(DYNAMIC_DOWNCAST(CPlayBoardFrame, &frame));
return pbrdFrame.GetActiveBoardView();
}
diff --git a/GP/LBoxSlct.h b/GP/LBoxSlct.h
index 07ce9876..8c3fb409 100644
--- a/GP/LBoxSlct.h
+++ b/GP/LBoxSlct.h
@@ -1,6 +1,6 @@
// LBoxSlct.h
//
-// Copyright (c) 1994-2020 By Dale L. Larson, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -58,11 +58,11 @@ class CSelectListBox : public CTileBaseListBox2
// Operations
public:
- void SetDocument(CGamDoc* pDoc) { CTileBaseListBox2::SetDocument(CheckedDeref(pDoc)); m_pDoc = pDoc; }
+ void SetDocument(CGamDoc& pDoc) { CTileBaseListBox2::SetDocument(pDoc); m_pDoc = &pDoc; }
// Implementation
protected:
- CGamDoc* m_pDoc;
+ CB::propagate_const m_pDoc;
GameElement menuGameElement = Invalid_v;
@@ -71,31 +71,28 @@ class CSelectListBox : public CTileBaseListBox2
std::vector GetTileIDs(size_t nIndex) const;
// Overrides
- virtual CSize OnItemSize(size_t nIndex) const override;
- virtual void OnItemDraw(CDC& pDC, size_t nIndex, UINT nAction, UINT nState,
- CRect rctItem) const override;
- virtual BOOL OnDragSetup(DragInfo& pDI) const override;
+ wxSize GetItemSize(size_t nIndex) const override;
+ void OnDrawItem(wxDC& pDC, const wxRect& rctItem, size_t nIndex) const override;
+ virtual BOOL OnDragSetup(DragInfoWx& pDI) const override;
virtual CB::string OnGetItemDebugString(size_t nItem) const override;
// Tool tip processing
virtual BOOL OnIsToolTipsEnabled() const override;
- virtual GameElement OnGetHitItemCodeAtPoint(CPoint point, CRect& rct) const override;
+ virtual GameElement OnGetHitItemCodeAtPoint(wxPoint point, wxRect& rct) const override;
private:
typedef GameElement (CGamDoc::*GetGameElementCodeForObject_t)(const CDrawObj& pDObj, size_t nSide) const;
- GameElement OnGetHitItemCodeAtPoint(GetGameElementCodeForObject_t func, CPoint point, CRect& rct) const;
+ GameElement OnGetHitItemCodeAtPoint(GetGameElementCodeForObject_t func, wxPoint point, wxRect& rct) const;
public:
- virtual void OnGetTipTextForItemCode(GameElement nItemCode, CB::string& strTip) const override;
+ virtual CB::string OnGetTipTextForItemCode(GameElement nItemCode) const override;
virtual BOOL OnDoesItemHaveTipText(size_t nItem) const override;
- //{{AFX_MSG(CSelectListBox)
- afx_msg LRESULT OnDragItem(WPARAM wParam, LPARAM lParam);
- afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
- afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
- afx_msg BOOL OnActTurnOver(UINT id);
- afx_msg void OnUpdateActTurnOver(CCmdUI* pCmdUI);
- //}}AFX_MSG
- DECLARE_MESSAGE_MAP()
+ void OnDragItem(DragDropEvent& event);
+ void OnContextMenu(wxContextMenuEvent& event);
+ void OnInitMenuPopup(wxMenuEvent& event);
+ void OnActTurnOver(wxCommandEvent& event);
+ void OnUpdateActTurnOver(wxUpdateUIEvent& pCmdUI);
+ wxDECLARE_EVENT_TABLE();
private:
const CPlayBoardView& GetBoardView() const;
@@ -103,7 +100,8 @@ class CSelectListBox : public CTileBaseListBox2
{
return const_cast(std::as_const(*this).GetBoardView());
}
+
+ wxDECLARE_DYNAMIC_CLASS(CSelectListBox);
};
#endif
-
diff --git a/GP/LBoxTray.cpp b/GP/LBoxTray.cpp
index 9ba9c8bb..0d6b2b2c 100644
--- a/GP/LBoxTray.cpp
+++ b/GP/LBoxTray.cpp
@@ -1,6 +1,6 @@
// LBoxTray.cpp
//
-// Copyright (c) 1994-2025 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -364,7 +364,6 @@ CTrayListBoxWx::CTrayListBoxWx(CGamDoc& pDoc) :
CTrayListBoxWx()
{
Init(pDoc);
- CGrafixListBoxDataWx::SetDocument(pDoc);
}
/////////////////////////////////////////////////////////////////////////////
@@ -374,12 +373,10 @@ const CTileManager& CTrayListBoxWx::GetTileManager() const
return m_pDoc->GetTileManager();
}
-#if 0
-BOOL CTrayListBox::IsShowingTileImages() const
+BOOL CTrayListBoxWx::IsShowingTileImages() const
{
return m_eTrayViz == trayVizAllSides || m_eTrayViz == trayVizOneSide;
}
-#endif
void CTrayListBoxWx::SetTrayContentVisibility(TrayViz eTrayViz, CB::string pszHiddenString)
{
@@ -459,7 +456,6 @@ BOOL CTrayListBoxWx::OnDoesItemHaveTipText(size_t nItem) const
PieceID pid = MapIndexToItem(nItem);
if (m_eTrayViz != trayVizAllSides)
{
- wxASSERT(!"untested code");
uint8_t side = m_pDoc->GetPieceTable().GetSide(pid);
return m_pDoc->HasGameElementString(MakePieceElement(pid, side));
}
@@ -470,7 +466,6 @@ BOOL CTrayListBoxWx::OnDoesItemHaveTipText(size_t nItem) const
{
if (m_pDoc->HasGameElementString(MakePieceElement(pid, i)))
{
- wxASSERT(!"untested code");
return true;
}
}
@@ -480,50 +475,46 @@ BOOL CTrayListBoxWx::OnDoesItemHaveTipText(size_t nItem) const
/////////////////////////////////////////////////////////////////////////////
-#if 0
-void CTrayListBox::DeselectAll()
+void CTrayListBoxWx::DeselectAll()
{
- ASSERT(IsMultiSelect());
- if (GetCount() < 1)
+ wxASSERT(IsMultiSelect());
+ if (GetItemCount() < 1)
return;
- SelItemRange(FALSE, 0, GetCount()-1);
+ BASE::DeselectAll();
}
-size_t CTrayListBox::SelectTrayPiece(PieceID pid)
+size_t CTrayListBoxWx::SelectTrayPiece(PieceID pid)
{
size_t nIndex = MapItemToIndex(pid);
if (nIndex != Invalid_v)
{
- ShowListIndex(value_preserving_cast(nIndex));
- SetSel(value_preserving_cast(nIndex), TRUE);
+ ShowListIndex(nIndex);
+ Select(nIndex, TRUE);
}
else
{
- if (GetCount() > 0)
- SetSel(0, TRUE);
+ if (GetItemCount() > 0)
+ Select(0, TRUE);
}
return nIndex;
}
/////////////////////////////////////////////////////////////////////////////
-void CTrayListBox::ShowListIndex(int nPos)
+void CTrayListBoxWx::ShowListIndex(size_t nPos)
{
- if (nPos < GetTopIndex())
+ if (nPos < this->GetVisibleRowsBegin())
{
- SetTopIndex(nPos);
+ ScrollToRow(nPos);
return;
}
- CRect rct;
- GetItemRect(nPos, &rct);
- CRect rctClient;
- GetClientRect(&rctClient);
- if (rct.IntersectRect(&rct, &rctClient))
+ wxRect rct = GetItemRect(nPos);
+ wxRect rctClient = GetClientRect();
+ if (rct.Intersects(rctClient))
return;
- SetTopIndex(nPos);
+ ScrollToRow(nPos);
}
-#endif
/////////////////////////////////////////////////////////////////////////////
@@ -557,26 +548,11 @@ void CTrayListBoxWx::OnDrawItem(wxDC& pDC, const wxRect& rctItem, size_t nIndex)
else
{
// Hidden pieces. Draw the supplied text.
-#if 0
- pDC.SetTextAlign(TA_TOP | TA_LEFT);
- CBrush brBack(GetSysColor(nState & ODS_SELECTED ?
- COLOR_HIGHLIGHT : COLOR_WINDOW));
- pDC.FillRect(&rctItem, &brBack); // Fill background color
- pDC.SetBkMode(TRANSPARENT);
- CFont* pPrvFont = pDC.SelectObject(CFont::FromHandle(g_res.h8ss));
- pDC.SetTextColor(GetSysColor(nState & ODS_SELECTED ?
- COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT));
- pDC.TextOut(rctItem.left, rctItem.top, m_strHiddenString);
- pDC.SelectObject(pPrvFont);
-#else
- wxASSERT(!"needs testing");
- // TODO: is bkg automatic?
pDC.SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT);
pDC.SetFont(g_res.h8ssWx);
pDC.SetTextForeground(wxSystemSettings::GetColour(IsSelected(nIndex) ?
wxSYS_COLOUR_HIGHLIGHTTEXT : wxSYS_COLOUR_WINDOWTEXT));
pDC.DrawLabel(m_strHiddenString, rctItem, wxALIGN_TOP | wxALIGN_LEFT);
-#endif
#if 0
if (nAction & ODA_FOCUS)
pDC.DrawFocusRect(&rctItem);
@@ -619,7 +595,6 @@ std::vector CTrayListBoxWx::GetPieceTileIDs(size_t nIndex) const
BOOL CTrayListBoxWx::OnDragSetup(DragInfoWx& pDI) const
{
- wxASSERT(!"needs testing");
if (m_pDoc->IsPlaying())
{
pDI.SetDragType(DRAG_INVALID);
@@ -636,7 +611,7 @@ BOOL CTrayListBoxWx::OnDragSetup(DragInfoWx& pDI) const
}
else
{
- ASSERT(!"untested code");
+ wxASSERT(!"untested code");
pDI.SetDragType(DRAG_PIECE);
pDI.GetSubInfo().m_pieceID = GetCurMapItem();
pDI.GetSubInfo().m_size = GetDragSize();
diff --git a/GP/LBoxTray.h b/GP/LBoxTray.h
index 245cde16..2006e5b9 100644
--- a/GP/LBoxTray.h
+++ b/GP/LBoxTray.h
@@ -1,6 +1,6 @@
// LBoxTray.cpp
//
-// Copyright (c) 1994-2025 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -112,7 +112,12 @@ class CTrayListBoxWx : public CGrafixListBoxDataWx
public:
CTrayListBoxWx();
CTrayListBoxWx(CGamDoc& pDoc);
- void Init(const CGamDoc& pDoc) { wxASSERT(!m_pDoc); m_pDoc = &pDoc; }
+ void Init(CGamDoc& pDoc)
+ {
+ wxASSERT(!m_pDoc);
+ BASE::SetDocument(pDoc);
+ m_pDoc = &pDoc;
+ }
// Attributes
public:
@@ -126,7 +131,7 @@ class CTrayListBoxWx : public CGrafixListBoxDataWx
public:
void DeselectAll();
size_t SelectTrayPiece(PieceID pid);
- void ShowListIndex(int nPos);
+ void ShowListIndex(size_t nPos);
void SetTrayContentVisibility(TrayViz eTrayViz, CB::string pszHiddenString = CB::string());
void SetTipsAllowed(BOOL bTipsAllowed)
@@ -164,6 +169,8 @@ class CTrayListBoxWx : public CGrafixListBoxDataWx
wxDECLARE_DYNAMIC_CLASS(CTrayListBoxWx);
private:
+ typedef CGrafixListBoxDataWx BASE;
+
bool IsShowAllSides(PieceID pid) const;
};
diff --git a/GP/MoveMgr.cpp b/GP/MoveMgr.cpp
index 8039f240..278d2102 100644
--- a/GP/MoveMgr.cpp
+++ b/GP/MoveMgr.cpp
@@ -1025,7 +1025,7 @@ void CObjectDelete::DoMove(CGamDoc& pDoc, int nMoveWithinGroup) const
if (pPBoard != NULL)
{
- std::vector> list;
+ std::vector> list;
list.push_back(pObj);
pDoc.DeleteObjectsInTable(list);
}
diff --git a/GP/PBoard.cpp b/GP/PBoard.cpp
index 6ef2f59f..0f52389e 100644
--- a/GP/PBoard.cpp
+++ b/GP/PBoard.cpp
@@ -1,6 +1,6 @@
// PBoard.cpp
//
-// Copyright (c) 1994-2025 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -141,6 +141,20 @@ void CPlayBoard::Draw(CDC& pDC, const CRect& pDrawRct, TileScale eScale)
m_pIndList->Draw(pDC, pDrawRct, eScale);
}
+void CPlayBoard::Draw(wxDC& pDC, const wxRect& pDrawRct, TileScale eScale)
+{
+ wxASSERT(m_pBoard);
+ wxASSERT(m_pPceList);
+
+ if (m_bIVisible && !m_bIndOnTop)
+ m_pIndList->Draw(pDC, pDrawRct, eScale);
+
+ m_pPceList->Draw(pDC, pDrawRct, eScale, TRUE, FALSE, !m_bPVisible, m_bLockedDrawnBeneath);
+
+ if (m_bIVisible && m_bIndOnTop)
+ m_pIndList->Draw(pDC, pDrawRct, eScale);
+}
+
//////////////////////////////////////////////////////////////////////
// Piece is centered on point.
diff --git a/GP/PBoard.h b/GP/PBoard.h
index 3cb7ad2c..a34d8f32 100644
--- a/GP/PBoard.h
+++ b/GP/PBoard.h
@@ -107,6 +107,7 @@ class CPlayBoard
// Operations
public:
void Draw(CDC& pDC, const CRect& pDrawRct, TileScale eScale);
+ void Draw(wxDC& pDC, const wxRect& pDrawRct, TileScale eScale);
// ------- //
CPieceObj& AddPiece(CPoint pnt, PieceID pid);
const CPieceObj* FindPieceID(PieceID pid) const;
diff --git a/GP/PalMark.cpp b/GP/PalMark.cpp
index 312f3d19..db4ffb14 100644
--- a/GP/PalMark.cpp
+++ b/GP/PalMark.cpp
@@ -1,6 +1,6 @@
// PalMark.cpp : implementation file
//
-// Copyright (c) 1994-2024 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -36,7 +36,9 @@
static char THIS_FILE[] = __FILE__;
#endif
-IMPLEMENT_DYNCREATE(CMarkerPalette, CMiniFrameWnd)
+#if 0
+wxIMPLEMENT_CLASS(CMarkerPalette, wxPanel)
+#endif
#ifdef _DEBUG
#define new DEBUG_NEW
@@ -44,53 +46,65 @@ IMPLEMENT_DYNCREATE(CMarkerPalette, CMiniFrameWnd)
/////////////////////////////////////////////////////////////////////////////
-BEGIN_MESSAGE_MAP(CMarkerPalette, CWnd)
- //{{AFX_MSG_MAP(CMarkerPalette)
+wxBEGIN_EVENT_TABLE(CMarkerPalette, wxPanel)
+#if 0
ON_WM_ERASEBKGND()
ON_WM_SIZE()
ON_WM_CREATE()
ON_WM_WINDOWPOSCHANGING()
- ON_CBN_SELCHANGE(IDC_W_MARKLIST, OnMarkerNameCbnSelchange)
- ON_MESSAGE(WM_OVERRIDE_SELECTED_ITEM, OnOverrideSelectedItem)
- ON_MESSAGE(WM_GET_DRAG_SIZE, OnGetDragSize)
+#endif
+ EVT_CHOICE(XRCID("m_comboMGrp"), OnMarkerNameCbnSelchange)
+ EVT_OVERRIDE_SELECTED_ITEM(OnOverrideSelectedItem)
+ EVT_GET_DRAG_SIZE(OnGetDragSize)
+#if 0
ON_WM_HELPINFO()
ON_WM_CREATE()
- //}}AFX_MSG_MAP
- ON_MESSAGE(WM_PALETTE_HIDE, OnPaletteHide)
- ON_MESSAGE(WM_WINSTATE_RESTORE, OnMessageRestoreWinState)
+#endif
+ EVT_COMMAND(wxID_ANY, WM_PALETTE_HIDE_WX, OnPaletteHide)
+ EVT_WINSTATE_RESTORE(OnMessageRestoreWinState)
+wxEND_EVENT_TABLE()
+
+BEGIN_MESSAGE_MAP(CMarkerPaletteContainer, CWnd)
+ ON_WM_CREATE()
+ ON_WM_SETFOCUS()
+ ON_WM_SIZE()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMarkerPalette
-CMarkerPalette::CMarkerPalette()
+CMarkerPalette::CMarkerPalette(CMarkerPaletteContainer& container, CGamDoc& pDoc) :
+ m_pContainer(&container),
+ m_pDoc(&pDoc),
+ m_comboMGrp(nullptr),
+ m_listMark(nullptr)
{
- m_pDoc = NULL;
-
- m_listMark.EnableDrag(TRUE);
m_dummyArray.push_back(MarkID(0));
m_bStateVarsArmed = FALSE;
m_nComboHeight = 0;
- m_pDockingFrame = NULL;
}
-BOOL CMarkerPalette::Create(CWnd* pOwnerWnd, DWORD dwStyle, UINT nID)
+BOOL CMarkerPalette::Create(/*CWnd& pOwnerWnd, DWORD dwStyle, UINT nID*/)
{
- dwStyle |= WS_CHILD | WS_VISIBLE;
- if (!CWnd::Create(AfxRegisterWndClass(0), NULL, dwStyle,
- CRect(0, 0, 200, 100), pOwnerWnd, nID))
+ if (!CB::XrcLoad(*this, *m_pContainer, "CMarkerPalette"))
{
- TRACE("Failed to create Tray palette window.\n");
- return FALSE;
+ return false;
}
+ m_comboMGrp = XRCCTRL(*this, "m_comboMGrp", wxChoice);
+ m_listMark = XRCCTRL(*this, "m_listMark", CMarkListBoxWx);
+ (*m_pContainer)->Layout();
+
+ m_listMark->EnableDrag(TRUE);
+ m_listMark->SetDocument(&*m_pDoc);
UpdatePaletteContents();
// Queue up a message to finish up state restore.
- PostMessage(WM_WINSTATE_RESTORE);
+ QueueEvent(WinStateRestoreEvent().Clone());
return TRUE;
}
+#if 0
int CMarkerPalette::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
CRect rctCombo;
@@ -128,96 +142,101 @@ int CMarkerPalette::OnCreate(LPCREATESTRUCT lpCreateStruct)
return 0;
}
+#endif
///////////////////////////////////////////////////////////////////////
// This method handles the custom message WM_WINSTATE_RESTORE. The
// message is posted during view initial update if the state of
// the windows should be restored.
-LRESULT CMarkerPalette::OnMessageRestoreWinState(WPARAM, LPARAM)
+void CMarkerPalette::OnMessageRestoreWinState(WinStateRestoreEvent& /*event*/)
{
UpdatePaletteContents();
if (!m_bStateVarsArmed)
- return (LRESULT)0;
+ return;
- m_comboMGrp.SetCurSel(m_nComboIndex);
+ m_comboMGrp->SetSelection(m_nComboIndex == uint32_t(wxNOT_FOUND) ?
+ wxNOT_FOUND
+ :
+ value_preserving_cast(m_nComboIndex));
UpdateMarkerList();
- m_listMark.SetCurSel(m_nListCurSel);
- m_listMark.SetTopIndex(m_nListTopindex);
+ m_listMark->SetSelection(m_nListCurSel == uint32_t(wxNOT_FOUND) ?
+ wxNOT_FOUND
+ :
+ value_preserving_cast(m_nListCurSel));
+ m_listMark->ScrollToRow(value_preserving_cast(m_nListTopindex));
m_bStateVarsArmed = FALSE;
-
- return (LRESULT)0;
}
/////////////////////////////////////////////////////////////////////////////
-LRESULT CMarkerPalette::OnPaletteHide(WPARAM, LPARAM)
+void CMarkerPalette::OnPaletteHide(wxCommandEvent& /*event*/)
{
GetMainFrame()->SendMessage(WM_COMMAND, ID_VIEW_MARKERPAL);
- return (LRESULT)0;
}
/////////////////////////////////////////////////////////////////////////////
-size_t CMarkerPalette::GetSelectedMarkerGroup()
+size_t CMarkerPalette::GetSelectedMarkerGroup() const
{
- int nSel = m_comboMGrp.GetCurSel();
- if (nSel < 0)
+ int nSel = m_comboMGrp->GetSelection();
+ if (nSel == wxNOT_FOUND)
return Invalid_v;
- return value_preserving_cast(m_comboMGrp.GetItemData(nSel));
+ return value_preserving_cast(reinterpret_cast(m_comboMGrp->GetClientData(value_preserving_cast(nSel))));
}
-int CMarkerPalette::FindMarkerGroupIndex(size_t nGroupNum)
+int CMarkerPalette::FindMarkerGroupIndex(size_t nGroupNum) const
{
- if (m_comboMGrp.GetCount() <= 0)
- return -1;
- for (int nIdx = 0; nIdx < m_comboMGrp.GetCount(); nIdx++)
+ if (m_comboMGrp->IsEmpty())
+ return wxNOT_FOUND;
+ for (size_t nIdx = size_t(0) ; nIdx < m_comboMGrp->GetCount() ; ++nIdx)
{
- if (value_preserving_cast(m_comboMGrp.GetItemData(nIdx)) == nGroupNum)
- return nIdx;
+ if (reinterpret_cast(m_comboMGrp->GetClientData(value_preserving_cast(nIdx))) == nGroupNum)
+ return value_preserving_cast(nIdx);
}
- return -1;
+ return wxNOT_FOUND;
}
/////////////////////////////////////////////////////////////////////////////
-LRESULT CMarkerPalette::OnOverrideSelectedItem(WPARAM wParam, LPARAM lParam)
+void CMarkerPalette::OnOverrideSelectedItem(OverrideSelectedItemEvent& event)
{
size_t nSel = GetSelectedMarkerGroup();
if (nSel == Invalid_v)
- return (LRESULT)0;
+ {
+ event.Skip();
+ return;
+ }
CMarkManager& pMMgr = m_pDoc->GetMarkManager();
CMarkSet& pMSet = pMMgr.GetMarkSet(nSel);
if (pMSet.IsRandomMarkerPull())
{
- COverrideInfo& oi = *reinterpret_cast*>(wParam);
- oi.CheckType();
+ OverrideSelectedItemEvent& oi = event;
uint32_t nRandSeed = m_pDoc->GetRandomNumberSeed();
int32_t nRandNum = CalcRandomNumberUsingSeed(0, value_preserving_cast(pMSet.GetMarkIDTable().size()),
nRandSeed, &nRandSeed);
- oi.m_markID = pMSet.GetMarkIDTable().at(value_preserving_cast(nRandNum));
+ oi.ID() = pMSet.GetMarkIDTable().at(value_preserving_cast(nRandNum));
m_pDoc->SetRandomNumberSeed(nRandSeed);
}
-
- return (LRESULT)1;
}
-LRESULT CMarkerPalette::OnGetDragSize(WPARAM wParam, LPARAM /*lParam*/)
+void CMarkerPalette::OnGetDragSize(GetDragSizeEvent& event)
{
size_t nSel = GetSelectedMarkerGroup();
if (nSel == Invalid_v)
{
- ASSERT(!"bad tray");
- return 0;
+ wxASSERT(!"bad tray");
+ event.Skip();
+ return;
}
CMarkManager& pMMgr = m_pDoc->GetMarkManager();
CMarkSet& pMSet = pMMgr.GetMarkSet(nSel);
@@ -225,31 +244,30 @@ LRESULT CMarkerPalette::OnGetDragSize(WPARAM wParam, LPARAM /*lParam*/)
std::vector items;
if (pMSet.IsRandomMarkerPull())
{
- items.reserve(value_preserving_cast(m_listMark.GetCount()));
- for (int i = 0; i < m_listMark.GetCount(); ++i)
+ items.reserve(m_listMark->GetItemCount());
+ for (size_t i = size_t(0) ; i < m_listMark->GetItemCount() ; ++i)
{
- items.push_back(i);
+ items.push_back(value_preserving_cast(i));
}
}
else
{
- items.push_back(m_listMark.GetCurSel());
+ items.push_back(m_listMark->GetSelection());
}
CTileManager& tileMgr = m_pDoc->GetTileManager();
- CSize retval(0, 0);
+ wxSize retval(0, 0);
for (int item : items)
{
- MarkID mid = m_listMark.MapIndexToItem(value_preserving_cast(item));
+ MarkID mid = m_listMark->MapIndexToItem(value_preserving_cast(item));
MarkDef& pMark = pMMgr.GetMark(mid);
- ASSERT(pMark.m_tid != nullTid);
- CSize size = tileMgr.GetTile(pMark.m_tid).GetSize();
- retval.cx = std::max(retval.cx, size.cx);
- retval.cy = std::max(retval.cy, size.cy);
+ wxASSERT(pMark.m_tid != nullTid);
+ wxSize size = CB::Convert(tileMgr.GetTile(pMark.m_tid).GetSize());
+ retval.x = std::max(retval.x, size.x);
+ retval.y = std::max(retval.y, size.y);
}
- CheckedDeref(reinterpret_cast(wParam)) = retval;
- return 1;
+ event.SetSize(retval);
}
/////////////////////////////////////////////////////////////////////////////
@@ -257,14 +275,14 @@ LRESULT CMarkerPalette::OnGetDragSize(WPARAM wParam, LPARAM /*lParam*/)
void CMarkerPalette::SelectMarker(MarkID mid)
{
size_t nGrp = m_pDoc->GetMarkManager().FindMarkInMarkSet(mid);
- ASSERT(nGrp != Invalid_v);
+ wxASSERT(nGrp != Invalid_v);
size_t nSel = GetSelectedMarkerGroup();
if (nSel != nGrp)
{
- m_comboMGrp.SetCurSel(FindMarkerGroupIndex(nGrp));
+ m_comboMGrp->SetSelection(FindMarkerGroupIndex(nGrp));
UpdateMarkerList();
}
- m_listMark.SelectMarker(mid);
+ m_listMark->SelectMarker(mid);
}
/////////////////////////////////////////////////////////////////////////////
@@ -273,26 +291,26 @@ void CMarkerPalette::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
- ar << (DWORD)m_comboMGrp.GetCurSel();
- ar << (DWORD)m_listMark.GetTopIndex();
- ar << (DWORD)m_listMark.GetCurSel();
+ ar << static_cast(value_preserving_cast(m_comboMGrp->GetSelection()));
+ ar << static_cast(value_preserving_cast(m_listMark->GetVisibleRowsBegin()));
+ ar << static_cast(value_preserving_cast(m_listMark->GetSelection()));
}
else
{
if (CGamDoc::GetLoadingVersion() >= NumVersion(2, 90)) // V2.90
{
- DWORD dwTmp;
- ar >> dwTmp; m_nComboIndex = (int)dwTmp;
- ar >> dwTmp; m_nListTopindex = (int)dwTmp;
- ar >> dwTmp; m_nListCurSel = (int)dwTmp;
+ uint32_t dwTmp;
+ ar >> dwTmp; m_nComboIndex = dwTmp;
+ ar >> dwTmp; m_nListTopindex = dwTmp;
+ ar >> dwTmp; m_nListCurSel = dwTmp;
m_bStateVarsArmed = TRUE; // Inform Create() data is good
}
else if (CGamDoc::GetLoadingVersion() >= NumVersion(2, 0)) // V2.0
{
- DWORD dwTmp;
- ar >> dwTmp; m_nComboIndex = (int)dwTmp;
- ar >> dwTmp; m_nListTopindex = (int)dwTmp;
- ar >> dwTmp; m_nListCurSel = (int)dwTmp;
+ uint32_t dwTmp;
+ ar >> dwTmp; m_nComboIndex = dwTmp;
+ ar >> dwTmp; m_nListTopindex = dwTmp;
+ ar >> dwTmp; m_nListCurSel = dwTmp;
CWinPlacement wndSink;
ar >> wndSink; // Eat this puppy
m_bStateVarsArmed = TRUE; // Inform Create() data is good
@@ -300,7 +318,7 @@ void CMarkerPalette::Serialize(CArchive& ar)
else // Pre V2.0 data
{
// Just eat the old data and go with the defaults
- short sTmp;
+ uint16_t sTmp;
ar >> sTmp;
ar >> sTmp;
ar >> sTmp;
@@ -311,27 +329,17 @@ void CMarkerPalette::Serialize(CArchive& ar)
/////////////////////////////////////////////////////////////////////////////
-void CMarkerPalette::SetDocument(CGamDoc *pDoc)
-{
- ASSERT(pDoc->IsKindOf(RUNTIME_CLASS(CGamDoc)));
- m_pDoc = pDoc;
- m_listMark.SetDocument(pDoc);
-}
-
-/////////////////////////////////////////////////////////////////////////////
-
void CMarkerPalette::LoadMarkerNameList()
{
- ASSERT(m_pDoc);
CMarkManager& pMMgr = m_pDoc->GetMarkManager();
- m_comboMGrp.ResetContent();
+ m_comboMGrp->Clear();
for (size_t i = size_t(0); i < pMMgr.GetNumMarkSets(); i++)
{
- int nIdx = m_comboMGrp.AddString(pMMgr.GetMarkSet(i).GetName());
- m_comboMGrp.SetItemData(nIdx, value_preserving_cast(i)); // Store the marker index in the data item
+ int nIdx = m_comboMGrp->Append(pMMgr.GetMarkSet(i).GetName());
+ m_comboMGrp->SetClientData(value_preserving_cast(nIdx), reinterpret_cast(value_preserving_cast(i))); // Store the marker index in the data item
}
- m_comboMGrp.SetCurSel(0);
+ m_comboMGrp->SetSelection(0);
UpdateMarkerList();
}
@@ -343,8 +351,8 @@ void CMarkerPalette::UpdatePaletteContents()
if (nSel == Invalid_v)
nSel = 0; // Force first entry (if any)
LoadMarkerNameList();
- if (value_preserving_cast(nSel) < m_comboMGrp.GetCount())
- m_comboMGrp.SetCurSel(FindMarkerGroupIndex(nSel));
+ if (nSel < m_comboMGrp->GetCount())
+ m_comboMGrp->SetSelection(FindMarkerGroupIndex(nSel));
UpdateMarkerList();
}
@@ -352,13 +360,12 @@ void CMarkerPalette::UpdatePaletteContents()
void CMarkerPalette::UpdateMarkerList()
{
- ASSERT(m_pDoc);
CMarkManager& pMMgr = m_pDoc->GetMarkManager();
size_t nSel = GetSelectedMarkerGroup();
if (nSel == Invalid_v)
{
- m_listMark.SetItemMap(NULL);
+ m_listMark->SetItemMap(NULL);
return;
}
@@ -378,13 +385,14 @@ void CMarkerPalette::UpdateMarkerList()
m_dummyArray.push_back(pMarkTbl->front());
pMarkTbl = &m_dummyArray;
}
- m_listMark.SetTrayContentVisibility(pMSet.GetMarkerTrayContentVisibility(), str);
- m_listMark.SetItemMap(pMarkTbl);
+ m_listMark->SetTrayContentVisibility(pMSet.GetMarkerTrayContentVisibility(), str);
+ m_listMark->SetItemMap(pMarkTbl);
}
/////////////////////////////////////////////////////////////////////////////
// CMarkerPalette message handlers
+#if 0
BOOL CMarkerPalette::OnEraseBkgnd(CDC* pDC)
{
return TRUE; // controls take care of erase
@@ -406,7 +414,7 @@ void CMarkerPalette::OnSize(UINT nType, int cx, int cy)
}
}
-void CMarkerPalette::PostNcDestroy()
+void CMarkerPaletteContainer::PostNcDestroy()
{
/* DO NOTHING - FRAME CLASS WOULD DELETE SELF! */
}
@@ -419,14 +427,71 @@ void CMarkerPalette::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
if (m_comboMGrp.m_hWnd != NULL)
m_comboMGrp.ShowDropDown(FALSE);
}
+#endif
-void CMarkerPalette::OnMarkerNameCbnSelchange()
+void CMarkerPalette::OnMarkerNameCbnSelchange(wxCommandEvent& /*event*/)
{
UpdateMarkerList();
}
+#if 0
BOOL CMarkerPalette::OnHelpInfo(HELPINFO* pHelpInfo)
{
GetApp()->DoHelpTopic("gp-ref-pal-markers.htm");
return TRUE;
}
+#endif
+
+CMarkerPaletteContainer::CMarkerPaletteContainer(CGamDoc& pDoc) :
+ CB::wxNativeContainerWindowMixin(static_cast(*this)),
+ child(new CMarkerPalette(*this, pDoc))
+{
+}
+
+void CMarkerPaletteContainer::SetDockingFrame(CDockMarkPalette* pDockingFrame)
+{
+ m_pDockingFrame = pDockingFrame;
+ SetParent(pDockingFrame);
+}
+
+BOOL CMarkerPaletteContainer::Create(CWnd& pOwnerWnd/*, DWORD dwStyle = 0, UINT nID = 0*/)
+{
+ DWORD dwStyle = WS_CHILD | WS_VISIBLE;
+ if (!CWnd::Create(AfxRegisterWndClass(0), NULL, dwStyle,
+ CRect(0, 0, 200, 100), &pOwnerWnd, 0))
+ {
+ TRACE("Failed to create Tray palette container window.\n");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+int CMarkerPaletteContainer::OnCreate(LPCREATESTRUCT lpCreateStruct)
+{
+ if (CWnd::OnCreate(lpCreateStruct) == -1)
+ {
+ return -1;
+ }
+
+ if (!child->Create())
+ {
+ TRACE("Failed to create Tray palette window.\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+// MFC puts the focus here, so move it to the useful window
+void CMarkerPaletteContainer::OnSetFocus(CWnd* pOldWnd)
+{
+ CWnd::OnSetFocus(pOldWnd);
+ child->SetFocus();
+}
+
+void CMarkerPaletteContainer::OnSize(UINT nType, int cx, int cy)
+{
+ child->SetSize(0, 0, cx, cy);
+ return CWnd::OnSize(nType, cx, cy);
+}
diff --git a/GP/PalMark.h b/GP/PalMark.h
index 8e982f49..e1e92c35 100644
--- a/GP/PalMark.h
+++ b/GP/PalMark.h
@@ -1,6 +1,6 @@
// PalMark.h : header file
//
-// Copyright (c) 1994-2020 By Dale L. Larson, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -36,26 +36,26 @@
/////////////////////////////////////////////////////////////////////////////
class CGamDoc;
+class CMarkerPaletteContainer;
+class CDockMarkPalette;
+class WinStateRestoreEvent;
/////////////////////////////////////////////////////////////////////////////
// CMarkerPalette window - Marker palette's are part of the document object.
-class CMarkerPalette : public CWnd
+class CMarkerPalette : public wxPanel
{
- DECLARE_DYNCREATE(CMarkerPalette)
-
// Construction
public:
- CMarkerPalette();
- BOOL Create(CWnd* pOwnerWnd, DWORD dwStyle = 0, UINT nID = 0);
+ CMarkerPalette(CMarkerPaletteContainer& container, CGamDoc& pDoc);
+ BOOL Create();
// Attributes
public:
- void SetDocument(CGamDoc *pDoc);
// Operations
public:
- size_t GetSelectedMarkerGroup();
+ size_t GetSelectedMarkerGroup() const;
void UpdatePaletteContents();
@@ -63,18 +63,10 @@ class CMarkerPalette : public CWnd
void Serialize(CArchive &ar);
- CDockablePane* GetDockingFrame() { return m_pDockingFrame; }
- void SetDockingFrame(CDockablePane* pDockingFrame)
- {
- m_pDockingFrame = pDockingFrame;
- SetParent(pDockingFrame);
- }
-
// Implementation
protected:
- CGamDoc* m_pDoc;
- CRect m_rctPos;
- CDockablePane* m_pDockingFrame;
+ RefPtr m_pContainer;
+ RefPtr m_pDoc;
// This dummy area only contains a single entry. It is used
// when only single entry should be shown in the Tray listbox.
@@ -83,45 +75,85 @@ class CMarkerPalette : public CWnd
std::vector m_dummyArray;
// Enclosed controls....
- CComboBox m_comboMGrp;
- CMarkListBox m_listMark;
+ CB::propagate_const m_comboMGrp;
+ CB::propagate_const m_listMark;
void LoadMarkerNameList();
void UpdateMarkerList();
- int FindMarkerGroupIndex(size_t nGroupNum);
+ int FindMarkerGroupIndex(size_t nGroupNum) const;
// Some temporary vars used during windows position restoration.
// They are loaded during the de-serialization process.
BOOL m_bStateVarsArmed; // Set so state restore is one-shot process
- int m_nComboIndex;
- int m_nListTopindex;
- int m_nListCurSel;
+ uint32_t m_nComboIndex;
+ uint32_t m_nListTopindex;
+ uint32_t m_nListCurSel;
int m_nComboHeight;
- CWinPlacement m_wndPlace;
-
// Implementation
public:
- virtual void PostNcDestroy();
- // Generated message map functions
protected:
- //{{AFX_MSG(CMarkerPalette)
+#if 0
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnDestroy();
afx_msg void OnWindowPosChanging(WINDOWPOS FAR* lpwndpos);
- afx_msg void OnMarkerNameCbnSelchange();
- afx_msg LRESULT OnOverrideSelectedItem(WPARAM wParam, LPARAM lParam);
- afx_msg LRESULT OnGetDragSize(WPARAM wParam, LPARAM lParam);
+#endif
+ void OnMarkerNameCbnSelchange(wxCommandEvent& /*event*/);
+ void OnOverrideSelectedItem(OverrideSelectedItemEvent& event);
+ void OnGetDragSize(GetDragSizeEvent& event);
+#if 0
afx_msg BOOL OnHelpInfo(HELPINFO* pHelpInfo);
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
- //}}AFX_MSG
- afx_msg LRESULT OnPaletteHide(WPARAM, LPARAM);
- afx_msg LRESULT OnMessageRestoreWinState(WPARAM, LPARAM);
+#endif
+ void OnPaletteHide(wxCommandEvent& event);
+ void OnMessageRestoreWinState(WinStateRestoreEvent& event);
+
+ wxDECLARE_EVENT_TABLE();
+};
+
+class CMarkerPaletteContainer : public CWnd,
+ public CB::wxNativeContainerWindowMixin
+{
+public:
+ CMarkerPaletteContainer(CGamDoc& pDoc);
+ BOOL Create(CWnd& pOwnerWnd/*, DWORD dwStyle = 0, UINT nID = 0*/);
+
+#if 0
+ void PostNcDestroy() override;
+#endif
+ operator const CMarkerPalette&() const { return *child; }
+ operator CMarkerPalette&()
+ {
+ return const_cast(static_cast(std::as_const(*this)));
+ }
+ const CMarkerPalette* operator->() const { return &static_cast(*this); }
+ CMarkerPalette* operator->()
+ {
+ return const_cast(std::as_const(*this).operator->());
+ }
+
+ const CDockMarkPalette* GetDockingFrame() const { return m_pDockingFrame.get(); }
+ CDockMarkPalette* GetDockingFrame()
+ {
+ return const_cast(std::as_const(*this).GetDockingFrame());
+ }
+ void SetDockingFrame(CDockMarkPalette* pDockingFrame);
+
+ void Serialize(CArchive& ar) override { wxASSERT(false); AfxThrowNotSupportedException(); }
+
+private:
+ afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
+ afx_msg void OnSetFocus(CWnd* pOldWnd);
+ afx_msg void OnSize(UINT nType, int cx, int cy);
DECLARE_MESSAGE_MAP()
+
+ CB::propagate_const m_pDockingFrame = nullptr;
+ // owned by wx
+ CB::propagate_const child = nullptr;
};
/////////////////////////////////////////////////////////////////////////////
diff --git a/GP/PalTray.cpp b/GP/PalTray.cpp
index 6e0d0723..054c60df 100644
--- a/GP/PalTray.cpp
+++ b/GP/PalTray.cpp
@@ -1,6 +1,6 @@
// PalTray.cpp : implementation file
//
-// Copyright (c) 1994-2025 By Dale L. Larson & William Su, All Rights Reserved.
+// Copyright (c) 1994-2026 By Dale L. Larson & William Su, All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
@@ -41,7 +41,7 @@
static char THIS_FILE[] = __FILE__;
#endif
-IMPLEMENT_DYNAMIC(CTrayPalette, CWnd)
+wxIMPLEMENT_CLASS(CTrayPalette, wxPanel)
#ifdef _DEBUG
#define new DEBUG_NEW
@@ -53,87 +53,112 @@ IMPLEMENT_DYNAMIC(CTrayPalette, CWnd)
/////////////////////////////////////////////////////////////////////////////
-BEGIN_MESSAGE_MAP(CTrayPalette, CWnd)
- //{{AFX_MSG_MAP(CTrayPalette)
+wxBEGIN_EVENT_TABLE(CTrayPalette, wxPanel)
+#if 0
ON_WM_ERASEBKGND()
ON_WM_SIZE()
ON_WM_CREATE()
ON_WM_WINDOWPOSCHANGING()
- ON_CBN_SELCHANGE(IDC_W_TRAYNAMECOMBO, OnTrayNameCbnSelchange)
- ON_LBN_DBLCLK(IDC_W_TRAYLIST, OnTrayListDoubleClick)
- ON_REGISTERED_MESSAGE(WM_DRAGDROP, OnDragItem)
- ON_MESSAGE(WM_OVERRIDE_SELECTED_ITEM_LIST, OnOverrideSelectedItemList)
- ON_MESSAGE(WM_GET_DRAG_SIZE, OnGetDragSize)
- ON_WM_CONTEXTMENU()
- ON_COMMAND(ID_PTRAY_SHUFFLE, OnPieceTrayShuffle)
- ON_UPDATE_COMMAND_UI(ID_PTRAY_SHUFFLE, OnUpdatePieceTrayShuffle)
- ON_WM_LBUTTONUP()
- ON_COMMAND(ID_PTRAY_SHUFFLE_SELECTED, OnPieceTrayShuffleSelected)
- ON_UPDATE_COMMAND_UI(ID_PTRAY_SHUFFLE_SELECTED, OnUpdatePieceTrayShuffleSelected)
- ON_COMMAND(ID_EDIT_ELEMENT_TEXT, OnEditElementText)
- ON_UPDATE_COMMAND_UI(ID_EDIT_ELEMENT_TEXT, OnUpdateEditElementText)
- ON_COMMAND_EX(ID_ACT_TURNOVER, OnActTurnOver)
- ON_COMMAND_EX(ID_ACT_TURNOVER_PREV, OnActTurnOver)
- ON_COMMAND_EX(ID_ACT_TURNOVER_RANDOM, OnActTurnOver)
- ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER, OnUpdateActTurnOver)
- ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER_PREV, OnUpdateActTurnOver)
- ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER_RANDOM, OnUpdateActTurnOver)
- ON_COMMAND_EX(ID_ACT_TURNOVER_ALL, OnActTurnOver)
- ON_COMMAND_EX(ID_ACT_TURNOVER_ALL_PREV, OnActTurnOver)
- ON_COMMAND_EX(ID_ACT_TURNOVER_ALL_RANDOM, OnActTurnOver)
- ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER_ALL, OnUpdateActTurnOver)
- ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER_ALL_PREV, OnUpdateActTurnOver)
- ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER_ALL_RANDOM, OnUpdateActTurnOver)
- ON_COMMAND_EX(ID_ACT_TURNOVER_SELECT, OnActTurnOver)
- ON_UPDATE_COMMAND_UI(ID_ACT_TURNOVER_SELECT, OnUpdateActTurnOver)
- ON_COMMAND(ID_PTRAY_ABOUT, OnPieceTrayAbout)
- ON_UPDATE_COMMAND_UI(ID_PTRAY_ABOUT, OnUpdatePieceTrayAbout)
+#endif
+ EVT_CHOICE(XRCID("m_comboYGrp"), OnTrayNameCbnSelchange)
+ EVT_LISTBOX_DCLICK(XRCID("m_listTray"), OnTrayListDoubleClick)
+ EVT_DRAGDROP(OnDragItem)
+ EVT_OVERRIDE_SELECTED_ITEM_LIST(OnOverrideSelectedItemList)
+ EVT_GET_DRAG_SIZE(OnGetDragSize)
+ EVT_CONTEXT_MENU(OnContextMenu)
+ EVT_MENU(XRCID("ID_PTRAY_SHUFFLE"), OnPieceTrayShuffle)
+ EVT_UPDATE_UI(XRCID("ID_PTRAY_SHUFFLE"), OnUpdatePieceTrayShuffle)
+ EVT_BUTTON(XRCID("m_bpMenuBtn"), OnMenuButton)
+ EVT_MENU(XRCID("ID_PTRAY_SHUFFLE_SELECTED"), OnPieceTrayShuffleSelected)
+ EVT_UPDATE_UI(XRCID("ID_PTRAY_SHUFFLE_SELECTED"), OnUpdatePieceTrayShuffleSelected)
+ EVT_MENU(XRCID("ID_EDIT_ELEMENT_TEXT"), OnEditElementText)
+ EVT_UPDATE_UI(XRCID("ID_EDIT_ELEMENT_TEXT"), OnUpdateEditElementText)
+ EVT_MENU(XRCID("ID_ACT_TURNOVER"), OnActTurnOver)
+ EVT_MENU(XRCID("ID_ACT_TURNOVER_PREV"), OnActTurnOver)
+ EVT_MENU(XRCID("ID_ACT_TURNOVER_RANDOM"), OnActTurnOver)
+ EVT_UPDATE_UI(XRCID("ID_ACT_TURNOVER"), OnUpdateActTurnOver)
+ EVT_UPDATE_UI(XRCID("ID_ACT_TURNOVER_PREV"), OnUpdateActTurnOver)
+ EVT_UPDATE_UI(XRCID("ID_ACT_TURNOVER_RANDOM"), OnUpdateActTurnOver)
+ EVT_MENU(XRCID("ID_ACT_TURNOVER_ALL"), OnActTurnOver)
+ EVT_MENU(XRCID("ID_ACT_TURNOVER_ALL_PREV"), OnActTurnOver)
+ EVT_MENU(XRCID("ID_ACT_TURNOVER_ALL_RANDOM"), OnActTurnOver)
+ EVT_UPDATE_UI(XRCID("ID_ACT_TURNOVER_ALL"), OnUpdateActTurnOver)
+ EVT_UPDATE_UI(XRCID("ID_ACT_TURNOVER_ALL_PREV"), OnUpdateActTurnOver)
+ EVT_UPDATE_UI(XRCID("ID_ACT_TURNOVER_ALL_RANDOM"), OnUpdateActTurnOver)
+ EVT_MENU(XRCID("ID_ACT_TURNOVER_SELECT"), OnActTurnOver)
+ EVT_UPDATE_UI(XRCID("ID_ACT_TURNOVER_SELECT"), OnUpdateActTurnOver)
+ EVT_MENU(XRCID("ID_PTRAY_ABOUT"), OnPieceTrayAbout)
+ EVT_UPDATE_UI(XRCID("ID_PTRAY_ABOUT"), OnUpdatePieceTrayAbout)
+#if 0
ON_WM_HELPINFO()
ON_WM_MOUSEMOVE()
- //}}AFX_MSG_MAP
- ON_MESSAGE(WM_WINSTATE_RESTORE, OnMessageRestoreWinState)
- ON_MESSAGE(WM_PALETTE_HIDE, OnPaletteHide)
+#endif
+ EVT_WINSTATE_RESTORE(OnMessageRestoreWinState)
+ EVT_COMMAND(wxID_ANY, WM_PALETTE_HIDE_WX, OnPaletteHide)
+#if 0
ON_WM_INITMENUPOPUP()
+#endif
+wxEND_EVENT_TABLE()
+
+BEGIN_MESSAGE_MAP(CTrayPaletteContainer, CWnd)
+ ON_WM_CREATE()
+ ON_WM_SETFOCUS()
+ ON_WM_SIZE()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTrayPalette
-CTrayPalette::CTrayPalette(CGamDoc& pDoc) :
+CTrayPalette::CTrayPalette(CTrayPaletteContainer& container, CGamDoc& pDoc, UINT palID) :
+ m_pContainer(&container),
m_pDoc(&pDoc),
- m_listTray(*m_pDoc)
+ m_bpMenuBtn(nullptr),
+ m_comboYGrp(nullptr),
+ m_listTray(nullptr)
{
- ASSERT(m_pDoc->IsKindOf(RUNTIME_CLASS(CGamDoc)));
- m_listTray.EnableDrag();
- m_listTray.EnableSelfDrop();
- m_listTray.EnableDropScroll();
- m_listTray.SetTrayContentVisibility(trayVizAllSides);
-
m_dummyArray.push_back(PieceID(0));
m_bStateVarsArmed = FALSE;
m_nComboHeight = 0;
m_pDockingFrame = NULL;
+ SetPaletteID(palID);
}
-BOOL CTrayPalette::Create(CWnd* pOwnerWnd, DWORD dwStyle, UINT nID)
+BOOL CTrayPalette::Create(/*wxWindow & pOwnerWnd, DWORD dwStyle, UINT nID*/)
{
LoadMenuButtonBitmap();
- dwStyle |= WS_CHILD | WS_VISIBLE;
- if (!CWnd::Create(AfxRegisterWndClass(0), NULL, dwStyle,
- CRect(0, 0, 200, 100), pOwnerWnd, nID))
+ if (!CB::XrcLoad(*this, *m_pContainer, "CTrayPalette"))
{
- TRACE("Failed to create Tray palette window.\n");
- return FALSE;
+ return false;
}
+ m_bpMenuBtn = XRCCTRL(*this, "m_bpMenuBtn", wxBitmapButton);
+ m_bpMenuBtn->SetBitmap(m_bmpMenuBtn);
+ m_comboYGrp = XRCCTRL(*this, "m_comboYGrp", wxChoice);
+ m_listTray = XRCCTRL(*this, "m_listTray", CTrayListBoxWx);
+ (*m_pContainer)->Layout();
+
+ m_listTray->Init(*m_pDoc);
+ m_listTray->EnableDrag();
+ m_listTray->EnableSelfDrop();
+ m_listTray->EnableDropScroll();
+ m_listTray->SetTrayContentVisibility(trayVizAllSides);
+
+ EnsureTooltipExistance();
UpdatePaletteContents();
// Queue up a message to finish up state restore.
- PostMessage(WM_WINSTATE_RESTORE);
+ QueueEvent(WinStateRestoreEvent().Clone());
return TRUE;
}
+void CTrayPaletteContainer::SetDockingFrame(CDockTrayPalette* pDockingFrame)
+{
+ m_pDockingFrame = pDockingFrame;
+ SetParent(pDockingFrame);
+}
+
+#if 0
int CTrayPalette::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
m_rctMenuBtn.left = 0;
@@ -178,6 +203,7 @@ int CTrayPalette::OnCreate(LPCREATESTRUCT lpCreateStruct)
return 0;
}
+#endif
/////////////////////////////////////////////////////////////////////////////
// Because of the way MFC and Windows re-parents the tooltip control they
@@ -187,15 +213,12 @@ int CTrayPalette::OnCreate(LPCREATESTRUCT lpCreateStruct)
BOOL CTrayPalette::EnsureTooltipExistance()
{
- if (m_toolTipMenu.m_hWnd == NULL)
- {
- // Add a tip to the menu icon click area.
- m_toolTipMenu.Create(this, TTS_ALWAYSTIP | TTS_BALLOON | TTS_NOPREFIX);
- m_toolTipMenu.AddTool(this, IDS_TIP_CLICK_MENU, m_rctMenuBtn, ID_TIP_MENU);
+ // Add a tip to the menu button.
+ m_toolTipMenu.SetBalloonMode(true);
+ m_toolTipMenu.Enable(true);
+ m_toolTipMenu.Add(*m_bpMenuBtn, CB::string::LoadString(IDS_TIP_CLICK_MENU));
- m_toolTipCombo.Create(this, TTS_ALWAYSTIP | TTS_NOPREFIX);
- return TRUE;
- }
+ m_toolTipCombo.Enable(true);
return FALSE;
}
@@ -203,37 +226,36 @@ BOOL CTrayPalette::EnsureTooltipExistance()
void CTrayPalette::DoEditSelectedPieceText()
{
- ASSERT(m_listTray.GetSelCount() == 1);
- int nSelItem;
- m_listTray.GetSelItems(1, &nSelItem);
+ std::vector nSelItem = m_listTray->GetSelections();
+ wxASSERT(nSelItem.size() == size_t(1));
- PieceID pid = m_listTray.MapIndexToItem(value_preserving_cast(nSelItem));
+ PieceID pid = m_listTray->MapIndexToItem(nSelItem.front());
m_pDoc->DoEditPieceText(pid);
}
/////////////////////////////////////////////////////////////////////////////
-size_t CTrayPalette::GetSelectedTray()
+size_t CTrayPalette::GetSelectedTray() const
{
- int nSel = m_comboYGrp.GetCurSel();
- if (nSel < 0)
+ int nSel = m_comboYGrp->GetSelection();
+ if (nSel == wxNOT_FOUND)
return Invalid_v;
- return value_preserving_cast(m_comboYGrp.GetItemData(nSel));
+ return value_preserving_cast(reinterpret_cast(m_comboYGrp->GetClientData(value_preserving_cast(nSel))));
}
-int CTrayPalette::FindTrayIndex(size_t nTrayNum)
+int CTrayPalette::FindTrayIndex(size_t nTrayNum) const
{
- if (m_comboYGrp.GetCount() <= 0)
- return -1;
+ if (m_comboYGrp->GetCount() <= 0)
+ return wxNOT_FOUND;
// @@@@@ TRACE1("m_comboYGrp.GetCount() = %d\n", m_comboYGrp.GetCount());
- for (int nIdx = 0; nIdx < m_comboYGrp.GetCount(); nIdx++)
+ for (unsigned nIdx = unsigned(0) ; nIdx < m_comboYGrp->GetCount() ; ++nIdx)
{
- if (value_preserving_cast(m_comboYGrp.GetItemData(nIdx)) == nTrayNum)
- return nIdx;
+ if (value_preserving_cast(reinterpret_cast(m_comboYGrp->GetClientData(nIdx))) == nTrayNum)
+ return value_preserving_cast(nIdx);
}
// CAN HAPPEN! ASSERT(nIdx < m_comboYGrp.GetCount());
- return -1;
+ return wxNOT_FOUND;
}
///////////////////////////////////////////////////////////////////////
@@ -241,53 +263,49 @@ int CTrayPalette::FindTrayIndex(size_t nTrayNum)
// message is posted during view initial update if the state of
// the windows should be restored.
-LRESULT CTrayPalette::OnMessageRestoreWinState(WPARAM, LPARAM)
+void CTrayPalette::OnMessageRestoreWinState(WinStateRestoreEvent& /*event*/)
{
UpdatePaletteContents();
if (!m_bStateVarsArmed)
- return (LRESULT)0;
+ return;
- m_comboYGrp.SetCurSel(m_nComboIndex);
+ m_comboYGrp->SetSelection(value_preserving_cast(m_nComboIndex));
UpdateTrayList();
- for (int i = 0; i < m_tblListBoxSel.GetSize(); i++)
- m_listTray.SetSel(m_tblListBoxSel[i]);
- m_listTray.SetTopIndex(m_nListTopindex);
+ for (size_t i = size_t(0) ; i < m_tblListBoxSel.size() ; ++i)
+ m_listTray->SetSelection(m_tblListBoxSel[i]);
+ m_listTray->ScrollToRow(m_nListTopindex);
m_bStateVarsArmed = FALSE;
- return (LRESULT)0;
}
/////////////////////////////////////////////////////////////////////////////
-LRESULT CTrayPalette::OnPaletteHide(WPARAM, LPARAM)
+void CTrayPalette::OnPaletteHide(wxCommandEvent& /*event*/)
{
GetMainFrame()->SendMessage(WM_COMMAND,
- (WPARAM)(m_nID == 0 ? ID_VIEW_TRAYA : ID_VIEW_TRAYB));
- return (LRESULT)0;
+ (WPARAM)(m_nID));
}
/////////////////////////////////////////////////////////////////////////////
-void CTrayPalette::DoMenu(CPoint point, bool rightButton)
+void CTrayPalette::DoMenu(wxPoint point)
{
// remember clicked side in case of ID_ACT_TURNOVER_SELECT
- CPoint clientPoint(point);
- ScreenToClient(&clientPoint);
- CWnd* child = ChildWindowFromPoint(clientPoint);
- ASSERT(child == this || child == &m_listTray);
- if (child == &m_listTray)
- {
- CRect rect;
- MapWindowPoints(&m_listTray, &clientPoint, 1);
+ wxWindow* child = wxFindWindowAtPoint(point);
+ wxASSERT(child == &*m_bpMenuBtn || child == &*m_listTray);
+ if (child == &*m_listTray)
+ {
+ wxRect rect;
+ wxPoint clientPoint = m_listTray->ScreenToClient(point);
/* KLUDGE: OnGetHitItemCodeAtPoint is public in base
CGrafixListBox, but protected in derived
CTrayListBox. Why? */
- menuGameElement = static_cast(m_listTray).OnGetHitItemCodeAtPoint(clientPoint, rect);
+ menuGameElement = static_cast(*m_listTray).OnGetHitItemCodeAtPoint(clientPoint, rect);
// ASSERT(menuGameElement != Invalid_v --> menuGameElement.IsAPiece()
- ASSERT(menuGameElement == Invalid_v ||
+ wxASSERT(menuGameElement == Invalid_v ||
menuGameElement.IsAPiece());
}
else
@@ -295,39 +313,35 @@ void CTrayPalette::DoMenu(CPoint point, bool rightButton)
menuGameElement = Invalid_v;
}
- CMenu bar;
- if (bar.LoadMenuW(IDR_MENU_PLAYER_POPUPS))
+ std::unique_ptr bar(wxXmlResource::Get()->LoadMenuBar("IDR_MENU_PLAYER_POPUPS"));
+ if (bar)
{
- CMenu& popup = *bar.GetSubMenu(MENU_PV_PIECE_TRAY);
- ASSERT(popup.m_hMenu != NULL);
+ int index = bar->FindMenu("5=PV_PIECE_TRAY");
+ wxASSERT(index != wxNOT_FOUND);
+ std::unique_ptr popup(bar->Remove(value_preserving_cast(index)));
// Make sure we clean up even if exception is tossed.
- TRY
+ try
{
- popup.TrackPopupMenu(TPM_LEFTBUTTON |
- TPM_LEFTALIGN |
- (rightButton ? TPM_RIGHTBUTTON : 0),
- point.x, point.y, this); // Route commands through tray window
+ PopupMenu(&*popup, ScreenToClient(point));
+ }
+ catch (...)
+ {
+ wxASSERT(!"exception");
}
- END_TRY
- }
- else
- {
- ASSERT(!"LoadMenu error");
}
}
-void CTrayPalette::OnContextMenu(CWnd* pWnd, CPoint point)
+void CTrayPalette::OnContextMenu(wxContextMenuEvent& event)
{
- DoMenu(point, true);
+ DoMenu(event.GetPosition());
}
-void CTrayPalette::OnLButtonUp(UINT nFlags, CPoint point)
+void CTrayPalette::OnMenuButton(wxCommandEvent& /*event*/)
{
- CRect rct;
// Use the list box as a guide of where to place the menu
- m_listTray.GetWindowRect(rct);
- DoMenu(rct.TopLeft(), false);
+ wxRect rct = m_listTray->GetScreenRect();
+ DoMenu(rct.GetTopLeft());
}
/////////////////////////////////////////////////////////////////////////////
@@ -335,13 +349,12 @@ void CTrayPalette::OnLButtonUp(UINT nFlags, CPoint point)
// of items. It gives the tray the chance to mess with the list's
// contents prior to commiting it.
-LRESULT CTrayPalette::OnOverrideSelectedItemList(WPARAM wParam, LPARAM lParam)
+void CTrayPalette::OnOverrideSelectedItemList(OverrideSelectedItemListEvent& event)
{
- wchar_t prefix = value_preserving_cast(lParam);
- ASSERT(prefix == L'P' && wParam);
+ OverrideSelectedItemListEvent& oil = event;
size_t nSel = GetSelectedTray();
- if (nSel == Invalid_v || !wParam || prefix != L'P')
- return (LRESULT)0;
+ if (nSel == Invalid_v)
+ return;
CTrayManager& pYMgr = m_pDoc->GetTrayManager();
CTraySet& pYSet = pYMgr.GetTraySet(nSel);
@@ -349,7 +362,7 @@ LRESULT CTrayPalette::OnOverrideSelectedItemList(WPARAM wParam, LPARAM lParam)
if (pYSet.IsRandomPiecePull() ||
pYSet.IsRandomSidePull())
{
- std::vector& pPceArray = *reinterpret_cast*>(wParam);
+ std::vector& pPceArray = oil.Vector();
uint32_t nRandSeed = m_pDoc->GetRandomNumberSeed();
@@ -391,57 +404,57 @@ LRESULT CTrayPalette::OnOverrideSelectedItemList(WPARAM wParam, LPARAM lParam)
m_pDoc->SetRandomNumberSeed(nRandSeed);
}
- return (LRESULT)1;
+ return;
}
-LRESULT CTrayPalette::OnGetDragSize(WPARAM wParam, LPARAM /*lParam*/)
+void CTrayPalette::OnGetDragSize(GetDragSizeEvent& event)
{
size_t nSel = GetSelectedTray();
if (nSel == Invalid_v