tdf#110357: Impress table looses selection when clicking on ...
... Increase \ decrease font button
Change-Id: I52cf853de01b06c6c9db9779f15174f895789da8
Reviewed-on: https://gerrit.libreoffice.org/43962
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Tamás Zolnai <tamas.zolnai@collabora.com>
diff --git a/include/svx/sdr/table/tablecontroller.hxx b/include/svx/sdr/table/tablecontroller.hxx
index 5b9dd17..7973075 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 d2fb9c4..7510a83 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 6fe8180..2150f11 100644
--- a/sd/qa/unit/tiledrendering/data/tdf105502.odp
+++ b/sd/qa/unit/tiledrendering/data/tdf105502.odp
Binary files differ
diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index 1e3d54e..6d5c0bc 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<sal_Int32>(0), aFirstCell.mnCol);
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), aFirstCell.mnRow);
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1), aLastCell.mnCol);
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(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 19f18ef..9ea0570 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<sdr::SelectionController> 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<sdr::table::SdrTableObj*>(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 0fc2d52..e8e6383 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 f12b7b1..0677bcc 100644
--- a/svx/source/table/tablecontroller.cxx
+++ b/svx/source/table/tablecontroller.cxx
@@ -72,6 +72,7 @@
#include <cppuhelper/implbase.hxx>
#include <comphelper/lok.hxx>
#include <sfx2/viewsh.hxx>
#include <editeng/editview.hxx>
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;