From d1fa41bea17438132ffe3b861f0caacc13a629e8 Mon Sep 17 00:00:00 2001 From: Takashi Sawanaka Date: Fri, 24 Dec 2021 22:04:37 +0900 Subject: [PATCH] =?utf8?q?Fix=20a=20problem=20that=20'Encountered=20an=20i?= =?utf8?q?mproper=20argument'=20error=20occurs=20when=20a=20pane=20split?= =?utf8?q?=20by=20Window=E2=86=92Split=20menu=20item=20is=20unsplit=20by?= =?utf8?q?=20drag=20operation.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Src/Common/SplitterWndEx.cpp | 28 ++++++++++++++++++++++++++++ Src/Common/SplitterWndEx.h | 1 + Src/MergeDoc.cpp | 19 +++++++++++++++---- Src/MergeDoc.h | 6 ++++-- Src/MergeEditSplitterView.cpp | 10 ++++------ Src/MergeEditSplitterView.h | 1 - 6 files changed, 52 insertions(+), 13 deletions(-) diff --git a/Src/Common/SplitterWndEx.cpp b/Src/Common/SplitterWndEx.cpp index ee7dcc4b5..3b306b447 100644 --- a/Src/Common/SplitterWndEx.cpp +++ b/Src/Common/SplitterWndEx.cpp @@ -334,6 +334,34 @@ void CSplitterWndEx::TrackColumnSize(int x, int col) updateRatios(*this, col, x, m_colRatios, true); } +// Override GetActivePane() because CSplitterWnd::GetActivePane() does not take into account the case of nested Splitter Windows. +CWnd* CSplitterWndEx::GetActivePane(int* pRow, int* pCol) +{ + ASSERT_VALID(this); + + // attempt to use active view of frame window + CWnd* pView = NULL; + CFrameWnd* pFrameWnd = EnsureParentFrame(); + pView = pFrameWnd->GetActiveView(); + + // failing that, use the current focus + if (pView == NULL) + pView = GetFocus(); + + CWnd* pActiveView = pView; + if (pView) + { + while (pView && pView->GetParent() != this) + pView = pView->GetParent(); + } + + // make sure the pane is a child pane of the splitter + if (pView != NULL && !IsChildPane(pView, pRow, pCol)) + pActiveView = NULL; + + return pActiveView; +} + void CSplitterWndEx::OnSize(UINT nType, int cx, int cy) { CSplitterWnd::OnSize(nType, cx, cy); diff --git a/Src/Common/SplitterWndEx.h b/Src/Common/SplitterWndEx.h index ab0a58992..666b25cf2 100644 --- a/Src/Common/SplitterWndEx.h +++ b/Src/Common/SplitterWndEx.h @@ -32,6 +32,7 @@ public: virtual void RecalcLayout() override; virtual void TrackRowSize(int y, int row) override; virtual void TrackColumnSize(int x, int col) override; + virtual CWnd* GetActivePane(int* pRow = NULL, int* pCol = NULL) override; CScrollBar* GetScrollBarCtrl(CWnd* pWnd, int nBar) const; diff --git a/Src/MergeDoc.cpp b/Src/MergeDoc.cpp index 5c69554e6..180ed3b3a 100644 --- a/Src/MergeDoc.cpp +++ b/Src/MergeDoc.cpp @@ -2752,17 +2752,24 @@ void CMergeDoc::RescanIfNeeded(float timeOutInSecond) * @brief We have two child views (left & right), so we keep pointers directly * at them (the MFC view list doesn't have them both) */ -void CMergeDoc::AddMergeViews(CMergeEditView *pView[3]) +void CMergeDoc::AddMergeViews(CMergeEditSplitterView* pMergeEditSplitterView, CMergeEditView *pView[3]) { - + m_pMergeEditSplitterView[m_nGroups] = pMergeEditSplitterView; for (int nBuffer = 0; nBuffer < m_nBuffers; nBuffer++) m_pView[m_nGroups][nBuffer] = pView[nBuffer]; ++m_nGroups; } -void CMergeDoc::RemoveMergeViews(int nGroup) +void CMergeDoc::RemoveMergeViews(CMergeEditSplitterView* pMergeEditSplitterView) { - + ASSERT(m_nGroups > 0); + int nGroup; + for (nGroup = 0; nGroup < m_nGroups; ++nGroup) + { + if (m_pMergeEditSplitterView[nGroup] == pMergeEditSplitterView) + break; + } + ASSERT(nGroup < m_nGroups); for (; nGroup < m_nGroups - 1; nGroup++) { for (int nBuffer = 0; nBuffer < m_nBuffers; nBuffer++) @@ -2770,7 +2777,11 @@ void CMergeDoc::RemoveMergeViews(int nGroup) m_pView[nGroup][nBuffer] = m_pView[nGroup + 1][nBuffer]; m_pView[nGroup][nBuffer]->m_nThisGroup = nGroup; } + m_pMergeEditSplitterView[nGroup] = m_pMergeEditSplitterView[nGroup + 1]; } + for (int nBuffer = 0; nBuffer < m_nBuffers; nBuffer++) + m_pView[m_nGroups - 1][nBuffer] = nullptr; + m_pMergeEditSplitterView[m_nGroups - 1] = nullptr; --m_nGroups; } diff --git a/Src/MergeDoc.h b/Src/MergeDoc.h index 4af8d381b..24727edcd 100644 --- a/Src/MergeDoc.h +++ b/Src/MergeDoc.h @@ -113,6 +113,7 @@ class CMergeEditFrame; class CDirDoc; class CEncodingErrorBar; class CLocationView; +class CMergeEditSplitterView; /** * @brief Document class for merging two files @@ -184,8 +185,8 @@ public: void SetPrediffer(const PrediffingInfo * infoPrediffer); void GetPrediffer(PrediffingInfo * infoPrediffer); const PrediffingInfo *GetPrediffer() const override; - void AddMergeViews(CMergeEditView * pView[3]); - void RemoveMergeViews(int nGroup); + void AddMergeViews(CMergeEditSplitterView* pMergeEditSplitterView, CMergeEditView* pView[3]); + void RemoveMergeViews(CMergeEditSplitterView* pMergeEditSplitterView); void SetLocationView(CLocationView *pLocationView) { m_pLocationView = pLocationView; } CDirDoc * GetDirDoc() const override { return m_pDirDoc; } @@ -336,6 +337,7 @@ protected: int m_nCurDiff; /**< Selected diff, 0-based index, -1 if no diff selected */ CurrentWordDiff m_CurWordDiff; CMergeEditView * m_pView[3][3]; /**< Pointer to left/middle/right view */ + CMergeEditSplitterView * m_pMergeEditSplitterView[3]; CLocationView * m_pLocationView; /**< Pointer to locationview */ CDirDoc * m_pDirDoc; bool m_bEnableRescan; /**< Automatic rescan enabled/disabled */ diff --git a/Src/MergeEditSplitterView.cpp b/Src/MergeEditSplitterView.cpp index 299c15c31..a782cb461 100644 --- a/Src/MergeEditSplitterView.cpp +++ b/Src/MergeEditSplitterView.cpp @@ -30,13 +30,13 @@ IMPLEMENT_DYNCREATE(CMergeEditSplitterView, CView) -CMergeEditSplitterView::CMergeEditSplitterView(): m_bDetailView(false), m_nThisGroup(0) +CMergeEditSplitterView::CMergeEditSplitterView(): m_bDetailView(false) { } CMergeEditSplitterView::~CMergeEditSplitterView() { - dynamic_cast(GetDocument())->RemoveMergeViews(m_nThisGroup); + dynamic_cast(GetDocument())->RemoveMergeViews(this); } @@ -88,8 +88,6 @@ BOOL CMergeEditSplitterView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowNam m_wndSplitter.ResizablePanes(true); m_wndSplitter.AutoResizePanes(GetOptionsMgr()->GetBool(OPT_RESIZE_PANES)); - m_nThisGroup = pDoc->m_nGroups; - // stash left & right pointers into the mergedoc CMergeEditView * pView[3]; for (int nBuffer = 0; nBuffer < pDoc->m_nBuffers; nBuffer++) @@ -97,10 +95,10 @@ BOOL CMergeEditSplitterView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowNam pView[nBuffer] = static_cast(m_wndSplitter.GetPane(SWAPPARAMS_IF(bSplitVert, 0, nBuffer))); // connect merge views up to display of status info pView[nBuffer]->m_nThisPane = nBuffer; - pView[nBuffer]->m_nThisGroup = m_nThisGroup; + pView[nBuffer]->m_nThisGroup = pDoc->m_nGroups; pView[nBuffer]->m_bDetailView = m_bDetailView; } - pDoc->AddMergeViews(pView); + pDoc->AddMergeViews(this, pView); if (!m_bDetailView && pDoc->m_nGroups > 1) { for (int nBuffer = 0; nBuffer < pDoc->m_nBuffers; nBuffer++) diff --git a/Src/MergeEditSplitterView.h b/Src/MergeEditSplitterView.h index 2c39f9ca2..1d85914ca 100644 --- a/Src/MergeEditSplitterView.h +++ b/Src/MergeEditSplitterView.h @@ -26,7 +26,6 @@ public: public: CSplitterWndEx m_wndSplitter; bool m_bDetailView; - int m_nThisGroup; protected: -- 2.11.0