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);
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;
* @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++)
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;
}
class CDirDoc;
class CEncodingErrorBar;
class CLocationView;
+class CMergeEditSplitterView;
/**
* @brief Document class for merging two files
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; }
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 */
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);
}
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++)
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++)
public:
CSplitterWndEx m_wndSplitter;
bool m_bDetailView;
- int m_nThisGroup;
protected: