sc/source/ui/docshell/dbdocfun.cxx | 16 ++++++ sc/source/ui/docshell/olinefun.cxx | 85 +++++++++++++++++++++++++------------ sc/source/ui/inc/dbfunc.hxx | 2 sc/source/ui/inc/tabview.hxx | 9 +++ sc/source/ui/inc/tabvwsh.hxx | 8 --- sc/source/ui/undo/undoblk2.cxx | 4 - sc/source/ui/undo/undodat.cxx | 13 ++++- sc/source/ui/view/dbfunc.cxx | 2 sc/source/ui/view/dbfunc3.cxx | 13 ++--- sc/source/ui/view/gridwin.cxx | 3 + sc/source/ui/view/tabview4.cxx | 5 +- sc/source/ui/view/tabvwshc.cxx | 25 ++++++++++ sc/source/ui/view/viewfunc.cxx | 4 - 13 files changed, 134 insertions(+), 55 deletions(-)
New commits: commit a2cd438a34e911650acf8bbd85840eb8aa36543a Author: Marco Cecchetti <marco.cecche...@collabora.com> Date: Fri Dec 15 11:43:55 2017 +0100 lok: sc: header, cursor and selection overlays issues wrt autofilter Change-Id: I5d797b48083c24e63f7149cf3a469ebf93213311 Reviewed-on: https://gerrit.libreoffice.org/46530 Reviewed-by: Marco Cecchetti <mrcek...@gmail.com> Tested-by: Marco Cecchetti <mrcek...@gmail.com> diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx index 02090556c614..a46413200225 100644 --- a/sc/source/ui/docshell/dbdocfun.cxx +++ b/sc/source/ui/docshell/dbdocfun.cxx @@ -616,6 +616,12 @@ bool ScDBDocFunc::Query( SCTAB nTab, const ScQueryParam& rQueryParam, ScDocShellModificator aModificator( rDocShell ); ScDocument& rDoc = rDocShell.GetDocument(); + + if (ScTabViewShell::isAnyEditViewInRange(/*bColumns*/ false, rQueryParam.nRow1, rQueryParam.nRow2)) + { + return false; + } + if (bRecord && !rDoc.IsUndoEnabled()) bRecord = false; ScDBData* pDBData = rDoc.GetDBAtArea( nTab, rQueryParam.nCol1, rQueryParam.nRow1, @@ -926,6 +932,16 @@ bool ScDBDocFunc::Query( SCTAB nTab, const ScQueryParam& rQueryParam, pOld, bDoSize, pAdvSource ) ); } + ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); + if ( pViewSh ) + { + // could there be horizontal autofilter ? + // maybe it would be better to set bColumns to !rQueryParam.bByRow ? + // anyway at the beginning the value of bByRow is 'false' + // then after the first sort action it becomes 'true' + pViewSh->OnLOKShowHideColRow(/*bColumns*/ false, rQueryParam.nRow1 - 1); + } + if (bCopy) { SCCOL nEndX = aLocalParam.nCol2; diff --git a/sc/source/ui/docshell/olinefun.cxx b/sc/source/ui/docshell/olinefun.cxx index 410c6e1bc58a..90df8eb475ba 100644 --- a/sc/source/ui/docshell/olinefun.cxx +++ b/sc/source/ui/docshell/olinefun.cxx @@ -79,32 +79,6 @@ static void lcl_PaintWidthHeight( ScDocShell& rDocShell, SCTAB nTab, rDocShell.PostPaint( nStartCol,nStartRow,nTab, MAXCOL,MAXROW,nTab, nParts ); } -static bool lcl_IsAnyViewEditingInEntryRange(bool bColumns, SCCOLROW nStart, SCCOLROW nEnd) -{ - if (comphelper::LibreOfficeKit::isActive()) - { - SfxViewShell* pViewShell = SfxViewShell::GetFirst(); - while (pViewShell) - { - ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell); - if (pTabViewShell) - { - ScInputHandler* pInputHandler = pTabViewShell->GetInputHandler(); - if (pInputHandler && pInputHandler->GetActiveView()) - { - const ScViewData& rViewData = pTabViewShell->GetViewData(); - SCCOLROW nPos = bColumns ? rViewData.GetCurX() : rViewData.GetCurY(); - if (nStart <= nPos && nPos <= nEnd) - return true; - } - } - pViewShell = SfxViewShell::GetNext(*pViewShell); - } - } - return false; -} - - void ScOutlineDocFunc::MakeOutline( const ScRange& rRange, bool bColumns, bool bRecord, bool bApi ) { SCCOL nStartCol = rRange.aStart.Col(); @@ -393,7 +367,7 @@ bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, bool bColumns, sal_uInt16 nLevel sal_uInt16 nThisLevel = aIter.LastLevel(); bool bShow = (nThisLevel < nLevel); - if (!bShow && lcl_IsAnyViewEditingInEntryRange(bColumns, nThisStart, nThisEnd)) + if (!bShow && ScTabViewShell::isAnyEditViewInRange(bColumns, nThisStart, nThisEnd)) continue; if (bShow) // enable @@ -443,7 +417,7 @@ bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, bool bColumns, sal_uInt16 nLevel ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); if ( pViewSh ) - pViewSh->OnLOKShowHideOutline(bColumns, nStart - 1); + pViewSh->OnLOKShowHideColRow(bColumns, nStart - 1); if (bPaint) lcl_PaintWidthHeight( rDocShell, nTab, bColumns, nStart, nEnd ); @@ -554,8 +528,8 @@ bool ScOutlineDocFunc::ShowMarkedOutlines( const ScRange& rRange, bool bRecord ) ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); if ( pViewSh ) { - pViewSh->OnLOKShowHideOutline(/*columns: */ true, nMinStartCol - 1); - pViewSh->OnLOKShowHideOutline(/*columns: */ false, nMinStartRow - 1); + pViewSh->OnLOKShowHideColRow(/*columns: */ true, nMinStartCol - 1); + pViewSh->OnLOKShowHideColRow(/*columns: */ false, nMinStartRow - 1); } rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PaintPartFlags::Grid | PaintPartFlags::Left | PaintPartFlags::Top ); @@ -741,7 +715,7 @@ bool ScOutlineDocFunc::ShowOutline( SCTAB nTab, bool bColumns, sal_uInt16 nLevel ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); if ( pViewSh ) - pViewSh->OnLOKShowHideOutline(bColumns, nStart - 1); + pViewSh->OnLOKShowHideColRow(bColumns, nStart - 1); if (bPaint) lcl_PaintWidthHeight( rDocShell, nTab, bColumns, nStart, nEnd ); @@ -767,7 +741,7 @@ bool ScOutlineDocFunc::HideOutline( SCTAB nTab, bool bColumns, sal_uInt16 nLevel SCCOLROW nEnd = pEntry->GetEnd(); - if (lcl_IsAnyViewEditingInEntryRange(bColumns, nStart, nEnd)) + if (ScTabViewShell::isAnyEditViewInRange(bColumns, nStart, nEnd)) return false; // TODO undo can mess things up when another view is editing a cell in the range of group entry @@ -810,7 +784,7 @@ bool ScOutlineDocFunc::HideOutline( SCTAB nTab, bool bColumns, sal_uInt16 nLevel ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); if ( pViewSh ) - pViewSh->OnLOKShowHideOutline(bColumns, nStart - 1); + pViewSh->OnLOKShowHideColRow(bColumns, nStart - 1); if (bPaint) lcl_PaintWidthHeight( rDocShell, nTab, bColumns, nStart, nEnd ); diff --git a/sc/source/ui/inc/dbfunc.hxx b/sc/source/ui/inc/dbfunc.hxx index 793b8c65c3c8..709e1a3fd058 100644 --- a/sc/source/ui/inc/dbfunc.hxx +++ b/sc/source/ui/inc/dbfunc.hxx @@ -117,7 +117,7 @@ public: static sal_uInt16 DoUpdateCharts( const ScAddress& rPos, ScDocument* pDoc, bool bAllCharts ); - void OnLOKShowHideOutline(bool bColumns, SCROW nStartRow); + void OnLOKShowHideColRow(bool bColumns, SCROW nStartRow); }; #endif diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx index 6eddd88a5c5f..885b207cbab3 100644 --- a/sc/source/ui/inc/tabview.hxx +++ b/sc/source/ui/inc/tabview.hxx @@ -59,6 +59,13 @@ namespace chart2 { namespace data { struct HighlightedRange; }}}}} +enum HeaderType +{ + COLUMN_HEADER, + ROW_HEADER, + BOTH_HEADERS +}; + // Help - Window class ScCornerButton : public vcl::Window @@ -498,7 +505,7 @@ public: long GetGridWidth( ScHSplitPos eWhich ); long GetGridHeight( ScVSplitPos eWhich ); - void UpdateScrollBars(); + void UpdateScrollBars( HeaderType eHeaderType = BOTH_HEADERS ); void SetNewVisArea(); void SetTabProtectionSymbol( SCTAB nTab, const bool bProtect ); // for protection icon of a tab on tabbar diff --git a/sc/source/ui/inc/tabvwsh.hxx b/sc/source/ui/inc/tabvwsh.hxx index a6435591f18b..ae283f238735 100644 --- a/sc/source/ui/inc/tabvwsh.hxx +++ b/sc/source/ui/inc/tabvwsh.hxx @@ -92,13 +92,6 @@ enum ObjectSelectionType OST_Media }; -enum HeaderType -{ - COLUMN_HEADER, - ROW_HEADER, - BOTH_HEADERS -}; - class SC_DLLPUBLIC ScTabViewShell: public SfxViewShell, public ScDBFunc { private: @@ -398,6 +391,7 @@ public: /// Emits a LOK_CALLBACK_INVALIDATE_HEADER for all views whose current tab is equal to nCurrentTabIndex static void notifyAllViewsHeaderInvalidation(HeaderType eHeaderType, SCTAB nCurrentTabIndex = -1); static void notifyAllViewsHeaderInvalidation(bool Columns, SCTAB nCurrentTabIndex = -1); + static bool isAnyEditViewInRange(bool bColumns, SCCOLROW nStart, SCCOLROW nEnd); css::uno::Reference<css::drawing::XShapes> getSelectedXShapes(); }; diff --git a/sc/source/ui/undo/undoblk2.cxx b/sc/source/ui/undo/undoblk2.cxx index 569905716f39..d8baab68c6af 100644 --- a/sc/source/ui/undo/undoblk2.cxx +++ b/sc/source/ui/undo/undoblk2.cxx @@ -125,13 +125,11 @@ void ScUndoWidthOrHeight::Undo() if (pViewShell) { - pViewShell->UpdateScrollBars(); + pViewShell->UpdateScrollBars(bWidth ? COLUMN_HEADER : ROW_HEADER); SCTAB nCurrentTab = pViewShell->GetViewData().GetTabNo(); if ( nCurrentTab < nStartTab || nCurrentTab > nEndTab ) pViewShell->SetTabNo( nStartTab ); - - ScTabViewShell::notifyAllViewsHeaderInvalidation(bWidth, pViewShell->GetViewData().GetTabNo()); } EndUndo(); diff --git a/sc/source/ui/undo/undodat.cxx b/sc/source/ui/undo/undodat.cxx index 0fd7ee5f3b68..55fdad8188a6 100644 --- a/sc/source/ui/undo/undodat.cxx +++ b/sc/source/ui/undo/undodat.cxx @@ -365,8 +365,8 @@ void ScUndoOutlineBlock::Undo() pDocShell->PostPaint(0,0,nTab,MAXCOL,MAXROW,nTab,PaintPartFlags::Grid|PaintPartFlags::Left|PaintPartFlags::Top); - pViewShell->OnLOKShowHideOutline(/*columns: */ true, nStartCol - 1); - pViewShell->OnLOKShowHideOutline(/*columns: */ false, nStartRow - 1); + pViewShell->OnLOKShowHideColRow(/*columns: */ true, nStartCol - 1); + pViewShell->OnLOKShowHideColRow(/*columns: */ false, nStartRow - 1); EndUndo(); } @@ -736,6 +736,9 @@ OUString ScUndoQuery::GetComment() const void ScUndoQuery::Undo() { + if (ScTabViewShell::isAnyEditViewInRange(/*bColumns*/ false, aQueryParam.nRow1, aQueryParam.nRow2)) + return; + BeginUndo(); ScDocument& rDoc = pDocShell->GetDocument(); @@ -811,7 +814,11 @@ void ScUndoQuery::Undo() if ( nVisTab != nTab ) pViewShell->SetTabNo( nTab ); - // Paint + + // invalidate cache positions and update cursor and selection + pViewShell->OnLOKShowHideColRow(/*bColumns*/ false, aQueryParam.nRow1 - 1); + + // Paint if (bCopy) { diff --git a/sc/source/ui/view/dbfunc.cxx b/sc/source/ui/view/dbfunc.cxx index 7b0d640fd30d..f0ce2668aeaa 100644 --- a/sc/source/ui/view/dbfunc.cxx +++ b/sc/source/ui/view/dbfunc.cxx @@ -256,7 +256,7 @@ void ScDBFunc::Query( const ScQueryParam& rQueryParam, const ScRange* pAdvSource if (!bCopy) { - UpdateScrollBars(); + UpdateScrollBars(ROW_HEADER); SelectionChanged(); // for attribute states (filtered rows are ignored) } diff --git a/sc/source/ui/view/dbfunc3.cxx b/sc/source/ui/view/dbfunc3.cxx index 6bf344eec654..9483af89e256 100644 --- a/sc/source/ui/view/dbfunc3.cxx +++ b/sc/source/ui/view/dbfunc3.cxx @@ -194,8 +194,7 @@ void ScDBFunc::RemoveAllOutlines( bool bRecord ) if (bOk) { - UpdateScrollBars(); - ScTabViewShell::notifyAllViewsHeaderInvalidation(BOTH_HEADERS, GetViewData().GetTabNo()); + UpdateScrollBars(BOTH_HEADERS); } } @@ -228,7 +227,7 @@ void ScDBFunc::SelectLevel( bool bColumns, sal_uInt16 nLevel, bool bRecord ) bool bOk = aFunc.SelectLevel( nTab, bColumns, nLevel, bRecord, true/*bPaint*/ ); if (bOk) - UpdateScrollBars(); + UpdateScrollBars(bColumns ? COLUMN_HEADER : ROW_HEADER); } // show individual outline groups @@ -256,7 +255,7 @@ void ScDBFunc::ShowOutline( bool bColumns, sal_uInt16 nLevel, sal_uInt16 nEntry, bool bOk = aFunc.ShowOutline( nTab, bColumns, nLevel, nEntry, bRecord, bPaint ); if ( bOk && bPaint ) - UpdateScrollBars(); + UpdateScrollBars(bColumns ? COLUMN_HEADER : ROW_HEADER); } // hide individual outline groups @@ -270,7 +269,7 @@ void ScDBFunc::HideOutline( bool bColumns, sal_uInt16 nLevel, sal_uInt16 nEntry, bool bOk = aFunc.HideOutline( nTab, bColumns, nLevel, nEntry, bRecord, bPaint ); if ( bOk && bPaint ) - UpdateScrollBars(); + UpdateScrollBars(bColumns ? COLUMN_HEADER : ROW_HEADER); } // menu status: show/hide marked range @@ -2247,7 +2246,7 @@ void ScDBFunc::RepeatDB( bool bRecord ) ErrorMessage(STR_MSSG_REPEATDB_0); } -void ScDBFunc::OnLOKShowHideOutline(bool bColumns, SCCOLROW nStart) +void ScDBFunc::OnLOKShowHideColRow(bool bColumns, SCCOLROW nStart) { if (!comphelper::LibreOfficeKit::isActive()) return; @@ -2272,8 +2271,6 @@ void ScDBFunc::OnLOKShowHideOutline(bool bColumns, SCCOLROW nStart) } pViewShell = SfxViewShell::GetNext(*pViewShell); } - - ScTabViewShell::notifyAllViewsHeaderInvalidation(bColumns, nCurrentTabIndex); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx index 0e0f668adf7a..0881f006a4f0 100644 --- a/sc/source/ui/view/gridwin.cxx +++ b/sc/source/ui/view/gridwin.cxx @@ -795,6 +795,9 @@ void ScGridWindow::UpdateAutoFilterFromMenu(AutoFilterMode eMode) // Something went terribly wrong! return; + if (ScTabViewShell::isAnyEditViewInRange(/*bColumns*/ false, aParam.nRow1, aParam.nRow2)) + return; + pEntry->bDoQuery = true; pEntry->nField = rPos.Col(); pEntry->eConnect = SC_AND; diff --git a/sc/source/ui/view/tabview4.cxx b/sc/source/ui/view/tabview4.cxx index d56dcbf439ef..9eb1ebd51c02 100644 --- a/sc/source/ui/view/tabview4.cxx +++ b/sc/source/ui/view/tabview4.cxx @@ -21,6 +21,7 @@ #include <vcl/svapp.hxx> #include <tabview.hxx> +#include <tabvwsh.hxx> #include <document.hxx> #include <docsh.hxx> #include <scmod.hxx> @@ -375,8 +376,10 @@ static long lcl_GetScrollRange( SCCOLROW nDocEnd, SCCOLROW nPos, SCCOLROW nVis, return ( nEnd - nStart ); // for range starting at 0 } -void ScTabView::UpdateScrollBars() +void ScTabView::UpdateScrollBars( HeaderType eHeaderType ) { + ScTabViewShell::notifyAllViewsHeaderInvalidation(eHeaderType, GetViewData().GetTabNo()); + long nDiff; bool bTop = ( aViewData.GetVSplitMode() != SC_SPLIT_NONE ); bool bRight = ( aViewData.GetHSplitMode() != SC_SPLIT_NONE ); diff --git a/sc/source/ui/view/tabvwshc.cxx b/sc/source/ui/view/tabvwshc.cxx index aa72409f84a2..2b31c3024800 100644 --- a/sc/source/ui/view/tabvwshc.cxx +++ b/sc/source/ui/view/tabvwshc.cxx @@ -585,6 +585,31 @@ void ScTabViewShell::notifyAllViewsHeaderInvalidation(bool bColumns, SCTAB nCurr ScTabViewShell::notifyAllViewsHeaderInvalidation(eHeaderType, nCurrentTabIndex); } +bool ScTabViewShell::isAnyEditViewInRange(bool bColumns, SCCOLROW nStart, SCCOLROW nEnd) +{ + if (comphelper::LibreOfficeKit::isActive()) + { + SfxViewShell* pViewShell = SfxViewShell::GetFirst(); + while (pViewShell) + { + ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell); + if (pTabViewShell) + { + ScInputHandler* pInputHandler = pTabViewShell->GetInputHandler(); + if (pInputHandler && pInputHandler->GetActiveView()) + { + const ScViewData& rViewData = pTabViewShell->GetViewData(); + SCCOLROW nPos = bColumns ? rViewData.GetCurX() : rViewData.GetCurY(); + if (nStart <= nPos && nPos <= nEnd) + return true; + } + } + pViewShell = SfxViewShell::GetNext(*pViewShell); + } + } + return false; +} + bool ScTabViewShell::UseSubTotal(ScRangeList* pRangeList) { bool bSubTotal = false; diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx index 3d776a0f3301..ccbe1671932b 100644 --- a/sc/source/ui/view/viewfunc.cxx +++ b/sc/source/ui/view/viewfunc.cxx @@ -2239,7 +2239,7 @@ void ScViewFunc::SetWidthOrHeight( for (; itr != itrEnd; ++itr) rDoc.UpdatePageBreaks( *itr ); - GetViewData().GetView()->UpdateScrollBars(); + GetViewData().GetView()->UpdateScrollBars(bWidth ? COLUMN_HEADER : ROW_HEADER); { itr = aMarkData.begin(); @@ -2294,8 +2294,6 @@ void ScViewFunc::SetWidthOrHeight( HelperNotifyChanges::Notify(*pModelObj, aChangeRanges, "column-resize"); } } - - ScTabViewShell::notifyAllViewsHeaderInvalidation(bWidth, GetViewData().GetTabNo()); } // column width/row height (via marked range) commit b18e58d98f2f2c89d97140e9eea3094d5d238e6f Author: Marco Cecchetti <marco.cecche...@collabora.com> Date: Wed Dec 13 18:19:16 2017 +0100 lok: sc: handling conflicts btw group collapsing and cell editing Now when a cell is edited, a group including the cell in its range can't be collapsed. When whole levels are collapsed all together any group entry including an edited cell is skipped from collapsing. Undo/redo of collapsing/expanding has been (temporarily) disabled in the LOK case, since it could mess things up when a cell is edited and a group is collapsed because of an undo/redo. Change-Id: I401fa69b7a0275e3e14428b16ab48c409408a861 Reviewed-on: https://gerrit.libreoffice.org/46529 Reviewed-by: Marco Cecchetti <mrcek...@gmail.com> Tested-by: Marco Cecchetti <mrcek...@gmail.com> diff --git a/sc/source/ui/docshell/olinefun.cxx b/sc/source/ui/docshell/olinefun.cxx index 6e7f42cbc635..410c6e1bc58a 100644 --- a/sc/source/ui/docshell/olinefun.cxx +++ b/sc/source/ui/docshell/olinefun.cxx @@ -24,6 +24,7 @@ #include <docsh.hxx> #include <olinetab.hxx> #include <tabvwsh.hxx> +#include <inputhdl.hxx> #include <undodat.hxx> #include <globstr.hrc> #include <sc.hrc> @@ -78,6 +79,32 @@ static void lcl_PaintWidthHeight( ScDocShell& rDocShell, SCTAB nTab, rDocShell.PostPaint( nStartCol,nStartRow,nTab, MAXCOL,MAXROW,nTab, nParts ); } +static bool lcl_IsAnyViewEditingInEntryRange(bool bColumns, SCCOLROW nStart, SCCOLROW nEnd) +{ + if (comphelper::LibreOfficeKit::isActive()) + { + SfxViewShell* pViewShell = SfxViewShell::GetFirst(); + while (pViewShell) + { + ScTabViewShell* pTabViewShell = dynamic_cast<ScTabViewShell*>(pViewShell); + if (pTabViewShell) + { + ScInputHandler* pInputHandler = pTabViewShell->GetInputHandler(); + if (pInputHandler && pInputHandler->GetActiveView()) + { + const ScViewData& rViewData = pTabViewShell->GetViewData(); + SCCOLROW nPos = bColumns ? rViewData.GetCurX() : rViewData.GetCurY(); + if (nStart <= nPos && nPos <= nEnd) + return true; + } + } + pViewShell = SfxViewShell::GetNext(*pViewShell); + } + } + return false; +} + + void ScOutlineDocFunc::MakeOutline( const ScRange& rRange, bool bColumns, bool bRecord, bool bApi ) { SCCOL nStartCol = rRange.aStart.Col(); @@ -330,7 +357,9 @@ bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, bool bColumns, sal_uInt16 nLevel SCCOLROW nStart, nEnd; rArray.GetRange( nStart, nEnd ); - if ( bRecord ) + // TODO undo can mess things up when another view is editing a cell in the range of group entry + // this is a temporarily workaround + if (!comphelper::LibreOfficeKit::isActive() && bRecord ) { ScOutlineTable* pUndoTab = new ScOutlineTable( *pTable ); ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); @@ -358,8 +387,15 @@ bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, bool bColumns, sal_uInt16 nLevel ScOutlineEntry* pEntry; while ((pEntry=aIter.GetNext()) != nullptr) { + SCCOLROW nThisStart = pEntry->GetStart(); + SCCOLROW nThisEnd = pEntry->GetEnd(); + sal_uInt16 nThisLevel = aIter.LastLevel(); bool bShow = (nThisLevel < nLevel); + + if (!bShow && lcl_IsAnyViewEditingInEntryRange(bColumns, nThisStart, nThisEnd)) + continue; + if (bShow) // enable { pEntry->SetHidden( false ); @@ -372,12 +408,20 @@ bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, bool bColumns, sal_uInt16 nLevel } else // hidden below { - pEntry->SetVisible( false ); + if (comphelper::LibreOfficeKit::isActive() && nThisLevel > 0) + { + pEntry->SetHidden( true ); + const ScOutlineEntry* pParentEntry = rArray.GetEntryByPos(nThisLevel - 1, nThisStart); + if (pParentEntry && pParentEntry->IsHidden()) + pEntry->SetVisible( false ); + } + else + { + pEntry->SetVisible( false ); + } } - SCCOLROW nThisStart = pEntry->GetStart(); - SCCOLROW nThisEnd = pEntry->GetEnd(); - for (SCCOLROW i=nThisStart; i<=nThisEnd; i++) + for (SCCOLROW i=nThisStart; i<=nThisEnd; i++) { if ( bColumns ) rDoc.ShowCol( static_cast<SCCOL>(i), nTab, bShow ); @@ -397,16 +441,16 @@ bool ScOutlineDocFunc::SelectLevel( SCTAB nTab, bool bColumns, sal_uInt16 nLevel rDoc.SetDrawPageSize(nTab); rDoc.UpdatePageBreaks( nTab ); + ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); + if ( pViewSh ) + pViewSh->OnLOKShowHideOutline(bColumns, nStart - 1); + if (bPaint) lcl_PaintWidthHeight( rDocShell, nTab, bColumns, nStart, nEnd ); rDocShell.SetDocumentModified(); lcl_InvalidateOutliner( rDocShell.GetViewBindings() ); - ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); - if ( pViewSh ) - pViewSh->OnLOKShowHideOutline(bColumns, 0); - return true; } @@ -435,7 +479,9 @@ bool ScOutlineDocFunc::ShowMarkedOutlines( const ScRange& rRange, bool bRecord ) SCCOLROW nMax; SCCOLROW i; - if ( bRecord ) + // TODO undo can mess things up when another view is editing a cell in the range of group entry + // this is a temporarily workaround + if ( !comphelper::LibreOfficeKit::isActive() && bRecord ) { ScOutlineTable* pUndoTab = new ScOutlineTable( *pTable ); ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); @@ -505,18 +551,18 @@ bool ScOutlineDocFunc::ShowMarkedOutlines( const ScRange& rRange, bool bRecord ) rDoc.SetDrawPageSize(nTab); rDoc.UpdatePageBreaks( nTab ); - rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PaintPartFlags::Grid | PaintPartFlags::Left | PaintPartFlags::Top ); - rDocShell.SetDocumentModified(); - bDone = true; - - lcl_InvalidateOutliner( rDocShell.GetViewBindings() ); - ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); if ( pViewSh ) { pViewSh->OnLOKShowHideOutline(/*columns: */ true, nMinStartCol - 1); pViewSh->OnLOKShowHideOutline(/*columns: */ false, nMinStartRow - 1); } + + rDocShell.PostPaint( 0,0,nTab, MAXCOL,MAXROW,nTab, PaintPartFlags::Grid | PaintPartFlags::Left | PaintPartFlags::Top ); + rDocShell.SetDocumentModified(); + bDone = true; + + lcl_InvalidateOutliner( rDocShell.GetViewBindings() ); } return bDone; @@ -559,7 +605,9 @@ bool ScOutlineDocFunc::HideMarkedOutlines( const ScRange& rRange, bool bRecord ) rRowArray.FindTouchedLevel( nStartRow, nEndRow, nRowLevel ); rRowArray.ExtendBlock( nRowLevel, nEffStartRow, nEffEndRow ); - if ( bRecord ) + // TODO undo can mess things up when another view is editing a cell in the range of group entry + // this is a temporarily workaround + if ( !comphelper::LibreOfficeKit::isActive() && bRecord ) { ScOutlineTable* pUndoTab = new ScOutlineTable( *pTable ); ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); @@ -628,7 +676,9 @@ bool ScOutlineDocFunc::ShowOutline( SCTAB nTab, bool bColumns, sal_uInt16 nLevel SCCOLROW nStart = pEntry->GetStart(); SCCOLROW nEnd = pEntry->GetEnd(); - if ( bRecord ) + // TODO undo can mess things up when another view is editing a cell in the range of group entry + // this is a temporarily workaround + if ( !comphelper::LibreOfficeKit::isActive() && bRecord ) { ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); if (bColumns) @@ -689,6 +739,10 @@ bool ScOutlineDocFunc::ShowOutline( SCTAB nTab, bool bColumns, sal_uInt16 nLevel rDoc.InvalidatePageBreaks(nTab); rDoc.UpdatePageBreaks( nTab ); + ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); + if ( pViewSh ) + pViewSh->OnLOKShowHideOutline(bColumns, nStart - 1); + if (bPaint) lcl_PaintWidthHeight( rDocShell, nTab, bColumns, nStart, nEnd ); @@ -696,10 +750,6 @@ bool ScOutlineDocFunc::ShowOutline( SCTAB nTab, bool bColumns, sal_uInt16 nLevel lcl_InvalidateOutliner( rDocShell.GetViewBindings() ); - ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); - if ( pViewSh ) - pViewSh->OnLOKShowHideOutline(bColumns, nStart - 1); - return true; //! always ??? } @@ -716,7 +766,13 @@ bool ScOutlineDocFunc::HideOutline( SCTAB nTab, bool bColumns, sal_uInt16 nLevel SCCOLROW nStart = pEntry->GetStart(); SCCOLROW nEnd = pEntry->GetEnd(); - if ( bRecord ) + + if (lcl_IsAnyViewEditingInEntryRange(bColumns, nStart, nEnd)) + return false; + + // TODO undo can mess things up when another view is editing a cell in the range of group entry + // this is a temporarily workaround + if ( !comphelper::LibreOfficeKit::isActive() && bRecord ) { ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); if (bColumns) @@ -752,6 +808,10 @@ bool ScOutlineDocFunc::HideOutline( SCTAB nTab, bool bColumns, sal_uInt16 nLevel rDoc.InvalidatePageBreaks(nTab); rDoc.UpdatePageBreaks( nTab ); + ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); + if ( pViewSh ) + pViewSh->OnLOKShowHideOutline(bColumns, nStart - 1); + if (bPaint) lcl_PaintWidthHeight( rDocShell, nTab, bColumns, nStart, nEnd ); @@ -759,9 +819,6 @@ bool ScOutlineDocFunc::HideOutline( SCTAB nTab, bool bColumns, sal_uInt16 nLevel lcl_InvalidateOutliner( rDocShell.GetViewBindings() ); - ScTabViewShell* pViewSh = rDocShell.GetBestViewShell(); - if ( pViewSh ) - pViewSh->OnLOKShowHideOutline(bColumns, nStart - 1); return true; //! always ??? } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits