[Libreoffice-commits] core.git: Branch 'feature/table_rotated_text' - 368 commits - android/source basctl/CppunitTest_basctl_dialogs_test.mk basic/qa basic/source bin/distro-install-file-lists bin/find-german-comments chart2/CppunitTest_chart2_dialogs_test.mk chart2/qa cli_ure/source comphelper/Library_comphelper.mk comphelper/qa comphelper/source comphelper/util compilerplugins/clang config_host/config_telepathy.h.in config_host.mk.in configmgr/source configure.ac connectivity/source cppcanvas/source cppuhelper/source cppu/qa cppu/source cui/CppunitTest_cui_dialogs_test.mk cui/source dbaccess/CppunitTest_dbaccess_dialogs_test.mk dbaccess/inc dbaccess/source dbaccess/uiconfig dbaccess/UIConfig_dbaccess.mk desktop/CppunitTest_desktop_app.mk desktop/CppunitTest_desktop_dialogs_test.mk desktop/Library_sofficeapp.mk desktop/qa desktop/source distro-configs/LibreOfficeFlatpak.conf download.lst editeng/source embeddedobj/source embedserv/source extensions/test external/cppunit external/misc_extensions external/pdfium extras/source filter/Configuration_filter.mk filter/CppunitTest_filter_dialogs_test.mk filter/Library_msfilter.mk filter/Library_placeware.mk filter/Module_filter.mk filter/source formula/CppunitTest_formula_dialogs_test.mk formula/source fpicker/CppunitTest_fpicker_dialogs_test.mk fpicker/source framework/inc framework/qa framework/source helpcontent2 hwpfilter/source i18nutil/source icon-themes/breeze icon-themes/breeze_dark icon-themes/breeze_svg icon-themes/sifr icon-themes/sifr_svg include/dbaccess include/editeng include/filter include/formula include/framework include/jvmfwk include/o3tl include/oox include/postwin.h include/prewin.h include/sal include/sfx2 include/svl include/svtools include/svx include/tools include/tubes include/unotools include/vcl include/xmloff jvmfwk/inc jvmfwk/plugins jvmfwk/source l10ntools/source librelogo/source libreofficekit/CppunitTest_libreofficekit_checkapi.mk libreofficekit/qa lotuswordpro/source o3tl/CppunitTest_o3tl_tests.m k o3tl/qa offapi/com offapi/type_reference offapi/UnoApi_offapi.mk officecfg/registry onlineupdate/source oox/source package/inc package/source postprocess/Rdb_services.mk qadevOOo/runner reportdesign/CppunitTest_reportdesign_dialogs_test.mk reportdesign/inc reportdesign/source reportdesign/uiconfig reportdesign/UIConfig_dbreport.mk RepositoryExternal.mk Repository.mk RepositoryModule_host.mk rsc/inc sal/osl sal/qa sal/rtl sal/textenc sc/CppunitTest_sc_screenshots.mk sc/CppunitTest_sc_ucalc.mk sc/CustomTarget_uiconfig.mk sc/inc sc/Library_sc.mk sc/Library_scui.mk sc/Module_sc.mk scp2/source sc/qa sc/README scripting/source sc/sdi sc/source sc/uiconfig sc/UIConfig_scalc.mk sc/UITest_search_replace.mk sd/AllLangResTarget_sd.mk sd/CppunitTest_sd_dialogs_test.mk sdext/source sd/inc sd/qa sd/source sd/uiconfig sd/UIConfig_simpress.mk sfx2/CppunitTest_sfx2_classification.mk sfx2/CppunitTest_sfx2_dialogs_test.mk sfx2/inc sfx2/source sfx2/uiconfig sfx2/UIConfig_sfx.mk shell/inc shell/source slideshow/test solenv/bin solenv/gbuild solenv/qa sot/source starmath/CppunitTest_starmath_dialogs_test.mk starmath/inc starmath/source stoc/source svl/qa svl/source svtools/CppunitTest_svtools_dialogs_test.mk svtools/source svtools/uiconfig svtools/UIConfig_svt.mk svx/AllLangResTarget_svx.mk svx/CppunitTest_svx_dialogs_test.mk svx/inc svx/Library_svxcore.mk svx/source svx/uiconfig svx/UIConfig_svx.mk sw/AllLangResTarget_sw.mk sw/CppunitTest_sw_dialogs_test.mk sw/CppunitTest_sw_mailmerge.mk sw/CppunitTest_sw_odfimport.mk sw/CppunitTest_sw_ooxmlexport8.mk sw/inc sw/Library_sw.mk sw/ooxmlexport_setup.mk sw/qa sw/README sw/source sw/uiconfig sw/UIConfig_swriter.mk test/source tools/qa tools/source translations tubes/CppunitTest_tubes_test.mk tubes/Executable_liboapprover.mk tubes/Library_tubes.mk tubes/LibreOfficeApprover.client tubes/LibreOffice.client tubes/Makefile tubes/Module_tubes.mk tubes/org.freedesktop.Telepathy.Client.LibreOfficeApprover.service tubes/org.freedesktop.Telepat hy.Client.LibreOffice.service tubes/qa tubes/README tubes/source tubes/uiconfig tubes/UIConfig_tubes.mk ucb/source uitest/impress_tests unotools/source unoxml/source uui/CppunitTest_uui_dialogs_test.mk uui/source vbahelper/source vcl/backendtest vcl/CppunitTest_vcl_bitmapprocessor_test.mk vcl/CppunitTest_vcl_dialogs_test.mk vcl/headless vcl/inc vcl/Library_vcl.mk vcl/Module_vcl.mk vcl/osx vcl/Package_osxres.mk vcl/qa vcl/source vcl/unx vcl/win vcl/WinResTarget_vcl.mk vcl/workben wizards/com writerfilter/source writerperfect/qa writerperfect/source xmloff/inc xmloff/source xmlscript/source xmlsecurity/CppunitTest_xmlsecurity_dialogs_test.mk xmlsecurity/inc xmlsecurity/qa xmlsecurity/source
Tamás Zolnai
tamas.zolnai at collabora.com
Fri Apr 14 22:58:52 UTC 2017
Rebased ref, commits from common ancestor:
commit c3591519e25204c0ceaca1aa90942273374f8640
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date: Sat Apr 15 00:18:11 2017 +0200
Fix vertical text and bitmap bullet rendering
Change-Id: I881fce0511c81b164516d68f72c7e750687d4e0e
diff --git a/editeng/source/outliner/outlin2.cxx b/editeng/source/outliner/outlin2.cxx
index 08495c39fa07..45efe99362ed 100644
--- a/editeng/source/outliner/outlin2.cxx
+++ b/editeng/source/outliner/outlin2.cxx
@@ -536,6 +536,11 @@ bool Outliner::IsVertical() const
return pEditEngine->IsVertical();
}
+bool Outliner::IsTopToBottom() const
+{
+ return pEditEngine->IsTopToBottom();
+}
+
void Outliner::SetFixedCellHeight( bool bUseFixedCellHeight )
{
pEditEngine->SetFixedCellHeight( bUseFixedCellHeight );
diff --git a/editeng/source/outliner/outliner.cxx b/editeng/source/outliner/outliner.cxx
index 3f7914ff2ad2..6ffaf540edfe 100644
--- a/editeng/source/outliner/outliner.cxx
+++ b/editeng/source/outliner/outliner.cxx
@@ -861,7 +861,7 @@ vcl::Font Outliner::ImpCalcBulletFont( sal_Int32 nPara ) const
aBulletFont.SetFontSize( Size( 0, nScaledLineHeight ) );
bool bVertical = IsVertical();
aBulletFont.SetVertical( bVertical );
- aBulletFont.SetOrientation( bVertical ? 2700 : 0 );
+ aBulletFont.SetOrientation( bVertical ? (IsTopToBottom() ? 2700 : 900) : 0 );
Color aColor( COL_AUTO );
if( !pEditEngine->IsFlatMode() && !( pEditEngine->GetControlWord() & EEControlBits::NOCOLORS ) )
@@ -890,6 +890,7 @@ void Outliner::PaintBullet( sal_Int32 nPara, const Point& rStartPos,
if (bDrawBullet && ImplHasNumberFormat(nPara))
{
bool bVertical = IsVertical();
+ bool bTopToBottom = IsTopToBottom();
bool bRightToLeftPara = pEditEngine->IsRightToLeft( nPara );
@@ -927,9 +928,17 @@ void Outliner::PaintBullet( sal_Int32 nPara, const Point& rStartPos,
}
else
{
-// aTextPos.X() = rStartPos.X() - aBulletArea.Bottom();
- aTextPos.X() = rStartPos.X() - ( bSymbol ? aBulletArea.Bottom() : aParaInfos.nFirstLineMaxAscent );
- aTextPos.Y() = rStartPos.Y() + aBulletArea.Left();
+ if (bTopToBottom)
+ {
+// aTextPos.X() = rStartPos.X() - aBulletArea.Bottom();
+ aTextPos.X() = rStartPos.X() - (bSymbol ? aBulletArea.Bottom() : aParaInfos.nFirstLineMaxAscent);
+ aTextPos.Y() = rStartPos.Y() + aBulletArea.Left();
+ }
+ else
+ {
+ aTextPos.X() = rStartPos.X() + (bSymbol ? aBulletArea.Bottom() : aParaInfos.nFirstLineMaxAscent);
+ aTextPos.Y() = rStartPos.Y() + aBulletArea.Left();
+ }
}
if ( nOrientation )
@@ -998,8 +1007,16 @@ void Outliner::PaintBullet( sal_Int32 nPara, const Point& rStartPos,
}
else
{
- aBulletPos.X() = rStartPos.X() - aBulletArea.Bottom();
- aBulletPos.Y() = rStartPos.Y() + aBulletArea.Left();
+ if (bTopToBottom)
+ {
+ aBulletPos.X() = rStartPos.X() - aBulletArea.Bottom();
+ aBulletPos.Y() = rStartPos.Y() + aBulletArea.Left();
+ }
+ else
+ {
+ aBulletPos.X() = rStartPos.X() + aBulletArea.Top();
+ aBulletPos.Y() = rStartPos.Y() - aBulletArea.Right();
+ }
}
if(bStrippingPortions)
diff --git a/include/editeng/outliner.hxx b/include/editeng/outliner.hxx
index 5d2ce0044517..e8fdb13b6920 100644
--- a/include/editeng/outliner.hxx
+++ b/include/editeng/outliner.hxx
@@ -686,6 +686,7 @@ public:
void SetVertical( bool bVertical, bool bTopToBottom = true);
bool IsVertical() const;
+ bool IsTopToBottom() const;
void SetFixedCellHeight( bool bUseFixedCellHeight );
commit 71fa72c6d03852c563206baaa8bd3d303da3e6b0
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date: Fri Apr 14 17:03:28 2017 +0200
Avoid using implicit assignment operator
Change-Id: If9b67d16e468f9a705140da2c7b39721b47c5799
diff --git a/include/editeng/outlobj.hxx b/include/editeng/outlobj.hxx
index 1477e38d8b5b..24c806b6952e 100644
--- a/include/editeng/outlobj.hxx
+++ b/include/editeng/outlobj.hxx
@@ -46,6 +46,9 @@ struct OutlinerParaObjData
OutlinerParaObjData( const OutlinerParaObjData& r );
+ // assignment operator
+ OutlinerParaObjData& operator=(const OutlinerParaObjData& rCandidate) = delete;
+
// destructor
~OutlinerParaObjData();
commit a1050d6bd0eebb793a9d09d134a1489cb8e08fa0
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date: Sat Apr 15 00:23:07 2017 +0200
ODF import / export of rotated text in Impress table
Change-Id: I57136e32ed2db5e405a45e8e4bad1b8d459b7ae8
diff --git a/sd/qa/unit/data/pptx/tdf100926_ODP.pptx b/sd/qa/unit/data/pptx/tdf100926_ODP.pptx
new file mode 100755
index 000000000000..71627394ec84
Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf100926_ODP.pptx differ
diff --git a/sd/qa/unit/export-tests.cxx b/sd/qa/unit/export-tests.cxx
index dd57ec01bf3d..80a03416d759 100644
--- a/sd/qa/unit/export-tests.cxx
+++ b/sd/qa/unit/export-tests.cxx
@@ -93,6 +93,7 @@ public:
void testTransparentBackground();
void testEmbeddedPdf();
void testAuthorField();
+ void testTdf100926();
CPPUNIT_TEST_SUITE(SdExportTest);
@@ -108,6 +109,7 @@ public:
CPPUNIT_TEST(testTransparentBackground);
CPPUNIT_TEST(testEmbeddedPdf);
CPPUNIT_TEST(testAuthorField);
+ CPPUNIT_TEST(testTdf100926);
CPPUNIT_TEST_SUITE_END();
@@ -571,6 +573,35 @@ void SdExportTest::testAuthorField()
xDocShRef->DoClose();
}
+void SdExportTest::testTdf100926()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("sd/qa/unit/data/pptx/tdf100926_ODP.pptx"), PPTX);
+
+ xDocShRef = saveAndReload(xDocShRef.get(), ODP);
+
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ CPPUNIT_ASSERT(pPage != nullptr);
+
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pTableObj != nullptr);
+ uno::Reference< table::XCellRange > xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+
+ sal_Int32 nRotation = 0;
+ uno::Reference< beans::XPropertySet > xCell(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("RotateAngle") >>= nRotation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(27000), nRotation);
+
+ xCell.set(xTable->getCellByPosition(1, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("RotateAngle") >>= nRotation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(9000), nRotation);
+
+ xCell.set(xTable->getCellByPosition(2, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("RotateAngle") >>= nRotation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nRotation);
+
+ xDocShRef->DoClose();
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SdExportTest);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/xmloff/inc/xmlsdtypes.hxx b/xmloff/inc/xmlsdtypes.hxx
index 8e388cf032c7..86e81ba3ea5b 100644
--- a/xmloff/inc/xmlsdtypes.hxx
+++ b/xmloff/inc/xmlsdtypes.hxx
@@ -117,6 +117,8 @@
//////////////////////////////////////////////////////////////////////////////
+#define XML_SD_TYPE_CELL_ROTATION_ANGLE (XML_SD_TYPES_START + 79 )
+
#define CTF_NUMBERINGRULES 1000
#define CTF_CONTROLWRITINGMODE 1001
#define CTF_WRITINGMODE 1002
diff --git a/xmloff/source/draw/sdpropls.cxx b/xmloff/source/draw/sdpropls.cxx
index b32204d11e52..83462fd3089f 100644
--- a/xmloff/source/draw/sdpropls.cxx
+++ b/xmloff/source/draw/sdpropls.cxx
@@ -27,6 +27,7 @@
#include <com/sun/star/presentation/FadeEffect.hpp>
#include <com/sun/star/text/WritingMode.hpp>
+#include <com/sun/star/text/WritingMode2.hpp>
#include <xmloff/EnumPropertyHdl.hxx>
#include <xmloff/NamedBoolPropertyHdl.hxx>
#include <xmloff/WordWrapPropertyHdl.hxx>
@@ -58,6 +59,7 @@
#include "XMLPercentOrMeasurePropertyHandler.hxx"
#include "animations.hxx"
#include <sax/tools/converter.hxx>
+#include "xmlsdtypes.hxx"
#include "sdxmlexp_impl.hxx"
@@ -843,6 +845,52 @@ bool XMLSdHeaderFooterVisibilityTypeHdl::exportXML(
return bRet;
}
+class XMLSdRotationAngleTypeHdl : public XMLPropertyHandler
+{
+public:
+ virtual bool importXML(const OUString& rStrImpValue, css::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter) const override;
+ virtual bool exportXML(OUString& rStrExpValue, const css::uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter) const override;
+};
+
+bool XMLSdRotationAngleTypeHdl::importXML(
+ const OUString& rStrImpValue,
+ css::uno::Any& rValue,
+ const SvXMLUnitConverter&) const
+{
+ sal_Int32 nValue;
+ bool const bRet = ::sax::Converter::convertNumber(nValue, rStrImpValue);
+ if (bRet)
+ {
+ nValue = (nValue % 360);
+ if (nValue < 0)
+ nValue = 360 + nValue;
+ sal_Int32 nAngle;
+ if (nValue < 45 || nValue > 315)
+ nAngle = 0;
+ else if (nValue < 180)
+ nAngle = 9000;
+ else /* if nValalue <= 315 ) */
+ nAngle = 27000;
+
+ rValue <<= nAngle;
+ }
+ return bRet;
+}
+
+bool XMLSdRotationAngleTypeHdl::exportXML(
+ OUString& rStrExpValue,
+ const Any& rValue,
+ const SvXMLUnitConverter&) const
+{
+ sal_Int32 nAngle;
+ bool bRet = (rValue >>= nAngle) && nAngle != 0;
+ if (bRet)
+ {
+ rStrExpValue = OUString::number(nAngle / 100);
+ }
+ return bRet;
+}
+
XMLSdPropHdlFactory::XMLSdPropHdlFactory( uno::Reference< frame::XModel > const & xModel, SvXMLImport& rImport )
: mxModel( xModel ), mpExport(nullptr), mpImport( &rImport )
{
@@ -1142,6 +1190,9 @@ const XMLPropertyHandler* XMLSdPropHdlFactory::GetPropertyHandler( sal_Int32 nTy
case XML_SD_TYPE_HEADER_FOOTER_VISIBILITY_TYPE:
pHdl = new XMLSdHeaderFooterVisibilityTypeHdl;
break;
+ case XML_SD_TYPE_CELL_ROTATION_ANGLE:
+ pHdl = new XMLSdRotationAngleTypeHdl;
+ break;
}
if(pHdl)
@@ -1264,7 +1315,18 @@ void XMLShapeExportPropertyMapper::ContextFilter(
pControlWritingMode = property;
break;
case CTF_TEXTWRITINGMODE:
- pTextWritingMode = property;
+ {
+ pTextWritingMode = property;
+ sal_Int32 eWritingMode;
+ if (property->maValue >>= eWritingMode)
+ {
+ if (text::WritingMode2::LR_TB == eWritingMode)
+ {
+ property->mnIndex = -1;
+ pTextWritingMode = nullptr;
+ }
+ }
+ }
break;
case CTF_REPEAT_OFFSET_X:
pRepeatOffsetX = property;
diff --git a/xmloff/source/table/XMLTableExport.cxx b/xmloff/source/table/XMLTableExport.cxx
index 668e2b477931..6be73aa181e3 100644
--- a/xmloff/source/table/XMLTableExport.cxx
+++ b/xmloff/source/table/XMLTableExport.cxx
@@ -44,6 +44,7 @@
#include <xmloff/xmlexppr.hxx>
#include <xmloff/xmlexp.hxx>
#include <xmloff/xmltypes.hxx>
+#include "xmlsdtypes.hxx"
#include <xmloff/maptype.hxx>
#include <xmloff/prhdlfac.hxx>
#include <xmloff/txtprmap.hxx>
@@ -62,6 +63,7 @@ using namespace ::com::sun::star::style;
#define MAP_(name,prefix,token,type,context) { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_010, false }
#define CMAP(name,prefix,token,type,context) MAP_(name,prefix,token,type|XML_TYPE_PROP_TABLE_COLUMN,context)
#define RMAP(name,prefix,token,type,context) MAP_(name,prefix,token,type|XML_TYPE_PROP_TABLE_ROW,context)
+#define CELLMAP(name,prefix,token,type,context) MAP_(name,prefix,token,type|XML_TYPE_PROP_TABLE_CELL,context)
#define MAP_END { nullptr, 0, 0, XML_EMPTY, 0, 0, SvtSaveOptions::ODFVER_010, false }
const XMLPropertyMapEntry* getColumnPropertiesMap()
@@ -89,6 +91,17 @@ const XMLPropertyMapEntry* getRowPropertiesMap()
return &aXMLRowProperties[0];
}
+const XMLPropertyMapEntry* getCellPropertiesMap()
+{
+ static const XMLPropertyMapEntry aXMLCellProperties[] =
+ {
+ CELLMAP( "RotateAngle", XML_NAMESPACE_STYLE, XML_ROTATION_ANGLE, XML_SD_TYPE_CELL_ROTATION_ANGLE, 0),
+ MAP_END
+ };
+
+ return &aXMLCellProperties[0];
+}
+
class StringStatisticHelper
{
private:
@@ -167,6 +180,7 @@ XMLTableExport::XMLTableExport(SvXMLExport& rExp, const rtl::Reference< SvXMLExp
{
mxCellExportPropertySetMapper = xExportPropertyMapper;
mxCellExportPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(rExp));
+ mxCellExportPropertySetMapper->ChainExportMapper(new SvXMLExportPropertyMapper(new XMLPropertySetMapper(getCellPropertiesMap(), xFactoryRef.get(), true)));
}
mxRowExportPropertySetMapper = new SvXMLExportPropertyMapper( new XMLPropertySetMapper( getRowPropertiesMap(), xFactoryRef.get(), true ) );
diff --git a/xmloff/source/table/XMLTableImport.cxx b/xmloff/source/table/XMLTableImport.cxx
index 8e8db41dd068..46e5b7ed04f1 100644
--- a/xmloff/source/table/XMLTableImport.cxx
+++ b/xmloff/source/table/XMLTableImport.cxx
@@ -216,6 +216,7 @@ XMLTableImport::XMLTableImport( SvXMLImport& rImport, const rtl::Reference< XMLP
{
mxCellImportPropertySetMapper = new SvXMLImportPropertyMapper( xCellPropertySetMapper.get(), rImport );
mxCellImportPropertySetMapper->ChainImportMapper(XMLTextImportHelper::CreateParaExtPropMapper(rImport));
+ mxCellImportPropertySetMapper->ChainImportMapper(new SvXMLImportPropertyMapper(new XMLPropertySetMapper(getCellPropertiesMap(), xFactoryRef.get(), true), rImport));
}
rtl::Reference < XMLPropertySetMapper > xRowMapper( new XMLPropertySetMapper( getRowPropertiesMap(), xFactoryRef.get(), false ) );
diff --git a/xmloff/source/table/table.hxx b/xmloff/source/table/table.hxx
index cb00e7cb13f4..2eddd38d5b83 100644
--- a/xmloff/source/table/table.hxx
+++ b/xmloff/source/table/table.hxx
@@ -34,6 +34,7 @@ extern const TableStyleElement* getTableStyleMap();
extern const TableStyleElement* getWriterSpecificTableStyleMap();
extern const XMLPropertyMapEntry* getColumnPropertiesMap();
extern const XMLPropertyMapEntry* getRowPropertiesMap();
+extern const XMLPropertyMapEntry* getCellPropertiesMap();
#endif
commit 1bb064739c75477818352ed8beb966153d8864d6
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date: Fri Apr 7 14:17:57 2017 +0200
tdf#100926: PPTX import of table with rotated text
Change-Id: I05a8e979ac11b179e15784023032a56edc5b569b
diff --git a/oox/source/drawingml/table/tablecell.cxx b/oox/source/drawingml/table/tablecell.cxx
index 1c0d08616599..ebc2ed731d5b 100644
--- a/oox/source/drawingml/table/tablecell.cxx
+++ b/oox/source/drawingml/table/tablecell.cxx
@@ -467,6 +467,11 @@ void TableCell::pushToXCell( const ::oox::core::XmlFilterBase& rFilterBase, cons
}
getTextBody()->insertAt( rFilterBase, xText, xAt, aTextStyleProps, pMasterTextListStyle );
+
+ if (getVertToken() == XML_vert)
+ xPropSet->setPropertyValue("RotateAngle", Any(short(27000)));
+ else if (getVertToken() == XML_vert270)
+ xPropSet->setPropertyValue("RotateAngle", Any(short(9000)));
}
} } }
diff --git a/sd/qa/unit/data/pptx/tdf100926.pptx b/sd/qa/unit/data/pptx/tdf100926.pptx
new file mode 100755
index 000000000000..71627394ec84
Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf100926.pptx differ
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index c194e0314769..8b980353d5d4 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -157,6 +157,7 @@ public:
void testTdf104445();
void testTdf105150();
void testTdf105150PPT();
+ void testTdf100926();
bool checkPattern(sd::DrawDocShellRef& rDocRef, int nShapeNumber, std::vector<sal_uInt8>& rExpected);
void testPatternImport();
@@ -222,6 +223,7 @@ public:
CPPUNIT_TEST(testTdf104445);
CPPUNIT_TEST(testTdf105150);
CPPUNIT_TEST(testTdf105150PPT);
+ CPPUNIT_TEST(testTdf100926);
CPPUNIT_TEST(testPatternImport);
CPPUNIT_TEST_SUITE_END();
@@ -2155,6 +2157,32 @@ void SdImportTest::testPatternImport()
xDocRef->DoClose();
}
+void SdImportTest::testTdf100926()
+{
+ sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("sd/qa/unit/data/pptx/tdf100926.pptx"), PPTX);
+ const SdrPage* pPage = GetPage(1, xDocShRef);
+ CPPUNIT_ASSERT(pPage != nullptr);
+
+ sdr::table::SdrTableObj *pTableObj = dynamic_cast<sdr::table::SdrTableObj*>(pPage->GetObj(0));
+ CPPUNIT_ASSERT(pTableObj != nullptr);
+ uno::Reference< table::XCellRange > xTable(pTableObj->getTable(), uno::UNO_QUERY_THROW);
+
+ sal_Int32 nRotation = 0;
+ uno::Reference< beans::XPropertySet > xCell(xTable->getCellByPosition(0, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("RotateAngle") >>= nRotation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(27000), nRotation);
+
+ xCell.set(xTable->getCellByPosition(1, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("RotateAngle") >>= nRotation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(9000), nRotation);
+
+ xCell.set(xTable->getCellByPosition(2, 0), uno::UNO_QUERY_THROW);
+ xCell->getPropertyValue("RotateAngle") >>= nRotation;
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(0), nRotation);
+
+ xDocShRef->DoClose();
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest);
CPPUNIT_PLUGIN_IMPLEMENT();
commit ac0928eda5b19798cb9de516ec90b03c7157526f
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date: Thu Apr 6 22:22:53 2017 +0200
Implement RotateAngle API property for Impress table cells
Change-Id: I01379c0fc21e8fe294bc882bf824f64502863ff4
diff --git a/svx/source/table/cell.cxx b/svx/source/table/cell.cxx
index 814e69ce3790..8da2f1555a06 100644
--- a/svx/source/table/cell.cxx
+++ b/svx/source/table/cell.cxx
@@ -90,6 +90,7 @@ static const SvxItemPropertySet* ImplGetSvxCellPropertySet()
{ OUString("BottomBorder"), SDRATTR_TABLE_BORDER, cppu::UnoType<BorderLine>::get(), 0, BOTTOM_BORDER },
{ OUString("LeftBorder"), SDRATTR_TABLE_BORDER, cppu::UnoType<BorderLine>::get(), 0, LEFT_BORDER },
{ OUString("RightBorder"), SDRATTR_TABLE_BORDER, cppu::UnoType<BorderLine>::get(), 0, RIGHT_BORDER },
+ { OUString("RotateAngle"), SDRATTR_TABLE_TEXT_ROTATION, cppu::UnoType<sal_Int32>::get(), 0, 0 },
SVX_UNOEDIT_OUTLINER_PROPERTIES,
SVX_UNOEDIT_CHAR_PROPERTIES,
@@ -285,8 +286,6 @@ namespace sdr
OutlinerParaObject* pTemp = pOutliner->CreateParaObject(0, nParaCount);
pOutliner->Clear();
- pTemp->SetVertical(pParaObj->IsVertical(), pParaObj->IsTopToBottom());
-
mxCell->SetOutlinerParaObject(pTemp);
}
@@ -1102,6 +1101,18 @@ void SAL_CALL Cell::setPropertyValue( const OUString& rPropertyName, const Any&
mpProperties->SetObjectItem( XFillBmpTileItem( eMode == BitmapMode_REPEAT ) );
return;
}
+ case SDRATTR_TABLE_TEXT_ROTATION:
+ {
+ sal_Int32 nRotVal = 0;
+ if (!(rValue >>= nRotVal))
+ throw IllegalArgumentException();
+
+ if (nRotVal != 27000 && nRotVal != 9000 && nRotVal != 0)
+ throw IllegalArgumentException();
+
+ mpProperties->SetObjectItem(SvxTextRotateItem(nRotVal/10, SDRATTR_TABLE_TEXT_ROTATION));
+ return;
+ }
default:
{
SfxItemSet aSet( GetModel()->GetItemPool(), pMap->nWID, pMap->nWID);
@@ -1217,6 +1228,11 @@ Any SAL_CALL Cell::getPropertyValue( const OUString& PropertyName )
return Any( BitmapMode_NO_REPEAT );
}
}
+ case SDRATTR_TABLE_TEXT_ROTATION:
+ {
+ const SvxTextRotateItem& rTextRotate = static_cast<const SvxTextRotateItem&>(mpProperties->GetItem(SDRATTR_TABLE_TEXT_ROTATION));
+ return Any(sal_Int32(rTextRotate.GetValue() * 10));
+ }
default:
{
SfxItemSet aSet( GetModel()->GetItemPool(), pMap->nWID, pMap->nWID);
commit 4801bfe96fc483ff2ceeacab60abbe3074d9ad4b
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date: Wed Apr 5 15:12:11 2017 +0200
Introduce text rotation for Impress tables
* Introduce new table property for text rotation
* Support only two rotation angle (270° and 90°)
* Implement editing and rendering of 270° rotated
text (90° rotation was already implemented)
Change-Id: Ifc2e0f171e9c840e86b365e9af2c30aa97ecd92e
diff --git a/editeng/source/editeng/editdoc.cxx b/editeng/source/editeng/editdoc.cxx
index 5cb51b1ea647..572402936587 100644
--- a/editeng/source/editeng/editdoc.cxx
+++ b/editeng/source/editeng/editdoc.cxx
@@ -1974,6 +1974,7 @@ EditDoc::EditDoc( SfxItemPool* pPool ) :
pItemPool(pPool ? pPool : new EditEngineItemPool(false)),
nDefTab(DEFTAB),
bIsVertical(false),
+ bIsTopToBottomVert(false),
bIsFixedCellHeight(false),
bOwnerOfPool(pPool == nullptr),
bModified(false)
@@ -2108,7 +2109,7 @@ void EditDoc::CreateDefFont( bool bUseStyles )
SfxItemSet aTmpSet( GetItemPool(), EE_PARA_START, EE_CHAR_END );
CreateFont( aDefFont, aTmpSet );
aDefFont.SetVertical( IsVertical() );
- aDefFont.SetOrientation( IsVertical() ? 2700 : 0 );
+ aDefFont.SetOrientation( IsVertical() ? (IsTopToBottom() ? 2700 : 900) : 0 );
for ( sal_Int32 nNode = 0; nNode < Count(); nNode++ )
{
diff --git a/editeng/source/editeng/editdoc.hxx b/editeng/source/editeng/editdoc.hxx
index a31eaefc5739..d1c921d74d49 100644
--- a/editeng/source/editeng/editdoc.hxx
+++ b/editeng/source/editeng/editdoc.hxx
@@ -746,6 +746,7 @@ private:
SvxFont aDefFont; //faster than ever from the pool!!
sal_uInt16 nDefTab;
bool bIsVertical:1;
+ bool bIsTopToBottomVert : 1;
bool bIsFixedCellHeight:1;
bool bOwnerOfPool:1;
@@ -772,8 +773,10 @@ public:
void SetDefTab( sal_uInt16 nTab ) { nDefTab = nTab ? nTab : DEFTAB; }
sal_uInt16 GetDefTab() const { return nDefTab; }
- void SetVertical( bool bVertical ) { bIsVertical = bVertical; }
+ void SetVertical( bool bVertical, bool bTopToBottom = true )
+ { bIsVertical = bVertical; bIsTopToBottomVert = bVertical && bTopToBottom; }
bool IsVertical() const { return bIsVertical; }
+ bool IsTopToBottom() const { return bIsTopToBottomVert; }
void SetFixedCellHeight( bool bUseFixedCellHeight ) { bIsFixedCellHeight = bUseFixedCellHeight; }
bool IsFixedCellHeight() const { return bIsFixedCellHeight; }
diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx
index 4e2aa8d4cfe2..0a4c315bf970 100644
--- a/editeng/source/editeng/editeng.cxx
+++ b/editeng/source/editeng/editeng.cxx
@@ -428,9 +428,9 @@ const Size& EditEngine::GetPaperSize() const
return pImpEditEngine->GetPaperSize();
}
-void EditEngine::SetVertical( bool bVertical )
+void EditEngine::SetVertical( bool bVertical, bool bTopToBottom )
{
- pImpEditEngine->SetVertical( bVertical );
+ pImpEditEngine->SetVertical( bVertical, bTopToBottom);
}
bool EditEngine::IsVertical() const
@@ -438,6 +438,11 @@ bool EditEngine::IsVertical() const
return pImpEditEngine->IsVertical();
}
+bool EditEngine::IsTopToBottom() const
+{
+ return pImpEditEngine->IsTopToBottom();
+}
+
void EditEngine::SetFixedCellHeight( bool bUseFixedCellHeight )
{
pImpEditEngine->SetFixedCellHeight( bUseFixedCellHeight );
@@ -1777,8 +1782,16 @@ void EditEngine::StripPortions()
tools::Rectangle aBigRect( Point( 0, 0 ), Size( 0x7FFFFFFF, 0x7FFFFFFF ) );
if ( IsVertical() )
{
- aBigRect.Right() = 0;
- aBigRect.Left() = -0x7FFFFFFF;
+ if( IsTopToBottom() )
+ {
+ aBigRect.Right() = 0;
+ aBigRect.Left() = -0x7FFFFFFF;
+ }
+ else
+ {
+ aBigRect.Top() = -0x7FFFFFFF;
+ aBigRect.Bottom() = 0;
+ }
}
pImpEditEngine->Paint( aTmpDev.get(), aBigRect, Point(), true );
}
diff --git a/editeng/source/editeng/editobj.cxx b/editeng/source/editeng/editobj.cxx
index 17f9f13e9497..778bb6677f5d 100644
--- a/editeng/source/editeng/editobj.cxx
+++ b/editeng/source/editeng/editobj.cxx
@@ -356,9 +356,14 @@ bool EditTextObject::IsVertical() const
return mpImpl->IsVertical();
}
-void EditTextObject::SetVertical( bool bVertical )
+bool EditTextObject::IsTopToBottom() const
{
- return mpImpl->SetVertical(bVertical);
+ return mpImpl->IsTopToBottom();
+}
+
+void EditTextObject::SetVertical( bool bVertical, bool bTopToBottom )
+{
+ return mpImpl->SetVertical(bVertical, bTopToBottom);
}
SvtScriptType EditTextObject::GetScriptType() const
@@ -560,6 +565,7 @@ EditTextObjectImpl::EditTextObjectImpl( EditTextObject* pFront, SfxItemPool* pP
}
bVertical = false;
+ bIsTopToBottomVert = false;
bStoreUnicodeStrings = false;
nScriptType = SvtScriptType::NONE;
}
@@ -572,6 +578,7 @@ EditTextObjectImpl::EditTextObjectImpl( EditTextObject* pFront, const EditTextOb
nUserType = r.nUserType;
nObjSettings = r.nObjSettings;
bVertical = r.bVertical;
+ bIsTopToBottomVert = r.bIsTopToBottomVert;
nScriptType = r.nScriptType;
pPortionInfo = nullptr; // Do not copy PortionInfo
bStoreUnicodeStrings = false;
@@ -653,12 +660,22 @@ std::vector<svl::SharedString> EditTextObjectImpl::GetSharedStrings() const
return aSSs;
}
+bool EditTextObjectImpl::IsVertical() const
+{
+ return bVertical;
+}
+
+bool EditTextObjectImpl::IsTopToBottom() const
+{
+ return bIsTopToBottomVert;
+}
-void EditTextObjectImpl::SetVertical( bool b )
+void EditTextObjectImpl::SetVertical( bool bVert, bool bTopToBottom)
{
- if ( b != bVertical )
+ if (bVert != bVertical || bTopToBottom != (bVert && bIsTopToBottomVert))
{
- bVertical = b;
+ bVertical = bVert;
+ bIsTopToBottomVert = bVert && bTopToBottom;
ClearPortionInfo();
}
}
@@ -1088,7 +1105,7 @@ public:
void EditTextObjectImpl::StoreData( SvStream& rOStream ) const
{
- sal_uInt16 nVer = 602;
+ sal_uInt16 nVer = 603;
rOStream.WriteUInt16( nVer );
rOStream.WriteBool( bOwnerOfPool );
@@ -1235,6 +1252,7 @@ void EditTextObjectImpl::StoreData( SvStream& rOStream ) const
rOStream.WriteUInt32( nObjSettings );
rOStream.WriteBool( bVertical );
+ rOStream.WriteBool( bIsTopToBottomVert );
rOStream.WriteUInt16( static_cast<sal_uInt16>(nScriptType) );
rOStream.WriteBool( bStoreUnicodeStrings );
@@ -1487,6 +1505,13 @@ void EditTextObjectImpl::CreateData( SvStream& rIStream )
bVertical = bTmp;
}
+ if (nVersion >= 603)
+ {
+ bool bTmp(false);
+ rIStream.ReadCharAsBool(bTmp);
+ bIsTopToBottomVert = bTmp;
+ }
+
if ( nVersion >= 602 )
{
sal_uInt16 aTmp16;
@@ -1577,7 +1602,8 @@ bool EditTextObjectImpl::operator==( const EditTextObjectImpl& rCompare ) const
( nMetric != rCompare.nMetric ) ||
( nUserType!= rCompare.nUserType ) ||
( nScriptType != rCompare.nScriptType ) ||
- ( bVertical != rCompare.bVertical ) )
+ ( bVertical != rCompare.bVertical ) ||
+ ( bIsTopToBottomVert != rCompare.bIsTopToBottomVert ) )
return false;
for (size_t i = 0, n = aContents.size(); i < n; ++i)
diff --git a/editeng/source/editeng/editobj2.hxx b/editeng/source/editeng/editobj2.hxx
index d9efd1fb200d..928f4ba12b84 100644
--- a/editeng/source/editeng/editobj2.hxx
+++ b/editeng/source/editeng/editobj2.hxx
@@ -182,6 +182,7 @@ private:
bool bOwnerOfPool:1;
bool bVertical:1;
+ bool bIsTopToBottomVert : 1;
bool bStoreUnicodeStrings:1;
bool ImpChangeStyleSheets( const OUString& rOldName, SfxStyleFamily eOldFamily,
@@ -204,8 +205,9 @@ public:
void NormalizeString( svl::SharedStringPool& rPool );
std::vector<svl::SharedString> GetSharedStrings() const;
- bool IsVertical() const { return bVertical;}
- void SetVertical( bool b );
+ bool IsVertical() const;
+ bool IsTopToBottom() const;
+ void SetVertical( bool bVert, bool bTopToBottom = true);
SvtScriptType GetScriptType() const { return nScriptType;}
void SetScriptType( SvtScriptType nType );
diff --git a/editeng/source/editeng/impedit.cxx b/editeng/source/editeng/impedit.cxx
index 25df5d898fd8..43cb55259fb9 100644
--- a/editeng/source/editeng/impedit.cxx
+++ b/editeng/source/editeng/impedit.cxx
@@ -513,6 +513,11 @@ bool ImpEditView::IsVertical() const
return pEditEngine->pImpEditEngine->IsVertical();
}
+bool ImpEditView::IsTopToBottom() const
+{
+ return pEditEngine->pImpEditEngine->IsTopToBottom();
+}
+
tools::Rectangle ImpEditView::GetVisDocArea() const
{
return tools::Rectangle( GetVisDocLeft(), GetVisDocTop(), GetVisDocRight(), GetVisDocBottom() );
@@ -530,8 +535,16 @@ Point ImpEditView::GetDocPos( const Point& rWindowPos ) const
}
else
{
- aPoint.X() = rWindowPos.Y() - aOutArea.Top() + GetVisDocLeft();
- aPoint.Y() = aOutArea.Right() - rWindowPos.X() + GetVisDocTop();
+ if (pEditEngine->pImpEditEngine->IsTopToBottom())
+ {
+ aPoint.X() = rWindowPos.Y() - aOutArea.Top() + GetVisDocLeft();
+ aPoint.Y() = aOutArea.Right() - rWindowPos.X() + GetVisDocTop();
+ }
+ else
+ {
+ aPoint.X() = aOutArea.Bottom() - rWindowPos.Y() + GetVisDocLeft();
+ aPoint.Y() = rWindowPos.X() - aOutArea.Left() + GetVisDocTop();
+ }
}
return aPoint;
@@ -549,8 +562,16 @@ Point ImpEditView::GetWindowPos( const Point& rDocPos ) const
}
else
{
- aPoint.X() = aOutArea.Right() - rDocPos.Y() + GetVisDocTop();
- aPoint.Y() = rDocPos.X() + aOutArea.Top() - GetVisDocLeft();
+ if (pEditEngine->pImpEditEngine->IsTopToBottom())
+ {
+ aPoint.X() = aOutArea.Right() - rDocPos.Y() + GetVisDocTop();
+ aPoint.Y() = rDocPos.X() + aOutArea.Top() - GetVisDocLeft();
+ }
+ else
+ {
+ aPoint.X() = aOutArea.Left() + rDocPos.Y() - GetVisDocTop();
+ aPoint.Y() = aOutArea.Bottom() - rDocPos.X() + GetVisDocLeft();
+ }
}
return aPoint;
@@ -916,8 +937,8 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
if ( nDocDiffX | nDocDiffY )
{
- long nDiffX = !IsVertical() ? nDocDiffX : -nDocDiffY;
- long nDiffY = !IsVertical() ? nDocDiffY : nDocDiffX;
+ long nDiffX = !IsVertical() ? nDocDiffX : (IsTopToBottom() ? -nDocDiffY : nDocDiffY);
+ long nDiffY = !IsVertical() ? nDocDiffY : (IsTopToBottom() ? nDocDiffX : -nDocDiffX);
// Negative: Back to the top or left edge
if ( ( std::abs( nDiffY ) > pEditEngine->GetOnePixelInRef() ) && DoBigScroll() )
@@ -993,7 +1014,7 @@ void ImpEditView::ShowCursor( bool bGotoCursor, bool bForceVisCursor )
aCursorSz.Width() = aOldSz.Height();
aCursorSz.Height() = aOldSz.Width();
GetCursor()->SetPos( aCursorRect.TopRight() );
- GetCursor()->SetOrientation( 2700 );
+ GetCursor()->SetOrientation( IsTopToBottom() ? 2700 : 900 );
}
else
// #i32593# Reset correct orientation in horizontal layout
@@ -1087,8 +1108,16 @@ Pair ImpEditView::Scroll( long ndX, long ndY, ScrollRangeCheck nRangeCheck )
}
else
{
- aNewVisArea.Top() += ndX;
- aNewVisArea.Bottom() += ndX;
+ if( IsTopToBottom() )
+ {
+ aNewVisArea.Top() += ndX;
+ aNewVisArea.Bottom() += ndX;
+ }
+ else
+ {
+ aNewVisArea.Top() -= ndX;
+ aNewVisArea.Bottom() -= ndX;
+ }
}
if ( ( nRangeCheck == ScrollRangeCheck::PaperWidthTextSize ) && ( aNewVisArea.Bottom() > (long)pEditEngine->pImpEditEngine->GetTextHeight() ) )
{
@@ -1107,8 +1136,16 @@ Pair ImpEditView::Scroll( long ndX, long ndY, ScrollRangeCheck nRangeCheck )
}
else
{
- aNewVisArea.Left() -= ndY;
- aNewVisArea.Right() -= ndY;
+ if (IsTopToBottom())
+ {
+ aNewVisArea.Left() -= ndY;
+ aNewVisArea.Right() -= ndY;
+ }
+ else
+ {
+ aNewVisArea.Left() += ndY;
+ aNewVisArea.Right() += ndY;
+ }
}
if ( ( nRangeCheck == ScrollRangeCheck::PaperWidthTextSize ) && ( aNewVisArea.Right() > (long)pEditEngine->pImpEditEngine->CalcTextWidth( false ) ) )
{
@@ -1119,8 +1156,8 @@ Pair ImpEditView::Scroll( long ndX, long ndY, ScrollRangeCheck nRangeCheck )
aNewVisArea.Move( -aNewVisArea.Left(), 0 );
// The difference must be alignt on pixel (due to scroll!)
- long nDiffX = !IsVertical() ? ( GetVisDocLeft() - aNewVisArea.Left() ) : -( GetVisDocTop() - aNewVisArea.Top() );
- long nDiffY = !IsVertical() ? ( GetVisDocTop() - aNewVisArea.Top() ) : ( GetVisDocLeft() - aNewVisArea.Left() );
+ long nDiffX = !IsVertical() ? ( GetVisDocLeft() - aNewVisArea.Left() ) : (IsTopToBottom() ? -( GetVisDocTop() - aNewVisArea.Top() ) : (GetVisDocTop() - aNewVisArea.Top()));
+ long nDiffY = !IsVertical() ? ( GetVisDocTop() - aNewVisArea.Top() ) : (IsTopToBottom() ? (GetVisDocLeft() - aNewVisArea.Left()) : -(GetVisDocTop() - aNewVisArea.Top()));
Size aDiffs( nDiffX, nDiffY );
aDiffs = pOutWin->LogicToPixel( aDiffs );
@@ -1139,7 +1176,12 @@ Pair ImpEditView::Scroll( long ndX, long ndY, ScrollRangeCheck nRangeCheck )
if ( !IsVertical() )
aVisDocStartPos.Move( -nRealDiffX, -nRealDiffY );
else
- aVisDocStartPos.Move( -nRealDiffY, nRealDiffX );
+ {
+ if (IsTopToBottom())
+ aVisDocStartPos.Move(-nRealDiffY, nRealDiffX);
+ else
+ aVisDocStartPos.Move(nRealDiffY, -nRealDiffX);
+ }
// Move by aligned value does not necessarily result in aligned
// rectangle ...
aVisDocStartPos = pOutWin->LogicToPixel( aVisDocStartPos );
@@ -2101,8 +2143,16 @@ void ImpEditView::dragOver(const css::datatransfer::dnd::DropTargetDragEvent& rD
}
else
{
- aEditCursor.Left()--;
- aEditCursor.Right()++;
+ if( IsTopToBottom() )
+ {
+ aEditCursor.Left()--;
+ aEditCursor.Right()++;
+ }
+ else
+ {
+ aEditCursor.Left()++;
+ aEditCursor.Right()--;
+ }
}
aEditCursor = GetWindow()->PixelToLogic( aEditCursor );
}
diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx
index fe0ce85c2386..651441ab8fab 100644
--- a/editeng/source/editeng/impedit.hxx
+++ b/editeng/source/editeng/impedit.hxx
@@ -295,6 +295,7 @@ public:
const tools::Rectangle& GetOutputArea() const { return aOutArea; }
bool IsVertical() const;
+ bool IsTopToBottom() const;
bool PostKeyEvent( const KeyEvent& rKeyEvent, vcl::Window* pFrameWin );
@@ -722,8 +723,9 @@ public:
const Size& GetPaperSize() const { return aPaperSize; }
void SetPaperSize( const Size& rSz ) { aPaperSize = rSz; }
- void SetVertical( bool bVertical );
+ void SetVertical( bool bVertical, bool bTopToBottom = true);
bool IsVertical() const { return GetEditDoc().IsVertical(); }
+ bool IsTopToBottom() const { return GetEditDoc().IsTopToBottom(); }
bool IsPageOverflow( ) const;
diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx
index 4e656233dac0..462229e2f25e 100644
--- a/editeng/source/editeng/impedit3.cxx
+++ b/editeng/source/editeng/impedit3.cxx
@@ -2580,11 +2580,11 @@ void ImpEditEngine::SetTextRanger( TextRanger* pRanger )
}
}
-void ImpEditEngine::SetVertical( bool bVertical )
+void ImpEditEngine::SetVertical( bool bVertical, bool bTopToBottom)
{
- if ( IsVertical() != bVertical )
+ if ( IsVertical() != bVertical || IsTopToBottom() != (bVertical && bTopToBottom))
{
- GetEditDoc().SetVertical( bVertical );
+ GetEditDoc().SetVertical( bVertical, bTopToBottom);
bool bUseCharAttribs = bool(aStatus.GetControlWord() & EEControlBits::USECHARATTRIBS);
GetEditDoc().CreateDefFont( bUseCharAttribs );
if ( IsFormatted() )
@@ -2963,7 +2963,8 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
sal_Int32 nIndex = 0;
if ( pPortion->IsVisible() && (
( !IsVertical() && ( ( aStartPos.Y() + nParaHeight ) > aClipRect.Top() ) ) ||
- ( IsVertical() && ( ( aStartPos.X() - nParaHeight ) < aClipRect.Right() ) ) ) )
+ ( IsVertical() && IsTopToBottom() && ( ( aStartPos.X() - nParaHeight ) < aClipRect.Right() ) ) ||
+ ( IsVertical() && !IsTopToBottom() && ( ( aStartPos.X() + nParaHeight ) > aClipRect.Left() ) ) ) )
{
@@ -2977,7 +2978,12 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
if ( !IsVertical() )
aStartPos.Y() += pPortion->GetFirstLineOffset();
else
- aStartPos.X() -= pPortion->GetFirstLineOffset();
+ {
+ if( IsTopToBottom() )
+ aStartPos.X() -= pPortion->GetFirstLineOffset();
+ else
+ aStartPos.X() += pPortion->GetFirstLineOffset();
+ }
Point aParaStart( aStartPos );
@@ -3002,15 +3008,27 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
}
else
{
- aTmpPos.Y() += pLine->GetStartPosX();
- aTmpPos.X() -= pLine->GetMaxAscent();
- aStartPos.X() -= pLine->GetHeight();
- if (nLine != nLastLine)
- aStartPos.X() -= nVertLineSpacing;
+ if ( IsTopToBottom() )
+ {
+ aTmpPos.Y() += pLine->GetStartPosX();
+ aTmpPos.X() -= pLine->GetMaxAscent();
+ aStartPos.X() -= pLine->GetHeight();
+ if (nLine != nLastLine)
+ aStartPos.X() -= nVertLineSpacing;
+ }
+ else
+ {
+ aTmpPos.Y() -= pLine->GetStartPosX();
+ aTmpPos.X() += pLine->GetMaxAscent();
+ aStartPos.X() += pLine->GetHeight();
+ if (nLine != nLastLine)
+ aStartPos.X() += nVertLineSpacing;
+ }
}
if ( ( !IsVertical() && ( aStartPos.Y() > aClipRect.Top() ) )
- || ( IsVertical() && aStartPos.X() < aClipRect.Right() ) )
+ || ( IsVertical() && IsTopToBottom() && aStartPos.X() < aClipRect.Right() )
+ || ( IsVertical() && !IsTopToBottom() && aStartPos.X() > aClipRect.Left() ) )
{
bPaintBullet = false;
@@ -3048,9 +3066,18 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
}
else
{
- aTmpPos.Y() = aStartPos.Y() + nPortionXOffset;
- if ( aTmpPos.Y() > aClipRect.Bottom() )
- break; // No further output in line necessary
+ if( IsTopToBottom() )
+ {
+ aTmpPos.Y() = aStartPos.Y() + nPortionXOffset;
+ if ( aTmpPos.Y() > aClipRect.Bottom() )
+ break; // No further output in line necessary
+ }
+ else
+ {
+ aTmpPos.Y() = aStartPos.Y() - nPortionXOffset;
+ if (aTmpPos.Y() < aClipRect.Top())
+ break; // No further output in line necessary
+ }
}
switch ( rTextPortion.GetKind() )
@@ -3141,8 +3168,16 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
}
else
{
- aTopLeftRectPos.Y() += nAdvanceX;
- aTopLeftRectPos.X() -= nAdvanceY;
+ if( IsTopToBottom() )
+ {
+ aTopLeftRectPos.Y() -= nAdvanceX;
+ aTopLeftRectPos.X() += nAdvanceY;
+ }
+ else
+ {
+ aTopLeftRectPos.Y() += nAdvanceX;
+ aTopLeftRectPos.X() -= nAdvanceY;
+ }
}
Point aBottomRightRectPos( aTopLeftRectPos );
@@ -3153,8 +3188,16 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
}
else
{
- aBottomRightRectPos.X() -= pLine->GetHeight();
- aBottomRightRectPos.Y() += 2 * nHalfBlankWidth;
+ if (IsTopToBottom())
+ {
+ aBottomRightRectPos.X() += pLine->GetHeight();
+ aBottomRightRectPos.Y() -= 2 * nHalfBlankWidth;
+ }
+ else
+ {
+ aBottomRightRectPos.X() -= pLine->GetHeight();
+ aBottomRightRectPos.Y() += 2 * nHalfBlankWidth;
+ }
}
pOutDev->Push( PushFlags::FILLCOLOR );
@@ -3187,7 +3230,10 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
}
else
{
- aSlashPos.Y() = aTopLeftRectPos.Y() + nAddX;
+ if (IsTopToBottom())
+ aSlashPos.Y() = aTopLeftRectPos.Y() + nAddX;
+ else
+ aSlashPos.Y() = aTopLeftRectPos.Y() - nAddX;
}
aTmpFont.QuickDrawText( pOutDev, aSlashPos, aSlash, 0, 1 );
@@ -3226,8 +3272,16 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
}
else
{
- aTmpPos.X() -= pLine->GetMaxAscent();
- aStartPos.X() -= pLine->GetHeight();
+ if (IsTopToBottom())
+ {
+ aTmpPos.X() -= pLine->GetMaxAscent();
+ aStartPos.X() -= pLine->GetHeight();
+ }
+ else
+ {
+ aTmpPos.X() += pLine->GetMaxAscent();
+ aStartPos.X() += pLine->GetHeight();
+ }
}
}
std::vector< sal_Int32 >::iterator curIt = itSubLines;
@@ -3404,7 +3458,12 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
if ( !IsVertical() )
aOutPos.Y() -= nDiff;
else
- aOutPos.X() += nDiff;
+ {
+ if (IsTopToBottom())
+ aOutPos.X() += nDiff;
+ else
+ aOutPos.X() -= nDiff;
+ }
aRedLineTmpPos = aOutPos;
aTmpFont.SetEscapement( 0 );
}
@@ -3534,7 +3593,10 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
if( !IsVertical() )
aRedLineTmpPos.Y() -= nShift;
else
- aRedLineTmpPos.X() += nShift;
+ if (IsTopToBottom())
+ aRedLineTmpPos.X() += nShift;
+ else
+ aRedLineTmpPos.X() -= nShift;
}
}
Color aOldColor( pOutDev->GetLineColor() );
@@ -3651,13 +3713,20 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
if ( !IsVertical() )
aStartPos.Y() += nSBL;
else
- aStartPos.X() -= nSBL;
+ {
+ if( IsTopToBottom() )
+ aStartPos.X() -= nSBL;
+ else
+ aStartPos.X() += nSBL;
+ }
}
// no more visible actions?
if ( !IsVertical() && ( aStartPos.Y() >= aClipRect.Bottom() ) )
break;
- else if ( IsVertical() && ( aStartPos.X() <= aClipRect.Left() ) )
+ else if ( IsVertical() && IsTopToBottom() && ( aStartPos.X() <= aClipRect.Left() ) )
+ break;
+ else if (IsVertical() && !IsTopToBottom() && (aStartPos.X() >= aClipRect.Right()))
break;
}
@@ -3668,7 +3737,12 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
if ( !IsVertical() )
aStartPos.Y() += nUL;
else
- aStartPos.X() -= nUL;
+ {
+ if (IsTopToBottom())
+ aStartPos.X() -= nUL;
+ else
+ aStartPos.X() += nUL;
+ }
}
// #108052# Safer way for #i108052# and #i118881#: If for the current ParaPortion
@@ -3697,7 +3771,12 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
if ( !IsVertical() )
aStartPos.Y() += nParaHeight;
else
- aStartPos.X() -= nParaHeight;
+ {
+ if (IsTopToBottom())
+ aStartPos.X() -= nParaHeight;
+ else
+ aStartPos.X() += nParaHeight;
+ }
}
if ( pPDFExtOutDevData )
@@ -3706,7 +3785,9 @@ void ImpEditEngine::Paint( OutputDevice* pOutDev, tools::Rectangle aClipRect, Po
// no more visible actions?
if ( !IsVertical() && ( aStartPos.Y() > aClipRect.Bottom() ) )
break;
- if ( IsVertical() && ( aStartPos.X() < aClipRect.Left() ) )
+ if ( IsVertical() && IsTopToBottom() && ( aStartPos.X() < aClipRect.Left() ) )
+ break;
+ if (IsVertical() && !IsTopToBottom() && ( aStartPos.X() > aClipRect.Right() ) )
break;
}
if ( aStatus.DoRestoreFont() )
@@ -3735,9 +3816,18 @@ void ImpEditEngine::Paint( ImpEditView* pView, const tools::Rectangle& rRect, Ou
}
else
{
- aStartPos = pView->GetOutputArea().TopRight();
- aStartPos.X() += pView->GetVisDocTop();
- aStartPos.Y() -= pView->GetVisDocLeft();
+ if( IsTopToBottom() )
+ {
+ aStartPos = pView->GetOutputArea().TopRight();
+ aStartPos.X() += pView->GetVisDocTop();
+ aStartPos.Y() -= pView->GetVisDocLeft();
+ }
+ else
+ {
+ aStartPos = pView->GetOutputArea().BottomLeft();
+ aStartPos.X() -= pView->GetVisDocTop();
+ aStartPos.Y() += pView->GetVisDocLeft();
+ }
}
// If Doc-width < Output Area,Width and not wrapped fields,
@@ -4029,8 +4119,13 @@ long ImpEditEngine::CalcVertLineSpacing(Point& rStartPos) const
return 0;
if (IsVertical())
- // Shift the text to the right for the asian layout mode.
- rStartPos.X() += nTotalSpace;
+ {
+ if( IsTopToBottom() )
+ // Shift the text to the right for the asian layout mode.
+ rStartPos.X() += nTotalSpace;
+ else
+ rStartPos.X() -= nTotalSpace;
+ }
return nTotalSpace / (nTotalLineCount-1);
}
diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx
index 99a926075737..ab1db9862c79 100644
--- a/editeng/source/editeng/impedit4.cxx
+++ b/editeng/source/editeng/impedit4.cxx
@@ -1023,7 +1023,7 @@ EditTextObject* ImpEditEngine::CreateTextObject(const EditSelection& rSel)
EditTextObject* ImpEditEngine::CreateTextObject( EditSelection aSel, SfxItemPool* pPool, bool bAllowBigObjects, sal_Int32 nBigObjectStart )
{
EditTextObject* pTxtObj = new EditTextObject(pPool);
- pTxtObj->SetVertical( IsVertical() );
+ pTxtObj->SetVertical( IsVertical(), IsTopToBottom());
MapUnit eMapUnit = aEditDoc.GetItemPool().GetMetric( DEF_METRIC );
pTxtObj->mpImpl->SetMetric( (sal_uInt16) eMapUnit );
if ( pTxtObj->mpImpl->IsOwnerOfPool() )
@@ -1181,7 +1181,7 @@ void ImpEditEngine::SetText( const EditTextObject& rTextObject )
EnableUndo( false );
InsertText( rTextObject, EditSelection( aPaM, aPaM ) );
- SetVertical( rTextObject.IsVertical() );
+ SetVertical( rTextObject.IsVertical(), rTextObject.IsTopToBottom());
DBG_ASSERT( !HasUndoManager() || !GetUndoManager().GetUndoActionCount(), "From where comes the Undo in SetText ?!" );
SetUpdateMode( _bUpdate );
diff --git a/editeng/source/outliner/outlin2.cxx b/editeng/source/outliner/outlin2.cxx
index d3504c94b24f..08495c39fa07 100644
--- a/editeng/source/outliner/outlin2.cxx
+++ b/editeng/source/outliner/outlin2.cxx
@@ -526,9 +526,9 @@ const EditEngine& Outliner::GetEditEngine() const
return *pEditEngine;
}
-void Outliner::SetVertical( bool b )
+void Outliner::SetVertical( bool bVertical, bool bTopToBottom)
{
- pEditEngine->SetVertical( b );
+ pEditEngine->SetVertical(bVertical, bTopToBottom);
}
bool Outliner::IsVertical() const
diff --git a/editeng/source/outliner/outlobj.cxx b/editeng/source/outliner/outlobj.cxx
index 539e4c2b2652..1cbd51f5700c 100644
--- a/editeng/source/outliner/outlobj.cxx
+++ b/editeng/source/outliner/outlobj.cxx
@@ -130,12 +130,18 @@ bool OutlinerParaObject::IsVertical() const
return mpImpl->mpEditTextObject->IsVertical();
}
-void OutlinerParaObject::SetVertical(bool bNew)
+bool OutlinerParaObject::IsTopToBottom() const
+{
+ return mpImpl->mpEditTextObject->IsTopToBottom();
+}
+
+void OutlinerParaObject::SetVertical(bool bNew, bool bTopToBottom)
{
const ::o3tl::cow_wrapper< OutlinerParaObjData >* pImpl = &mpImpl;
- if ( ( *pImpl )->mpEditTextObject->IsVertical() != bNew )
+ if ( ( *pImpl )->mpEditTextObject->IsVertical() != bNew ||
+ (*pImpl)->mpEditTextObject->IsTopToBottom() != (bNew && bTopToBottom))
{
- mpImpl->mpEditTextObject->SetVertical(bNew);
+ mpImpl->mpEditTextObject->SetVertical(bNew, bTopToBottom);
}
}
diff --git a/include/editeng/charrotateitem.hxx b/include/editeng/charrotateitem.hxx
index fec33b5d4944..292712cc6823 100644
--- a/include/editeng/charrotateitem.hxx
+++ b/include/editeng/charrotateitem.hxx
@@ -63,6 +63,7 @@ public:
void SetBottomToTop() { SetValue(900); }
bool IsTopToBottom() const { return 2700 == GetValue(); }
bool IsBottomToTop() const { return 900 == GetValue(); }
+ bool IsVertical() const { return IsTopToBottom() || IsBottomToTop(); }
void dumpAsXml(struct _xmlTextWriter* pWriter) const override;
};
diff --git a/include/editeng/editeng.hxx b/include/editeng/editeng.hxx
index a8fa950a6805..6b3ba51a6578 100644
--- a/include/editeng/editeng.hxx
+++ b/include/editeng/editeng.hxx
@@ -242,8 +242,9 @@ public:
void SetPaperSize( const Size& rSize );
const Size& GetPaperSize() const;
- void SetVertical( bool bVertical );
+ void SetVertical( bool bVertical, bool bTopToBottom = true );
bool IsVertical() const;
+ bool IsTopToBottom() const;
void SetFixedCellHeight( bool bUseFixedCellHeight );
diff --git a/include/editeng/editobj.hxx b/include/editeng/editobj.hxx
index 509954069b09..2833be068fa7 100644
--- a/include/editeng/editobj.hxx
+++ b/include/editeng/editobj.hxx
@@ -86,7 +86,8 @@ public:
void SetUserType( OutlinerMode n );
bool IsVertical() const;
- void SetVertical( bool bVertical );
+ bool IsTopToBottom() const;
+ void SetVertical( bool bVertical, bool bTopToBottom = true);
SvtScriptType GetScriptType() const;
diff --git a/include/editeng/outliner.hxx b/include/editeng/outliner.hxx
index 665497ed33a3..5d2ce0044517 100644
--- a/include/editeng/outliner.hxx
+++ b/include/editeng/outliner.hxx
@@ -684,7 +684,7 @@ public:
void Init( OutlinerMode nOutlinerMode );
OutlinerMode GetMode() const { return nOutlinerMode; }
- void SetVertical( bool bVertical );
+ void SetVertical( bool bVertical, bool bTopToBottom = true);
bool IsVertical() const;
void SetFixedCellHeight( bool bUseFixedCellHeight );
diff --git a/include/editeng/outlobj.hxx b/include/editeng/outlobj.hxx
index b296d7907376..1477e38d8b5b 100644
--- a/include/editeng/outlobj.hxx
+++ b/include/editeng/outlobj.hxx
@@ -81,7 +81,8 @@ public:
// vertical access
bool IsVertical() const;
- void SetVertical(bool bNew);
+ bool IsTopToBottom() const;
+ void SetVertical(bool bNew, bool bTopToBottom = true);
// data read access
sal_Int32 Count() const;
diff --git a/include/svx/svddef.hxx b/include/svx/svddef.hxx
index f3bf1ea8484a..2afa2f94f4b8 100644
--- a/include/svx/svddef.hxx
+++ b/include/svx/svddef.hxx
@@ -296,8 +296,9 @@
#define SDRATTR_TABLE_BORDER_INNER (SDRATTR_TABLE_FIRST+1)
#define SDRATTR_TABLE_BORDER_TLBR (SDRATTR_TABLE_FIRST+2)
#define SDRATTR_TABLE_BORDER_BLTR (SDRATTR_TABLE_FIRST+3)
+#define SDRATTR_TABLE_TEXT_ROTATION (SDRATTR_TABLE_FIRST+4)
-#define SDRATTR_TABLE_LAST (SDRATTR_TABLE_BORDER_BLTR)
+#define SDRATTR_TABLE_LAST (SDRATTR_TABLE_TEXT_ROTATION)
#define SDRATTR_END SDRATTR_TABLE_LAST /* 1357 */ /* 1333 V4+++*/ /* 1243 V4+++*/ /*1213*/ /*1085*/ /*1040*/ /*Pool V2: 1123,V1: 1065 */
diff --git a/include/svx/svdoashp.hxx b/include/svx/svdoashp.hxx
index 483455aa2d25..dd4d03789c51 100644
--- a/include/svx/svdoashp.hxx
+++ b/include/svx/svdoashp.hxx
@@ -210,7 +210,7 @@ public:
virtual bool AdjustTextFrameWidthAndHeight() override;
virtual bool IsAutoGrowHeight() const override;
virtual bool IsAutoGrowWidth() const override;
- virtual void SetVerticalWriting( bool bVertical ) override;
+ virtual void SetVerticalWriting(bool bVertical) override;
virtual void TakeTextEditArea(Size* pPaperMin, Size* pPaperMax, tools::Rectangle* pViewInit, tools::Rectangle* pViewMin) const override;
virtual void EndTextEdit( SdrOutliner& rOutl ) override;
virtual void TakeTextAnchorRect( tools::Rectangle& rAnchorRect ) const override;
diff --git a/sd/source/ui/func/futext.cxx b/sd/source/ui/func/futext.cxx
index 4f9955ceea3a..e22615cb5728 100644
--- a/sd/source/ui/func/futext.cxx
+++ b/sd/source/ui/func/futext.cxx
@@ -1055,7 +1055,9 @@ void FuText::SetInEditMode(const MouseEvent& rMEvt, bool bQuickDrag)
if( pTextObj )
{
OutlinerParaObject* pOPO = pTextObj->GetOutlinerParaObject();
- if( ( pOPO && pOPO->IsVertical() ) || (nSlotId == SID_ATTR_CHAR_VERTICAL) || (nSlotId == SID_TEXT_FITTOSIZE_VERTICAL) )
+ if( pOPO && pOPO->IsVertical() )
+ pOutl->SetVertical( true, pOPO->IsTopToBottom());
+ else if (nSlotId == SID_ATTR_CHAR_VERTICAL || nSlotId == SID_TEXT_FITTOSIZE_VERTICAL)
pOutl->SetVertical( true );
if( pTextObj->getTextCount() > 1 )
diff --git a/svx/source/svdraw/svdattr.cxx b/svx/source/svdraw/svdattr.cxx
index 7a09e8a8c313..427242539cc3 100644
--- a/svx/source/svdraw/svdattr.cxx
+++ b/svx/source/svdraw/svdattr.cxx
@@ -38,6 +38,7 @@
#include <editeng/adjustitem.hxx>
#include <editeng/editdata.hxx>
#include <editeng/writingmodeitem.hxx>
+#include <editeng/charrotateitem.hxx>
#include <i18nutil/unicode.hxx>
#include <svl/solar.hrc>
#include <tools/bigint.hxx>
@@ -320,6 +321,7 @@ SdrItemPool::SdrItemPool(
rPoolDefaults[ SDRATTR_TABLE_BORDER_INNER - SDRATTR_START ] = pBoxInfoItem;
rPoolDefaults[ SDRATTR_TABLE_BORDER_TLBR - SDRATTR_START ] = new SvxLineItem( SDRATTR_TABLE_BORDER_TLBR );
rPoolDefaults[ SDRATTR_TABLE_BORDER_BLTR - SDRATTR_START ] = new SvxLineItem( SDRATTR_TABLE_BORDER_BLTR );
+ rPoolDefaults[ SDRATTR_TABLE_TEXT_ROTATION - SDRATTR_START ] = new SvxTextRotateItem(0, SDRATTR_TABLE_TEXT_ROTATION);
// set own ItemInfos
mpLocalItemInfos[SDRATTR_SHADOW-SDRATTR_START]._nSID=SID_ATTR_FILL_SHADOW;
diff --git a/svx/source/svdraw/svdotext.cxx b/svx/source/svdraw/svdotext.cxx
index 6e75fd299131..50522622e646 100644
--- a/svx/source/svdraw/svdotext.cxx
+++ b/svx/source/svdraw/svdotext.cxx
@@ -1384,7 +1384,7 @@ void SdrTextObj::NbcSetOutlinerParaObjectForText( OutlinerParaObject* pTextObjec
if (pText && pText->GetOutlinerParaObject())
{
- SvxWritingModeItem aWritingMode(pText->GetOutlinerParaObject()->IsVertical()
+ SvxWritingModeItem aWritingMode(pText->GetOutlinerParaObject()->IsVertical() && pText->GetOutlinerParaObject()->IsTopToBottom()
? css::text::WritingMode_TB_RL
: css::text::WritingMode_LR_TB,
SDRATTR_TEXTDIRECTION);
@@ -1529,6 +1529,7 @@ bool SdrTextObj::IsVerticalWriting() const
void SdrTextObj::SetVerticalWriting(bool bVertical)
{
OutlinerParaObject* pOutlinerParaObject = GetOutlinerParaObject();
+
if( !pOutlinerParaObject && bVertical )
{
// we only need to force a outliner para object if the default of
@@ -1537,7 +1538,8 @@ void SdrTextObj::SetVerticalWriting(bool bVertical)
pOutlinerParaObject = GetOutlinerParaObject();
}
- if( pOutlinerParaObject && (pOutlinerParaObject->IsVertical() != bVertical) )
+ if (pOutlinerParaObject &&
+ (pOutlinerParaObject->IsVertical() != bVertical))
{
// get item settings
const SfxItemSet& rSet = GetObjectItemSet();
@@ -1564,14 +1566,14 @@ void SdrTextObj::SetVerticalWriting(bool bVertical)
aNewSet.Put(makeSdrTextAutoGrowHeightItem(bAutoGrowWidth));
// Exchange horz and vert adjusts
- switch(eVert)
+ switch (eVert)
{
case SDRTEXTVERTADJUST_TOP: aNewSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_RIGHT)); break;
case SDRTEXTVERTADJUST_CENTER: aNewSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_CENTER)); break;
case SDRTEXTVERTADJUST_BOTTOM: aNewSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_LEFT)); break;
case SDRTEXTVERTADJUST_BLOCK: aNewSet.Put(SdrTextHorzAdjustItem(SDRTEXTHORZADJUST_BLOCK)); break;
}
- switch(eHorz)
+ switch (eHorz)
{
case SDRTEXTHORZADJUST_LEFT: aNewSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_BOTTOM)); break;
case SDRTEXTHORZADJUST_CENTER: aNewSet.Put(SdrTextVertAdjustItem(SDRTEXTVERTADJUST_CENTER)); break;
@@ -1582,7 +1584,7 @@ void SdrTextObj::SetVerticalWriting(bool bVertical)
SetObjectItemSet(aNewSet);
pOutlinerParaObject = GetOutlinerParaObject();
- if( pOutlinerParaObject )
+ if (pOutlinerParaObject)
{
// set ParaObject orientation accordingly
pOutlinerParaObject->SetVertical(bVertical);
@@ -1593,7 +1595,6 @@ void SdrTextObj::SetVerticalWriting(bool bVertical)
}
}
-
// transformation interface for StarOfficeAPI. This implements support for
// homogeneous 3x3 matrices containing the transformation of the SdrObject. At the
// moment it contains a shearX, rotation and translation, but for setting all linear
diff --git a/svx/source/svdraw/svdotextdecomposition.cxx b/svx/source/svdraw/svdotextdecomposition.cxx
index 926ae34dfc31..a05a428b6798 100644
--- a/svx/source/svdraw/svdotextdecomposition.cxx
+++ b/svx/source/svdraw/svdotextdecomposition.cxx
@@ -759,6 +759,7 @@ void SdrTextObj::impDecomposeAutoFitTextPrimitive(
const OutlinerParaObject* pOutlinerParaObject = rSdrAutofitTextPrimitive.getSdrText()->GetOutlinerParaObject();
OSL_ENSURE(pOutlinerParaObject, "impDecomposeBlockTextPrimitive used with no OutlinerParaObject (!)");
const bool bVerticalWriting(pOutlinerParaObject->IsVertical());
+ const bool bTopToBottom(pOutlinerParaObject->IsTopToBottom());
const Size aAnchorTextSize(Size(nAnchorTextWidth, nAnchorTextHeight));
if((rSdrAutofitTextPrimitive.getWordWrap() || IsTextFrame()))
@@ -829,8 +830,9 @@ void SdrTextObj::impDecomposeAutoFitTextPrimitive(
// translate relative to given primitive to get same rotation and shear
// as the master shape we are working on. For vertical, use the top-right
// corner
- const double fStartInX(bVerticalWriting ? aAdjustTranslate.getX() + aOutlinerScale.getX() : aAdjustTranslate.getX());
- aNewTransformA.translate(fStartInX, aAdjustTranslate.getY());
+ const double fStartInX(bVerticalWriting && bTopToBottom ? aAdjustTranslate.getX() + aOutlinerScale.getX() : aAdjustTranslate.getX());
+ const double fStartInY(bVerticalWriting && !bTopToBottom ? aAdjustTranslate.getY() + aOutlinerScale.getY() : aAdjustTranslate.getY());
+ aNewTransformA.translate(fStartInX, fStartInY);
// mirroring. We are now in aAnchorTextRange sizes. When mirroring in X and Y,
// move the null point which was top left to bottom right.
@@ -922,6 +924,7 @@ void SdrTextObj::impDecomposeBlockTextPrimitive(
const sal_uInt32 nAnchorTextWidth(FRound(aAnchorTextRange.getWidth() + 1L));
const sal_uInt32 nAnchorTextHeight(FRound(aAnchorTextRange.getHeight() + 1L));
const bool bVerticalWriting(rSdrBlockTextPrimitive.getOutlinerParaObject().IsVertical());
+ const bool bTopToBottom(rSdrBlockTextPrimitive.getOutlinerParaObject().IsTopToBottom());
const Size aAnchorTextSize(Size(nAnchorTextWidth, nAnchorTextHeight));
if(bIsCell)
@@ -1082,8 +1085,9 @@ void SdrTextObj::impDecomposeBlockTextPrimitive(
// Translate relative to given primitive to get same rotation and shear
// as the master shape we are working on. For vertical, use the top-right
// corner
- const double fStartInX(bVerticalWriting ? aAdjustTranslate.getX() + aOutlinerScale.getX() : aAdjustTranslate.getX());
- const basegfx::B2DTuple aAdjOffset(fStartInX, aAdjustTranslate.getY());
+ const double fStartInX(bVerticalWriting && bTopToBottom ? aAdjustTranslate.getX() + aOutlinerScale.getX() : aAdjustTranslate.getX());
+ const double fStartInY(bVerticalWriting && !bTopToBottom ? aAdjustTranslate.getY() + aOutlinerScale.getY() : aAdjustTranslate.getY());
+ const basegfx::B2DTuple aAdjOffset(fStartInX, fStartInY);
basegfx::B2DHomMatrix aNewTransformA(basegfx::tools::createTranslateB2DHomMatrix(aAdjOffset.getX(), aAdjOffset.getY()));
// mirroring. We are now in aAnchorTextRange sizes. When mirroring in X and Y,
@@ -1162,10 +1166,14 @@ void SdrTextObj::impDecomposeStretchTextPrimitive(
// needs to translate the text initially around object width to orient
// it relative to the topper right instead of the topper left
const bool bVertical(rSdrStretchTextPrimitive.getOutlinerParaObject().IsVertical());
+ const bool bTopToBottom(rSdrStretchTextPrimitive.getOutlinerParaObject().IsTopToBottom());
if(bVertical)
{
- aNewTransformA.translate(aScale.getX(), 0.0);
+ if(bTopToBottom)
+ aNewTransformA.translate(aScale.getX(), 0.0);
+ else
+ aNewTransformA.translate(0.0, aScale.getY());
}
// calculate global char stretching scale parameters. Use non-mirrored sizes
@@ -1517,6 +1525,7 @@ void SdrTextObj::impDecomposeChainedTextPrimitive(
OSL_ENSURE(pOutlinerParaObject, "impDecomposeBlockTextPrimitive used with no OutlinerParaObject (!)");
const bool bVerticalWriting(pOutlinerParaObject->IsVertical());
+ const bool bTopToBottom(pOutlinerParaObject->IsTopToBottom());
const Size aAnchorTextSize(Size(nAnchorTextWidth, nAnchorTextHeight));
if(IsTextFrame())
@@ -1593,8 +1602,9 @@ void SdrTextObj::impDecomposeChainedTextPrimitive(
// translate relative to given primitive to get same rotation and shear
// as the master shape we are working on. For vertical, use the top-right
// corner
- const double fStartInX(bVerticalWriting ? aAdjustTranslate.getX() + aOutlinerScale.getX() : aAdjustTranslate.getX());
- aNewTransformA.translate(fStartInX, aAdjustTranslate.getY());
+ const double fStartInX(bVerticalWriting && bTopToBottom ? aAdjustTranslate.getX() + aOutlinerScale.getX() : aAdjustTranslate.getX());
+ const double fStartInY(bVerticalWriting && !bTopToBottom ? aAdjustTranslate.getY() + aOutlinerScale.getY() : aAdjustTranslate.getY());
+ aNewTransformA.translate(fStartInX, fStartInY);
// mirroring. We are now in aAnchorTextRange sizes. When mirroring in X and Y,
// move the null point which was top left to bottom right.
diff --git a/svx/source/table/cell.cxx b/svx/source/table/cell.cxx
index 41601c98be83..814e69ce3790 100644
--- a/svx/source/table/cell.cxx
+++ b/svx/source/table/cell.cxx
@@ -51,6 +51,7 @@
#include "svx/unoshape.hxx"
#include "editeng/editobj.hxx"
#include "editeng/boxitem.hxx"
+#include <editeng/charrotateitem.hxx>
#include "svx/xflbstit.hxx"
#include "svx/xflbmtit.hxx"
#include <svx/svdpool.hxx>
@@ -284,6 +285,7 @@ namespace sdr
OutlinerParaObject* pTemp = pOutliner->CreateParaObject(0, nParaCount);
pOutliner->Clear();
+ pTemp->SetVertical(pParaObj->IsVertical(), pParaObj->IsTopToBottom());
mxCell->SetOutlinerParaObject(pTemp);
}
@@ -307,8 +309,7 @@ namespace sdr
bool bVertical(css::text::WritingMode_TB_RL == static_cast<const SvxWritingModeItem*>(pNewItem)->GetValue());
sdr::table::SdrTableObj& rObj = static_cast<sdr::table::SdrTableObj&>(GetSdrObject());
- if( rObj.IsVerticalWriting() != bVertical )
- rObj.SetVerticalWriting(bVertical);
+ rObj.SetVerticalWriting(bVertical);
// Set a cell vertical property
OutlinerParaObject* pParaObj = mxCell->GetEditOutlinerParaObject();
@@ -327,6 +328,50 @@ namespace sdr
}
}
+ if (pNewItem && (SDRATTR_TABLE_TEXT_ROTATION == nWhich))
+ {
+ const SvxTextRotateItem* pRotateItem = static_cast<const SvxTextRotateItem*>(pNewItem);
+
+ // Set a cell vertical property
+ OutlinerParaObject* pParaObj = mxCell->GetEditOutlinerParaObject();
+
+ const bool bOwnParaObj = pParaObj != nullptr;
+
+ if (pParaObj == nullptr)
+ pParaObj = mxCell->GetOutlinerParaObject();
+
+ if (pParaObj)
+ {
+ pParaObj->SetVertical(pRotateItem->IsVertical(), pRotateItem->IsTopToBottom());
+
+ if (bOwnParaObj)
+ delete pParaObj;
+ }
+
+ // Change autogrow direction
+ SdrTextObj& rObj = static_cast<SdrTextObj&>(GetSdrObject());
+
+ // rescue object size
+ tools::Rectangle aObjectRect = rObj.GetSnapRect();
+
+ const SfxItemSet& rSet = rObj.GetObjectItemSet();
+ bool bAutoGrowWidth = static_cast<const SdrOnOffItem&>(rSet.Get(SDRATTR_TEXT_AUTOGROWWIDTH)).GetValue();
+ bool bAutoGrowHeight = static_cast<const SdrOnOffItem&>(rSet.Get(SDRATTR_TEXT_AUTOGROWHEIGHT)).GetValue();
+
+ // prepare ItemSet to set exchanged width and height items
+ SfxItemSet aNewSet(*rSet.GetPool(),
+ SDRATTR_TEXT_AUTOGROWHEIGHT, SDRATTR_TEXT_AUTOGROWHEIGHT,
+ 0, 0);
+
+ aNewSet.Put(rSet);
+ aNewSet.Put(makeSdrTextAutoGrowWidthItem(bAutoGrowHeight));
+ aNewSet.Put(makeSdrTextAutoGrowHeightItem(bAutoGrowWidth));
+ rObj.SetObjectItemSet(aNewSet);
+
+ // restore object size
+ rObj.SetSnapRect(aObjectRect);
+ }
+
// call parent
AttributeProperties::ItemChange( nWhich, pNewItem );
}
diff --git a/svx/source/table/svdotable.cxx b/svx/source/table/svdotable.cxx
index 7aea17aebfdf..0b0596bae078 100644
--- a/svx/source/table/svdotable.cxx
+++ b/svx/source/table/svdotable.cxx
@@ -1943,9 +1943,9 @@ bool SdrTableObj::IsVerticalWriting() const
}
-void SdrTableObj::SetVerticalWriting(bool bVertical )
+void SdrTableObj::SetVerticalWriting(bool bVertical)
{
- if( bVertical != IsVerticalWriting() )
+ if(bVertical != IsVerticalWriting() )
{
SvxWritingModeItem aModeItem( css::text::WritingMode_LR_TB, SDRATTR_TEXTDIRECTION );
SetObjectItem( aModeItem );
diff --git a/svx/source/unodraw/unoshtxt.cxx b/svx/source/unodraw/unoshtxt.cxx
index cb5b73836645..0d688e55bf3c 100644
--- a/svx/source/unodraw/unoshtxt.cxx
+++ b/svx/source/unodraw/unoshtxt.cxx
@@ -635,7 +635,7 @@ SvxTextForwarder* SvxTextEditSourceImpl::GetBackgroundTextForwarder()
mpOutliner->SetStyleSheet( 0, pStyleSheet );
if( bVertical )
- mpOutliner->SetVertical( true );
+ mpOutliner->SetVertical( true, pOutlinerParaObject->IsTopToBottom());
}
// maybe we have to set the border attributes
commit 88b42085ab5af0f865573180e642af9b29f472e5
Author: Caolán McNamara <caolanm at redhat.com>
Date: Fri Apr 14 16:40:08 2017 +0100
convert cell menu to .ui
Change-Id: If0b17eb94a629d6a46d5fd44430e866135a4c002
diff --git a/include/svx/fmresids.hrc b/include/svx/fmresids.hrc
index 318cdd6d85c3..7ff02a58790f 100644
--- a/include/svx/fmresids.hrc
+++ b/include/svx/fmresids.hrc
@@ -64,7 +64,6 @@
// Menu-Id's -----------------------------------------------------------
#define RID_FMEXPLORER_POPUPMENU (RID_FORMS_START + 0)
#define RID_SVXMNU_COLS (RID_FORMS_START + 2)
-#define RID_SVXMNU_CELL (RID_FORMS_START + 3)
#define RID_FMSHELL_CONVERSIONMENU (RID_FORMS_START + 4)
#define RID_FM_FILTER_MENU (RID_FORMS_START + 5)
#define RID_MENU_DATANAVIGATOR (RID_FORMS_START + 10)
diff --git a/svx/UIConfig_svx.mk b/svx/UIConfig_svx.mk
index 278100146ffe..286b14ac9560 100644
--- a/svx/UIConfig_svx.mk
+++ b/svx/UIConfig_svx.mk
@@ -18,6 +18,7 @@ $(eval $(call gb_UIConfig_add_uifiles,svx,\
svx/uiconfig/ui/addnamespacedialog \
svx/uiconfig/ui/addsubmissiondialog \
svx/uiconfig/ui/asianphoneticguidedialog \
+ svx/uiconfig/ui/cellmenu \
svx/uiconfig/ui/chineseconversiondialog \
svx/uiconfig/ui/chinesedictionary \
svx/uiconfig/ui/colorwindow \
diff --git a/svx/source/fmcomp/gridctrl.cxx b/svx/source/fmcomp/gridctrl.cxx
index c4ee149afe30..363df1260eda 100644
--- a/svx/source/fmcomp/gridctrl.cxx
+++ b/svx/source/fmcomp/gridctrl.cxx
@@ -2860,14 +2860,10 @@ void DbGridControl::Command(const CommandEvent& rEvt)
}
else if (canCopyCellText(nRow, nColId))
{
- ScopedVclPtrInstance<PopupMenu> aContextMenu(SVX_RES(RID_SVXMNU_CELL));
- aContextMenu->RemoveDisabledEntries(true, true);
- switch (aContextMenu->Execute(this, rEvt.GetMousePosPixel()))
- {
- case SID_COPY:
- copyCellText(nRow, nColId);
- break;
- }
+ VclBuilder aBuilder(nullptr, VclBuilderContainer::getUIRootDir(), "svx/ui/cellmenu.ui", "");
+ VclPtr<PopupMenu> aContextMenu(aBuilder.get_menu("menu"));
+ if (aContextMenu->Execute(this, rEvt.GetMousePosPixel()))
+ copyCellText(nRow, nColId);
}
else
{
diff --git a/svx/source/fmcomp/gridctrl.src b/svx/source/fmcomp/gridctrl.src
index b5365864420e..443537dea90e 100644
--- a/svx/source/fmcomp/gridctrl.src
+++ b/svx/source/fmcomp/gridctrl.src
@@ -161,17 +161,4 @@ Menu RID_SVXMNU_COLS
};
};
-Menu RID_SVXMNU_CELL
-{
- ItemList =
- {
- MenuItem
- {
- Identifier = SID_COPY ;
- Command = ".uno:Copy" ;
- Text [ en-US ] = "~Copy" ;
- };
- };
-};
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svx/uiconfig/ui/cellmenu.ui b/svx/uiconfig/ui/cellmenu.ui
new file mode 100644
index 000000000000..e7edb0c359fe
--- /dev/null
+++ b/svx/uiconfig/ui/cellmenu.ui
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="copy">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Copy</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
commit 7a01268f3fccd9cb43097f27696fec563f21b336
Author: Caolán McNamara <caolanm at redhat.com>
Date: Fri Apr 14 16:32:02 2017 +0100
convert rows menu to .ui
Change-Id: If81b5e23c1699822899c929b486850ac06776c76
diff --git a/include/svx/fmresids.hrc b/include/svx/fmresids.hrc
index 320920e29e87..318cdd6d85c3 100644
--- a/include/svx/fmresids.hrc
+++ b/include/svx/fmresids.hrc
@@ -63,7 +63,6 @@
// Menu-Id's -----------------------------------------------------------
#define RID_FMEXPLORER_POPUPMENU (RID_FORMS_START + 0)
-#define RID_SVXMNU_ROWS (RID_FORMS_START + 1)
#define RID_SVXMNU_COLS (RID_FORMS_START + 2)
#define RID_SVXMNU_CELL (RID_FORMS_START + 3)
#define RID_FMSHELL_CONVERSIONMENU (RID_FORMS_START + 4)
diff --git a/svx/UIConfig_svx.mk b/svx/UIConfig_svx.mk
index 6223380663a1..278100146ffe 100644
--- a/svx/UIConfig_svx.mk
+++ b/svx/UIConfig_svx.mk
@@ -70,6 +70,7 @@ $(eval $(call gb_UIConfig_add_uifiles,svx,\
svx/uiconfig/ui/redlinecontrol \
svx/uiconfig/ui/redlinefilterpage \
svx/uiconfig/ui/redlineviewpage \
+ svx/uiconfig/ui/rowsmenu \
svx/uiconfig/ui/rulermenu \
svx/uiconfig/ui/safemodedialog \
svx/uiconfig/ui/savemodifieddialog \
diff --git a/svx/inc/fmhelp.hrc b/svx/inc/fmhelp.hrc
index 8cc34fcb29f0..5a1f072407ce 100644
--- a/svx/inc/fmhelp.hrc
+++ b/svx/inc/fmhelp.hrc
@@ -39,7 +39,6 @@
#define HID_XFORMS_TOOLBOX_ITEM_EDIT "SVX_HID_XFORMS_TOOLBOX_ITEM_EDIT"
#define HID_XFORMS_TOOLBOX_ITEM_REMOVE "SVX_HID_XFORMS_TOOLBOX_ITEM_REMOVE"
#define HID_XFORMS_MID_INSERT_CONTROL "SVX_HID_XFORMS_MID_INSERT_CONTROL"
-#define HID_FM_DELETEROWS "SVX_HID_FM_DELETEROWS"
#define HID_FM_INSERTCOL "SVX_HID_FM_INSERTCOL"
#define HID_FM_CHANGECOL "SVX_HID_FM_CHANGECOL"
#define HID_FM_DELETECOL "SVX_HID_FM_DELETECOL"
diff --git a/svx/source/fmcomp/gridctrl.cxx b/svx/source/fmcomp/gridctrl.cxx
index 275b19b96910..c4ee149afe30 100644
--- a/svx/source/fmcomp/gridctrl.cxx
+++ b/svx/source/fmcomp/gridctrl.cxx
@@ -44,6 +44,7 @@
#include <tools/resid.hxx>
#include <tools/diagnose_ex.h>
#include <tools/fract.hxx>
+#include <vcl/builder.hxx>
#include <vcl/menu.hxx>
#include <vcl/settings.hxx>
@@ -2698,8 +2699,8 @@ void DbGridControl::PreExecuteRowContextMenu(sal_uInt16 /*nRow*/, PopupMenu& rMe
// if only a blank row is selected than do not delete
bDelete = bDelete && !((m_nOptions & DbGridControlOptions::Insert) && GetSelectRowCount() == 1 && IsRowSelected(GetRowCount() - 1));
- rMenu.EnableItem(SID_FM_DELETEROWS, bDelete);
- rMenu.EnableItem(SID_FM_RECORD_SAVE, IsModified());
+ rMenu.EnableItem(rMenu.GetItemId("delete"), bDelete);
+ rMenu.EnableItem(rMenu.GetItemId("save"), IsModified());
// the undo is more difficult
bool bCanUndo = IsModified();
@@ -2708,28 +2709,22 @@ void DbGridControl::PreExecuteRowContextMenu(sal_uInt16 /*nRow*/, PopupMenu& rMe
nState = m_aMasterStateProvider.Call(DbGridControlNavigationBarState::Undo);
bCanUndo &= ( 0 != nState );
- rMenu.EnableItem(SID_FM_RECORD_UNDO, bCanUndo);
+ rMenu.EnableItem(rMenu.GetItemId("undo"), bCanUndo);
}
-void DbGridControl::PostExecuteRowContextMenu(sal_uInt16 /*nRow*/, const PopupMenu& /*rMenu*/, sal_uInt16 nExecutionResult)
+void DbGridControl::PostExecuteRowContextMenu(sal_uInt16 /*nRow*/, const PopupMenu& rMenu, sal_uInt16 nExecutionResult)
{
- switch (nExecutionResult)
+ if (nExecutionResult == rMenu.GetItemId("delete"))
{
- case SID_FM_DELETEROWS:
- // delete asynchronously
- if (m_nDeleteEvent)
- Application::RemoveUserEvent(m_nDeleteEvent);
- m_nDeleteEvent = Application::PostUserEvent(LINK(this,DbGridControl,OnDelete), nullptr, true);
- break;
- case SID_FM_RECORD_UNDO:
- Undo();
- break;
- case SID_FM_RECORD_SAVE:
- SaveRow();
- break;
- default:
- break;
+ // delete asynchronously
+ if (m_nDeleteEvent)
+ Application::RemoveUserEvent(m_nDeleteEvent);
+ m_nDeleteEvent = Application::PostUserEvent(LINK(this,DbGridControl,OnDelete), nullptr, true);
}
+ else if (nExecutionResult == rMenu.GetItemId("undo"))
+ Undo();
+ else if (nExecutionResult == rMenu.GetItemId("save"))
+ SaveRow();
}
void DbGridControl::DataSourcePropertyChanged(const PropertyChangeEvent& evt)
@@ -2822,14 +2817,12 @@ void DbGridControl::copyCellText(sal_Int32 _nRow, sal_uInt16 _nColId)
void DbGridControl::executeRowContextMenu( long _nRow, const Point& _rPreferredPos )
{
- ScopedVclPtrInstance<PopupMenu> aContextMenu( SVX_RES( RID_SVXMNU_ROWS ) );
+ VclBuilder aBuilder(nullptr, VclBuilderContainer::getUIRootDir(), "svx/ui/rowsmenu.ui", "");
+ VclPtr<PopupMenu> aContextMenu(aBuilder.get_menu("menu"));
PreExecuteRowContextMenu( (sal_uInt16)_nRow, *aContextMenu.get() );
aContextMenu->RemoveDisabledEntries( true, true );
PostExecuteRowContextMenu( (sal_uInt16)_nRow, *aContextMenu.get(), aContextMenu->Execute( this, _rPreferredPos ) );
-
- // TODO: why this weird cast to sal_uInt16? What if we really have more than 65535 lines?
- // -> change this to sal_uInt32
}
void DbGridControl::Command(const CommandEvent& rEvt)
diff --git a/svx/source/fmcomp/gridctrl.src b/svx/source/fmcomp/gridctrl.src
index 112f77f6161a..b5365864420e 100644
--- a/svx/source/fmcomp/gridctrl.src
+++ b/svx/source/fmcomp/gridctrl.src
@@ -22,30 +22,6 @@
#include "fmhelp.hrc"
#include <svx/svxcommands.h>
-Menu RID_SVXMNU_ROWS
-{
- ItemList =
- {
- MenuItem
- {
- Identifier = SID_FM_DELETEROWS ;
- HelpId = HID_FM_DELETEROWS ;
- Text [ en-US ] = "Delete Rows" ;
- };
- MenuItem
- {
- Identifier = SID_FM_RECORD_SAVE ;
- HelpId = CMD_SID_FM_RECORD_SAVE ;
- Text [ en-US ] = "Save Record" ;
- };
- MenuItem
- {
- Identifier = SID_FM_RECORD_UNDO ;
- HelpId = CMD_SID_FM_RECORD_UNDO ;
- Text [ en-US ] = "Undo: Data entry" ;
- };
- };
-};
Menu RID_SVXMNU_COLS
{
ItemList =
diff --git a/svx/uiconfig/ui/rowsmenu.ui b/svx/uiconfig/ui/rowsmenu.ui
new file mode 100644
index 000000000000..210add5c4389
--- /dev/null
+++ b/svx/uiconfig/ui/rowsmenu.ui
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="delete">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Delete Rows</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="save">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Save Record</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkMenuItem" id="undo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Undo: Data entry</property>
+ </object>
+ </child>
+ </object>
+</interface>
commit 975440b9189602b5a10059d892cb09e6849148f7
Author: Caolán McNamara <caolanm at redhat.com>
Date: Fri Apr 14 15:55:34 2017 +0100
convert group sort context menu to .ui
Change-Id: I8ad51ef49cc0f869efd09b95d3dc11f201e8ee61
diff --git a/reportdesign/UIConfig_dbreport.mk b/reportdesign/UIConfig_dbreport.mk
index 84327116ecb4..b1b8a326e2db 100644
--- a/reportdesign/UIConfig_dbreport.mk
+++ b/reportdesign/UIConfig_dbreport.mk
@@ -47,6 +47,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/dbreport,\
reportdesign/uiconfig/dbreport/ui/floatingfield \
reportdesign/uiconfig/dbreport/ui/floatingnavigator \
reportdesign/uiconfig/dbreport/ui/floatingsort \
+ reportdesign/uiconfig/dbreport/ui/groupsortmenu \
reportdesign/uiconfig/dbreport/ui/pagedialog \
reportdesign/uiconfig/dbreport/ui/pagenumberdialog \
))
diff --git a/reportdesign/inc/RptResId.hrc b/reportdesign/inc/RptResId.hrc
index a095b3b26c1a..8535390c59c2 100644
--- a/reportdesign/inc/RptResId.hrc
+++ b/reportdesign/inc/RptResId.hrc
@@ -192,7 +192,6 @@
#define RID_STR_PARAADJUST (RID_STRING_START + 161)
// menu -----------------------------------------------------------------------
-#define RID_GROUPSROWPOPUPMENU ( RID_MENU_START + 0 )
#define RID_MENU_NAVIGATOR ( RID_MENU_START + 1 )
// bitmaps
#define RID_SVXBMP_SELECT_REPORT (RID_BITMAP_START + 0 )
diff --git a/reportdesign/source/ui/dlg/GroupsSorting.cxx b/reportdesign/source/ui/dlg/GroupsSorting.cxx
index 6bb15689d36c..d60b07c557e8 100644
--- a/reportdesign/source/ui/dlg/GroupsSorting.cxx
+++ b/reportdesign/source/ui/dlg/GroupsSorting.cxx
@@ -709,7 +709,6 @@ void OFieldExpressionControl::Command(const CommandEvent& rEvt)
if ( nColId == HANDLE_ID )
{
- ScopedVclPtrInstance<PopupMenu> aContextMenu(ModuleRes(RID_GROUPSROWPOPUPMENU));
bool bEnable = false;
long nIndex = FirstSelectedRow();
while( nIndex >= 0 && !bEnable )
@@ -718,8 +717,10 @@ void OFieldExpressionControl::Command(const CommandEvent& rEvt)
bEnable = true;
nIndex = NextSelectedRow();
}
- aContextMenu->EnableItem(SID_DELETE, IsDeleteAllowed() && bEnable);
- if (aContextMenu->Execute(this, rEvt.GetMousePosPixel()) == SID_DELETE)
+ VclBuilder aBuilder(nullptr, VclBuilderContainer::getUIRootDir(), "modules/dbreport/ui/groupsortmenu.ui", "");
+ VclPtr<PopupMenu> aContextMenu(aBuilder.get_menu("menu"));
+ aContextMenu->EnableItem(aContextMenu->GetItemId("delete"), IsDeleteAllowed() && bEnable);
+ if (aContextMenu->Execute(this, rEvt.GetMousePosPixel()))
{
if( m_nDeleteEvent )
Application::RemoveUserEvent( m_nDeleteEvent );
diff --git a/reportdesign/source/ui/dlg/GroupsSorting.src b/reportdesign/source/ui/dlg/GroupsSorting.src
index 21148dbd571e..9ae6ebda573a 100644
--- a/reportdesign/source/ui/dlg/GroupsSorting.src
+++ b/reportdesign/source/ui/dlg/GroupsSorting.src
@@ -105,16 +105,4 @@ String STR_RPT_HELP_SORT
Text [ en-US ] = "Select ascending or descending sort order. Ascending means from A to Z or 0 to 9" ;
};
-Menu RID_GROUPSROWPOPUPMENU
-{
- ItemList =
- {
- MenuItem
- {
- Identifier = SID_DELETE ;
- Text [ en-US ] = "~Delete FOO" ;
- };
- };
-};
-
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/reportdesign/uiconfig/dbreport/ui/groupsortmenu.ui b/reportdesign/uiconfig/dbreport/ui/groupsortmenu.ui
new file mode 100644
index 000000000000..b9df6f291084
--- /dev/null
+++ b/reportdesign/uiconfig/dbreport/ui/groupsortmenu.ui
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.20.0 -->
+<interface>
+ <requires lib="gtk+" version="3.10"/>
+ <object class="GtkMenu" id="menu">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <child>
+ <object class="GtkMenuItem" id="delete">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">_Delete</property>
+ <property name="use_underline">True</property>
+ </object>
+ </child>
+ </object>
+</interface>
commit bde543032d44bf31dfe291995ce8cae3ab8d677a
Author: Caolán McNamara <caolanm at redhat.com>
Date: Fri Apr 14 15:46:11 2017 +0100
remove methods that were never called
Change-Id: I5a841e1cd2bcd2766e51bb5944b992b5de51c7b6
diff --git a/reportdesign/source/ui/dlg/GroupsSorting.cxx b/reportdesign/source/ui/dlg/GroupsSorting.cxx
index a471e7e15634..6bb15689d36c 100644
--- a/reportdesign/source/ui/dlg/GroupsSorting.cxx
+++ b/reportdesign/source/ui/dlg/GroupsSorting.cxx
@@ -126,9 +126,6 @@ public:
void lateInit();
bool IsDeleteAllowed( );
void DeleteRows();
- void cut();
- void copy();
- void paste();
sal_Int32 getGroupPosition(sal_Int32 _nRow) const { return _nRow != BROWSER_ENDOFSELECTION ? m_aGroupPositions[_nRow] : sal_Int32(NO_GROUP); }
@@ -798,42 +795,6 @@ void OFieldExpressionControl::DeleteRows()
Invalidate();
}
-
-void OFieldExpressionControl::cut()
-{
- copy();
- DeleteRows();
-}
-
-
-void OFieldExpressionControl::copy()
-{
-
- // set to the right row and save it
- m_pParent->SaveData( m_nDataPos );
-
- uno::Sequence<uno::Any> aClipboardList = fillSelectedGroups();
-
- if( aClipboardList.getLength() )
- {
- OGroupExchange* pData = new OGroupExchange(aClipboardList);
- uno::Reference< css::datatransfer::XTransferable> xRef = pData;
- pData->CopyToClipboard(GetParent());
- }
-}
-
-
-void OFieldExpressionControl::paste()
-{
- TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard(GetParent()));
- if(aTransferData.HasFormat(OGroupExchange::getReportGroupId()))
- {
- if( m_nPasteEvent )
- Application::RemoveUserEvent( m_nPasteEvent );
- m_nPasteEvent = Application::PostUserEvent( LINK(this, OFieldExpressionControl, DelayedPaste), nullptr, true );
- }
-}
-
IMPL_LINK_NOARG( OFieldExpressionControl, DelayedPaste, void*, void )
{
m_nPasteEvent = nullptr;
commit 6b55bfe5659a2160e69a8dc255caabf3cc10c437
Author: Caolán McNamara <caolanm at redhat.com>
Date: Fri Apr 14 15:44:44 2017 +0100
the context menu has only DELETE in it
Change-Id: Ib581011e4f3adda8b6f81d1c2cbdf5de5da80f55
diff --git a/reportdesign/source/ui/dlg/GroupsSorting.cxx b/reportdesign/source/ui/dlg/GroupsSorting.cxx
index eba7ab9d24e6..a471e7e15634 100644
--- a/reportdesign/source/ui/dlg/GroupsSorting.cxx
+++ b/reportdesign/source/ui/dlg/GroupsSorting.cxx
@@ -721,26 +721,12 @@ void OFieldExpressionControl::Command(const CommandEvent& rEvt)
bEnable = true;
nIndex = NextSelectedRow();
}
- aContextMenu->EnableItem( SID_DELETE, IsDeleteAllowed() && bEnable );
- switch (aContextMenu->Execute(this, rEvt.GetMousePosPixel()))
+ aContextMenu->EnableItem(SID_DELETE, IsDeleteAllowed() && bEnable);
+ if (aContextMenu->Execute(this, rEvt.GetMousePosPixel()) == SID_DELETE)
{
- case SID_CUT:
- cut();
- break;
- case SID_COPY:
- copy();
- break;
- case SID_PASTE:
- paste();
- break;
-
- case SID_DELETE:
- if( m_nDeleteEvent )
- Application::RemoveUserEvent( m_nDeleteEvent );
- m_nDeleteEvent = Application::PostUserEvent( LINK(this, OFieldExpressionControl, DelayedDelete), nullptr, true );
- break;
- default:
- break;
+ if( m_nDeleteEvent )
+ Application::RemoveUserEvent( m_nDeleteEvent );
+ m_nDeleteEvent = Application::PostUserEvent( LINK(this, OFieldExpressionControl, DelayedDelete), nullptr, true );
}
}
SAL_FALLTHROUGH;
diff --git a/reportdesign/source/ui/dlg/GroupsSorting.src b/reportdesign/source/ui/dlg/GroupsSorting.src
index 687f6ba0bdb3..21148dbd571e 100644
--- a/reportdesign/source/ui/dlg/GroupsSorting.src
+++ b/reportdesign/source/ui/dlg/GroupsSorting.src
@@ -112,8 +112,7 @@ Menu RID_GROUPSROWPOPUPMENU
MenuItem
{
Identifier = SID_DELETE ;
- Command = ".uno:Delete" ;
- Text [ en-US ] = "~Delete" ;
+ Text [ en-US ] = "~Delete FOO" ;
};
};
};
commit aca25d6123da5e6da9b3f25ac0347a479b1d5526
Author: Caolán McNamara <caolanm at redhat.com>
Date: Fri Apr 14 15:27:27 2017 +0100
convert function menu to .ui
Change-Id: I6ff1ccc0fb20c638c7bdb587c8fe81a710a49d21
diff --git a/include/svx/dialogs.hrc b/include/svx/dialogs.hrc
index 2a23a2164ccb..349a2145e0c4 100644
--- a/include/svx/dialogs.hrc
+++ b/include/svx/dialogs.hrc
@@ -140,9 +140,6 @@
#define RID_SVXFLOAT3D_FIX_G (RID_SVX_START + 78)
#define RID_SVXFLOAT3D_FIX_B (RID_SVX_START + 84)
-// ResId for funktion popup menue
-#define RID_SVXMNU_PSZ_FUNC (RID_SVX_START + 83)
-
#define RID_SVXBMP_SLIDERBUTTON (RID_SVX_START + 66)
#define RID_SVXBMP_SLIDERDECREASE (RID_SVX_START + 67)
#define RID_SVXBMP_SLIDERINCREASE (RID_SVX_START + 68)
diff --git a/svx/UIConfig_svx.mk b/svx/UIConfig_svx.mk
index f68a66650128..6223380663a1 100644
--- a/svx/UIConfig_svx.mk
+++ b/svx/UIConfig_svx.mk
@@ -43,6 +43,7 @@ $(eval $(call gb_UIConfig_add_uifiles,svx,\
svx/uiconfig/ui/fontworkgallerydialog \
svx/uiconfig/ui/fontworkspacingdialog \
svx/uiconfig/ui/formlinkwarndialog \
+ svx/uiconfig/ui/functionmenu \
svx/uiconfig/ui/gallerymenu1 \
svx/uiconfig/ui/gallerymenu2 \
svx/uiconfig/ui/headfootformatpage \
diff --git a/svx/inc/helpid.hrc b/svx/inc/helpid.hrc
index 75e7079434ea..8312e935d7fe 100644
--- a/svx/inc/helpid.hrc
+++ b/svx/inc/helpid.hrc
@@ -41,14 +41,6 @@
#define HID_GALLERY_RENAME "SVX_HID_GALLERY_RENAME"
#define HID_GALLERY_THEMELIST "SVX_HID_GALLERY_THEMELIST"
#define HID_GALLERY_WINDOW "SVX_HID_GALLERY_WINDOW"
-#define HID_MNU_FUNC_AVG "SVX_HID_MNU_FUNC_AVG"
-#define HID_MNU_FUNC_COUNT "SVX_HID_MNU_FUNC_COUNT"
-#define HID_MNU_FUNC_COUNT2 "SVX_HID_MNU_FUNC_COUNT2"
-#define HID_MNU_FUNC_MAX "SVX_HID_MNU_FUNC_MAX"
-#define HID_MNU_FUNC_MIN "SVX_HID_MNU_FUNC_MIN"
-#define HID_MNU_FUNC_NONE "SVX_HID_MNU_FUNC_NONE"
-#define HID_MNU_FUNC_SUM "SVX_HID_MNU_FUNC_SUM"
-#define HID_MNU_FUNC_SELECTION_COUNT "SVX_HID_MNU_FUNC_SELECTION_COUNT"
#define HID_POPUP_COLOR "SVX_HID_POPUP_COLOR"
#define HID_POPUP_COLOR_CTRL "SVX_HID_POPUP_COLOR_CTRL"
#define HID_POPUP_FRAME "SVX_HID_POPUP_FRAME"
diff --git a/svx/source/stbctrls/pszctrl.cxx b/svx/source/stbctrls/pszctrl.cxx
index a6cc6bb0aec0..c19f02cb3114 100644
--- a/svx/source/stbctrls/pszctrl.cxx
+++ b/svx/source/stbctrls/pszctrl.cxx
@@ -18,6 +18,7 @@
*/
#include <limits.h>
+#include <vcl/builder.hxx>
#include <vcl/status.hxx>
#include <vcl/menu.hxx>
#include <vcl/image.hxx>
@@ -89,33 +90,78 @@ OUString SvxPosSizeStatusBarControl::GetMetricStr_Impl( long nVal )
SFX_IMPL_STATUSBAR_CONTROL(SvxPosSizeStatusBarControl, SvxSizeItem);
-class FunctionPopup_Impl : public PopupMenu
+class FunctionPopup_Impl
{
+ VclBuilder m_aBuilder;
+ VclPtr<PopupMenu> m_xMenu;
+ sal_uInt32 m_nSelected;
+ static sal_uInt16 id_to_function(const OString& rIdent);
+ sal_uInt16 function_to_id(sal_uInt16 nFunc) const;
public:
explicit FunctionPopup_Impl( sal_uInt32 nCheckEncoded );
-
- sal_uInt32 GetSelected() const { return nSelected; }
-
-private:
- sal_uInt32 nSelected;
-
- virtual void Select() override;
+ sal_uInt16 Execute(vcl::Window* pWindow, const Point& rPopupPos) { return m_xMenu->Execute(pWindow, rPopupPos); }
+ sal_uInt32 GetSelected() const;
};
+sal_uInt16 FunctionPopup_Impl::id_to_function(const OString& rIdent)
+{
+ if (rIdent == "avg")
+ return PSZ_FUNC_AVG;
+ else if (rIdent == "counta")
+ return PSZ_FUNC_COUNT2;
+ else if (rIdent == "count")
+ return PSZ_FUNC_COUNT;
+ else if (rIdent == "max")
+ return PSZ_FUNC_MAX;
+ else if (rIdent == "min")
+ return PSZ_FUNC_MIN;
+ else if (rIdent == "sum")
+ return PSZ_FUNC_SUM;
+ else if (rIdent == "selection")
+ return PSZ_FUNC_SELECTION_COUNT;
+ else if (rIdent == "none")
+ return PSZ_FUNC_NONE;
+ return 0;
+}
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list