From 3d872ecc51e47e02e70732c848964274b2aad29e Mon Sep 17 00:00:00 2001 From: Tamás Zolnai Date: Sat, 28 Oct 2017 18:02:46 +0200 Subject: tdf#110357: Impress table looses selection when clicking on ... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... Increase \ decrease font button Change-Id: I52cf853de01b06c6c9db9779f15174f895789da8 Reviewed-on: https://gerrit.libreoffice.org/43962 Tested-by: Jenkins Reviewed-by: Tamás Zolnai --- include/svx/sdr/table/tablecontroller.hxx | 3 ++ include/svx/selectioncontroller.hxx | 3 ++ sd/qa/unit/tiledrendering/data/tdf105502.odp | Bin 11376 -> 11629 bytes sd/qa/unit/tiledrendering/tiledrendering.cxx | 12 +++++-- sd/source/ui/func/futext.cxx | 41 ++---------------------- svx/source/svdraw/selectioncontroller.cxx | 6 ++++ svx/source/table/tablecontroller.cxx | 46 +++++++++++++++++++++++++++ 7 files changed, 70 insertions(+), 41 deletions(-) diff --git a/include/svx/sdr/table/tablecontroller.hxx b/include/svx/sdr/table/tablecontroller.hxx index 5b9dd171710c..79730758b419 100644 --- a/include/svx/sdr/table/tablecontroller.hxx +++ b/include/svx/sdr/table/tablecontroller.hxx @@ -100,6 +100,9 @@ public: /// @see sdr::SelectionController::getSelectedCells(). void getSelectedCells( CellPos& rFirstPos, CellPos& rLastPos ) override; void setSelectedCells( const CellPos& rFirstPos, const CellPos& rLastPos ); + + virtual bool ChangeFontSize(bool bGrow, const FontList* pFontList) override; + void clearSelection(); void selectAll(); diff --git a/include/svx/selectioncontroller.hxx b/include/svx/selectioncontroller.hxx index d2fb9c4b9964..7510a830e645 100644 --- a/include/svx/selectioncontroller.hxx +++ b/include/svx/selectioncontroller.hxx @@ -33,6 +33,7 @@ class SfxStyleSheet; class SdrPage; class SdrModel; class Point; +class FontList; namespace sdr { @@ -78,6 +79,8 @@ public: virtual bool setCursorLogicPosition(const Point& rPosition, bool bPoint); /// Get the position of the first and the last selected cell. virtual void getSelectedCells(table::CellPos& rFirstPos, table::CellPos& rLastPos); + /// Changes the font (grow/shrink) according to the input parameters. + virtual bool ChangeFontSize(bool bGrow, const FontList* pFontList); }; } diff --git a/sd/qa/unit/tiledrendering/data/tdf105502.odp b/sd/qa/unit/tiledrendering/data/tdf105502.odp index 6fe818090c8b..2150f1152ba7 100644 Binary files a/sd/qa/unit/tiledrendering/data/tdf105502.odp and b/sd/qa/unit/tiledrendering/data/tdf105502.odp differ diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx index 1e3d54e7e6d1..6d5c0bc84af2 100644 --- a/sd/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx @@ -1601,13 +1601,21 @@ void SdTiledRenderingTest::testTdf105502() // Assert that the selected A1 has now a larger font than the unselected // A2. xmlDocPtr pXmlDoc = parseXmlDump(); - sal_Int32 nA1Height = getXPath(pXmlDoc, "//Cell[1]/SdrText/OutlinerParaObject/EditTextObject/ContentInfo/attribs[1]/SvxFontHeightItem", "height").toInt32(); + sal_Int32 nA1Height = getXPath(pXmlDoc, "//Cell[1]/SdrText/OutlinerParaObject/EditTextObject/ContentInfo/SfxItemSet/SvxFontHeightItem[1]", "height").toInt32(); sal_Int32 nA2Height = getXPath(pXmlDoc, "//Cell[3]/SdrText/OutlinerParaObject/EditTextObject/ContentInfo/attribs[1]/SvxFontHeightItem", "height").toInt32(); // This failed when FuText::ChangeFontSize() never did "continue" in the // text loop, instead of doing so depending on what IsInSelection() returns. CPPUNIT_ASSERT(nA1Height > nA2Height); - xmlFreeDoc(pXmlDoc); + // Check that selection remains the same + CPPUNIT_ASSERT(xSelectionController->hasSelectedCells()); + xSelectionController->getSelectedCells(aFirstCell, aLastCell); + CPPUNIT_ASSERT_EQUAL(static_cast(0), aFirstCell.mnCol); + CPPUNIT_ASSERT_EQUAL(static_cast(0), aFirstCell.mnRow); + CPPUNIT_ASSERT_EQUAL(static_cast(1), aLastCell.mnCol); + CPPUNIT_ASSERT_EQUAL(static_cast(0), aLastCell.mnRow); + + xmlFreeDoc(pXmlDoc); comphelper::LibreOfficeKit::setActive(false); } diff --git a/sd/source/ui/func/futext.cxx b/sd/source/ui/func/futext.cxx index 19f18efa9906..9ea0570e6e17 100644 --- a/sd/source/ui/func/futext.cxx +++ b/sd/source/ui/func/futext.cxx @@ -1372,24 +1372,6 @@ bool FuText::cancel() } } -/// Is rCell covered by the rFirst - rLast selection? -static bool IsInSelection(const sdr::table::CellPos& rFirst, const sdr::table::CellPos& rLast, sdr::table::CellPos const & rCell) -{ - if (rCell.mnCol < rFirst.mnCol) - return false; - - if (rCell.mnCol > rLast.mnCol) - return false; - - if (rCell.mnRow < rFirst.mnRow) - return false; - - if (rCell.mnRow > rLast.mnRow) - return false; - - return true; -} - void FuText::ChangeFontSize( bool bGrow, OutlinerView* pOLV, const FontList* pFontList, ::sd::View* pView ) { if( !pFontList || !pView ) @@ -1410,31 +1392,12 @@ void FuText::ChangeFontSize( bool bGrow, OutlinerView* pOLV, const FontList* pFo if( pTextObj ) { rtl::Reference xSelectionController(pView->getSelectionController()); - sdr::table::CellPos aFirstCell; - sdr::table::CellPos aLastCell; - sdr::table::SdrTableObj* pTableObject = nullptr; - if (xSelectionController.is() && xSelectionController->hasSelectedCells()) + if (xSelectionController.is() && xSelectionController->ChangeFontSize(bGrow, pFontList)) { - // This is a table object, and one or more of its cells are - // selected. - xSelectionController->getSelectedCells(aFirstCell, aLastCell); - pTableObject = dynamic_cast(pTextObj); + continue; } for( sal_Int32 nText = 0; nText < pTextObj->getTextCount(); nText++ ) { - if (pTableObject) - { - sal_Int32 nColCount = pTableObject->getColumnCount(); - if (nColCount > 0) - { - sdr::table::CellPos aPos(nText % nColCount, nText / nColCount); - if (!IsInSelection(aFirstCell, aLastCell, aPos)) - // There is a selection, but this cell is not - // part of it: don't change font size. - continue; - } - } - pTextObj->setActiveText( nText ); // Put text object into edit mode. diff --git a/svx/source/svdraw/selectioncontroller.cxx b/svx/source/svdraw/selectioncontroller.cxx index 0fc2d526e1c1..e8e6383e3a8c 100644 --- a/svx/source/svdraw/selectioncontroller.cxx +++ b/svx/source/svdraw/selectioncontroller.cxx @@ -119,6 +119,12 @@ bool SelectionController::setCursorLogicPosition(const Point& /*rPosition*/, boo return false; } + +bool SelectionController::ChangeFontSize(bool /*bGrow*/, const FontList* /*pFontList*/) +{ + return false; +} + } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/source/table/tablecontroller.cxx b/svx/source/table/tablecontroller.cxx index f12b7b1d4e67..0677bccbb892 100644 --- a/svx/source/table/tablecontroller.cxx +++ b/svx/source/table/tablecontroller.cxx @@ -72,6 +72,7 @@ #include #include #include +#include using ::editeng::SvxBorderLine; using namespace sdr::table; @@ -2029,6 +2030,51 @@ void SvxTableController::setSelectedCells( const CellPos& rStart, const CellPos& } +bool SvxTableController::ChangeFontSize(bool bGrow, const FontList* pFontList) +{ + if (mxTable.is()) + { + if (mpView->IsTextEdit()) + return true; + + CellPos aStart, aEnd; + if(hasSelectedCells()) + { + getSelectedCells(aStart, aEnd); + } + else + { + aStart.mnRow = 0; + aStart.mnCol = 0; + aEnd.mnRow = mxTable->getRowCount() - 1; + aEnd.mnCol = mxTable->getColumnCount() - 1; + } + + for (sal_Int32 nRow = aStart.mnRow; nRow <= aEnd.mnRow; nRow++) + { + for (sal_Int32 nCol = aStart.mnCol; nCol <= aEnd.mnCol; nCol++) + { + CellRef xCell(dynamic_cast< Cell* >(mxTable->getCellByPosition(nCol, nRow).get())); + if (xCell.is()) + { + if (mpModel && mpModel->IsUndoEnabled()) + xCell->AddUndo(); + + SfxItemSet aCellSet(xCell->GetItemSet()); + if (EditView::ChangeFontSize(bGrow, aCellSet, pFontList)) + { + xCell->SetMergedItemSetAndBroadcast(aCellSet, false); + } + } + } + } + UpdateTableShape(); + return true; + } + return false; +} + + void SvxTableController::UpdateSelection( const CellPos& rPos ) { maCursorLastPos = rPos; -- cgit