void CSimpleReport::RowSetFocused(CXTPReportRecord* pRec) { CXTPReportRows* pRows = GetRows(); for (int i = 0; i < pRows->GetCount(); i++) { CXTPReportRow* pRow = pRows->GetAt(i); if (pRow->GetRecord() == pRec) { SetFocusedRow(pRow); return; } } }
void CXTPReportSelectedRows::SelectBlock(int nBlockBegin, int nEnd, BOOL bControlKey) { CXTPReportRows* pRows; switch(m_nRowType) { case xtpRowTypeHeader : pRows = m_pControl->GetHeaderRows(); break; case xtpRowTypeFooter : pRows = m_pControl->GetFooterRows(); break; default : pRows = m_pControl->GetRows(); break; } int nRowsCount(0); if (pRows) nRowsCount = pRows->GetCount(); BOOL bGo = (nBlockBegin >= 0 && nBlockBegin < nRowsCount && nEnd < nRowsCount); if (!bGo) { Clear(GetNotifyOnSelectedRowsClear()); return; } if (bControlKey == FALSE) { nBlockBegin = m_nRowBlockBegin != -1 ? m_nRowBlockBegin : nBlockBegin; int nBegin = nBlockBegin; if (nBegin == -1 || nEnd == -1) return; if (nBegin > nEnd) { nBegin = nEnd; nEnd = nBlockBegin; } if (m_arrSelectedBlocks.GetSize() == 1 && m_arrSelectedBlocks[0].nIndexBegin == nBegin && m_arrSelectedBlocks[0].nIndexEnd == nEnd + 1) { return; } XTPReportRowType nRowType = m_nRowType; Clear(GetNotifyOnSelectedRowsClear()); m_nRowType = nRowType; if (m_nRowBlockBegin == -1) m_nRowBlockBegin = nBlockBegin; BOOL bSkipGroupFocus = m_pControl->IsSkipGroupsFocusEnabled(); BOOL bHasGroups = m_pControl->GetColumns()->GetGroupsOrder()->GetCount() != 0; if (!bHasGroups || !bSkipGroupFocus) { _InsertBlock(0, nBegin, nEnd + 1); } else { for (int i = nBegin; i <= nEnd; i++) { CXTPReportRow* pRow = pRows->GetAt(i); if (!pRow) continue; if (!bSkipGroupFocus || !pRow->IsGroupRow() || !pRow->IsExpanded() || (i == nBegin) || (i == nEnd)) { Add(pRow); } } } // notify owner the selection state has changed. _NotifyStateChanged(nBegin, nEnd); } else { int kSB = (int) m_arrSelectedBlocks.GetSize(); if (kSB > 0) { int iMin = m_arrSelectedBlocks[0].nIndexBegin; int iMax = m_arrSelectedBlocks[kSB - 1].nIndexEnd; if (nEnd >= iMin && nEnd < iMax) { return; } } BOOL bSkipGroupFocus = FALSE;//m_pControl->IsSkipGroupsFocusEnabled(); BOOL bHasGroups = m_pControl->GetColumns()->GetGroupsOrder()->GetCount() != 0; BOOL bWasShiftKey = m_pControl->m_bWasShiftKey; if (m_nRowBlockBegin != -1) nBlockBegin = m_nRowBlockBegin; int nBegin(nBlockBegin), iB, iE; if (nBegin == -1 || nEnd == -1) { return; } BOOL bSwap = SwapIfNeed(nBegin, nEnd); int nArSz = (int) m_arrSelectedBlocks.GetSize(); CUIntArray ar; if (nArSz > 0) { for (int k = 0; k < nArSz; k++) { int iB = m_arrSelectedBlocks[nArSz - 1 - k].nIndexBegin; int iE = m_arrSelectedBlocks[nArSz - 1 - k].nIndexEnd; if (iE == iB + 1 && iB == 0) k++; //this fix a case of initial selection from any row to any row with SHIFT+CONTROL pressed if (k < nArSz) { ar.Add(m_arrSelectedBlocks[k].nIndexBegin); ar.Add(m_arrSelectedBlocks[k].nIndexEnd); } } } XTPReportRowType nRowType = m_nRowType; Clear(GetNotifyOnSelectedRowsClear()); m_nRowType = nRowType; if (m_nRowBlockBegin == -1) m_nRowBlockBegin = nBlockBegin; if (!bHasGroups || !bSkipGroupFocus) //<<>> { int k = 0; int N = (int) ar.GetSize(); if (N > 0 && bControlKey && !bWasShiftKey) { for (k = 0; k < N / 2; k++) { iB = ar.GetAt(2 * k); iE = ar.GetAt(2 * k + 1); if (iE < nBegin || iB > nEnd) { _InsertBlock(k, iB, iE); } else if (iB >= nBegin && iE <= nEnd) //skip [iB:iE] segment - totally covered { } else if (iB <= nBegin && iE <= nEnd) //skip [iB:iE] segment amd modify new segment { nBegin = iB; } else if (iB <= nBegin && iE > nEnd) //skip [iB:iE] segment amd modify new segment { nBegin = iB; nEnd = iE; } else if (iB >= nBegin && iE > nEnd) //skip [iB:iE] segment amd modify new segment { nEnd = iE; } else { } } if (bSwap) { _InsertBlock(0, nBegin, nEnd); } else { _InsertBlock(k, nEnd + 1, nBegin); } } else { _InsertBlock(0, nBegin, nEnd + 1); } CUIntArray aDel; for (int l = 0; l < m_arrSelectedBlocks.GetSize(); l++) { if (m_arrSelectedBlocks[l].nIndexBegin == m_arrSelectedBlocks[l].nIndexEnd) aDel.Add(l); } for (int ll = 0; ll < aDel.GetSize(); ll++) m_arrSelectedBlocks.RemoveAt(aDel.GetAt(ll)); } else { for (int i = nBegin; i <= nEnd; i++) { CXTPReportRow* pRow = pRows->GetAt(i); if (!pRow) continue; if (!pRow->IsGroupRow() || !bSkipGroupFocus || !pRow->IsExpanded() || i == nBegin || i == nEnd) Add(pRow); } } // notify owner the selection state has changed. _NotifyStateChanged(nBegin, nEnd); } if (m_pControl->m_bSelectionExcludeGroupRows) m_pControl->UnselectGroupRows(); //to show only selected childs under group rows //flag - m_bSelectionExcludeGroupRows default = TRUE - this is 12.1 way to show selection TRACE(_T("return from SelectBlock with Count=%d\n"), GetCount()); }