OSDN Git Service

Fix a problem that 'Encountered an improper argument' error occurs when a pane split...
authorTakashi Sawanaka <sdottaka@users.sourceforge.net>
Fri, 24 Dec 2021 13:04:37 +0000 (22:04 +0900)
committerTakashi Sawanaka <sdottaka@users.sourceforge.net>
Fri, 24 Dec 2021 13:04:37 +0000 (22:04 +0900)
Src/Common/SplitterWndEx.cpp
Src/Common/SplitterWndEx.h
Src/MergeDoc.cpp
Src/MergeDoc.h
Src/MergeEditSplitterView.cpp
Src/MergeEditSplitterView.h

index ee7dcc4..3b306b4 100644 (file)
@@ -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);
index ab0a589..666b25c 100644 (file)
@@ -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;
 
index 5c69554..180ed3b 100644 (file)
@@ -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;
 }
 
index 4af8d38..24727ed 100644 (file)
@@ -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 */
index 299c15c..a782cb4 100644 (file)
 
 IMPLEMENT_DYNCREATE(CMergeEditSplitterView, CView)
 
-CMergeEditSplitterView::CMergeEditSplitterView(): m_bDetailView(false), m_nThisGroup(0)
+CMergeEditSplitterView::CMergeEditSplitterView(): m_bDetailView(false)
 {
 }
 
 CMergeEditSplitterView::~CMergeEditSplitterView()
 {
-       dynamic_cast<CMergeDoc *>(GetDocument())->RemoveMergeViews(m_nThisGroup);
+       dynamic_cast<CMergeDoc *>(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<CMergeEditView *>(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++)
index 2c39f9c..1d85914 100644 (file)
@@ -26,7 +26,6 @@ public:
 public:
        CSplitterWndEx m_wndSplitter;
        bool m_bDetailView;
-       int m_nThisGroup;
 
 protected: