/** * @brief Same purpose as the one as in MergeEditView.cpp * @note Nearly the same code also */ void CMergeDiffDetailView::UpdateSiblingScrollPos (BOOL bHorz) { CSplitterWnd *pSplitterWnd = GetParentSplitter (this, FALSE); if (pSplitterWnd != NULL) { // See CSplitterWnd::IdFromRowCol() implementation for details int nCurrentRow = (GetDlgCtrlID () - MY_IDW_PANE_FIRST) / 16; int nCurrentCol = (GetDlgCtrlID () - MY_IDW_PANE_FIRST) % 16; ASSERT (nCurrentRow >= 0 && nCurrentRow < pSplitterWnd->GetRowCount ()); ASSERT (nCurrentCol >= 0 && nCurrentCol < pSplitterWnd->GetColumnCount ()); // limit the TopLine : must be smaller than GetLineCount for all the panels int nNewTopLine = m_nTopLine; int nRows = pSplitterWnd->GetRowCount (); int nCols = pSplitterWnd->GetColumnCount (); int nRow=0; for (nRow = 0; nRow < nRows; nRow++) { for (int nCol = 0; nCol < nCols; nCol++) { CMergeDiffDetailView *pSiblingView = static_cast<CMergeDiffDetailView*>(GetSiblingView (nRow, nCol)); if (pSiblingView != NULL) if (pSiblingView->GetLineCount() <= nNewTopLine) nNewTopLine = pSiblingView->GetLineCount()-1; } } if (m_nTopLine != nNewTopLine) { // only modification from code in MergeEditView.cpp // Where are we now, are we still in a diff ? So set to no diff nNewTopLine = m_lineBegin = 0; m_lineEnd = -1; m_diffLength = 0; ScrollToLine(nNewTopLine); } for (nRow = 0; nRow < nRows; nRow++) { for (int nCol = 0; nCol < nCols; nCol++) { if (!(nRow == nCurrentRow && nCol == nCurrentCol)) // We don't need to update ourselves { CMergeDiffDetailView *pSiblingView = static_cast<CMergeDiffDetailView*>(GetSiblingView (nRow, nCol)); if (pSiblingView != NULL) pSiblingView->OnUpdateSibling (this, bHorz); } } } } }
void CMergeDiffDetailView::OnDisplayDiff(int nDiff /*=0*/) { int newlineBegin, newlineEnd; CMergeDoc *pd = GetDocument(); if (nDiff < 0 || nDiff >= pd->m_diffList.GetSize()) { newlineBegin = 0; newlineEnd = -1; } else { DIFFRANGE curDiff; VERIFY(pd->m_diffList.GetDiff(nDiff, curDiff)); newlineBegin = curDiff.dbegin0; ASSERT (newlineBegin >= 0); newlineEnd = curDiff.dend0; } if (newlineBegin == m_lineBegin && newlineEnd == m_lineEnd) return; m_lineBegin = newlineBegin; m_lineEnd = newlineEnd; m_diffLength = m_lineEnd - m_lineBegin + 1; // scroll to the first line of the diff ScrollToLine(m_lineBegin); // tell the others views about this diff (no need to call UpdateSiblingScrollPos) CSplitterWnd *pSplitterWnd = GetParentSplitter(this, FALSE); // pSplitterWnd is NULL if WinMerge started minimized. if (pSplitterWnd != NULL) { int nRows = pSplitterWnd->GetRowCount (); int nCols = pSplitterWnd->GetColumnCount (); for (int nRow = 0; nRow < nRows; nRow++) { for (int nCol = 0; nCol < nCols; nCol++) { CMergeDiffDetailView *pSiblingView = static_cast<CMergeDiffDetailView*>(GetSiblingView (nRow, nCol)); if (pSiblingView != NULL) pSiblingView->OnDisplayDiff(nDiff); } } } // update the width of the horizontal scrollbar RecalcHorzScrollBar(); }
BOOL COXChildFrameState::ComputeSplitterPanes(CFrameWnd* pFrameWnd) // --- In : // --- Out : // --- Returns : Whether it succeeded or not // --- Effect : Computes all the states of the splitter panes and adds them // to an internal collection { ASSERT_VALID(this); // Check for a CSplitterWnd child window CSplitterWnd* pSplitterWnd = GetSplitterWindow(pFrameWnd); if (pSplitterWnd == NULL) // ... No splitter window found : nothing to do return TRUE; BOOL bAllSucceeded = TRUE; int nRowColIndex = 0; // Calculate the row properties for (nRowColIndex = 0; nRowColIndex < pSplitterWnd->GetRowCount(); nRowColIndex++) { COXSplitterColRowState* pSplitterColRowState = new COXSplitterColRowState; if (pSplitterColRowState->ComputeProperties(pSplitterWnd, nRowColIndex, TRUE)) m_pSplitterPanes->Add(pSplitterColRowState); else { TRACE0("COXChildFrameState::ComputeSplitterPanes : Failed to compute properties (row)\n"); bAllSucceeded = FALSE; delete pSplitterColRowState; } } // Calculate the column properties for (nRowColIndex = 0; nRowColIndex < pSplitterWnd->GetColumnCount(); nRowColIndex++) { COXSplitterColRowState* pSplitterColRowState = new COXSplitterColRowState; if (pSplitterColRowState->ComputeProperties(pSplitterWnd, nRowColIndex, FALSE)) m_pSplitterPanes->Add(pSplitterColRowState); else { TRACE0("COXChildFrameState::ComputeSplitterPanes : Failed to compute properties (column)\n"); bAllSucceeded = FALSE; delete pSplitterColRowState; } } ASSERT_VALID(this); return bAllSucceeded; }
///////////////////////////////////////////////////////////////////////////// // switch to the new selected view tab ///////////////////////////////////////////////////////////////////////////// BOOL CBonfireDoc::SwitchToView(CString strTab) { if (strTab == "") return FALSE; CChildFrame* pChild = (CChildFrame*)g_pMainFrame->MDIGetActive(); if (!pChild || pChild->GetActiveDocument() != this) { POSITION pos = GetFirstViewPosition(); pChild = (CChildFrame*)GetNextView(pos)->GetParentFrame(); } if (!pChild) return FALSE; CView* pViewAdd = NULL; CBonfireView* pGlobalView = NULL; CBonfireView* pBNewView = NULL; // get the view to "hide" CView* pViewDel = pChild->GetActiveView(); // if we're already displaying this kind of view, no need to go further. for (int i = 0; i < theApp.m_arAllViews.GetSize(); i++) { if ( ((CBonfireView*)theApp.m_arAllViews[i])->m_strCaption.Compare(strTab) == 0 ) { pGlobalView = (CBonfireView*)theApp.m_arAllViews[i]; break; } } if ( pViewDel && pViewDel->IsKindOf(pGlobalView->m_pClass) ) return TRUE; // check if a view of this type already exists if ( !m_pViews->Lookup(pGlobalView->m_strCaption, (void*&)pBNewView) ) { // doesn't exist so create a new view pViewAdd = (CView*)pGlobalView->m_pClass->CreateObject(); if (pViewAdd == NULL) { TRACE1("Warning: Dynamic create of view type %Fs failed\n", pGlobalView->m_pClass->m_lpszClassName); return FALSE; } // draw new view CCreateContext context; context.m_pNewViewClass = pGlobalView->m_pClass; context.m_pCurrentDoc = NULL; context.m_pNewDocTemplate = this->GetDocTemplate(); context.m_pLastView = NULL; context.m_pCurrentFrame = pChild; // draw new view if (!pViewAdd->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), pChild, AFX_IDW_PANE_FIRST, &context)) { TRACE0("Warning: couldn't create view for frame\n"); delete pViewAdd; return FALSE; } // add the view to the map pBNewView = new CBonfireView(pGlobalView); pBNewView->m_pView = pViewAdd; pBNewView->m_pClass = pViewAdd->GetRuntimeClass(); // add this view to the document's map AddViewToMap(pBNewView); // WM_INITIALUPDATE is defined in afxpriv.h pViewAdd->SendMessage(WM_INITIALUPDATE,0,0); // connect the view to the document AddView(pViewAdd); } else { pViewAdd = pBNewView->m_pView; } // save file on switching views if (theApp.m_opOptions.general.dwSaveOnSwitch && !m_xTextBuffer.GetReadOnly() && pViewDel) DoFileSave(); CSplitterWnd* pSplitter = NULL; POSITION pos = GetFirstViewPosition(); BOOL firstOne = true; while (pos) { CView* pv = GetNextView(pos); if (pv == pViewAdd) { pv->SetDlgCtrlID(AFX_IDW_PANE_FIRST); // show the view if (pBNewView->m_bAllowsSplitter) { pSplitter = (CSplitterWnd*)pViewAdd->GetParent(); // show the splitter (show the children view(s) as well) pSplitter->ShowWindow(SW_SHOW); } else // show the view pViewAdd->ShowWindow(SW_SHOW); } else { // check if the view is inside a splitter if (pv->GetParent()->GetRuntimeClass() == (CRuntimeClass*)RUNTIME_CLASS(CSplitterWnd)) { pSplitter = (CSplitterWnd*)pv->GetParent(); // hide the splitter (hide all views with the splitter) pSplitter->ShowWindow(SW_HIDE); } else { // hide the view pv->ShowWindow(SW_HIDE); pv->SetDlgCtrlID(AFX_IDW_PANE_FIRST + 255); } } TRACE("%s (%d) ", pv->GetRuntimeClass()->m_lpszClassName, (unsigned)(pv->GetDlgCtrlID() - AFX_IDW_PANE_FIRST)); if (pv == pViewDel) TRACE("= D "); if (pv == pViewAdd) TRACE("= A "); if (pv->GetRuntimeClass() == pGlobalView->m_pClass) { if (firstOne) firstOne = false; else TRACE("removing "); } } TRACE("\n"); // get rid of extra views created by the splitter if (pSplitter) { for (int cols = 1; cols < pSplitter->GetColumnCount(); cols++) pSplitter->DeleteColumn(cols); for (int rows = 1; rows < pSplitter->GetRowCount(); rows++) pSplitter->DeleteRow(rows); pSplitter->RecalcLayout(); } pViewAdd->UpdateWindow(); pChild->SetActiveView(pViewAdd); pChild->RecalcLayout(); if (pBNewView->m_bModifiedSinceRefresh) { pBNewView->m_bModifiedSinceRefresh = FALSE; if (pGlobalView->m_pClass == RUNTIME_CLASS(CXMLTreeView)) { ((CXMLTreeView*)pViewAdd)->RefreshView(); } else if (pGlobalView->m_pClass == RUNTIME_CLASS(CBrowserView)) { ((CBrowserView*)pViewAdd)->RefreshView(); } else { pBNewView->m_bModifiedSinceRefresh = TRUE; } } return TRUE; }