diff --git a/.gitignore b/.gitignore index d1f9b1b..1338610 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -SOURCES/libreoffice-4.1.4.2.tar.xz SOURCES/0168229624cfac409e766913506961a8-ucpp-1.3.2.tar.gz SOURCES/17410483b5b5f267aa18b7e00b65e6e0-hsqldb_1_8_0.zip SOURCES/185d60944ea767075d27247c3162b3bc-unowinreg.dll @@ -6,5 +5,6 @@ SOURCES/1f24ab1d39f4a51faf22244c94a6203f-xmlsec1-1.2.14.tar.gz SOURCES/35c94d2df8893241173de1d16b6034c0-swingExSrc.zip SOURCES/798b2ffdc8bcfe7bca2cf92b62caf685-rhino1_5R5.zip SOURCES/a7983f859eafb2677d7ff386a023bc40-xsltml_2.1.2.zip -SOURCES/libreoffice-help-4.1.4.2.tar.xz -SOURCES/libreoffice-translations-4.1.4.2.tar.xz +SOURCES/libreoffice-4.2.6.3.tar.xz +SOURCES/libreoffice-help-4.2.6.3.tar.xz +SOURCES/libreoffice-translations-4.2.6.3.tar.xz diff --git a/.libreoffice.metadata b/.libreoffice.metadata index 9a14f98..7da70fd 100644 --- a/.libreoffice.metadata +++ b/.libreoffice.metadata @@ -1,4 +1,3 @@ -cf6da298d213796310cecbb2d4b991b139f86ffd SOURCES/libreoffice-4.1.4.2.tar.xz 452eba922e4f41603539c9dc39947d2271e47093 SOURCES/0168229624cfac409e766913506961a8-ucpp-1.3.2.tar.gz 7168b0f40aa5c72267899601c116d2348d2f56ec SOURCES/17410483b5b5f267aa18b7e00b65e6e0-hsqldb_1_8_0.zip 0619ed3a89644bef318df67db12045b2b590585b SOURCES/185d60944ea767075d27247c3162b3bc-unowinreg.dll @@ -6,5 +5,6 @@ cf6da298d213796310cecbb2d4b991b139f86ffd SOURCES/libreoffice-4.1.4.2.tar.xz 1acea86fd399ed7817879d36370d3d1f8b109050 SOURCES/35c94d2df8893241173de1d16b6034c0-swingExSrc.zip 8a90669029e107b61953b90ba11545fef586c2ca SOURCES/798b2ffdc8bcfe7bca2cf92b62caf685-rhino1_5R5.zip 2d49e11b0b711970f494294dc3698f05eb294853 SOURCES/a7983f859eafb2677d7ff386a023bc40-xsltml_2.1.2.zip -c268cebd2666f27dc96eed369f80b2497b4d98d5 SOURCES/libreoffice-help-4.1.4.2.tar.xz -9204484e084f9dde2db105ed09a40c0d2773b7eb SOURCES/libreoffice-translations-4.1.4.2.tar.xz +f6674acadd8f655d94535953eea71c288515d0aa SOURCES/libreoffice-4.2.6.3.tar.xz +6c6c113c1e1f97afa366ba4b188a03d983c5d73c SOURCES/libreoffice-help-4.2.6.3.tar.xz +f7a983a38e08cd0d536984c079c17bd74a6d64ae SOURCES/libreoffice-translations-4.2.6.3.tar.xz diff --git a/SOURCES/0001-Change-SDK-javaodc-from-static-Package-to-dynamic-Ge.patch b/SOURCES/0001-Change-SDK-javaodc-from-static-Package-to-dynamic-Ge.patch new file mode 100644 index 0000000..2b34206 --- /dev/null +++ b/SOURCES/0001-Change-SDK-javaodc-from-static-Package-to-dynamic-Ge.patch @@ -0,0 +1,209 @@ +From a59e5ecd611ddd41cec6d9c78773f55887df67e6 Mon Sep 17 00:00:00 2001 +From: Stephan Bergmann +Date: Tue, 25 Feb 2014 15:44:16 +0100 +Subject: [PATCH] Change SDK javaodc from static Package to dynamic + GeneratedPackage + +...as e.g. the list of resrouces/*.gif apparently varies per javadoc version. + +Change-Id: Idcf95229295c1c5cd16e565bcd168c1a0e7d4f0c +--- + odk/GeneratedPackage_odk_javadoc.mk | 16 ++++ + odk/Module_odk.mk | 2 +- + odk/Package_javadoc.mk | 146 ------------------------------------ + 3 files changed, 17 insertions(+), 147 deletions(-) + create mode 100644 odk/GeneratedPackage_odk_javadoc.mk + delete mode 100644 odk/Package_javadoc.mk + +diff --git a/odk/GeneratedPackage_odk_javadoc.mk b/odk/GeneratedPackage_odk_javadoc.mk +new file mode 100644 +index 0000000..569377b +--- /dev/null ++++ b/odk/GeneratedPackage_odk_javadoc.mk +@@ -0,0 +1,16 @@ ++# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- ++# ++# This file is part of the LibreOffice project. ++# ++# This Source Code Form is subject to the terms of the Mozilla Public ++# License, v. 2.0. If a copy of the MPL was not distributed with this ++# file, You can obtain one at http://mozilla.org/MPL/2.0/. ++# ++ ++$(eval $(call gb_GeneratedPackage_GeneratedPackage,odk_javadoc,$(call gb_CustomTarget_get_workdir,odk/docs/java/ref))) ++ ++$(eval $(call gb_GeneratedPackage_add_dir,odk_javadoc,$(INSTDIR)/$(SDKDIRNAME)/docs/java/ref,.)) ++ ++$(eval $(call gb_GeneratedPackage_use_customtarget,odk_javadoc,odk/docs/java/ref)) ++ ++# vim: set noet sw=4 ts=4: +diff --git a/odk/Module_odk.mk b/odk/Module_odk.mk +index 9ddc400..32bdfc1 100644 +--- a/odk/Module_odk.mk ++++ b/odk/Module_odk.mk +@@ -44,9 +44,9 @@ $(eval $(call gb_Module_add_targets,odk,\ + $(if $(filter YESGCC,$(BUILD_UNOWINREG)$(COM)),CustomTarget_unowinreg) \ + CustomTarget_classes \ + CustomTarget_javadoc \ ++ GeneratedPackage_odk_javadoc \ + GeneratedPackage_uno_loader_classes \ + $(if $(filter WNT,$(OS)),Library_unowinreg) \ +- Package_javadoc \ + Package_unowinreg \ + )) + endif +diff --git a/odk/Package_javadoc.mk b/odk/Package_javadoc.mk +deleted file mode 100644 +index 5f0ea44..0000000 +--- a/odk/Package_javadoc.mk ++++ /dev/null +@@ -1,146 +0,0 @@ +-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +-# +-# This file is part of the LibreOffice project. +-# +-# This Source Code Form is subject to the terms of the Mozilla Public +-# License, v. 2.0. If a copy of the MPL was not distributed with this +-# file, You can obtain one at http://mozilla.org/MPL/2.0/. +-# +- +-$(eval $(call gb_Package_Package,odk_javadoc,$(call gb_CustomTarget_get_workdir,odk/docs/java/ref))) +- +-$(eval $(call gb_Package_set_outdir,odk_javadoc,$(INSTDIR))) +- +-$(eval $(call gb_Package_add_files_with_dir,odk_javadoc,$(SDKDIRNAME)/docs/java/ref,\ +- allclasses-frame.html \ +- allclasses-noframe.html \ +- com/sun/star/comp/helper/Bootstrap.html \ +- com/sun/star/comp/helper/BootstrapException.html \ +- com/sun/star/comp/helper/ComponentContext.html \ +- com/sun/star/comp/helper/ComponentContextEntry.html \ +- com/sun/star/comp/helper/SharedLibraryLoader.html \ +- com/sun/star/comp/helper/class-use/Bootstrap.html \ +- com/sun/star/comp/helper/class-use/BootstrapException.html \ +- com/sun/star/comp/helper/class-use/ComponentContext.html \ +- com/sun/star/comp/helper/class-use/ComponentContextEntry.html \ +- com/sun/star/comp/helper/class-use/SharedLibraryLoader.html \ +- com/sun/star/comp/helper/package-frame.html \ +- com/sun/star/comp/helper/package-summary.html \ +- com/sun/star/comp/helper/package-tree.html \ +- com/sun/star/comp/helper/package-use.html \ +- com/sun/star/lib/uno/helper/ComponentBase.html \ +- com/sun/star/lib/uno/helper/Factory.html \ +- com/sun/star/lib/uno/helper/InterfaceContainer.html \ +- com/sun/star/lib/uno/helper/MultiTypeInterfaceContainer.html \ +- com/sun/star/lib/uno/helper/PropertySet.html \ +- com/sun/star/lib/uno/helper/PropertySetMixin.BoundListeners.html \ +- com/sun/star/lib/uno/helper/PropertySetMixin.html \ +- com/sun/star/lib/uno/helper/UnoUrl.html \ +- com/sun/star/lib/uno/helper/WeakAdapter.html \ +- com/sun/star/lib/uno/helper/WeakBase.html \ +- com/sun/star/lib/uno/helper/class-use/ComponentBase.html \ +- com/sun/star/lib/uno/helper/class-use/Factory.html \ +- com/sun/star/lib/uno/helper/class-use/InterfaceContainer.html \ +- com/sun/star/lib/uno/helper/class-use/MultiTypeInterfaceContainer.html \ +- com/sun/star/lib/uno/helper/class-use/PropertySet.html \ +- com/sun/star/lib/uno/helper/class-use/PropertySetMixin.BoundListeners.html \ +- com/sun/star/lib/uno/helper/class-use/PropertySetMixin.html \ +- com/sun/star/lib/uno/helper/class-use/UnoUrl.html \ +- com/sun/star/lib/uno/helper/class-use/WeakAdapter.html \ +- com/sun/star/lib/uno/helper/class-use/WeakBase.html \ +- com/sun/star/lib/uno/helper/package-frame.html \ +- com/sun/star/lib/uno/helper/package-summary.html \ +- com/sun/star/lib/uno/helper/package-tree.html \ +- com/sun/star/lib/uno/helper/package-use.html \ +- com/sun/star/lib/unoloader/UnoClassLoader.html \ +- com/sun/star/lib/unoloader/UnoLoader.html \ +- com/sun/star/lib/unoloader/class-use/UnoClassLoader.html \ +- com/sun/star/lib/unoloader/class-use/UnoLoader.html \ +- com/sun/star/lib/unoloader/package-frame.html \ +- com/sun/star/lib/unoloader/package-summary.html \ +- com/sun/star/lib/unoloader/package-tree.html \ +- com/sun/star/lib/unoloader/package-use.html \ +- com/sun/star/lib/util/UrlToFileMapper.html \ +- com/sun/star/lib/util/class-use/UrlToFileMapper.html \ +- com/sun/star/lib/util/package-frame.html \ +- com/sun/star/lib/util/package-summary.html \ +- com/sun/star/lib/util/package-tree.html \ +- com/sun/star/lib/util/package-use.html \ +- com/sun/star/uno/Any.html \ +- com/sun/star/uno/AnyConverter.html \ +- com/sun/star/uno/Ascii.html \ +- com/sun/star/uno/AsciiString.html \ +- com/sun/star/uno/Enum.html \ +- com/sun/star/uno/IBridge.html \ +- com/sun/star/uno/IEnvironment.html \ +- com/sun/star/uno/IFieldDescription.html \ +- com/sun/star/uno/IMapping.html \ +- com/sun/star/uno/IMemberDescription.html \ +- com/sun/star/uno/IMethodDescription.html \ +- com/sun/star/uno/IQueryInterface.html \ +- com/sun/star/uno/ITypeDescription.html \ +- com/sun/star/uno/MappingException.html \ +- com/sun/star/uno/Type.html \ +- com/sun/star/uno/Union.html \ +- com/sun/star/uno/UnoRuntime.html \ +- com/sun/star/uno/WeakReference.html \ +- com/sun/star/uno/class-use/Any.html \ +- com/sun/star/uno/class-use/AnyConverter.html \ +- com/sun/star/uno/class-use/Ascii.html \ +- com/sun/star/uno/class-use/AsciiString.html \ +- com/sun/star/uno/class-use/Enum.html \ +- com/sun/star/uno/class-use/IBridge.html \ +- com/sun/star/uno/class-use/IEnvironment.html \ +- com/sun/star/uno/class-use/IFieldDescription.html \ +- com/sun/star/uno/class-use/IMapping.html \ +- com/sun/star/uno/class-use/IMemberDescription.html \ +- com/sun/star/uno/class-use/IMethodDescription.html \ +- com/sun/star/uno/class-use/IQueryInterface.html \ +- com/sun/star/uno/class-use/ITypeDescription.html \ +- com/sun/star/uno/class-use/MappingException.html \ +- com/sun/star/uno/class-use/Type.html \ +- com/sun/star/uno/class-use/Union.html \ +- com/sun/star/uno/class-use/UnoRuntime.html \ +- com/sun/star/uno/class-use/WeakReference.html \ +- com/sun/star/uno/package-frame.html \ +- com/sun/star/uno/package-summary.html \ +- com/sun/star/uno/package-tree.html \ +- com/sun/star/uno/package-use.html \ +- constant-values.html \ +- deprecated-list.html \ +- help-doc.html \ +- index-files/index-1.html \ +- index-files/index-10.html \ +- index-files/index-11.html \ +- index-files/index-12.html \ +- index-files/index-13.html \ +- index-files/index-14.html \ +- index-files/index-15.html \ +- index-files/index-16.html \ +- index-files/index-17.html \ +- index-files/index-18.html \ +- index-files/index-19.html \ +- index-files/index-2.html \ +- index-files/index-20.html \ +- index-files/index-21.html \ +- index-files/index-3.html \ +- index-files/index-4.html \ +- index-files/index-5.html \ +- index-files/index-6.html \ +- index-files/index-7.html \ +- index-files/index-8.html \ +- index-files/index-9.html \ +- index.html \ +- overview-frame.html \ +- overview-summary.html \ +- overview-tree.html \ +- package-list \ +- resources/background.gif \ +- resources/tab.gif \ +- resources/titlebar.gif \ +- resources/titlebar_end.gif \ +- serialized-form.html \ +- stylesheet.css \ +-)) +- +-# vim: set noet sw=4 ts=4: +-- +1.9.0 + diff --git a/SOURCES/0001-Disable-sdremote-by-default-and-improve-flow-control.patch b/SOURCES/0001-Disable-sdremote-by-default-and-improve-flow-control.patch new file mode 100644 index 0000000..30e62aa --- /dev/null +++ b/SOURCES/0001-Disable-sdremote-by-default-and-improve-flow-control.patch @@ -0,0 +1,52 @@ +From 99023fe9bd7d8b665faed7fe9cb98b3fb8922292 Mon Sep 17 00:00:00 2001 +From: Michael Meeks +Date: Tue, 7 Oct 2014 10:10:27 +0100 +Subject: [PATCH] Disable sdremote by default, and improve flow control. + +It was intended to disable sdremote by default when it exited +experimental mode. + +This reverts commit 576943b9bf7506829de97d2194c4bee35a485436. + +Change-Id: I2c1b5443e334021bd9574316167f48b1af6200e5 +Reviewed-on: https://gerrit.libreoffice.org/11837 +Reviewed-by: Jan Holesovsky +Tested-by: Jan Holesovsky +--- + officecfg/registry/schema/org/openoffice/Office/Impress.xcs | 2 +- + sd/source/ui/remotecontrol/Server.cxx | 6 +++++- + 2 files changed, 6 insertions(+), 2 deletions(-) + +diff --git a/officecfg/registry/schema/org/openoffice/Office/Impress.xcs b/officecfg/registry/schema/org/openoffice/Office/Impress.xcs +index b740aca..01836d6 100644 +--- a/officecfg/registry/schema/org/openoffice/Office/Impress.xcs ++++ b/officecfg/registry/schema/org/openoffice/Office/Impress.xcs +@@ -629,7 +629,7 @@ + Indicates whether to enable the Impress remote controller. + + +- true ++ false + + + +diff --git a/sd/source/ui/remotecontrol/Server.cxx b/sd/source/ui/remotecontrol/Server.cxx +index 51796cc..fb24e67 100644 +--- a/sd/source/ui/remotecontrol/Server.cxx ++++ b/sd/source/ui/remotecontrol/Server.cxx +@@ -115,7 +115,11 @@ void RemoteServer::execute() + { + OString aName( aLine ); + +- if ( ! pSocket->readLine( aLine ) ) delete pSocket; ++ if ( ! pSocket->readLine( aLine ) ) ++ { ++ delete pSocket; ++ continue; ++ } + OString aPin( aLine ); + + SocketAddr aClientAddr; +-- +1.9.3 + diff --git a/SOURCES/0001-KDE-don-t-throw-on-TemplatePathVariable.patch b/SOURCES/0001-KDE-don-t-throw-on-TemplatePathVariable.patch new file mode 100644 index 0000000..4959bd7 --- /dev/null +++ b/SOURCES/0001-KDE-don-t-throw-on-TemplatePathVariable.patch @@ -0,0 +1,51 @@ +From e44a7eefb7f632977b4c8c91ad14244372c6e04d Mon Sep 17 00:00:00 2001 +From: Maxim Monastirsky +Date: Wed, 26 Feb 2014 17:02:38 +0200 +Subject: [PATCH] KDE: don't throw on TemplatePathVariable +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This is required after commit +838b77f5f3d6d8fd98891e99a23ff78a6a357cb2. + +Actual functionality is still missing. + +Change-Id: Ib94d8a982609de730d9c61bf7bf9886093c51f5b +Reviewed-on: https://gerrit.libreoffice.org/8367 +Reviewed-by: Caolán McNamara +Tested-by: Caolán McNamara +--- + shell/source/backends/kde4be/kde4backend.cxx | 2 +- + shell/source/backends/kdebe/kdebackend.cxx | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/shell/source/backends/kde4be/kde4backend.cxx b/shell/source/backends/kde4be/kde4backend.cxx +index bf12683..1d486e4 100644 +--- a/shell/source/backends/kde4be/kde4backend.cxx ++++ b/shell/source/backends/kde4be/kde4backend.cxx +@@ -172,7 +172,7 @@ css::uno::Any Service::getPropertyValue(OUString const & PropertyName) + || PropertyName == "SourceViewFontName" || PropertyName == "WorkPathVariable" || PropertyName == "ooInetFTPProxyName" + || PropertyName == "ooInetFTPProxyPort" || PropertyName == "ooInetHTTPProxyName" || PropertyName == "ooInetHTTPProxyPort" + || PropertyName == "ooInetHTTPSProxyName" || PropertyName == "ooInetHTTPSProxyPort" || PropertyName == "ooInetNoProxy" +- || PropertyName == "ooInetProxyType" ) ++ || PropertyName == "ooInetProxyType" || PropertyName == "TemplatePathVariable" ) + { + return css::uno::makeAny( + enabled_ +diff --git a/shell/source/backends/kdebe/kdebackend.cxx b/shell/source/backends/kdebe/kdebackend.cxx +index 8089632..08915e8 100644 +--- a/shell/source/backends/kdebe/kdebackend.cxx ++++ b/shell/source/backends/kdebe/kdebackend.cxx +@@ -172,7 +172,7 @@ css::uno::Any Service::getPropertyValue(OUString const & PropertyName) + || PropertyName == "SourceViewFontName" || PropertyName == "WorkPathVariable" || PropertyName == "ooInetFTPProxyName" + || PropertyName == "ooInetFTPProxyPort" || PropertyName == "ooInetHTTPProxyName" || PropertyName == "ooInetHTTPProxyPort" + || PropertyName == "ooInetHTTPSProxyName" || PropertyName == "ooInetHTTPSProxyPort" || PropertyName == "ooInetNoProxy" +- || PropertyName == "ooInetProxyType" ) ++ || PropertyName == "ooInetProxyType" || PropertyName == "TemplatePathVariable" ) + { + return css::uno::makeAny( + enabled_ +-- +1.8.5.3 + diff --git a/SOURCES/0001-Make-charmap.cxx-compile-with-icu-4.4.patch b/SOURCES/0001-Make-charmap.cxx-compile-with-icu-4.4.patch deleted file mode 100644 index b4f5f3e..0000000 --- a/SOURCES/0001-Make-charmap.cxx-compile-with-icu-4.4.patch +++ /dev/null @@ -1,138 +0,0 @@ -From 163116da07b5b277b9f0489e2542fac6eef43cc9 Mon Sep 17 00:00:00 2001 -From: Mark Wielaard -Date: Fri, 31 May 2013 00:10:58 +0200 -Subject: [PATCH] Make charmap.cxx compile with icu >= 4.4. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -configure.ac claims ICU >= 4.2 is supported. Make it so. - -Change-Id: Ia08bb492f41dcb88bc84550edb51ce5e89fe1103 -Reviewed-on: https://gerrit.libreoffice.org/4112 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara -(cherry picked from commit 30c3032920be91741ab089966f7e458ce08d09a4) ---- - i18npool/qa/cppunit/test_breakiterator.cxx | 4 +++- - i18nutil/source/utility/unicode.cxx | 6 +++--- - svx/source/dialog/charmap.cxx | 5 +++++ - sw/source/core/text/porlay.cxx | 4 ++++ - 4 files changed, 15 insertions(+), 4 deletions(-) - -diff --git a/i18npool/qa/cppunit/test_breakiterator.cxx b/i18npool/qa/cppunit/test_breakiterator.cxx -index 41e4077..b121f6d 100644 ---- a/i18npool/qa/cppunit/test_breakiterator.cxx -+++ b/i18npool/qa/cppunit/test_breakiterator.cxx -@@ -16,7 +16,7 @@ - #include - #include - --#include -+#include - - #include - #include -@@ -233,6 +233,8 @@ void TestBreakIterator::testWordBoundaries() - } - - //See https://bugs.freedesktop.org/show_bug.cgi?id=49629 -+ //Note that the breakiterator test will fail on older icu versions -+ //(4.2.1) for the 200B (ZWSP) Zero Width Space testcase. - sal_Unicode aBreakTests[] = { ' ', 1, 2, 3, 4, 5, 6, 7, 0x91, 0x92, 0x200B, 0xE8FF, 0xF8FF }; - for (int mode = i18n::WordType::ANY_WORD; mode <= i18n::WordType::WORD_COUNT; ++mode) - { -diff --git a/i18nutil/source/utility/unicode.cxx b/i18nutil/source/utility/unicode.cxx -index 2c2dd42..b46a7f6 100644 ---- a/i18nutil/source/utility/unicode.cxx -+++ b/i18nutil/source/utility/unicode.cxx -@@ -826,6 +826,9 @@ OString SAL_CALL unicode::getExemplerLanguageForUScriptCode(UScriptCode eScript) - case USCRIPT_TAI_VIET: - sRet = "blt"; - break; -+ case USCRIPT_MANDAEAN: /* Aliased to USCRIPT_MANDAIC in icu 4.6. */ -+ sRet = "mic"; -+ break; - #if (U_ICU_VERSION_MAJOR_NUM > 4) || (U_ICU_VERSION_MAJOR_NUM == 4 && U_ICU_VERSION_MINOR_NUM >= 4) - case USCRIPT_NABATAEAN: //no language with an assigned code yet - sRet = "mis"; -@@ -833,9 +836,6 @@ OString SAL_CALL unicode::getExemplerLanguageForUScriptCode(UScriptCode eScript) - case USCRIPT_PALMYRENE: //no language with an assigned code yet - sRet = "mis"; - break; -- case USCRIPT_MANDAIC: -- sRet = "mic"; -- break; - case USCRIPT_BAMUM: - sRet = "bax"; - break; -diff --git a/svx/source/dialog/charmap.cxx b/svx/source/dialog/charmap.cxx -index 82239d8..be165f8 100644 ---- a/svx/source/dialog/charmap.cxx -+++ b/svx/source/dialog/charmap.cxx -@@ -1302,6 +1302,7 @@ void SubsetMap::InitList() - case UBLOCK_DOMINO_TILES: - aAllSubsets.push_back( Subset( 0x1F030, 0x1F09F, RID_SUBSETSTR_DOMINO_TILES ) ); - break; -+#if (U_ICU_VERSION_MAJOR_NUM > 4) || (U_ICU_VERSION_MAJOR_NUM == 4 && U_ICU_VERSION_MINOR_NUM >= 4) - case UBLOCK_SAMARITAN: - aAllSubsets.push_back( Subset( 0x0800, 0x083F, RID_SUBSETSTR_SAMARITAN ) ); - break; -@@ -1380,6 +1381,8 @@ void SubsetMap::InitList() - case UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C: - aAllSubsets.push_back( Subset( 0x2A700, 0x2B73F, RID_SUBSETSTR_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C ) ); - break; -+#endif -+#if (U_ICU_VERSION_MAJOR_NUM > 4) || (U_ICU_VERSION_MAJOR_NUM == 4 && U_ICU_VERSION_MINOR_NUM >= 6) - case UBLOCK_MANDAIC: - aAllSubsets.push_back( Subset( 0x0840, 0x085F, RID_SUBSETSTR_MANDAIC ) ); - break; -@@ -1416,6 +1419,8 @@ void SubsetMap::InitList() - case UBLOCK_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D: - aAllSubsets.push_back( Subset( 0x2B740, 0x2B81F, RID_SUBSETSTR_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D ) ); - break; -+#endif -+// Note ICU version 49 (NOT 4.9), so the MAJOR_NUM is two digits. - #if U_ICU_VERSION_MAJOR_NUM >= 49 - case UBLOCK_ARABIC_EXTENDED_A: - aAllSubsets.push_back( Subset( 0x08A0, 0x08FF, RID_SUBSETSTR_ARABIC_EXTENDED_A ) ); -diff --git a/sw/source/core/text/porlay.cxx b/sw/source/core/text/porlay.cxx -index b820b8b..edc8458 100644 ---- a/sw/source/core/text/porlay.cxx -+++ b/sw/source/core/text/porlay.cxx -@@ -72,7 +72,11 @@ using namespace i18n::ScriptType; - #define isRehChar(c) IS_JOINING_GROUP((c), REH) - #define isTehMarbutaChar(c) IS_JOINING_GROUP((c), TEH_MARBUTA) - #define isWawChar(c) IS_JOINING_GROUP((c), WAW) -+#if (U_ICU_VERSION_MAJOR_NUM > 4) || (U_ICU_VERSION_MAJOR_NUM == 4 && U_ICU_VERSION_MINOR_NUM >= 4) - #define isYehChar(c) (IS_JOINING_GROUP((c), YEH) || IS_JOINING_GROUP((c), FARSI_YEH)) -+#else -+#define isYehChar(c) IS_JOINING_GROUP((c), YEH) -+#endif - #define isSeenOrSadChar(c) (IS_JOINING_GROUP((c), SAD) || IS_JOINING_GROUP((c), SEEN)) - - bool isTransparentChar ( sal_Unicode cCh ) -diff --git a/i18npool/qa/cppunit/test_breakiterator.cxx b/i18npool/qa/cppunit/test_breakiterator.cxx ---- a/i18npool/qa/cppunit/test_breakiterator.cxx -+++ b/i18npool/qa/cppunit/test_breakiterator.cxx -@@ -233,14 +233,18 @@ - } - - //See https://bugs.freedesktop.org/show_bug.cgi?id=49629 -- //Note that the breakiterator test will fail on older icu versions -- //(4.2.1) for the 200B (ZWSP) Zero Width Space testcase. - sal_Unicode aBreakTests[] = { ' ', 1, 2, 3, 4, 5, 6, 7, 0x91, 0x92, 0x200B, 0xE8FF, 0xF8FF }; - for (int mode = i18n::WordType::ANY_WORD; mode <= i18n::WordType::WORD_COUNT; ++mode) - { - //make sure that in all cases isBeginWord and isEndWord matches getWordBoundary - for (size_t i = 0; i < SAL_N_ELEMENTS(aBreakTests); ++i) - { -+#if (U_ICU_VERSION_MAJOR_NUM == 4) && (U_ICU_VERSION_MINOR_NUM <= 2) -+ //Note the breakiterator test is known to fail on older icu -+ //versions (4.2.1) for the 200B (ZWSP) Zero Width Space testcase. -+ if (aBreakTests[i] == 0x200B) -+ continue; -+#endif - OUString aTest("Word"); - aTest += OUString(aBreakTests[i]) + OUString("Word"); - aBounds = m_xBreak->getWordBoundary(aTest, 0, aLocale, mode, true); diff --git a/SOURCES/0001-No-fstack-protect-strong-for-gcc3_linux_aarch64-cpp2.patch b/SOURCES/0001-No-fstack-protect-strong-for-gcc3_linux_aarch64-cpp2.patch new file mode 100644 index 0000000..2452164 --- /dev/null +++ b/SOURCES/0001-No-fstack-protect-strong-for-gcc3_linux_aarch64-cpp2.patch @@ -0,0 +1,34 @@ +From 8d12e4ec8b843d59661a12a7a92bfec7e4473e0f Mon Sep 17 00:00:00 2001 +From: Stephan Bergmann +Date: Thu, 4 Sep 2014 15:26:58 +0200 +Subject: [PATCH] No -fstack-protect-strong for gcc3_linux_aarch64/cpp2uno.cxx + vtableSlotCall + +Change-Id: I52efda594d87c37c2d38c61b54f1eebcc76cdfce +--- + bridges/Library_cpp_uno.mk | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/bridges/Library_cpp_uno.mk b/bridges/Library_cpp_uno.mk +index 33a5c00..c2e303d 100644 +--- a/bridges/Library_cpp_uno.mk ++++ b/bridges/Library_cpp_uno.mk +@@ -38,7 +38,14 @@ endif + else ifeq ($(OS)-$(CPUNAME),LINUX-AARCH64) + + bridges_SELECTED_BRIDGE := gcc3_linux_aarch64 +-bridge_exception_objects := abi callvirtualfunction cpp2uno uno2cpp ++bridge_exception_objects := abi callvirtualfunction uno2cpp ++ ++$(eval $(call gb_Library_add_cxxobjects,$(gb_CPPU_ENV)_uno, \ ++ bridges/source/cpp_uno/$(bridges_SELECTED_BRIDGE)/cpp2uno, \ ++ $(subst -fstack-protector-strong,-fstack-protector, \ ++ $(gb_LinkTarget_EXCEPTIONFLAGS) \ ++ $(call gb_LinkTarget__get_cxxflags,$(gb_CPPU_ENV)_uno)) \ ++)) + + else ifeq ($(OS)-$(CPUNAME),LINUX-AXP) + +-- +1.9.3 + diff --git a/SOURCES/0001-Package-GeneratedPackage-fixup.patch b/SOURCES/0001-Package-GeneratedPackage-fixup.patch new file mode 100644 index 0000000..db1ebba --- /dev/null +++ b/SOURCES/0001-Package-GeneratedPackage-fixup.patch @@ -0,0 +1,26 @@ +From c17e40a9b712142c268e0f57fe2e092350d2f2c0 Mon Sep 17 00:00:00 2001 +From: Stephan Bergmann +Date: Tue, 25 Feb 2014 16:03:21 +0100 +Subject: [PATCH] Package -> GeneratedPackage fixup + +Change-Id: Ib6e7a456b2f39c47da44552184669005d18d4fa4 +--- + odk/CustomTarget_check.mk | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/odk/CustomTarget_check.mk b/odk/CustomTarget_check.mk +index 88af63a..175d44d 100644 +--- a/odk/CustomTarget_check.mk ++++ b/odk/CustomTarget_check.mk +@@ -38,7 +38,7 @@ $(call gb_CustomTarget_get_workdir,odk/check)/checkbin : \ + ) \ + $(call gb_Package_get_target,odk_docs) \ + $(call gb_Package_get_target,odk_html) \ +- $(if $(ENABLE_JAVA),$(call gb_Package_get_target,odk_javadoc)) \ ++ $(if $(ENABLE_JAVA),$(call gb_GeneratedPackage_get_target,odk_javadoc)) \ + $(call gb_Package_get_target,odk_lib) \ + $(call gb_Package_get_target,odk_settings) \ + $(call gb_Package_get_target,odk_settings_generated) \ +-- +1.9.0 + diff --git a/SOURCES/0001-Related-fdo-36815-center-scaled-comment-page-vertica.patch b/SOURCES/0001-Related-fdo-36815-center-scaled-comment-page-vertica.patch new file mode 100644 index 0000000..501825f --- /dev/null +++ b/SOURCES/0001-Related-fdo-36815-center-scaled-comment-page-vertica.patch @@ -0,0 +1,104 @@ +From 9fd97266ce7dbeac33c93b6dace69d64c02d222c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Wed, 23 Apr 2014 15:22:13 +0100 +Subject: [PATCH] Related: fdo#36815 center scaled comment page vertically + +so comments at the top of the page don't get clipped +off the true printable area + +Change-Id: Icb796c901372437b276e7ce4e31c08e0bf2ec250 +--- + sw/source/core/view/vprint.cxx | 56 +++++++++++++++--------------------------- + 1 file changed, 20 insertions(+), 36 deletions(-) + +diff --git a/sw/source/core/view/vprint.cxx b/sw/source/core/view/vprint.cxx +index b680e52..0022fff 100644 +--- a/sw/source/core/view/vprint.cxx ++++ b/sw/source/core/view/vprint.cxx +@@ -455,26 +455,6 @@ sal_Bool SwViewShell::PrintOrPDFExport( + // output device is now provided by a call from outside the Writer) + pOutDev->Push(); + +- // fdo#36815 for comments in margins print to a metafile +- // and then scale that metafile down so that the comments +- // will fit on the real page, and replay that scaled +- // output to the real outputdevice +- GDIMetaFile *pOrigRecorder(NULL); +- GDIMetaFile *pMetaFile(NULL); +- sal_Int16 nPostItMode = rPrintData.GetPrintPostIts(); +- if (nPostItMode == POSTITS_INMARGINS) +- { +- //get and disable the existing recorder +- pOrigRecorder = pOutDev->GetConnectMetaFile(); +- pOutDev->SetConnectMetaFile(NULL); +- // turn off output to the device +- pOutDev->EnableOutput(false); +- // just record the rendering commands to the metafile +- // instead +- pMetaFile = new GDIMetaFile; +- pMetaFile->Record(pOutDev); +- } +- + // Print/PDF export for (multi-)selection has already generated a + // temporary document with the selected text. + // (see XRenderable implementation in unotxdoc.cxx) +@@ -490,6 +470,8 @@ sal_Bool SwViewShell::PrintOrPDFExport( + pDrawView->SetBufferedOverlayAllowed( false ); + } + ++ sal_Int16 nPostItMode = rPrintData.GetPrintPostIts(); ++ + { // additional scope so that the CurrShell is reset before destroying the shell + + SET_CURR_SHELL( pShell ); +@@ -537,22 +519,6 @@ sal_Bool SwViewShell::PrintOrPDFExport( + pPostItManager->CalcRects(); + pPostItManager->LayoutPostIts(); + pPostItManager->DrawNotesForPage(pOutDev, nPage-1); +- +- //Now scale the recorded page down so the notes +- //will fit in the final page +- pMetaFile->Stop(); +- pMetaFile->WindStart(); +- double fScale = 0.75; +- pMetaFile->Scale( fScale, fScale ); +- pMetaFile->WindStart(); +- +- //Enable output the the device again +- pOutDev->EnableOutput(true); +- //Restore the original recorder +- pOutDev->SetConnectMetaFile(pOrigRecorder); +- //play back the scaled page +- pMetaFile->Play(pOutDev); +- delete pMetaFile; + } + } + +@@ -562,6 +528,24 @@ sal_Bool SwViewShell::PrintOrPDFExport( + // output device is now provided by a call from outside the Writer) + pOutDev->Pop(); + ++ // fdo#36815 for comments in margins get the metafile we are printing to ++ // and then scale and vertically center that metafile down so that the ++ // comments will fit on the real page ++ GDIMetaFile *pRecorder = pOutDev->GetConnectMetaFile(); ++ if (nPostItMode == POSTITS_INMARGINS && pRecorder) ++ { ++ pRecorder->Stop(); ++ pRecorder->WindStart(); ++ double fScale = 0.75; ++ long nOrigHeight = pOutDev->GetOutputSize().Height(); ++ long nNewHeight = nOrigHeight*fScale; ++ long nShiftY = (nOrigHeight-nNewHeight)/2; ++ pRecorder->Scale(fScale, fScale); ++ pRecorder->WindStart(); ++ pRecorder->Move(0, nShiftY, pOutDev->ImplGetDPIX(), pOutDev->ImplGetDPIY()); ++ pRecorder->WindStart(); ++ } ++ + return sal_True; + } + +-- +1.9.0 + diff --git a/SOURCES/0001-Related-fdo-36815-clip-overlarge-comment-contents.patch b/SOURCES/0001-Related-fdo-36815-clip-overlarge-comment-contents.patch new file mode 100644 index 0000000..5e76743 --- /dev/null +++ b/SOURCES/0001-Related-fdo-36815-clip-overlarge-comment-contents.patch @@ -0,0 +1,102 @@ +From 0709713ad7ee0fa26b2a4f12720834e47e5dd681 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Tue, 6 May 2014 15:56:23 +0100 +Subject: [PATCH] Related: fdo#36815 clip overlarge comment contents + +and add an indicator that the comment won't fit in the space available + +Change-Id: I8dce7dfa678a606e8c4532addc4ba70c2a43644e +--- + sw/source/ui/docvw/SidebarTxtControl.cxx | 23 ++++------------------- + sw/source/ui/docvw/SidebarWin.cxx | 31 ++++++++++++++++++++++--------- + 2 files changed, 26 insertions(+), 28 deletions(-) + +diff --git a/sw/source/ui/docvw/SidebarTxtControl.cxx b/sw/source/ui/docvw/SidebarTxtControl.cxx +index 15af740..889c3bb 100644 +--- a/sw/source/ui/docvw/SidebarTxtControl.cxx ++++ b/sw/source/ui/docvw/SidebarTxtControl.cxx +@@ -120,28 +120,13 @@ void SidebarTxtControl::RequestHelp(const HelpEvent &rEvt) + + void SidebarTxtControl::Draw(OutputDevice* pDev, const Point& rPt, const Size& rSz, sal_uLong) + { +- if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) +- { +- if ( mrSidebarWin.IsMouseOverSidebarWin() || +- HasFocus() ) +- { +- pDev->DrawGradient( Rectangle( Point(0,0) + rPt, PixelToLogic(GetSizePixel()) ), +- Gradient( GradientStyle_LINEAR, +- mrSidebarWin.ColorDark(), +- mrSidebarWin.ColorDark() ) ); +- } +- else +- { +- pDev->DrawGradient( Rectangle( Point(0,0) + rPt, PixelToLogic(GetSizePixel()) ), +- Gradient( GradientStyle_LINEAR, +- mrSidebarWin.ColorLight(), +- mrSidebarWin.ColorDark())); +- } +- } ++ //Take the control's height, but overwrite the scrollbar area if there was one ++ Size aSize(PixelToLogic(GetSizePixel())); ++ aSize.Width() = rSz.Width(); + + if ( GetTextView() ) + { +- GetTextView()->GetOutliner()->Draw(pDev, Rectangle(rPt, rSz)); ++ GetTextView()->GetOutliner()->Draw(pDev, Rectangle(rPt, aSize)); + } + + if ( mrSidebarWin.GetLayoutStatus()==SwPostItHelper::DELETED ) +diff --git a/sw/source/ui/docvw/SidebarWin.cxx b/sw/source/ui/docvw/SidebarWin.cxx +index c3aa5b0..ebc4d4c 100644 +--- a/sw/source/ui/docvw/SidebarWin.cxx ++++ b/sw/source/ui/docvw/SidebarWin.cxx +@@ -218,15 +218,7 @@ void SwSidebarWin::Draw(OutputDevice* pDev, const Point& rPt, const Size& rSz, s + { + if (mpMetadataAuthor->IsVisible() ) + { +- //draw left over space +- if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) +- { +- pDev->SetFillColor(COL_BLACK); +- } +- else +- { +- pDev->SetFillColor(mColorDark); +- } ++ pDev->SetFillColor(mColorDark); + pDev->SetLineColor(); + pDev->DrawRect( Rectangle( rPt, rSz ) ); + } +@@ -265,6 +257,27 @@ void SwSidebarWin::Draw(OutputDevice* pDev, const Point& rPt, const Size& rSz, s + + pProcessor->process(rSequence); + delete pProcessor; ++ ++ if (mpVScrollbar->IsVisible()) ++ { ++ Font aOrigFont(mpMetadataDate->GetControlFont()); ++ Color aOrigBg( mpMetadataDate->GetControlBackground() ); ++ OUString sOrigText(mpMetadataDate->GetText()); ++ ++ Size aSize(PixelToLogic(mpMenuButton->GetSizePixel())); ++ Point aPos(PixelToLogic(mpMenuButton->GetPosPixel())); ++ aPos += rPt; ++ ++ Font aFont( mpMetadataDate->GetSettings().GetStyleSettings().GetFieldFont() ); ++ mpMetadataDate->SetControlFont( aFont ); ++ mpMetadataDate->SetControlBackground( 0xFFFFFF ); ++ mpMetadataDate->SetText("..."); ++ mpMetadataDate->Draw(pDev, aPos, aSize, nInFlags); ++ ++ mpMetadataDate->SetText(sOrigText); ++ mpMetadataDate->SetControlFont( aOrigFont ); ++ mpMetadataDate->SetControlBackground( aOrigBg ); ++ } + } + + void SwSidebarWin::SetPosSizePixelRect( long nX, +-- +1.9.0 + diff --git a/SOURCES/0001-Related-fdo-36815-print-the-text-highlight-range-as-.patch b/SOURCES/0001-Related-fdo-36815-print-the-text-highlight-range-as-.patch new file mode 100644 index 0000000..9a34fea --- /dev/null +++ b/SOURCES/0001-Related-fdo-36815-print-the-text-highlight-range-as-.patch @@ -0,0 +1,24 @@ +From fede08ac7d8b9d6c0abd2ba1b09fd3beb1c1b7e7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Thu, 17 Apr 2014 08:41:07 +0100 +Subject: [PATCH] Related: fdo#36815 print the text highlight range as well + +Change-Id: Ic332b1968b5dc72d26bd704cce70a496ec81e0b8 +--- + sw/source/core/layout/paintfrm.cxx | 2 +- + sw/source/core/uibase/docvw/SidebarWin.cxx | 4 ++-- + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx +index a5cbf3b..eb3133a 100644 +--- a/sw/source/core/layout/paintfrm.cxx ++++ b/sw/source/core/layout/paintfrm.cxx +@@ -6172,7 +6172,7 @@ static void lcl_paintBitmapExToRect(OutputDevice *pOut, const Point& aPoint, con + SwAlignRect( aPageRect, _pViewShell ); + + const SwPostItMgr *pMgr = _pViewShell->GetPostItMgr(); +- if (pMgr /*&& pMgr->ShowNotes()*/ && pMgr->HasNotes()) // do not show anything in print preview ++ if (pMgr && pMgr->ShowNotes() && pMgr->HasNotes()) // do not show anything in print preview + { + sal_Int32 nScrollerHeight = pMgr->GetSidebarScrollerHeight(); + const Rectangle &aVisRect = _pViewShell->VisArea().SVRect(); diff --git a/SOURCES/0001-Related-fdo-50697-reset-the-cache-timeout-on-GetGrap.patch b/SOURCES/0001-Related-fdo-50697-reset-the-cache-timeout-on-GetGrap.patch new file mode 100644 index 0000000..441a047 --- /dev/null +++ b/SOURCES/0001-Related-fdo-50697-reset-the-cache-timeout-on-GetGrap.patch @@ -0,0 +1,63 @@ +From 62b0eaf37c08dd27244e77b8bc90c691b000ebd6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Tue, 29 Apr 2014 14:17:11 +0100 +Subject: [PATCH] Related: fdo#50697 reset the cache timeout on GetGraphic + +so the graphic gets swapped out Xms after the last use and not Xms after +initial creation regardless of if it got used a moment earlier. + +Change-Id: I1458f307d090ecd8d8d031b545f23e78bf1bcb67 +--- + include/svtools/grfmgr.hxx | 2 ++ + svtools/source/graphic/grfmgr.cxx | 20 ++++++++++++++++++-- + 2 files changed, 20 insertions(+), 2 deletions(-) + +diff --git a/include/svtools/grfmgr.hxx b/include/svtools/grfmgr.hxx +index 3e1423a..251ee6d 100644 +--- a/include/svtools/grfmgr.hxx ++++ b/include/svtools/grfmgr.hxx +@@ -299,6 +299,8 @@ private: + + DECL_LINK( ImplAutoSwapOutHdl, void* ); + ++ void SVT_DLLPRIVATE ResetCacheTimeOut(); ++ + protected: + + virtual void GraphicManagerDestroyed(); +diff --git a/svtools/source/graphic/grfmgr.cxx b/svtools/source/graphic/grfmgr.cxx +index 087d27b..a405ea7 100644 +--- a/svtools/source/graphic/grfmgr.cxx ++++ b/svtools/source/graphic/grfmgr.cxx +@@ -744,10 +744,26 @@ void GraphicObject::StopAnimation( OutputDevice* pOut, long nExtraData ) + mpSimpleCache->maGraphic.StopAnimation( pOut, nExtraData ); + } + ++void GraphicObject::ResetCacheTimeOut() ++{ ++ if (mpSwapOutTimer) ++ { ++ mpSwapOutTimer->Stop(); ++ mpSwapOutTimer->Start(); ++ } ++} ++ + const Graphic& GraphicObject::GetGraphic() const + { +- if( mbAutoSwapped ) +- ( (GraphicObject*) this )->ImplAutoSwapIn(); ++ GraphicObject *pThis = const_cast(this); ++ ++ if (mbAutoSwapped) ++ pThis->ImplAutoSwapIn(); ++ ++ //fdo#50697 If we've been asked to provide the graphic, then reset ++ //the cache timeout to start from now and not remain at the ++ //time of creation ++ pThis->ResetCacheTimeOut(); + + return maGraphic; + } +-- +1.9.0 + diff --git a/SOURCES/0001-Related-rhbz-1032774-bodge-around-reported-NULL-valu.patch b/SOURCES/0001-Related-rhbz-1032774-bodge-around-reported-NULL-valu.patch new file mode 100644 index 0000000..dc9299c --- /dev/null +++ b/SOURCES/0001-Related-rhbz-1032774-bodge-around-reported-NULL-valu.patch @@ -0,0 +1,36 @@ +From 5620f5ba2fa123f029ac449f69a89ffc5703c71e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Thu, 21 Nov 2013 15:27:59 +0000 +Subject: [PATCH] Related: rhbz#1032774 bodge-around reported NULL value here + +Change-Id: I9c4791b8f82cdd6e4823f88f592ad9ce233b6966 +--- + sd/source/ui/slideshow/slideshow.cxx | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/sd/source/ui/slideshow/slideshow.cxx b/sd/source/ui/slideshow/slideshow.cxx +index 2bab38d..b71cad6 100644 +--- a/sd/source/ui/slideshow/slideshow.cxx ++++ b/sd/source/ui/slideshow/slideshow.cxx +@@ -1235,10 +1235,15 @@ void SlideShow::StartFullscreenPresentation( ) + // frame view of the current view shell. This avoids that + // changes made by the presentation have an effect on the other + // view shells. +- FrameView* pOriginalFrameView = mpCurrentViewShellBase ? mpCurrentViewShellBase->GetMainViewShell()->GetFrameView() : 0; ++ FrameView* pOriginalFrameView = 0; ++ if (mpCurrentViewShellBase) ++ { ++ ::boost::shared_ptr xShell(mpCurrentViewShellBase->GetMainViewShell()); ++ if (xShell.get()) ++ pOriginalFrameView = xShell->GetFrameView(); ++ } + +- if( mpFullScreenFrameView ) +- delete mpFullScreenFrameView; ++ delete mpFullScreenFrameView; + mpFullScreenFrameView = new FrameView(mpDoc, pOriginalFrameView); + + // The new frame is created hidden. To make it visible and activate the +-- +1.8.3.1 + diff --git a/SOURCES/0001-Related-rhbz-1065807-rework-i66157-for-multiple-writ.patch b/SOURCES/0001-Related-rhbz-1065807-rework-i66157-for-multiple-writ.patch new file mode 100644 index 0000000..31230c1 --- /dev/null +++ b/SOURCES/0001-Related-rhbz-1065807-rework-i66157-for-multiple-writ.patch @@ -0,0 +1,204 @@ +From 2fc88c27a7c329753f2c58ec5ee1caa3678200ae Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Mon, 24 Feb 2014 15:27:36 +0000 +Subject: [PATCH] Related: rhbz#1065807 rework #i66157# for multiple writable + template dirs + +if there are multiple user-level template dirs then we should be able to +remove/rename content in all of them, not just the default writable target. + +The target scenario here is to default to ~/Templates when it exists as the +template dir, but to retain ~/.config/libreoffice/user/template in the dir for +any pre-existing templates and to treat both as equivalent in terms of removing +their content etc. + +i#66157# wanted to avoid remove extensions templates and other internal +ones, so rework that logic to instead just be hands off internal templates +and allow modification of the remainder + +Change-Id: I56afe991d4297ba692e914ae95ea02d68553f60a +--- + sfx2/source/doc/doctemplates.cxx | 82 ++++++++++++++++++++++++++++++++-------- + 1 file changed, 67 insertions(+), 15 deletions(-) + +diff --git a/sfx2/source/doc/doctemplates.cxx b/sfx2/source/doc/doctemplates.cxx +index ff07ef3..fe43a40 100644 +--- a/sfx2/source/doc/doctemplates.cxx ++++ b/sfx2/source/doc/doctemplates.cxx +@@ -54,6 +54,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -180,6 +181,7 @@ class SfxDocTplService_Impl + + ::osl::Mutex maMutex; + Sequence< OUString > maTemplateDirs; ++ Sequence< OUString > maInternalTemplateDirs; + OUString maRootURL; + NameList_Impl maNames; + Locale maLocale; +@@ -264,8 +266,16 @@ class SfxDocTplService_Impl + + void updateData( DocTemplates_EntryData_Impl *pData ); + ++ //See: #i66157# and rhbz#1065807 ++ //return which template dir the rURL is a subpath of ++ OUString findParentTemplateDir(const OUString& rURL) const; ++ ++ //See: #i66157# and rhbz#1065807 ++ //return true if rURL is a path (or subpath of) a dir which is not a user path ++ //which implies neither it or its contents can be removed ++ bool isInternalTemplateDir(const OUString& rURL) const; + public: +- SfxDocTplService_Impl( const uno::Reference< XComponentContext > & xContext ); ++ SfxDocTplService_Impl( const uno::Reference< XComponentContext > & xContext ); + ~SfxDocTplService_Impl(); + + sal_Bool init() { if ( !mbIsInitialized ) init_Impl(); return mbIsInitialized; } +@@ -545,7 +555,7 @@ void SfxDocTplService_Impl::getDirList() + // TODO/LATER: let use service, register listener + INetURLObject aURL; + OUString aDirs = SvtPathOptions().GetTemplatePath(); +- sal_uInt16 nCount = comphelper::string::getTokenCount(aDirs, C_DELIM); ++ sal_Int32 nCount = comphelper::string::getTokenCount(aDirs, C_DELIM); + + maTemplateDirs = Sequence< OUString >( nCount ); + +@@ -553,7 +563,7 @@ void SfxDocTplService_Impl::getDirList() + const OUString aPrefix( + "vnd.sun.star.expand:" ); + +- for ( sal_uInt16 i=0; i xPathSettings = ++ css::util::PathSettings::create( mxContext ); ++ ++ // load internal paths ++ OUString sProp( "Template_internal" ); ++ Any aAny = xPathSettings->getPropertyValue( sProp ); ++ aAny >>= maInternalTemplateDirs; ++ ++ nCount = maInternalTemplateDirs.getLength(); ++ for (sal_Int32 i = 0; i < nCount; ++i) ++ { ++ //expand vnd.sun.star.expand: and remove "..." from them ++ //to normalize into the expected url patterns ++ maRelocator.makeRelocatableURL(maInternalTemplateDirs[i]); ++ maRelocator.makeAbsoluteURL(maInternalTemplateDirs[i]); ++ } ++ + // Store the template dir list + setProperty( maRootContent, aPropName, aValue ); + } +@@ -1547,13 +1574,16 @@ sal_Bool SfxDocTplService_Impl::removeGroup( const OUString& rGroupName ) + + if ( !maTemplateDirs.getLength() ) + return sal_False; +- OUString aGeneralTempPath = maTemplateDirs[ maTemplateDirs.getLength() - 1 ]; + + // check that the fs location is in writeble folder and this is not a "My templates" folder + INetURLObject aGroupParentFolder( aGroupTargetURL ); +- if ( !aGroupParentFolder.removeSegment() +- || !::utl::UCBContentHelper::IsSubPath( aGeneralTempPath, +- aGroupParentFolder.GetMainURL( INetURLObject::NO_DECODE ) ) ) ++ if (!aGroupParentFolder.removeSegment()) ++ return sal_False; ++ ++ OUString aGeneralTempPath = findParentTemplateDir( ++ aGroupParentFolder.GetMainURL(INetURLObject::NO_DECODE)); ++ ++ if (aGeneralTempPath.isEmpty()) + return sal_False; + + // now get the content of the Group +@@ -1661,14 +1691,14 @@ sal_Bool SfxDocTplService_Impl::renameGroup( const OUString& rOldName, + + if ( !maTemplateDirs.getLength() ) + return sal_False; +- OUString aGeneralTempPath = maTemplateDirs[ maTemplateDirs.getLength() - 1 ]; + + // check that the fs location is in writeble folder and this is not a "My templates" folder + INetURLObject aGroupParentFolder( aGroupTargetURL ); +- if ( !aGroupParentFolder.removeSegment() +- || !::utl::UCBContentHelper::IsSubPath( aGeneralTempPath, +- aGroupParentFolder.GetMainURL( INetURLObject::NO_DECODE ) ) ) ++ if (!aGroupParentFolder.removeSegment() || ++ isInternalTemplateDir(aGroupParentFolder.GetMainURL(INetURLObject::NO_DECODE))) ++ { + return sal_False; ++ } + + // check that the group can be renamed ( all the contents must be in target location ) + sal_Bool bCanBeRenamed = sal_False; +@@ -1770,7 +1800,7 @@ sal_Bool SfxDocTplService_Impl::storeTemplate( const OUString& rGroupName, + aValue >>= aTemplateToRemoveTargetURL; + + if ( aGroupTargetURL.isEmpty() || !maTemplateDirs.getLength() +- || (!aTemplateToRemoveTargetURL.isEmpty() && !::utl::UCBContentHelper::IsSubPath( maTemplateDirs[ maTemplateDirs.getLength() - 1 ], aTemplateToRemoveTargetURL )) ) ++ || (!aTemplateToRemoveTargetURL.isEmpty() && isInternalTemplateDir(aTemplateToRemoveTargetURL)) ) + return sal_False; // it is not allowed to remove the template + } + +@@ -1909,6 +1939,30 @@ sal_Bool SfxDocTplService_Impl::storeTemplate( const OUString& rGroupName, + } + } + ++bool SfxDocTplService_Impl::isInternalTemplateDir(const OUString& rURL) const ++{ ++ const sal_Int32 nDirs = maInternalTemplateDirs.getLength(); ++ const OUString* pDirs = maInternalTemplateDirs.getConstArray(); ++ for (sal_Int32 i = 0; i < nDirs; ++i, ++pDirs) ++ { ++ if (::utl::UCBContentHelper::IsSubPath(*pDirs, rURL)) ++ return true; ++ } ++ return false; ++} ++ ++OUString SfxDocTplService_Impl::findParentTemplateDir(const OUString& rURL) const ++{ ++ const sal_Int32 nDirs = maTemplateDirs.getLength(); ++ const OUString* pDirs = maTemplateDirs.getConstArray(); ++ for (sal_Int32 i = 0; i < nDirs; ++i, ++pDirs) ++ { ++ if (::utl::UCBContentHelper::IsSubPath(*pDirs, rURL)) ++ return *pDirs; ++ } ++ return OUString(); ++} ++ + //----------------------------------------------------------------------------- + sal_Bool SfxDocTplService_Impl::addTemplate( const OUString& rGroupName, + const OUString& rTemplateName, +@@ -2032,7 +2086,6 @@ sal_Bool SfxDocTplService_Impl::addTemplate( const OUString& rGroupName, + catch ( Exception& ) + { return sal_False; } + +- + // either the document has title and it is the same as requested, or we have to set it + sal_Bool bCorrectTitle = ( bDocHasTitle && aTitle.equals( rTemplateName ) ); + if ( !bCorrectTitle ) +@@ -2101,8 +2154,7 @@ sal_Bool SfxDocTplService_Impl::removeTemplate( const OUString& rGroupName, + // delete the target template + if ( !aTargetURL.isEmpty() ) + { +- if ( !maTemplateDirs.getLength() +- || !::utl::UCBContentHelper::IsSubPath( maTemplateDirs[ maTemplateDirs.getLength() - 1 ], aTargetURL ) ) ++ if (isInternalTemplateDir(aTargetURL)) + return sal_False; + + removeContent( aTargetURL ); +-- +1.8.5.3 + diff --git a/SOURCES/0001-Related-rhbz-1075951-abrt-crash-in-MSWordExportBase-.patch b/SOURCES/0001-Related-rhbz-1075951-abrt-crash-in-MSWordExportBase-.patch new file mode 100644 index 0000000..f92356e --- /dev/null +++ b/SOURCES/0001-Related-rhbz-1075951-abrt-crash-in-MSWordExportBase-.patch @@ -0,0 +1,34 @@ +From 7d53f81f0a88afcff0f60bbd066a5645ac2e6a8b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Fri, 14 Mar 2014 15:30:31 +0000 +Subject: [PATCH] Related: rhbz#1075951 abrt crash in + MSWordExportBase::OutputFormat + +Change-Id: I681fa40196eb04f4824e49458cba0acc15b26193 +--- + sw/source/filter/ww8/ww8atr.cxx | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx +index 7eb3134..da25acc 100644 +--- a/sw/source/filter/ww8/ww8atr.cxx ++++ b/sw/source/filter/ww8/ww8atr.cxx +@@ -745,10 +745,13 @@ void MSWordExportBase::OutputFormat( const SwFmt& rFmt, bool bPapFmt, bool bChpF + case RES_TXTFMTCOLL: + if( bPapFmt ) + { ++ int nLvl = MAXLEVEL; ++ + if (((const SwTxtFmtColl&)rFmt).IsAssignedToListLevelOfOutlineStyle()) +- { +- int nLvl = ((const SwTxtFmtColl&)rFmt).GetAssignedOutlineStyleLevel(); ++ nLvl = ((const SwTxtFmtColl&)rFmt).GetAssignedOutlineStyleLevel(); + ++ if (nLvl >= 0 && nLvl < MAXLEVEL) ++ { + //if outline numbered + // if Write StyleDefinition then write the OutlineRule + const SwNumFmt& rNFmt = pDoc->GetOutlineNumRule()->Get( static_cast( nLvl ) ); +-- +1.8.5.3 + diff --git a/SOURCES/0001-Related-rhbz-1130264-plausible-fix-for-reported-cras.patch b/SOURCES/0001-Related-rhbz-1130264-plausible-fix-for-reported-cras.patch new file mode 100644 index 0000000..abd96ee --- /dev/null +++ b/SOURCES/0001-Related-rhbz-1130264-plausible-fix-for-reported-cras.patch @@ -0,0 +1,76 @@ +From eb21b6827e25b2c943025a662cde2049c0454a6b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Fri, 15 Aug 2014 15:59:58 +0100 +Subject: [PATCH] Related: rhbz#1130264 plausible fix for reported crash + +Change-Id: I4ccdf19bfc7986881f7022109f22f47a0f493591 +--- + avmedia/source/gstreamer/gstplayer.cxx | 20 ++++++++++++++++---- + avmedia/source/gstreamer/gstplayer.hxx | 3 +++ + 2 files changed, 19 insertions(+), 4 deletions(-) + +diff --git a/avmedia/source/gstreamer/gstplayer.cxx b/avmedia/source/gstreamer/gstplayer.cxx +index ceea8e2..836e89e 100644 +--- a/avmedia/source/gstreamer/gstplayer.cxx ++++ b/avmedia/source/gstreamer/gstplayer.cxx +@@ -74,7 +74,9 @@ Player::Player( const uno::Reference< lang::XMultiServiceFactory >& rxMgr ) : + mpXOverlay( NULL ), + mnDuration( 0 ), + mnWidth( 0 ), +- mnHeight( 0 ) ++ mnHeight( 0 ), ++ mnWatchID( 0 ), ++ mbWatchID( false ) + { + // Initialize GStreamer library + int argc = 1; +@@ -127,11 +129,15 @@ void SAL_CALL Player::disposing() + g_object_unref( G_OBJECT ( mpXOverlay ) ); + mpXOverlay = NULL; + } ++ ++ } ++ if (mbWatchID) ++ { ++ g_source_remove(mnWatchID); ++ mbWatchID = false; + } + } + +-// ------------------------------------------------------------------------------ +- + static gboolean pipeline_bus_callback( GstBus *, GstMessage *message, gpointer data ) + { + Player* pPlayer = static_cast(data); +@@ -357,7 +363,13 @@ void Player::preparePlaybin( const OUString& rURL, GstElement *pSink ) + g_object_set( G_OBJECT( mpPlaybin ), "uri", ascURL.getStr() , NULL ); + + pBus = gst_element_get_bus( mpPlaybin ); +- gst_bus_add_watch( pBus, pipeline_bus_callback, this ); ++ if (mbWatchID) ++ { ++ g_source_remove(mnWatchID); ++ mbWatchID = false; ++ } ++ mnWatchID = gst_bus_add_watch( pBus, pipeline_bus_callback, this ); ++ mbWatchID = true; + DBG( "%p set sync handler", this ); + #ifdef AVMEDIA_GST_0_10 + gst_bus_set_sync_handler( pBus, pipeline_bus_sync_handler, this ); +diff --git a/avmedia/source/gstreamer/gstplayer.hxx b/avmedia/source/gstreamer/gstplayer.hxx +index 2426eed..33c9e4d 100644 +--- a/avmedia/source/gstreamer/gstplayer.hxx ++++ b/avmedia/source/gstreamer/gstplayer.hxx +@@ -97,6 +97,9 @@ protected: + int mnWidth; + int mnHeight; + ++ guint mnWatchID; ++ bool mbWatchID; ++ + osl::Condition maSizeCondition; + }; + +-- +1.9.3 + diff --git a/SOURCES/0001-Related-rhbz-919070-display-1-means-span-all-display.patch b/SOURCES/0001-Related-rhbz-919070-display-1-means-span-all-display.patch deleted file mode 100644 index 817b1e0..0000000 --- a/SOURCES/0001-Related-rhbz-919070-display-1-means-span-all-display.patch +++ /dev/null @@ -1,463 +0,0 @@ -From eb27eda272dd9fe6dfa4ebcfef24069bd117e5b3 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= -Date: Fri, 18 Oct 2013 10:04:45 +0100 -Subject: [PATCH] Related: rhbz#919070 display -1 means span all displays - -So try to set size to full "screen" size. most window managers -will ignore this however unless _NET_WM_FULLSCREEN_MONITORS is -set, Under gtk3 we can use gdk_window_set_fullscreen_mode to -do that. Its effectively impractical for LibreOffice to itself -calculate the right parameters for _NET_WM_FULLSCREEN_MONITORS -as far as I can see - -Change-Id: Ia725f21048bfcec3dbf1478b4303ccd9cfec0b36 -(cherry picked from commit a8dd794356cb62480b2dc12504ad9e0158a0b583) - -Resolves: rhbz#919070 offload set span-all-displays to a gtk3 utility - -Jaw dropping hack to set a slideshow to span all -monitors if gtk3 is available at runtime - -(cherry picked from commit 14bb85e0a3d95419c484bfa23881f03c54031c5d) - -Conflicts: - Repository.mk - -Change-Id: I363f63c9855d5cb1f92d65d0b34add0c60f7263c - -missing .mk - -Change-Id: I923153579d6cc50354450a5b3a55ecc133ae5e41 -(cherry picked from commit 2d3dd8594ee3e43fcf9a65887f90d187a4393297) - -move xid-fullscreen into gnome package - -Change-Id: I2ad0838a12ce06b2c6e77b7f55cdc2cd0627a38b -(cherry picked from commit 9c1170b25a9fab13084d2677aa4fc986db5ab675) - -pScreen uninitialized - -Change-Id: I244c3b5a949ae5c8a5bf46d1b58439e080b2c848 -(cherry picked from commit 1b4aa55ecd7b2c3f6e0d281642d0ed0a066dec69) ---- - Repository.mk | 3 + - scp2/source/gnome/module_gnome.scp | 3 +- - scp2/source/ooo/file_library_ooo.scp | 10 ++ - vcl/Executable_xid_fullscreen_on_all_monitors.mk | 20 +++ - vcl/Module_vcl.mk | 1 + - vcl/inc/unx/gtk/gtkframe.hxx | 1 + - vcl/unx/gtk/window/gtksalframe.cxx | 134 ++++++++++++++++----- - .../gtk/window/xid_fullscreen_on_all_monitors.c | 99 +++++++++++++++ - 8 files changed, 243 insertions(+), 28 deletions(-) - create mode 100644 vcl/Executable_xid_fullscreen_on_all_monitors.mk - create mode 100644 vcl/unx/gtk/window/xid_fullscreen_on_all_monitors.c - -diff --git a/Repository.mk b/Repository.mk -index e0d4d7c..99278bc 100644 ---- a/Repository.mk -+++ b/Repository.mk -@@ -89,6 +89,9 @@ endif - $(eval $(call gb_Helper_register_executables,OOO, \ - gnome-open-url.bin \ - spadmin.bin \ -+ $(if $(filter $(GUIBASE)$(ENABLE_GTK),unxTRUE), \ -+ xid-fullscreen-on-all-monitors \ -+ ) \ - $(if $(filter $(GUIBASE)$(ENABLE_TDE),unxTRUE), \ - tdefilepicker \ - ) \ -diff --git a/scp2/source/gnome/module_gnome.scp b/scp2/source/gnome/module_gnome.scp -index e8a22bf..75214d5 100644 ---- a/scp2/source/gnome/module_gnome.scp -+++ b/scp2/source/gnome/module_gnome.scp -@@ -34,7 +34,8 @@ Module gid_Module_Optional_Gnome - gid_File_Share_Registry_Gnome_Xcd, - #endif - gid_File_Bin_Gnome_Open_Url, -- gid_File_Bin_Gnome_Open_Url_Bin -+ gid_File_Bin_Gnome_Open_Url_Bin, -+ gid_File_Bin_XidFullscreen - ); - End - -diff --git a/scp2/source/ooo/file_library_ooo.scp b/scp2/source/ooo/file_library_ooo.scp -index 36ec8d4..417f483 100644 ---- a/scp2/source/ooo/file_library_ooo.scp -+++ b/scp2/source/ooo/file_library_ooo.scp -@@ -343,6 +343,16 @@ File gid_File_Bin_KdeFilePicker - Name = "kdefilepicker"; - End - #endif -+ -+#ifdef ENABLE_GTK -+File gid_File_Bin_XidFullscreen -+ BIN_FILE_BODY; -+ Styles = (PACKED); -+ Dir = gid_Brand_Dir_Program; -+ Name = "xid-fullscreen-on-all-monitors"; -+End -+#endif -+ - #endif - - #ifdef MACOSX -diff --git a/vcl/Executable_xid_fullscreen_on_all_monitors.mk b/vcl/Executable_xid_fullscreen_on_all_monitors.mk -new file mode 100644 -index 0000000..5f9c127 ---- /dev/null -+++ b/vcl/Executable_xid_fullscreen_on_all_monitors.mk -@@ -0,0 +1,20 @@ -+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- -+# -+# This file is part of the LibreOffice project. -+# -+# This Source Code Form is subject to the terms of the Mozilla Public -+# License, v. 2.0. If a copy of the MPL was not distributed with this -+# file, You can obtain one at http://mozilla.org/MPL/2.0/. -+# -+ -+$(eval $(call gb_Executable_Executable,xid-fullscreen-on-all-monitors)) -+ -+$(eval $(call gb_Executable_add_libs,xid-fullscreen-on-all-monitors,\ -+ -ldl \ -+)) -+ -+$(eval $(call gb_Executable_add_cobjects,xid-fullscreen-on-all-monitors,\ -+ vcl/unx/gtk/window/xid_fullscreen_on_all_monitors \ -+)) -+ -+# vim: set noet sw=4 ts=4: -diff --git a/vcl/Module_vcl.mk b/vcl/Module_vcl.mk -index fd2be4c5..47031b3 100644 ---- a/vcl/Module_vcl.mk -+++ b/vcl/Module_vcl.mk -@@ -39,6 +39,7 @@ $(eval $(call gb_Module_add_targets,vcl,\ - - ifneq ($(ENABLE_GTK),) - $(eval $(call gb_Module_add_targets,vcl,\ -+ Executable_xid_fullscreen_on_all_monitors \ - Library_vclplug_gtk \ - )) - endif -diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx -index c3ea919..3edd2cb 100644 ---- a/vcl/inc/unx/gtk/gtkframe.hxx -+++ b/vcl/inc/unx/gtk/gtkframe.hxx -@@ -196,6 +196,7 @@ class GtkSalFrame : public SalFrame - guint m_nGSMCookie; - int m_nWorkArea; - bool m_bFullscreen; -+ bool m_bSpanMonitorsWhenFullscreen; - bool m_bDefaultPos; - bool m_bDefaultSize; - bool m_bSendModChangeOnRelease; -diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx -index fef8407..4a3d01c 100644 ---- a/vcl/unx/gtk/window/gtksalframe.cxx -+++ b/vcl/unx/gtk/window/gtksalframe.cxx -@@ -29,6 +29,9 @@ - #include - #include - #include -+#include -+#include -+#include - #include - #include - #include -@@ -814,6 +819,7 @@ void GtkSalFrame::InitCommon() - m_pCurrentCursor = NULL; - m_nKeyModifiers = 0; - m_bFullscreen = false; -+ m_bSpanMonitorsWhenFullscreen = false; - m_nState = GDK_WINDOW_STATE_WITHDRAWN; - m_nVisibility = GDK_VISIBILITY_FULLY_OBSCURED; - m_bSendModChangeOnRelease = false; -@@ -2045,43 +2051,68 @@ void GtkSalFrame::SetScreen( unsigned int nNewScreen, int eType, Rectangle *pSiz - if (maGeometry.nDisplayScreenNumber == nNewScreen && eType == SET_RETAIN_SIZE) - return; - -- gint nMonitor; -- bool bSameMonitor = false; -- GdkScreen *pScreen = getDisplay()->getSystem()->getScreenMonitorFromIdx( nNewScreen, nMonitor ); -- if (!pScreen) -+ GdkScreen *pScreen = NULL; -+ GdkRectangle aNewMonitor; -+ -+ bool bSpanAllScreens = nNewScreen == (unsigned int)-1; -+ m_bSpanMonitorsWhenFullscreen = bSpanAllScreens && getDisplay()->getSystem()->GetDisplayScreenCount() > 1; -+ -+ if (m_bSpanMonitorsWhenFullscreen) //span all screens - { -- g_warning ("Attempt to move GtkSalFrame to invalid screen %d => " -- "fallback to current\n", nNewScreen); - pScreen = gtk_widget_get_screen( m_pWindow ); -- bSameMonitor = true; -+ aNewMonitor.x = 0; -+ aNewMonitor.y = 0; -+ aNewMonitor.width = gdk_screen_get_width(pScreen); -+ aNewMonitor.height = gdk_screen_get_height(pScreen); - } -+ else -+ { -+ gint nMonitor; -+ bool bSameMonitor = false; - -- // Heavy lifting, need to move screen ... -- if( pScreen != gtk_widget_get_screen( m_pWindow )) -- gtk_window_set_screen( GTK_WINDOW( m_pWindow ), pScreen ); -+ if (!bSpanAllScreens) -+ { -+ pScreen = getDisplay()->getSystem()->getScreenMonitorFromIdx( nNewScreen, nMonitor ); -+ if (!pScreen) -+ { -+ g_warning ("Attempt to move GtkSalFrame to invalid screen %d => " -+ "fallback to current\n", nNewScreen); -+ } -+ } - -- gint nOldMonitor = gdk_screen_get_monitor_at_window( -- pScreen, widget_get_window( m_pWindow ) ); -- if (bSameMonitor) -- nMonitor = nOldMonitor; -+ if (!pScreen) -+ { -+ pScreen = gtk_widget_get_screen( m_pWindow ); -+ bSameMonitor = true; -+ } - --#if OSL_DEBUG_LEVEL > 1 -- if( nMonitor == nOldMonitor ) -- g_warning( "An apparently pointless SetScreen - should we elide it ?" ); --#endif -+ // Heavy lifting, need to move screen ... -+ if( pScreen != gtk_widget_get_screen( m_pWindow )) -+ gtk_window_set_screen( GTK_WINDOW( m_pWindow ), pScreen ); -+ -+ gint nOldMonitor = gdk_screen_get_monitor_at_window( -+ pScreen, widget_get_window( m_pWindow ) ); -+ if (bSameMonitor) -+ nMonitor = nOldMonitor; - -- GdkRectangle aOldMonitor, aNewMonitor; -- gdk_screen_get_monitor_geometry( pScreen, nOldMonitor, &aOldMonitor ); -- gdk_screen_get_monitor_geometry( pScreen, nMonitor, &aNewMonitor ); -+ #if OSL_DEBUG_LEVEL > 1 -+ if( nMonitor == nOldMonitor ) -+ g_warning( "An apparently pointless SetScreen - should we elide it ?" ); -+ #endif -+ -+ GdkRectangle aOldMonitor; -+ gdk_screen_get_monitor_geometry( pScreen, nOldMonitor, &aOldMonitor ); -+ gdk_screen_get_monitor_geometry( pScreen, nMonitor, &aNewMonitor ); -+ -+ maGeometry.nX = aNewMonitor.x + maGeometry.nX - aOldMonitor.x; -+ maGeometry.nY = aNewMonitor.y + maGeometry.nY - aOldMonitor.y; -+ } - - bool bResize = false; - bool bVisible = IS_WIDGET_MAPPED( m_pWindow ); - if( bVisible ) - Show( sal_False ); - -- maGeometry.nX = aNewMonitor.x + maGeometry.nX - aOldMonitor.x; -- maGeometry.nY = aNewMonitor.y + maGeometry.nY - aOldMonitor.y; -- - if( eType == SET_FULLSCREEN ) - { - maGeometry.nX = aNewMonitor.x; -@@ -2093,8 +2124,8 @@ void GtkSalFrame::SetScreen( unsigned int nNewScreen, int eType, Rectangle *pSiz - - // #i110881# for the benefit of compiz set a max size here - // else setting to fullscreen fails for unknown reasons -- m_aMaxSize.Width() = aNewMonitor.width+100; -- m_aMaxSize.Height() = aNewMonitor.height+100; -+ m_aMaxSize.Width() = aNewMonitor.width; -+ m_aMaxSize.Height() = aNewMonitor.height; - } - - if( pSize && eType == SET_UN_FULLSCREEN ) -@@ -2119,14 +2150,19 @@ void GtkSalFrame::SetScreen( unsigned int nNewScreen, int eType, Rectangle *pSiz - - #if !GTK_CHECK_VERSION(3,0,0) - // _NET_WM_STATE_FULLSCREEN (Metacity <-> KWin) -- if( ! getDisplay()->getWMAdaptor()->isLegacyPartialFullscreen() ) -+ if( ! getDisplay()->getWMAdaptor()->isLegacyPartialFullscreen() ) - #endif - { -+#if GTK_CHECK_VERSION(3,8,0) -+ gdk_window_set_fullscreen_mode( gtk_widget_get_window(m_pWindow), m_bSpanMonitorsWhenFullscreen -+ ? GDK_FULLSCREEN_ON_ALL_MONITORS : GDK_FULLSCREEN_ON_CURRENT_MONITOR ); -+#endif - if( eType == SET_FULLSCREEN ) - gtk_window_fullscreen( GTK_WINDOW( m_pWindow ) ); - else if( eType == SET_UN_FULLSCREEN ) - gtk_window_unfullscreen( GTK_WINDOW( m_pWindow ) ); - } -+ - if( eType == SET_UN_FULLSCREEN && - !(m_nStyle & SAL_FRAME_STYLE_SIZEABLE) ) - gtk_window_set_resizable( GTK_WINDOW( m_pWindow ), FALSE ); -@@ -3339,10 +3375,54 @@ gboolean GtkSalFrame::signalFocus( GtkWidget*, GdkEventFocus* pEvent, gpointer f - return sal_False; - } - -+#if !GTK_CHECK_VERSION(3,8,0) -+static OString getDisplayString() -+{ -+ int nParams = rtl_getAppCommandArgCount(); -+ OUString aParam; -+ for( int i = 0; i < nParams; i++ ) -+ { -+ rtl_getAppCommandArg( i, &aParam.pData ); -+ if( i < nParams-1 && (aParam == "-display" || aParam == "--display" ) ) -+ { -+ rtl_getAppCommandArg( i+1, &aParam.pData ); -+ return OUStringToOString( aParam, osl_getThreadTextEncoding() ); -+ } -+ } -+ return OString(); -+} -+#endif -+ - gboolean GtkSalFrame::signalMap( GtkWidget *pWidget, GdkEvent*, gpointer frame ) - { - GtkSalFrame* pThis = (GtkSalFrame*)frame; - -+#if !GTK_CHECK_VERSION(3,8,0) -+ //Spawn off a helper program that will attempt to set this fullscreen -+ //window to span all displays. -+ if (pThis->m_bFullscreen && pThis->m_bSpanMonitorsWhenFullscreen) -+ { -+ GdkWindow* gdkwin = gtk_widget_get_window(pThis->m_pWindow); -+ if (gdkwin) -+ { -+ OUString sProgramURL( "$BRAND_BASE_DIR/program/xid-fullscreen-on-all-monitors"); -+ rtl::Bootstrap::expandMacros(sProgramURL); -+ OUString sProgram; -+ if (osl::FileBase::getSystemPathFromFileURL(sProgramURL, sProgram) == osl::File::E_None) -+ { -+ OString sFinalProgram(OUStringToOString(sProgram, osl_getThreadTextEncoding()) -+ + " " + OString::number((int)GDK_WINDOW_XID(gdkwin))); -+ OString sDisplay(getDisplayString()); -+ if (!sDisplay.isEmpty()) -+ { -+ sFinalProgram += "--display " + sDisplay; -+ } -+ system(sFinalProgram.getStr()); -+ } -+ } -+ } -+#endif -+ - bool bSetFocus = pThis->m_bSetFocusOnMap; - pThis->m_bSetFocusOnMap = false; - -diff --git a/vcl/unx/gtk/window/xid_fullscreen_on_all_monitors.c b/vcl/unx/gtk/window/xid_fullscreen_on_all_monitors.c -new file mode 100644 -index 0000000..00554b1 ---- /dev/null -+++ b/vcl/unx/gtk/window/xid_fullscreen_on_all_monitors.c -@@ -0,0 +1,99 @@ -+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -+/* -+ * This file is part of the LibreOffice project. -+ * -+ * This Source Code Form is subject to the terms of the Mozilla Public -+ * License, v. 2.0. If a copy of the MPL was not distributed with this -+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. -+ */ -+ -+#include -+#include -+ -+typedef int Window; -+typedef union _GdkEvent GdkEvent; -+typedef struct _GdkWindow GdkWindow; -+typedef struct _GdkDisplay GdkDisplay; -+typedef struct _GdkScreen GdkScreen; -+ -+typedef enum -+{ -+ GDK_FULLSCREEN_ON_CURRENT_MONITOR, -+ GDK_FULLSCREEN_ON_ALL_MONITORS -+} GdkFullscreenMode; -+ -+int main(int argc, char *argv[]) -+{ -+ void *handle; -+ void (*gtk_init)(int*, char***); -+ GdkWindow* (*gdk_x11_window_foreign_new_for_display)(GdkDisplay*, Window); -+ GdkDisplay* (*gdk_display_get_default)(void); -+ GdkEvent* (*gdk_event_get)(void); -+ void (*gtk_main_do_event)(GdkEvent*); -+ void (*gdk_event_free)(GdkEvent*); -+ void (*gdk_window_fullscreen)(GdkWindow *); -+ void (*gdk_window_set_fullscreen_mode)(GdkWindow *, GdkFullscreenMode); -+ -+ GdkEvent *event; -+ GdkWindow *window; -+ int windowid; -+ -+ handle = dlopen("libgtk-3.so.0", RTLD_LAZY); -+ if( NULL == handle ) -+ return -1; -+ -+ gtk_init = (void (*) (int*, char***)) -+ dlsym(handle, "gtk_init"); -+ gdk_x11_window_foreign_new_for_display = (GdkWindow* (*)(GdkDisplay*, Window)) -+ dlsym(handle, "gdk_x11_window_foreign_new_for_display"); -+ gdk_display_get_default = (GdkDisplay* (*)(void)) -+ dlsym(handle, "gdk_display_get_default"); -+ gdk_event_get = (GdkEvent* (*)(void)) -+ dlsym(handle, "gdk_event_get"); -+ gtk_main_do_event = (void (*)(GdkEvent*)) -+ dlsym(handle, "gtk_main_do_event"); -+ gdk_event_free = (void (*)(GdkEvent*)) -+ dlsym(handle, "gdk_event_free"); -+ gdk_window_fullscreen = (void (*)(GdkWindow *)) -+ dlsym(handle, "gdk_window_fullscreen"); -+ gdk_window_set_fullscreen_mode = (void (*)(GdkWindow *, GdkFullscreenMode)) -+ dlsym(handle, "gdk_window_set_fullscreen_mode"); -+ -+ if (!gtk_init || -+ !gdk_x11_window_foreign_new_for_display || -+ !gdk_display_get_default || -+ !gdk_event_get || -+ !gtk_main_do_event || -+ !gdk_event_free || -+ !gdk_window_fullscreen || -+ !gdk_window_set_fullscreen_mode) -+ { -+ dlclose(handle); -+ return -1; -+ } -+ -+ gtk_init(&argc, &argv); -+ -+ windowid = atoi(argv[1]); -+ -+ window = gdk_x11_window_foreign_new_for_display(gdk_display_get_default(), windowid); -+ if (!window) -+ { -+ dlclose(handle); -+ return -1; -+ } -+ -+ gdk_window_set_fullscreen_mode(window, GDK_FULLSCREEN_ON_ALL_MONITORS); -+ gdk_window_fullscreen(window); -+ -+ while ((event = gdk_event_get()) != NULL) -+ { -+ gtk_main_do_event(event); -+ gdk_event_free(event); -+ } -+ -+ dlclose(handle); -+ return 0; -+} -+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -+ --- -1.8.3.1 - diff --git a/SOURCES/0001-Resolves-fdo-36815-enable-printing-WYSIWYG-sidewindo.patch b/SOURCES/0001-Resolves-fdo-36815-enable-printing-WYSIWYG-sidewindo.patch new file mode 100644 index 0000000..510aa1f --- /dev/null +++ b/SOURCES/0001-Resolves-fdo-36815-enable-printing-WYSIWYG-sidewindo.patch @@ -0,0 +1,496 @@ +From fd3cf8a32c58ee1b0f9d676cfb393478cf9b1ba2 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Tue, 15 Apr 2014 09:42:32 +0100 +Subject: [PATCH] Resolves: fdo#36815 enable printing WYSIWYG sidewindow + comments + +in order for that to happen the document has to be scaled down +so that the comments outside the border of the sheet of paper +can be brought inside the printable area + +Change-Id: Ifafb8eec10a4ea3ea0014097728888603e61e5a4 +--- + sw/inc/PostItMgr.hxx | 3 ++ + sw/inc/SidebarWin.hxx | 1 + + sw/inc/printdata.hxx | 1 + + sw/source/core/layout/paintfrm.cxx | 2 +- + sw/source/core/view/printdata.cxx | 7 ++-- + sw/source/core/view/vprint.cxx | 49 ++++++++++++++++++++++++-- + sw/source/ui/config/optdlg.src | 1 + + sw/source/ui/config/optpage.cxx | 7 ++++ + sw/source/ui/docvw/PostItMgr.cxx | 16 +++++++++ + sw/source/ui/docvw/SidebarTxtControl.cxx | 40 ++++++++++++++++++++++ + sw/source/ui/docvw/SidebarTxtControl.hxx | 2 ++ + sw/source/ui/docvw/SidebarWin.cxx | 55 ++++++++++++++++++++++++++++++ + sw/source/ui/inc/optpage.hxx | 1 + + sw/uiconfig/swriter/ui/printoptionspage.ui | 23 +++++++++++-- + 14 files changed, 200 insertions(+), 8 deletions(-) + +diff --git a/sw/inc/PostItMgr.hxx b/sw/inc/PostItMgr.hxx +index 4c38d40..0ac0273 100644 +--- a/sw/inc/PostItMgr.hxx ++++ b/sw/inc/PostItMgr.hxx +@@ -33,6 +33,7 @@ + #include + #include + ++class OutputDevice; + class SwWrtShell; + class SwDoc; + class SwView; +@@ -279,6 +280,8 @@ class SwPostItMgr: public SfxListener + const sal_Int32 nIndex ); + void GetAllSidebarWinForFrm( const SwFrm& rFrm, + std::vector< Window* >* pChildren ); ++ ++ void DrawNotesForPage(OutputDevice *pOutDev, sal_uInt32 nPage); + }; + + #endif +diff --git a/sw/inc/SidebarWin.hxx b/sw/inc/SidebarWin.hxx +index b3c4c82..5c8c527 100644 +--- a/sw/inc/SidebarWin.hxx ++++ b/sw/inc/SidebarWin.hxx +@@ -163,6 +163,7 @@ class SwSidebarWin : public Window + + void ChangeSidebarItem( SwSidebarItem& rSidebarItem ); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible(); ++ virtual void Draw(OutputDevice* pDev, const Point&, const Size&, sal_uLong); + + protected: + virtual void DataChanged( const DataChangedEvent& aEvent); +diff --git a/sw/inc/printdata.hxx b/sw/inc/printdata.hxx +index b688608..b2f49b7 100644 +--- a/sw/inc/printdata.hxx ++++ b/sw/inc/printdata.hxx +@@ -307,6 +307,7 @@ public: + #define POSTITS_ONLY 1 + #define POSTITS_ENDDOC 2 + #define POSTITS_ENDPAGE 3 ++#define POSTITS_INMARGINS 4 + + namespace sw { + +diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx +index 3e4ed87..2e88ef7 100644 +--- a/sw/source/core/layout/paintfrm.cxx ++++ b/sw/source/core/layout/paintfrm.cxx +@@ -6213,7 +6213,7 @@ static void lcl_paintBitmapExToRect(OutputDevice *pOut, Point aPoint, BitmapEx& + SwAlignRect( aPageRect, _pViewShell ); + + const SwPostItMgr *pMgr = _pViewShell->GetPostItMgr(); +- if (pMgr && pMgr->ShowNotes() && pMgr->HasNotes()) // do not show anything in print preview ++ if (pMgr /*&& pMgr->ShowNotes()*/ && pMgr->HasNotes()) // do not show anything in print preview + { + sal_Int32 nScrollerHeight = pMgr->GetSidebarScrollerHeight(); + const Rectangle &aVisRect = _pViewShell->VisArea().SVRect(); +diff --git a/sw/source/core/view/printdata.cxx b/sw/source/core/view/printdata.cxx +index 192ae5a..b2e2ef5 100644 +--- a/sw/source/core/view/printdata.cxx ++++ b/sw/source/core/view/printdata.cxx +@@ -172,8 +172,8 @@ SwPrintUIOptions::SwPrintUIOptions( + { + ResStringArray aLocalizedStrings( SW_RES( STR_PRINTOPTUI ) ); + +- OSL_ENSURE( aLocalizedStrings.Count() >= 30, "resource incomplete" ); +- if( aLocalizedStrings.Count() < 30 ) // bad resource ? ++ OSL_ENSURE( aLocalizedStrings.Count() >= 31, "resource incomplete" ); ++ if( aLocalizedStrings.Count() < 31 ) // bad resource ? + return; + + // printing HTML sources does not have any valid UI options. +@@ -322,11 +322,12 @@ SwPrintUIOptions::SwPrintUIOptions( + OUString(), aContentsOpt); + // create a list box for notes content + const sal_Int16 nPrintPostIts = rDefaultPrintData.GetPrintPostIts(); +- aChoices.realloc( 4 ); ++ aChoices.realloc( 5 ); + aChoices[0] = aLocalizedStrings.GetString( 13 ); + aChoices[1] = aLocalizedStrings.GetString( 14 ); + aChoices[2] = aLocalizedStrings.GetString( 15 ); + aChoices[3] = aLocalizedStrings.GetString( 16 ); ++ aChoices[4] = aLocalizedStrings.GetString( 30 ); + aHelpIds.realloc( 2 ); + aHelpIds[0] = ".HelpID:vcl:PrintDialog:PrintAnnotationMode:FixedText"; + aHelpIds[1] = ".HelpID:vcl:PrintDialog:PrintAnnotationMode:ListBox"; +diff --git a/sw/source/core/view/vprint.cxx b/sw/source/core/view/vprint.cxx +index ff5ffb2..13c829b 100644 +--- a/sw/source/core/view/vprint.cxx ++++ b/sw/source/core/view/vprint.cxx +@@ -69,6 +69,7 @@ + #include + #include + #include ++#include "PostItMgr.hxx" + + using namespace ::com::sun::star; + +@@ -454,13 +455,33 @@ sal_Bool SwViewShell::PrintOrPDFExport( + // output device is now provided by a call from outside the Writer) + pOutDev->Push(); + ++ // fdo#36815 for comments in margins print to a metafile ++ // and then scale that metafile down so that the comments ++ // will fit on the real page, and replay that scaled ++ // output to the real outputdevice ++ GDIMetaFile *pOrigRecorder(NULL); ++ GDIMetaFile *pMetaFile(NULL); ++ sal_Int16 nPostItMode = rPrintData.GetPrintPostIts(); ++ if (nPostItMode == POSTITS_INMARGINS) ++ { ++ //get and disable the existing recorder ++ pOrigRecorder = pOutDev->GetConnectMetaFile(); ++ pOutDev->SetConnectMetaFile(NULL); ++ // turn off output to the device ++ pOutDev->EnableOutput(false); ++ // just record the rendering commands to the metafile ++ // instead ++ pMetaFile = new GDIMetaFile; ++ pMetaFile->Record(pOutDev); ++ } ++ + // Print/PDF export for (multi-)selection has already generated a + // temporary document with the selected text. + // (see XRenderable implementation in unotxdoc.cxx) + // It is implemented this way because PDF export calls this Prt function + // once per page and we do not like to always have the temporary document + // to be created that often here. +- SwViewShell *pShell = new SwViewShell( *this, 0, pOutDev ); ++ SwViewShell *pShell = new SwViewShell(*this, 0, pOutDev); + + SdrView *pDrawView = pShell->GetDrawView(); + if (pDrawView) +@@ -502,13 +523,37 @@ sal_Bool SwViewShell::PrintOrPDFExport( + + ::SetSwVisArea( pViewSh2, pStPage->Frm() ); + +- pShell->InitPrt( pOutDev ); ++ pShell->InitPrt(pOutDev); + + ::SetSwVisArea( pViewSh2, pStPage->Frm() ); + + pStPage->GetUpper()->Paint( pStPage->Frm(), &rPrintData ); + + SwPaintQueue::Repaint(); ++ ++ if (nPostItMode == POSTITS_INMARGINS) ++ { ++ SwPostItMgr *pPostItManager = pShell->GetPostItMgr(); ++ pPostItManager->CalcRects(); ++ pPostItManager->LayoutPostIts(); ++ pPostItManager->DrawNotesForPage(pOutDev, nPage-1); ++ ++ //Now scale the recorded page down so the notes ++ //will fit in the final page ++ pMetaFile->Stop(); ++ pMetaFile->WindStart(); ++ double fScale = 0.75; ++ pMetaFile->Scale( fScale, fScale ); ++ pMetaFile->WindStart(); ++ ++ //Enable output the the device again ++ pOutDev->EnableOutput(true); ++ //Restore the original recorder ++ pOutDev->SetConnectMetaFile(pOrigRecorder); ++ //play back the scaled page ++ pMetaFile->Play(pOutDev); ++ delete pMetaFile; ++ } + } + + delete pShell; +diff --git a/sw/source/ui/config/optdlg.src b/sw/source/ui/config/optdlg.src +index 748560a..b5ae69c 100644 +--- a/sw/source/ui/config/optdlg.src ++++ b/sw/source/ui/config/optdlg.src +@@ -71,6 +71,7 @@ StringArray STR_PRINTOPTUI + < "~All pages"; >; + < "Pa~ges"; >; + < "~Selection"; >; ++ < "Place in margins"; >; + }; + }; + +diff --git a/sw/source/ui/config/optpage.cxx b/sw/source/ui/config/optpage.cxx +index d7efd53..4549402 100644 +--- a/sw/source/ui/config/optpage.cxx ++++ b/sw/source/ui/config/optpage.cxx +@@ -312,6 +312,7 @@ SwAddPrinterTabPage::SwAddPrinterTabPage(Window* pParent, + get(m_pOnlyRB, "only"); + get(m_pEndRB, "end"); + get(m_pEndPageRB, "endpage"); ++ get(m_pInMarginsRB, "inmargins"); + get(m_pPrintEmptyPagesCB, "blankpages"); + get(m_pPaperFromSetupCB, "papertray"); + get(m_pFaxLB, "fax"); +@@ -332,6 +333,7 @@ SwAddPrinterTabPage::SwAddPrinterTabPage(Window* pParent, + m_pPaperFromSetupCB->SetClickHdl( aLk ); + m_pPrintEmptyPagesCB->SetClickHdl( aLk ); + m_pEndPageRB->SetClickHdl( aLk ); ++ m_pInMarginsRB->SetClickHdl( aLk ); + m_pEndRB->SetClickHdl( aLk ); + m_pOnlyRB->SetClickHdl( aLk ); + m_pNoRB->SetClickHdl( aLk ); +@@ -398,6 +400,8 @@ sal_Bool SwAddPrinterTabPage::FillItemSet( SfxItemSet& rCoreSet ) + POSTITS_ENDDOC; + if (m_pEndPageRB->IsChecked()) aAddPrinterAttr.nPrintPostIts = + POSTITS_ENDPAGE; ++ if (m_pInMarginsRB->IsChecked()) aAddPrinterAttr.nPrintPostIts = ++ POSTITS_INMARGINS; + + OUString sFax = m_pFaxLB->GetSelectEntry(); + aAddPrinterAttr.sFaxName = sNone == sFax ? aEmptyOUStr : sFax; +@@ -431,6 +435,7 @@ void SwAddPrinterTabPage::Reset( const SfxItemSet& ) + m_pOnlyRB->Check (pAddPrinterAttr->nPrintPostIts== POSTITS_ONLY ) ; + m_pEndRB->Check (pAddPrinterAttr->nPrintPostIts== POSTITS_ENDDOC ) ; + m_pEndPageRB->Check (pAddPrinterAttr->nPrintPostIts== POSTITS_ENDPAGE ) ; ++ m_pInMarginsRB->Check (pAddPrinterAttr->nPrintPostIts== POSTITS_INMARGINS ) ; + m_pFaxLB->SelectEntry( pAddPrinterAttr->sFaxName ); + } + if (m_pProspectCB->IsChecked()) +@@ -440,6 +445,7 @@ void SwAddPrinterTabPage::Reset( const SfxItemSet& ) + m_pOnlyRB->Enable( sal_False ); + m_pEndRB->Enable( sal_False ); + m_pEndPageRB->Enable( sal_False ); ++ m_pInMarginsRB->Enable( sal_False ); + } + else + m_pProspectCB_RTL->Enable( sal_False ); +@@ -461,6 +467,7 @@ IMPL_LINK_NOARG_INLINE_START(SwAddPrinterTabPage, AutoClickHdl) + m_pOnlyRB->Enable( !bIsProspect ); + m_pEndRB->Enable( !bIsProspect ); + m_pEndPageRB->Enable( !bIsProspect ); ++ m_pInMarginsRB->Enable( !bIsProspect ); + return 0; + } + IMPL_LINK_NOARG_INLINE_END(SwAddPrinterTabPage, AutoClickHdl) +diff --git a/sw/source/ui/docvw/PostItMgr.cxx b/sw/source/ui/docvw/PostItMgr.cxx +index 8ca06e7..e6b7cb6 100644 +--- a/sw/source/ui/docvw/PostItMgr.cxx ++++ b/sw/source/ui/docvw/PostItMgr.cxx +@@ -807,6 +807,22 @@ bool SwPostItMgr::BorderOverPageBorder(unsigned long aPage) const + return false; + } + ++void SwPostItMgr::DrawNotesForPage(OutputDevice *pOutDev, sal_uInt32 nPage) ++{ ++ assert(nPage < mPages.size()); ++ if (nPage >= mPages.size()) ++ return; ++ for(SwSidebarItem_iterator i = mPages[nPage]->mList->begin(); i != mPages[nPage]->mList->end(); ++i) ++ { ++ SwSidebarWin* pPostIt = (*i)->pPostIt; ++ if (!pPostIt) ++ continue; ++ Point aPoint(mpEditWin->PixelToLogic(pPostIt->GetPosPixel())); ++ Size aSize(pPostIt->PixelToLogic(pPostIt->GetSizePixel())); ++ pPostIt->Draw(pOutDev, aPoint, aSize, 0); ++ } ++} ++ + void SwPostItMgr::Scroll(const long lScroll,const unsigned long aPage) + { + OSL_ENSURE((lScroll % GetScrollSize() )==0,"SwPostItMgr::Scroll: scrolling by wrong value"); +diff --git a/sw/source/ui/docvw/SidebarTxtControl.cxx b/sw/source/ui/docvw/SidebarTxtControl.cxx +index b1d3767..15af740 100644 +--- a/sw/source/ui/docvw/SidebarTxtControl.cxx ++++ b/sw/source/ui/docvw/SidebarTxtControl.cxx +@@ -118,6 +118,46 @@ void SidebarTxtControl::RequestHelp(const HelpEvent &rEvt) + } + } + ++void SidebarTxtControl::Draw(OutputDevice* pDev, const Point& rPt, const Size& rSz, sal_uLong) ++{ ++ if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) ++ { ++ if ( mrSidebarWin.IsMouseOverSidebarWin() || ++ HasFocus() ) ++ { ++ pDev->DrawGradient( Rectangle( Point(0,0) + rPt, PixelToLogic(GetSizePixel()) ), ++ Gradient( GradientStyle_LINEAR, ++ mrSidebarWin.ColorDark(), ++ mrSidebarWin.ColorDark() ) ); ++ } ++ else ++ { ++ pDev->DrawGradient( Rectangle( Point(0,0) + rPt, PixelToLogic(GetSizePixel()) ), ++ Gradient( GradientStyle_LINEAR, ++ mrSidebarWin.ColorLight(), ++ mrSidebarWin.ColorDark())); ++ } ++ } ++ ++ if ( GetTextView() ) ++ { ++ GetTextView()->GetOutliner()->Draw(pDev, Rectangle(rPt, rSz)); ++ } ++ ++ if ( mrSidebarWin.GetLayoutStatus()==SwPostItHelper::DELETED ) ++ { ++ SetLineColor(mrSidebarWin.GetChangeColor()); ++ pDev->DrawLine( PixelToLogic( GetPosPixel(), pDev->GetMapMode() ), ++ PixelToLogic( GetPosPixel() + ++ Point( GetSizePixel().Width(), ++ GetSizePixel().Height() ), pDev->GetMapMode() ) ); ++ pDev->DrawLine( PixelToLogic( GetPosPixel() + ++ Point( GetSizePixel().Width(),0), pDev->GetMapMode() ), ++ PixelToLogic( GetPosPixel() + ++ Point( 0, GetSizePixel().Height() ), pDev->GetMapMode() ) ); ++ } ++} ++ + void SidebarTxtControl::Paint( const Rectangle& rRect) + { + if ( !Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) +diff --git a/sw/source/ui/docvw/SidebarTxtControl.hxx b/sw/source/ui/docvw/SidebarTxtControl.hxx +index 37829b2..66e282f 100644 +--- a/sw/source/ui/docvw/SidebarTxtControl.hxx ++++ b/sw/source/ui/docvw/SidebarTxtControl.hxx +@@ -66,6 +66,8 @@ class SidebarTxtControl : public Control + DECL_LINK( OnlineSpellCallback, SpellCallbackInfo*); + + virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible(); ++ virtual void Draw(OutputDevice* pDev, const Point&, const Size&, sal_uLong); ++ + }; + + } } // end of namespace sw::sidebarwindows +diff --git a/sw/source/ui/docvw/SidebarWin.cxx b/sw/source/ui/docvw/SidebarWin.cxx +index 4cf128a..275b72e 100644 +--- a/sw/source/ui/docvw/SidebarWin.cxx ++++ b/sw/source/ui/docvw/SidebarWin.cxx +@@ -64,10 +64,12 @@ + #include + + #include ++#include + #include + #include + #include + #include ++#include + #include + + namespace sw { namespace sidebarwindows { +@@ -212,6 +214,59 @@ void SwSidebarWin::Paint( const Rectangle& rRect) + } + } + ++void SwSidebarWin::Draw(OutputDevice* pDev, const Point& rPt, const Size& rSz, sal_uLong nInFlags) ++{ ++ if (mpMetadataAuthor->IsVisible() ) ++ { ++ //draw left over space ++ if ( Application::GetSettings().GetStyleSettings().GetHighContrastMode() ) ++ { ++ pDev->SetFillColor(COL_BLACK); ++ } ++ else ++ { ++ pDev->SetFillColor(mColorDark); ++ } ++ pDev->SetLineColor(); ++ pDev->DrawRect( Rectangle( rPt, rSz ) ); ++ } ++ ++ if (mpMetadataAuthor->IsVisible()) ++ { ++ Font aOrigFont(mpMetadataAuthor->GetControlFont()); ++ Size aSize(PixelToLogic(mpMetadataAuthor->GetSizePixel())); ++ Point aPos(PixelToLogic(mpMetadataAuthor->GetPosPixel())); ++ aPos += rPt; ++ Font aFont( mpMetadataAuthor->GetSettings().GetStyleSettings().GetFieldFont() ); ++ mpMetadataAuthor->SetControlFont( aFont ); ++ mpMetadataAuthor->Draw(pDev, aPos, aSize, nInFlags); ++ mpMetadataAuthor->SetControlFont( aOrigFont ); ++ } ++ ++ if (mpMetadataDate->IsVisible()) ++ { ++ Font aOrigFont(mpMetadataDate->GetControlFont()); ++ Size aSize(PixelToLogic(mpMetadataDate->GetSizePixel())); ++ Point aPos(PixelToLogic(mpMetadataDate->GetPosPixel())); ++ aPos += rPt; ++ Font aFont( mpMetadataDate->GetSettings().GetStyleSettings().GetFieldFont() ); ++ mpMetadataDate->SetControlFont( aFont ); ++ mpMetadataDate->Draw(pDev, aPos, aSize, nInFlags); ++ mpMetadataDate->SetControlFont( aOrigFont ); ++ } ++ ++ mpSidebarTxtControl->Draw(pDev, rPt, rSz, nInFlags); ++ ++ const drawinglayer::primitive2d::Primitive2DSequence& rSequence = mpAnchor->getOverlayObjectPrimitive2DSequence(); ++ const drawinglayer::geometry::ViewInformation2D aNewViewInfos; ++ drawinglayer::processor2d::BaseProcessor2D * pProcessor = ++ drawinglayer::processor2d::createBaseProcessor2DFromOutputDevice( ++ *pDev, aNewViewInfos ); ++ ++ pProcessor->process(rSequence); ++ delete pProcessor; ++} ++ + void SwSidebarWin::SetPosSizePixelRect( long nX, + long nY, + long nWidth, +diff --git a/sw/source/ui/inc/optpage.hxx b/sw/source/ui/inc/optpage.hxx +index 3e196e2..fa8f6b7 100644 +--- a/sw/source/ui/inc/optpage.hxx ++++ b/sw/source/ui/inc/optpage.hxx +@@ -104,6 +104,7 @@ class SwAddPrinterTabPage : public SfxTabPage + RadioButton* m_pOnlyRB; + RadioButton* m_pEndRB; + RadioButton* m_pEndPageRB; ++ RadioButton* m_pInMarginsRB; + + CheckBox* m_pPrintEmptyPagesCB; + CheckBox* m_pPaperFromSetupCB; +diff --git a/sw/uiconfig/swriter/ui/printoptionspage.ui b/sw/uiconfig/swriter/ui/printoptionspage.ui +index 0bf9afe..95e5ae2 100644 +--- a/sw/uiconfig/swriter/ui/printoptionspage.ui ++++ b/sw/uiconfig/swriter/ui/printoptionspage.ui +@@ -1,6 +1,7 @@ + ++ + +- ++ + + True + False +@@ -344,7 +345,7 @@ + True + 0 + True +- none ++ inmargins + + + 0 +@@ -353,6 +354,24 @@ + 1 + + ++ ++ ++ In margins ++ True ++ True ++ False ++ True ++ 0 ++ True ++ none ++ ++ ++ 0 ++ 4 ++ 1 ++ 1 ++ ++ + + + +-- +1.8.5.3 + diff --git a/SOURCES/0001-Resolves-fdo-37130-use-10pt-Default-style-font-for-c.patch b/SOURCES/0001-Resolves-fdo-37130-use-10pt-Default-style-font-for-c.patch new file mode 100644 index 0000000..04d2b87 --- /dev/null +++ b/SOURCES/0001-Resolves-fdo-37130-use-10pt-Default-style-font-for-c.patch @@ -0,0 +1,32 @@ +From a7228e0bdbb06de56145d1edeacfe4ede1a7a7d4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Sat, 12 Apr 2014 13:35:20 +0100 +Subject: [PATCH] Resolves: fdo#37130 use 10pt Default style font for comments + +instead of 10pt UI font + +Change-Id: I92e2b415ff37f8baae67a00cc077e431b12b924c +--- + sw/source/core/uibase/docvw/SidebarWin.cxx | 6 ------ + 1 file changed, 6 deletions(-) + +diff --git a/sw/source/core/uibase/docvw/SidebarWin.cxx b/sw/source/core/uibase/docvw/SidebarWin.cxx +index fb78b3b..930b95b 100644 +--- a/sw/source/ui/docvw/SidebarWin.cxx ++++ b/sw/source/ui/docvw/SidebarWin.cxx +@@ -270,12 +270,6 @@ SfxItemSet SwSidebarWin::DefaultItem() + { + SfxItemSet aItem( mrView.GetDocShell()->GetPool() ); + aItem.Put(SvxFontHeightItem(200,100,EE_CHAR_FONTHEIGHT)); +- aItem.Put(SvxFontItem(FAMILY_SWISS, +- GetSettings().GetStyleSettings().GetFieldFont().GetName(), +- OUString(), +- PITCH_DONTKNOW, +- RTL_TEXTENCODING_DONTKNOW, +- EE_CHAR_FONTINFO)); + return aItem; + } + +-- +1.9.0 + diff --git a/SOURCES/0001-Resolves-fdo-48835-application-menu-for-LibreOffice.patch b/SOURCES/0001-Resolves-fdo-48835-application-menu-for-LibreOffice.patch deleted file mode 100644 index a55294e..0000000 --- a/SOURCES/0001-Resolves-fdo-48835-application-menu-for-LibreOffice.patch +++ /dev/null @@ -1,249 +0,0 @@ -From 931fc46eb8e09a9b16232fd58a222a47d28c5ea1 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= -Date: Thu, 18 Jul 2013 17:19:46 +0100 -Subject: [PATCH] Resolves: fdo#48835 application menu for LibreOffice - -(cherry picked from commit c6d4c18c7ccf047bdb0ca1b65d8f63efa5d8422f) - -Change-Id: I623f029722b71dde6e60f289c7339a96e2dfbf8e ---- - vcl/inc/unx/gtk/gtkframe.hxx | 2 + - vcl/unx/gtk/window/gtksalframe.cxx | 149 +++++++++++++++++++++++++++++++++++-- - 2 files changed, 144 insertions(+), 7 deletions(-) - -diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx -index c3ea919..cce16ab 100644 ---- a/vcl/inc/unx/gtk/gtkframe.hxx -+++ b/vcl/inc/unx/gtk/gtkframe.hxx -@@ -309,7 +309,9 @@ public: - GtkSalFrame( SystemParentData* pSysData ); - - guint m_nMenuExportId; -+ guint m_nAppMenuExportId; - guint m_nActionGroupExportId; -+ guint m_nAppActionGroupExportId; - guint m_nHudAwarenessId; - - // dispatches an event, returns true if dispatched -diff --git a/vcl/unx/gtk/window/gtksalframe.cxx b/vcl/unx/gtk/window/gtksalframe.cxx -index 0f53e93..a3e648a 100644 ---- a/vcl/unx/gtk/window/gtksalframe.cxx -+++ b/vcl/unx/gtk/window/gtksalframe.cxx -@@ -21,6 +21,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -65,11 +66,17 @@ - # include - #endif - -+#include -+#include - #include - #include - #include - #include - #include -+#include -+#include -+#include -+#include - - #if GTK_CHECK_VERSION(3,0,0) - # include -@@ -534,6 +541,71 @@ static void hud_activated( gboolean hud_active, gpointer user_data ) - } - } - -+static void activate_uno(GSimpleAction *action, GVariant*, gpointer) -+{ -+ uno::Reference< css::uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext(); -+ -+ uno::Reference< css::frame::XDesktop2 > xDesktop = css::frame::Desktop::create( xContext ); -+ -+ uno::Reference < css::frame::XFrame > xFrame(xDesktop->getActiveFrame()); -+ if (!xFrame.is()) -+ xFrame = uno::Reference < css::frame::XFrame >(xDesktop, uno::UNO_QUERY); -+ -+ if (!xFrame.is()) -+ return; -+ -+ uno::Reference< css::frame::XDispatchProvider > xDispatchProvider(xFrame, uno::UNO_QUERY); -+ if (!xDispatchProvider.is()) -+ return; -+ -+ gchar *strval = NULL; -+ g_object_get(action, "name", &strval, NULL); -+ if (!strval) -+ return; -+ -+ if (strcmp(strval, "New") == 0) -+ { -+ uno::Reference xModuleManager(frame::ModuleManager::create(xContext)); -+ OUString aModuleId(xModuleManager->identify(xFrame)); -+ if (aModuleId.isEmpty()) -+ return; -+ -+ comphelper::SequenceAsHashMap lModuleDescription(xModuleManager->getByName(aModuleId)); -+ OUString sFactoryService; -+ lModuleDescription[OUString("ooSetupFactoryEmptyDocumentURL")] >>= sFactoryService; -+ if (sFactoryService.isEmpty()) -+ return; -+ -+ uno::Sequence < css::beans::PropertyValue > args(0); -+ xDesktop->loadComponentFromURL(sFactoryService, OUString("_blank"), 0, args); -+ return; -+ } -+ -+ OUString sCommand(".uno:"); -+ sCommand += OUString(strval, strlen(strval), RTL_TEXTENCODING_UTF8); -+ g_free(strval); -+ -+ css::util::URL aCommand; -+ aCommand.Complete = sCommand; -+ uno::Reference< css::util::XURLTransformer > xParser = css::util::URLTransformer::create(xContext); -+ xParser->parseStrict(aCommand); -+ -+ uno::Reference< css::frame::XDispatch > xDisp = xDispatchProvider->queryDispatch(aCommand, OUString(), 0); -+ -+ if (!xDisp.is()) -+ return; -+ -+ xDisp->dispatch(aCommand, css::uno::Sequence< css::beans::PropertyValue >()); -+} -+ -+static GActionEntry app_entries[] = { -+ { "OptionsTreeDialog", activate_uno, NULL, NULL, NULL, {0} }, -+ { "About", activate_uno, NULL, NULL, NULL, {0} }, -+ { "HelpIndex", activate_uno, NULL, NULL, NULL, {0} }, -+ { "Quit", activate_uno, NULL, NULL, NULL, {0} }, -+ { "New", activate_uno, NULL, NULL, NULL, {0} } -+}; -+ - gboolean ensure_dbus_setup( gpointer data ) - { - GtkSalFrame* pSalFrame = reinterpret_cast< GtkSalFrame* >( data ); -@@ -553,29 +625,86 @@ gboolean ensure_dbus_setup( gpointer data ) - - // Generate menu paths. - XLIB_Window windowId = GDK_WINDOW_XID( gdkWindow ); -- gchar* aDBusPath = g_strdup_printf("/window/%lu", windowId); -- gchar* aDBusWindowPath = g_strdup_printf( "/window/%lu", windowId ); -- gchar* aDBusMenubarPath = g_strdup_printf( "/window/%lu/menus/menubar", windowId ); -+ gchar* aDBusWindowPath = g_strdup_printf( "/org/libreoffice/window/%lu", windowId ); -+ gchar* aDBusMenubarPath = g_strdup_printf( "/org/libreoffice/window/%lu/menus/menubar", windowId ); - - // Set window properties. - g_object_set_data_full( G_OBJECT( gdkWindow ), "g-lo-menubar", pMenuModel, ObjectDestroyedNotify ); - g_object_set_data_full( G_OBJECT( gdkWindow ), "g-lo-action-group", pActionGroup, ObjectDestroyedNotify ); - -+ gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_APPLICATION_ID", "org.libreoffice" ); - gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_UNIQUE_BUS_NAME", g_dbus_connection_get_unique_name( pSessionBus ) ); -- gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_APPLICATION_OBJECT_PATH", "" ); -+ gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_APPLICATION_OBJECT_PATH", "/org/libreoffice" ); - gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_WINDOW_OBJECT_PATH", aDBusWindowPath ); - gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_MENUBAR_OBJECT_PATH", aDBusMenubarPath ); -+ gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_APP_MENU_OBJECT_PATH", "/org/libreoffice/menus/appmenu" ); - - // Publish the menu model and the action group. - SAL_INFO("vcl.unity", "exporting menu model at " << pMenuModel << " for window " << windowId); - pSalFrame->m_nMenuExportId = g_dbus_connection_export_menu_model (pSessionBus, aDBusMenubarPath, pMenuModel, NULL); - SAL_INFO("vcl.unity", "exporting action group at " << pActionGroup << " for window " << windowId); -- pSalFrame->m_nActionGroupExportId = g_dbus_connection_export_action_group( pSessionBus, aDBusPath, pActionGroup, NULL); -+ pSalFrame->m_nActionGroupExportId = g_dbus_connection_export_action_group( pSessionBus, aDBusWindowPath, pActionGroup, NULL); - pSalFrame->m_nHudAwarenessId = hud_awareness_register( pSessionBus, aDBusMenubarPath, hud_activated, pSalFrame, NULL, NULL ); - -- g_free( aDBusPath ); -- g_free( aDBusWindowPath ); -+ //app menu, to-do translations, block normal menus when active, honor use appmenu settings -+ ResMgr* pMgr = ImplGetResMgr(); -+ if( pMgr ) -+ { -+ GMenu *menu = g_menu_new (); -+ GMenuItem* item; -+ -+ GMenu *firstsubmenu = g_menu_new (); -+ -+ OString sNew(OUStringToOString(ResId(SV_BUTTONTEXT_NEW, *pMgr).toString(), -+ RTL_TEXTENCODING_UTF8).replaceFirst("~", "_")); -+ -+ item = g_menu_item_new(sNew.getStr(), "app.New"); -+ g_menu_append_item( firstsubmenu, item ); -+ -+ g_menu_append_section( menu, NULL, G_MENU_MODEL(firstsubmenu)); -+ -+ GMenu *secondsubmenu = g_menu_new (); -+ -+ OString sPreferences(OUStringToOString(ResId(SV_STDTEXT_PREFERENCES, *pMgr).toString(), -+ RTL_TEXTENCODING_UTF8).replaceFirst("~", "_")); -+ -+ item = g_menu_item_new(sPreferences.getStr(), "app.OptionsTreeDialog"); -+ g_menu_append_item( secondsubmenu, item ); -+ -+ g_menu_append_section( menu, NULL, G_MENU_MODEL(secondsubmenu)); -+ GMenu *thirdsubmenu = g_menu_new (); -+ -+ OString sHelp(OUStringToOString(ResId(SV_BUTTONTEXT_HELP, *pMgr).toString(), -+ RTL_TEXTENCODING_UTF8).replaceFirst("~", "_")); -+ -+ item = g_menu_item_new(sHelp.getStr(), "app.HelpIndex"); -+ g_menu_append_item( thirdsubmenu, item ); -+ -+ OString sAbout(OUStringToOString(ResId(SV_STDTEXT_ABOUT, *pMgr).toString(), -+ RTL_TEXTENCODING_UTF8).replaceFirst("~", "_")); -+ -+ item = g_menu_item_new(sAbout.getStr(), "app.About"); -+ g_menu_append_item( thirdsubmenu, item ); -+ -+ OString sQuit(OUStringToOString(ResId(SV_MENU_MAC_QUITAPP, *pMgr).toString(), -+ RTL_TEXTENCODING_UTF8).replaceFirst("~", "_")); -+ -+ item = g_menu_item_new(sQuit.getStr(), "app.Quit"); -+ g_menu_append_item( thirdsubmenu, item ); -+ g_menu_append_section( menu, NULL, G_MENU_MODEL(thirdsubmenu)); -+ -+ GSimpleActionGroup *group = g_simple_action_group_new (); -+ g_simple_action_group_add_entries (group, app_entries, G_N_ELEMENTS (app_entries), NULL); -+ GActionGroup* pAppActionGroup = G_ACTION_GROUP(group); -+ -+ pSalFrame->m_nAppActionGroupExportId = g_dbus_connection_export_action_group( pSessionBus, "/org/libreoffice", pAppActionGroup, NULL); -+ g_object_unref(pAppActionGroup); -+ pSalFrame->m_nAppMenuExportId = g_dbus_connection_export_menu_model (pSessionBus, "/org/libreoffice/menus/appmenu", G_MENU_MODEL (menu), NULL); -+ g_object_unref(menu); -+ } -+ - g_free( aDBusMenubarPath ); -+ g_free( aDBusWindowPath ); - } - - return FALSE; -@@ -707,8 +836,12 @@ GtkSalFrame::~GtkSalFrame() - hud_awareness_unregister( pSessionBus, m_nHudAwarenessId ); - if ( m_nMenuExportId ) - g_dbus_connection_unexport_menu_model( pSessionBus, m_nMenuExportId ); -+ if ( m_nAppMenuExportId ) -+ g_dbus_connection_unexport_menu_model( pSessionBus, m_nAppMenuExportId ); - if ( m_nActionGroupExportId ) - g_dbus_connection_unexport_action_group( pSessionBus, m_nActionGroupExportId ); -+ if ( m_nAppActionGroupExportId ) -+ g_dbus_connection_unexport_action_group( pSessionBus, m_nAppActionGroupExportId ); - } - #endif - gtk_widget_destroy( m_pWindow ); -@@ -828,7 +961,9 @@ void GtkSalFrame::InitCommon() - m_pSalMenu = NULL; - m_nWatcherId = 0; - m_nMenuExportId = 0; -+ m_nAppMenuExportId = 0; - m_nActionGroupExportId = 0; -+ m_nAppActionGroupExportId = 0; - m_nHudAwarenessId = 0; - - gtk_widget_set_app_paintable( m_pWindow, TRUE ); --- -1.8.3.1 - diff --git a/SOURCES/0001-Resolves-fdo-78128-go-back-to-using-an-interim-metaf.patch b/SOURCES/0001-Resolves-fdo-78128-go-back-to-using-an-interim-metaf.patch new file mode 100644 index 0000000..8a22d0a --- /dev/null +++ b/SOURCES/0001-Resolves-fdo-78128-go-back-to-using-an-interim-metaf.patch @@ -0,0 +1,119 @@ +From 834c9363f67198e33880c2ee7bdd136b5558599d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Thu, 1 May 2014 17:10:21 +0100 +Subject: [PATCH] Resolves: fdo#78128 go back to using an interim metafile + +this time we know that the other varient of "Move" doesn't +handle pixel drawing stuff like the dpi-using one does. + +and the move values have to be in 100TH_MM_MAP and +with the true numbers of the write page size + +Change-Id: I15fdb78797d8744702bec649024fedbf3e39b342 +--- + sw/source/core/view/vprint.cxx | 68 +++++++++++++++++++++++++++++------------- + 1 file changed, 48 insertions(+), 20 deletions(-) + +diff --git a/sw/source/core/view/vprint.cxx b/sw/source/core/view/vprint.cxx +index c9c7e42..6bc53e8 100644 +--- a/sw/source/core/view/vprint.cxx ++++ b/sw/source/core/view/vprint.cxx +@@ -455,6 +455,28 @@ sal_Bool SwViewShell::PrintOrPDFExport( + // output device is now provided by a call from outside the Writer) + pOutDev->Push(); + ++ // fdo#36815 for comments in margins print to a metafile ++ // and then scale that metafile down so that the comments ++ // will fit on the real page, and replay that scaled ++ // output to the real outputdevice ++ GDIMetaFile *pOrigRecorder(NULL); ++ GDIMetaFile *pMetaFile(NULL); ++ sal_Int16 nPostItMode = rPrintData.GetPrintPostIts(); ++ if (nPostItMode == POSTITS_INMARGINS) ++ { ++ //get and disable the existing recorder ++ pOrigRecorder = pOutDev->GetConnectMetaFile(); ++ pOutDev->SetConnectMetaFile(NULL); ++ // turn off output to the device ++ pOutDev->EnableOutput(false); ++ // just record the rendering commands to the metafile ++ // instead ++ pMetaFile = new GDIMetaFile; ++ pMetaFile->SetPrefSize(pOutDev->GetOutputSize()); ++ pMetaFile->SetPrefMapMode(pOutDev->GetMapMode()); ++ pMetaFile->Record(pOutDev); ++ } ++ + // Print/PDF export for (multi-)selection has already generated a + // temporary document with the selected text. + // (see XRenderable implementation in unotxdoc.cxx) +@@ -470,8 +492,6 @@ sal_Bool SwViewShell::PrintOrPDFExport( + pDrawView->SetBufferedOverlayAllowed( false ); + } + +- sal_Int16 nPostItMode = rPrintData.GetPrintPostIts(); +- + { // additional scope so that the CurrShell is reset before destroying the shell + + SET_CURR_SHELL( pShell ); +@@ -519,6 +539,32 @@ sal_Bool SwViewShell::PrintOrPDFExport( + pPostItManager->CalcRects(); + pPostItManager->LayoutPostIts(); + pPostItManager->DrawNotesForPage(pOutDev, nPage-1); ++ ++ //Stop recording now ++ pMetaFile->Stop(); ++ pMetaFile->WindStart(); ++ //Enable output to the device again ++ pOutDev->EnableOutput(true); ++ //Restore the original recorder ++ pOutDev->SetConnectMetaFile(pOrigRecorder); ++ ++ //Now scale the recorded page down so the notes ++ //will fit in the final page ++ double fScale = 0.75; ++ long nOrigHeight = pStPage->Frm().Height(); ++ long nNewHeight = nOrigHeight*fScale; ++ long nShiftY = (nOrigHeight-nNewHeight)/2; ++ pMetaFile->Scale( fScale, fScale ); ++ pMetaFile->WindStart(); ++ //Move the scaled page down to center it ++ //the other variant of Move does not map pixels ++ //back to the logical units correctly ++ pMetaFile->Move(0, TWIP_TO_MM100(nShiftY), pOutDev->ImplGetDPIX(), pOutDev->ImplGetDPIY()); ++ pMetaFile->WindStart(); ++ ++ //play back the scaled page ++ pMetaFile->Play(pOutDev); ++ delete pMetaFile; + } + } + +@@ -528,24 +574,6 @@ sal_Bool SwViewShell::PrintOrPDFExport( + // output device is now provided by a call from outside the Writer) + pOutDev->Pop(); + +- // fdo#36815 for comments in margins get the metafile we are printing to +- // and then scale and vertically center that metafile down so that the +- // comments will fit on the real page +- GDIMetaFile *pRecorder = pOutDev->GetConnectMetaFile(); +- if (nPostItMode == POSTITS_INMARGINS && pRecorder) +- { +- pRecorder->Stop(); +- pRecorder->WindStart(); +- double fScale = 0.75; +- long nOrigHeight = pOutDev->GetOutputSize().Height(); +- long nNewHeight = nOrigHeight*fScale; +- long nShiftY = (nOrigHeight-nNewHeight)/2; +- pRecorder->Scale(fScale, fScale); +- pRecorder->WindStart(); +- pRecorder->Move(0, nShiftY, pOutDev->ImplGetDPIX(), pOutDev->ImplGetDPIY()); +- pRecorder->WindStart(); +- } +- + return sal_True; + } + +-- +1.9.0 + diff --git a/SOURCES/0001-Resolves-fdo-81487-pasting-into-outline-view-crashes.patch b/SOURCES/0001-Resolves-fdo-81487-pasting-into-outline-view-crashes.patch new file mode 100644 index 0000000..4cbecd5 --- /dev/null +++ b/SOURCES/0001-Resolves-fdo-81487-pasting-into-outline-view-crashes.patch @@ -0,0 +1,48 @@ +From a5793f5e0013b156600fd718d8f77870a9e73032 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Fri, 18 Jul 2014 09:06:44 +0100 +Subject: [PATCH] Resolves: fdo#81487 pasting into outline view crashes impress + +CreateTitleTextObject will call indirectly ImpPageChange which +triggers tools::EventMultiplexerEvent::EID_PAGE_ORDER and so +in outlview.cxx without ignore page changes level in action +the outliner is filled in from the slide contents in +FillOutliner clearing the outliner contents and filling it +fresh, but.. + +a) this hack tower is not prepared for all the outliner +iterators to become invalid +b) the contents of this title object is empty, because +it was just created, and we didn't get a chance to fill +in its text. + +This all works for typing vs pasting because the KeyInput +uses the OutlineViewPageChangesGuard guard which sets the +ignore pages changes bit. + +So, given that OutlineView::UpdateDocument expects +the iterators of the outliner to be valid during +the lifetime of the method lock the full method with +the OutlineViewPageChangesGuard guard + +Change-Id: Iecbf37d54f5f0c5a181be5f27832f769a3d2e389 +--- + sd/source/ui/view/outlview.cxx | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/sd/source/ui/view/outlview.cxx b/sd/source/ui/view/outlview.cxx +index 268a32b..a76bb0b 100644 +--- a/sd/source/ui/view/outlview.cxx ++++ b/sd/source/ui/view/outlview.cxx +@@ -1535,6 +1535,8 @@ void OutlineView::EndModelChange() + /** updates all changes in the outliner model to the draw model */ + void OutlineView::UpdateDocument() + { ++ OutlineViewPageChangesGuard aGuard(this); ++ + const sal_uInt32 nPageCount = mrDoc.GetSdPageCount(PK_STANDARD); + Paragraph* pPara = mrOutliner.GetParagraph( 0 ); + sal_uInt32 nPage; +-- +1.9.3 + diff --git a/SOURCES/0001-Resolves-i125289-do-apply-possible-changed-GraphicSt.patch b/SOURCES/0001-Resolves-i125289-do-apply-possible-changed-GraphicSt.patch new file mode 100644 index 0000000..4a14092 --- /dev/null +++ b/SOURCES/0001-Resolves-i125289-do-apply-possible-changed-GraphicSt.patch @@ -0,0 +1,77 @@ +From fd641c7b23ce4205c29fc0c564b73336cb2cfb07 Mon Sep 17 00:00:00 2001 +From: Oliver-Rainer Wittmann +Date: Wed, 23 Jul 2014 08:53:15 +0000 +Subject: [PATCH] Resolves: #i125289# do apply possible changed + ... + +only for embedded images which already have its stream inside the package + +fixes also issue 125290 + +(cherry picked from commit 9602a121b458e7456fc533dad86f434f846a72ba) + +Conflicts: + xmloff/source/draw/shapeexport2.cxx + +Change-Id: I5af0093b20f2f291d3a94c690bfbdb59a59320c3 +--- + xmloff/source/draw/shapeexport.cxx | 32 +++++++++++++++++++------------- + 1 file changed, 19 insertions(+), 13 deletions(-) + +diff --git a/xmloff/source/draw/shapeexport.cxx b/xmloff/source/draw/shapeexport.cxx +index 7f33e58..ba8ce16 100644 +--- a/xmloff/source/draw/shapeexport.cxx ++++ b/xmloff/source/draw/shapeexport.cxx +@@ -2256,9 +2256,12 @@ void XMLShapeExport::ImpExportGraphicObjectShape( + OUString aResolveURL( sImageURL ); + const OUString sPackageURL( "vnd.sun.star.Package:" ); + +- // trying to preserve the filename ++ // trying to preserve the filename for embedded images which already have its stream inside the package ++ bool bIsEmbeddedImageWithExistingStreamInPackage = false; + if ( aStreamURL.match( sPackageURL, 0 ) ) + { ++ bIsEmbeddedImageWithExistingStreamInPackage = true; ++ + OUString sRequestedName( aStreamURL.copy( sPackageURL.getLength(), aStreamURL.getLength() - sPackageURL.getLength() ) ); + sal_Int32 nLastIndex = sRequestedName.lastIndexOf( '/' ) + 1; + if ( ( nLastIndex > 0 ) && ( nLastIndex < sRequestedName.getLength() ) ) +@@ -2278,20 +2281,23 @@ void XMLShapeExport::ImpExportGraphicObjectShape( + + if( !aStr.isEmpty() ) + { +- aStreamURL = sPackageURL; +- if( aStr[ 0 ] == '#' ) +- { +- aStreamURL = aStreamURL.concat( aStr.copy( 1, aStr.getLength() - 1 ) ); +- } +- else ++ // apply possible changed stream URL to embedded image object ++ if ( bIsEmbeddedImageWithExistingStreamInPackage ) + { +- aStreamURL = aStreamURL.concat( aStr ); +- } ++ aStreamURL = sPackageURL; ++ if ( aStr[0] == '#' ) ++ { ++ aStreamURL = aStreamURL.concat( aStr.copy( 1, aStr.getLength() - 1 ) ); ++ } ++ else ++ { ++ aStreamURL = aStreamURL.concat( aStr ); ++ } + +- // update stream URL for load on demand +- uno::Any aAny; +- aAny <<= aStreamURL; +- xPropSet->setPropertyValue("GraphicStreamURL", aAny ); ++ uno::Any aAny; ++ aAny <<= aStreamURL; ++ xPropSet->setPropertyValue( OUString("GraphicStreamURL"), aAny ); ++ } + + mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE ); + mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED ); +-- +1.9.3 + diff --git a/SOURCES/0001-Resolves-rhbz-1013480-crash-in-EditLineList-operator.patch b/SOURCES/0001-Resolves-rhbz-1013480-crash-in-EditLineList-operator.patch deleted file mode 100644 index 6ad4032..0000000 --- a/SOURCES/0001-Resolves-rhbz-1013480-crash-in-EditLineList-operator.patch +++ /dev/null @@ -1,45 +0,0 @@ -From b9240ac3695c0f4b88c539721f13dc03b5afdabb Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= -Date: Tue, 1 Oct 2013 15:14:30 +0100 -Subject: [PATCH] Resolves: rhbz#1013480 crash in EditLineList::operator[] - -avoid crashing anyway, though unknown how to end up in -this scenario - -Change-Id: Ib602c73478e5c4772cfef73f70c67ad22877a39f ---- - editeng/source/editeng/impedit2.cxx | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - -diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx -index 4bc6d70..8dd3e35 100644 ---- a/editeng/source/editeng/impedit2.cxx -+++ b/editeng/source/editeng/impedit2.cxx -@@ -4119,10 +4119,13 @@ Rectangle ImpEditEngine::GetEditCursor( ParaPortion* pPortion, sal_uInt16 nIndex - ? GetYValue( rLSItem.GetInterLineSpace() ) : 0; - - sal_uInt16 nCurIndex = 0; -- OSL_ENSURE( pPortion->GetLines().Count(), "Empty ParaPortion in GetEditCursor!" ); -+ size_t nLineCount = pPortion->GetLines().Count(); -+ OSL_ENSURE( nLineCount, "Empty ParaPortion in GetEditCursor!" ); -+ if (nLineCount == 0) -+ return Rectangle(); - const EditLine* pLine = NULL; - sal_Bool bEOL = ( nFlags & GETCRSR_ENDOFLINE ) ? sal_True : sal_False; -- for ( sal_uInt16 nLine = 0; nLine < pPortion->GetLines().Count(); nLine++ ) -+ for (size_t nLine = 0; nLine < nLineCount; ++nLine) - { - const EditLine* pTmpLine = pPortion->GetLines()[nLine]; - if ( ( pTmpLine->GetStart() == nIndex ) || ( pTmpLine->IsIn( nIndex, bEOL ) ) ) -@@ -4141,7 +4144,7 @@ Rectangle ImpEditEngine::GetEditCursor( ParaPortion* pPortion, sal_uInt16 nIndex - // Cursor at the End of the paragraph. - OSL_ENSURE( nIndex == nCurIndex, "Index dead wrong in GetEditCursor!" ); - -- pLine = pPortion->GetLines()[pPortion->GetLines().Count()-1]; -+ pLine = pPortion->GetLines()[nLineCount-1]; - nY -= pLine->GetHeight(); - if ( !aStatus.IsOutliner() ) - nY -= nSBL; --- -1.8.3.1 - diff --git a/SOURCES/0001-Resolves-rhbz-1015281-crash-on-clicking-custom-anima.patch b/SOURCES/0001-Resolves-rhbz-1015281-crash-on-clicking-custom-anima.patch deleted file mode 100644 index ac18ca7..0000000 --- a/SOURCES/0001-Resolves-rhbz-1015281-crash-on-clicking-custom-anima.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 95c7765107d4d668cfa0709dce8003bf3258ef66 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= -Date: Mon, 7 Oct 2013 12:21:54 +0100 -Subject: [PATCH] Resolves: rhbz#1015281 crash on clicking custom animation - -Change-Id: Ibb4519a3d41266ae16fcb93567cf5b5c67066b0c ---- - sd/source/ui/animations/motionpathtag.cxx | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/sd/source/ui/animations/motionpathtag.cxx b/sd/source/ui/animations/motionpathtag.cxx -index f5f7ac2..2051823 100644 ---- a/sd/source/ui/animations/motionpathtag.cxx -+++ b/sd/source/ui/animations/motionpathtag.cxx -@@ -366,7 +366,8 @@ MotionPathTag::MotionPathTag( CustomAnimationPane& rPane, ::sd::View& rView, con - { - mpPathObj = mpEffect->createSdrPathObjFromPath(); - mxPolyPoly = mpPathObj->GetPathPoly(); -- maOriginPos = mxOrigin->getPosition(); -+ if (mxOrigin.is()) -+ maOriginPos = mxOrigin->getPosition(); - - SdrPage* pPage = mrView.GetSdrPageView()->GetPage(); - if( pPage ) -@@ -946,7 +947,9 @@ void MotionPathTag::addCustomHandles( SdrHdlList& rHandlerList ) - { - if( mpPathObj ) - { -- ::com::sun::star::awt::Point aPos( mxOrigin->getPosition() ); -+ ::com::sun::star::awt::Point aPos; -+ if (mxOrigin.is()) -+ aPos = mxOrigin->getPosition(); - if( (aPos.X != maOriginPos.X) || (aPos.Y != maOriginPos.Y) ) - { - const basegfx::B2DHomMatrix aTransform(basegfx::tools::createTranslateB2DHomMatrix( --- -1.8.3.1 - diff --git a/SOURCES/0001-Resolves-rhbz-1021915-force-menubar-menus-to-be-up-d.patch b/SOURCES/0001-Resolves-rhbz-1021915-force-menubar-menus-to-be-up-d.patch deleted file mode 100644 index 93a9ae8..0000000 --- a/SOURCES/0001-Resolves-rhbz-1021915-force-menubar-menus-to-be-up-d.patch +++ /dev/null @@ -1,130 +0,0 @@ -From 0881ae68b0d7f977003e0798e52548caa2556f44 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= -Date: Tue, 29 Oct 2013 16:10:18 +0000 -Subject: [PATCH] Resolves: rhbz#1021915 force menubar menus to be up/down only - -If a menu won't fit in the desired location the default mode is to place it -somewhere it will fit. e.g. above, left, right. For some cases, e.g. menubars, -it's desirable to limit the options to above/below and force the menu to scroll -if it won't fit - -Change-Id: I1998a842d25752389ec9032e54673408d1ed6cb5 ---- - include/vcl/floatwin.hxx | 1 + - include/vcl/menu.hxx | 17 +++++++++++------ - vcl/source/window/menu.cxx | 34 ++++++++++++++++++++++++++++------ - 3 files changed, 40 insertions(+), 12 deletions(-) - -diff --git a/include/vcl/floatwin.hxx b/include/vcl/floatwin.hxx -index 4e2f97c..9a9dbdc 100644 ---- a/include/vcl/floatwin.hxx -+++ b/include/vcl/floatwin.hxx -@@ -48,6 +48,7 @@ class ToolBox; - #define FLOATWIN_POPUPMODE_NEWLEVEL ((sal_uLong)0x00008000) - #define FLOATWIN_POPUPMODE_NOMOUSEUPCLOSE ((sal_uLong)0x00010000) - #define FLOATWIN_POPUPMODE_GRABFOCUS ((sal_uLong)0x00020000) -+#define FLOATWIN_POPUPMODE_NOHORZPLACEMENT ((sal_uLong)0x00040000) - - #define FLOATWIN_POPUPMODEEND_CANCEL ((sal_uInt16)0x0001) - #define FLOATWIN_POPUPMODEEND_TEAROFF ((sal_uInt16)0x0002) -diff --git a/include/vcl/menu.hxx b/include/vcl/menu.hxx -index 5579149..637c701 100644 ---- a/include/vcl/menu.hxx -+++ b/include/vcl/menu.hxx -@@ -62,12 +62,17 @@ namespace vcl { struct MenuLayoutData; } - #define MENU_APPEND ((sal_uInt16)0xFFFF) - #define MENU_ITEM_NOTFOUND ((sal_uInt16)0xFFFF) - --#define POPUPMENU_EXECUTE_DOWN ((sal_uInt16)0x0001) --#define POPUPMENU_EXECUTE_UP ((sal_uInt16)0x0002) --#define POPUPMENU_EXECUTE_LEFT ((sal_uInt16)0x0004) --#define POPUPMENU_EXECUTE_RIGHT ((sal_uInt16)0x0008) -- --#define POPUPMENU_NOMOUSEUPCLOSE ((sal_uInt16)0x0010) -+#define POPUPMENU_EXECUTE_DOWN ((sal_uInt16)0x0001) -+#define POPUPMENU_EXECUTE_UP ((sal_uInt16)0x0002) -+#define POPUPMENU_EXECUTE_LEFT ((sal_uInt16)0x0004) -+#define POPUPMENU_EXECUTE_RIGHT ((sal_uInt16)0x0008) -+#define POPUPMENU_NOMOUSEUPCLOSE ((sal_uInt16)0x0010) -+//If there isn't enough space to put the menu where it wants -+//to go, then they will be autoplaced. Toggle this bit -+//on to force menus to be placed either above or below -+//the starting rectangle and shrunk to fit and then scroll rather than place -+//the menu beside that rectangle -+#define POPUPMENU_NOHORZ_PLACEMENT ((sal_uInt16)0x0020) - - #define MENU_FLAG_NOAUTOMNEMONICS 0x0001 - #define MENU_FLAG_HIDEDISABLEDENTRIES 0x0002 -diff --git a/vcl/source/window/menu.cxx b/vcl/source/window/menu.cxx -index f567ba3..6083554 100644 ---- a/vcl/source/window/menu.cxx -+++ b/vcl/source/window/menu.cxx -@@ -3581,7 +3581,6 @@ - { - ENSURE_OR_RETURN( pExecWindow, "PopupMenu::Execute: need a non-NULL window!", 0 ); - -- - sal_uLong nPopupModeFlags = 0; - if ( nFlags & POPUPMENU_EXECUTE_DOWN ) - nPopupModeFlags = FLOATWIN_POPUPMODE_DOWN; -@@ -3597,6 +3596,9 @@ - if (nFlags & POPUPMENU_NOMOUSEUPCLOSE ) // allow popup menus to stay open on mouse button up - nPopupModeFlags |= FLOATWIN_POPUPMODE_NOMOUSEUPCLOSE; // useful if the menu was opened on mousebutton down (eg toolbox configuration) - -+ if (nFlags & POPUPMENU_NOHORZ_PLACEMENT) -+ nPopupModeFlags |= FLOATWIN_POPUPMODE_NOHORZPLACEMENT; -+ - return ImplExecute( pExecWindow, rRect, nPopupModeFlags, 0, sal_False ); - } - -@@ -3700,17 +3702,37 @@ - - Size aSz = ImplCalcSize( pWin ); - -- long nMaxHeight = pWin->GetDesktopRectPixel().GetHeight(); -+ Rectangle aDesktopRect(pWin->GetDesktopRectPixel()); - if( Application::GetScreenCount() > 1 && Application::IsUnifiedDisplay() ) - { - Window* pDeskW = pWindow->GetWindow( WINDOW_REALPARENT ); - if( ! pDeskW ) - pDeskW = pWindow; - Point aDesktopTL( pDeskW->OutputToAbsoluteScreenPixel( aRect.TopLeft() ) ); -- nMaxHeight = Application::GetWorkAreaPosSizePixel( -- Application::GetBestScreen( Rectangle( aDesktopTL, aRect.GetSize() ) ) -- ).GetHeight(); -+ aDesktopRect = Application::GetWorkAreaPosSizePixel( -+ Application::GetBestScreen( Rectangle( aDesktopTL, aRect.GetSize() ) )); - } -+ -+ long nMaxHeight = aDesktopRect.GetHeight(); -+ -+ //rhbz#1021915. If a menu won't fit in the desired location the default -+ //mode is to place it somewhere it will fit. e.g. above, left, right. For -+ //some cases, e.g. menubars, it's desirable to limit the options to -+ //above/below and force the menu to scroll if it won't fit -+ if (nPopupModeFlags & FLOATWIN_POPUPMODE_NOHORZPLACEMENT) -+ { -+ Window* pRef = pWin; -+ if ( pRef->GetParent() ) -+ pRef = pRef->GetParent(); -+ -+ Rectangle devRect( pRef->OutputToAbsoluteScreenPixel( aRect.TopLeft() ), -+ pRef->OutputToAbsoluteScreenPixel( aRect.BottomRight() ) ); -+ -+ long nHeightAbove = devRect.Top() - aDesktopRect.Top(); -+ long nHeightBelow = aDesktopRect.Bottom() - devRect.Bottom(); -+ nMaxHeight = std::min(nMaxHeight, std::max(nHeightAbove, nHeightBelow)); -+ } -+ - if ( pStartedFrom && pStartedFrom->bIsMenuBar ) - nMaxHeight -= pW->GetSizePixel().Height(); - sal_Int32 nLeft, nTop, nRight, nBottom; -@@ -5345,7 +5367,7 @@ - // #99071# do not grab the focus, otherwise it will be restored to the menubar - // when the frame is reactivated later - //GrabFocus(); -- pActivePopup->ImplExecute( this, Rectangle( aItemTopLeft, aItemBottomRight ), FLOATWIN_POPUPMODE_DOWN, pMenu, bPreSelectFirst ); -+ pActivePopup->ImplExecute( this, Rectangle( aItemTopLeft, aItemBottomRight ), FLOATWIN_POPUPMODE_DOWN | FLOATWIN_POPUPMODE_NOHORZPLACEMENT, pMenu, bPreSelectFirst ); - if ( pActivePopup ) - { - // does not have a window, if aborted before or if there are no entries diff --git a/SOURCES/0001-Resolves-rhbz-1035092-no-shortcut-key-for-Italian-To.patch b/SOURCES/0001-Resolves-rhbz-1035092-no-shortcut-key-for-Italian-To.patch new file mode 100644 index 0000000..417e7d4 --- /dev/null +++ b/SOURCES/0001-Resolves-rhbz-1035092-no-shortcut-key-for-Italian-To.patch @@ -0,0 +1,27 @@ +From eaf5194e57a9a6b82672a019c8db30c9a67ff21a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Wed, 27 Nov 2013 11:20:04 +0000 +Subject: [PATCH] Resolves: rhbz#1035092 no shortcut key for Italian 'Tools' + menu + +Change-Id: I2f8867e7d4b9c7884d1d3af4f34a93fa5da08b47 +--- + source/it/officecfg/registry/data/org/openoffice/Office/UI.po | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/source/it/officecfg/registry/data/org/openoffice/Office/UI.po b/source/it/officecfg/registry/data/org/openoffice/Office/UI.po +index ea1ff2f..97dc332 100644 +--- a/translations/source/it/officecfg/registry/data/org/openoffice/Office/UI.po ++++ b/translations/source/it/officecfg/registry/data/org/openoffice/Office/UI.po +@@ -18673,7 +18673,7 @@ msgctxt "" + "Label\n" + "value.text" + msgid "~Tools" +-msgstr "Strumenti" ++msgstr "~Strumenti" + + #: GenericCommands.xcu + msgctxt "" +-- +1.8.3.1 + diff --git a/SOURCES/0001-Resolves-rhbz-1065807-use-xdg-Templates-for-default-.patch b/SOURCES/0001-Resolves-rhbz-1065807-use-xdg-Templates-for-default-.patch new file mode 100644 index 0000000..7a969ed --- /dev/null +++ b/SOURCES/0001-Resolves-rhbz-1065807-use-xdg-Templates-for-default-.patch @@ -0,0 +1,198 @@ +From cc9493e690c6dbe40a1da47a06acf7172a33ffa7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Mon, 24 Feb 2014 11:38:13 +0000 +Subject: [PATCH 1/2] Resolves: rhbz#1065807 use xdg ~/Templates for default + Template location + +(if it exists) + +Change-Id: I98fc9fd54d1f56c8bed24ce4d2ebf53756ded2cc +--- + framework/source/services/pathsettings.cxx | 6 ++++ + .../registry/data/org/openoffice/Office/Paths.xcu | 13 +++++++ + shell/source/backends/desktopbe/desktopbackend.cxx | 21 ++++++++--- + shell/source/backends/gconfbe/gconfaccess.cxx | 41 ++++++++++++++++------ + shell/source/backends/gconfbe/gconfaccess.hxx | 1 + + 5 files changed, 66 insertions(+), 16 deletions(-) + +diff --git a/framework/source/services/pathsettings.cxx b/framework/source/services/pathsettings.cxx +index 15fb3c0..bdb2949 100644 +--- a/framework/source/services/pathsettings.cxx ++++ b/framework/source/services/pathsettings.cxx +@@ -280,6 +280,12 @@ PathSettings::PathInfo PathSettings::impl_readNewFormat(const OUString& sPath) + // read the writeable path + xPath->getByName(CFGPROP_WRITEPATH) >>= aPathVal.sWritePath; + ++ // avoid duplicates, by removing the writeable path from ++ // the user defined path list if it happens to be there too ++ OUStringList::iterator aI = aPathVal.lUserPaths.find(aPathVal.sWritePath); ++ if (aI != aPathVal.lUserPaths.end()) ++ aPathVal.lUserPaths.erase(aI); ++ + // read state props + xPath->getByName(CFGPROP_ISSINGLEPATH) >>= aPathVal.bIsSinglePath; + +diff --git a/officecfg/registry/data/org/openoffice/Office/Paths.xcu b/officecfg/registry/data/org/openoffice/Office/Paths.xcu +index 05f8e0b..2a9eb5c 100644 +--- a/officecfg/registry/data/org/openoffice/Office/Paths.xcu ++++ b/officecfg/registry/data/org/openoffice/Office/Paths.xcu +@@ -161,8 +161,21 @@ + + + ++ + + $(userurl)/template ++ ++ ++ ++ $(userurl)/template + + + +diff --git a/shell/source/backends/desktopbe/desktopbackend.cxx b/shell/source/backends/desktopbe/desktopbackend.cxx +index 3e8e8c1..52d8358 100644 +--- a/shell/source/backends/desktopbe/desktopbackend.cxx ++++ b/shell/source/backends/desktopbe/desktopbackend.cxx +@@ -154,11 +154,22 @@ css::uno::Any Default::getPropertyValue(OUString const & PropertyName) + css::beans::UnknownPropertyException, css::lang::WrappedTargetException, + css::uno::RuntimeException) + { +- if ( PropertyName == "EnableATToolSupport" || PropertyName == "ExternalMailer" || PropertyName == "SourceViewFontHeight" +- || PropertyName == "SourceViewFontName" || PropertyName == "WorkPathVariable" || PropertyName == "ooInetFTPProxyName" +- || PropertyName == "ooInetFTPProxyPort" || PropertyName == "ooInetHTTPProxyName" || PropertyName == "ooInetHTTPProxyPort" +- || PropertyName == "ooInetHTTPSProxyName" || PropertyName == "ooInetHTTPSProxyPort" || PropertyName == "ooInetNoProxy" +- || PropertyName == "ooInetProxyType" || PropertyName == "givenname" || PropertyName == "sn" ) ++ if ( PropertyName == "EnableATToolSupport" || ++ PropertyName == "ExternalMailer" || ++ PropertyName == "SourceViewFontHeight" || ++ PropertyName == "SourceViewFontName" || ++ PropertyName == "TemplatePathVariable" || ++ PropertyName == "WorkPathVariable" || ++ PropertyName == "ooInetFTPProxyName" || ++ PropertyName == "ooInetFTPProxyPort" || ++ PropertyName == "ooInetHTTPProxyName" || ++ PropertyName == "ooInetHTTPProxyPort" || ++ PropertyName == "ooInetHTTPSProxyName" || ++ PropertyName == "ooInetHTTPSProxyPort" || ++ PropertyName == "ooInetNoProxy" || ++ PropertyName == "ooInetProxyType" || ++ PropertyName == "givenname" || ++ PropertyName == "sn" ) + { + return css::uno::makeAny(css::beans::Optional< css::uno::Any >()); + } +diff --git a/shell/source/backends/gconfbe/gconfaccess.cxx b/shell/source/backends/gconfbe/gconfaccess.cxx +index de8eb29..0d407d6 100644 +--- a/shell/source/backends/gconfbe/gconfaccess.cxx ++++ b/shell/source/backends/gconfbe/gconfaccess.cxx +@@ -23,6 +23,7 @@ + #include + + #include "com/sun/star/uno/RuntimeException.hpp" ++#include "com/sun/star/uno/Sequence.hxx" + #include "osl/file.hxx" + #include "osl/security.hxx" + #include "osl/thread.h" +@@ -189,15 +190,8 @@ static OUString xdg_user_dir_lookup (const char *type) + if( osl::FileBase::E_None == aDocumentsDir.open() ) + return aDocumentsDirURL; + } +- /* Special case desktop for historical compatibility */ +- if (strcmp (type, "DESKTOP") == 0) +- { +- return aHomeDirURL + "/Desktop"; +- } +- else +- { +- return aHomeDirURL + "/Documents"; +- } ++ /* Use fallbacks historical compatibility if nothing else exists */ ++ return aHomeDirURL + "/" + OUString::createFromAscii(type); + } + + //------------------------------------------------------------------------------ +@@ -317,11 +311,18 @@ uno::Any translateToOOo( const ConfigurationValue &rValue, GConfValue *pGconfVal + + case SETTING_WORK_DIRECTORY: + { +- OUString aDocumentsDirURL = xdg_user_dir_lookup("DOCUMENTS"); ++ OUString aDocumentsDirURL = xdg_user_dir_lookup("Documents"); + + return uno::makeAny( aDocumentsDirURL ); + } + ++ case SETTING_TEMPLATE_DIRECTORY: ++ { ++ OUString aTemplatesDirURL = xdg_user_dir_lookup("Templates"); ++ ++ return uno::makeAny( aTemplatesDirURL ); ++ } ++ + case SETTING_USER_GIVENNAME: + { + OUString aCompleteName( OStringToOUString( +@@ -392,7 +393,7 @@ sal_Bool SAL_CALL isDependencySatisfied( GConfClient* pClient, const Configurati + + case SETTING_WORK_DIRECTORY: + { +- OUString aDocumentsDirURL = xdg_user_dir_lookup("DOCUMENTS"); ++ OUString aDocumentsDirURL = xdg_user_dir_lookup("Documents"); + osl::Directory aDocumentsDir( aDocumentsDirURL ); + + if( osl::FileBase::E_None == aDocumentsDir.open() ) +@@ -400,6 +401,16 @@ sal_Bool SAL_CALL isDependencySatisfied( GConfClient* pClient, const Configurati + } + break; + ++ case SETTING_TEMPLATE_DIRECTORY: ++ { ++ OUString aTemplatesDirURL = xdg_user_dir_lookup("Templates"); ++ osl::Directory aTemplatesDir( aTemplatesDirURL ); ++ ++ if( osl::FileBase::E_None == aTemplatesDir.open() ) ++ return sal_True; ++ } ++ break; ++ + case SETTING_USER_GIVENNAME: + { + OUString aCompleteName( OStringToOUString( +@@ -563,6 +574,14 @@ ConfigurationValue const ConfigurationValues[] = + }, + + { ++ SETTING_TEMPLATE_DIRECTORY, ++ "/desktop/gnome/url-handlers/mailto/command", // dummy ++ RTL_CONSTASCII_STRINGPARAM("TemplatePathVariable"), ++ sal_True, ++ SETTING_TEMPLATE_DIRECTORY, // so that the existence of the dir can be checked ++ }, ++ ++ { + SETTING_USER_GIVENNAME, + "/desktop/gnome/url-handlers/mailto/command", // dummy + RTL_CONSTASCII_STRINGPARAM("givenname"), +diff --git a/shell/source/backends/gconfbe/gconfaccess.hxx b/shell/source/backends/gconfbe/gconfaccess.hxx +index 7f0a52a..3fcd217 100644 +--- a/shell/source/backends/gconfbe/gconfaccess.hxx ++++ b/shell/source/backends/gconfbe/gconfaccess.hxx +@@ -47,6 +47,7 @@ enum ConfigurationSetting + SETTING_ENABLE_ACCESSIBILITY, + SETTING_MAILER_PROGRAM, + SETTING_WORK_DIRECTORY, ++ SETTING_TEMPLATE_DIRECTORY, + SETTING_SOURCEVIEWFONT_NAME, + SETTING_SOURCEVIEWFONT_HEIGHT, + SETTING_USER_GIVENNAME, +-- +1.9.0 + diff --git a/SOURCES/0001-Resolves-rhbz-1081176-don-t-jump-to-cursor-pos-when.patch b/SOURCES/0001-Resolves-rhbz-1081176-don-t-jump-to-cursor-pos-when.patch new file mode 100644 index 0000000..134ad96 --- /dev/null +++ b/SOURCES/0001-Resolves-rhbz-1081176-don-t-jump-to-cursor-pos-when.patch @@ -0,0 +1,83 @@ +From 903652fafacf5268aeac4a702d52de44a8388652 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Fri, 11 Apr 2014 14:45:39 +0100 +Subject: [PATCH] Resolves: rhbz#1081176: don't jump to cursor pos when... + +launching a new window view of a document. This was happening because of +(temporary) activation of the modified flag (from updating the document stats +in the bottom bar) triggering a scrolll to the current cursor position of the +old document + +Change-Id: I6e1a3c07b66ff6373345850d1449f17c1f0baa17 +(cherry picked from commit e12184393f0591b5c5d9218062cc0a4bced6d4e6) +--- + sw/source/core/doc/doc.cxx | 39 ++++++++++++++++++++++++++++++++++++++- + 1 file changed, 38 insertions(+), 1 deletion(-) + +diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx +index 6382d74..047b8b3 100644 +--- a/sw/source/core/doc/doc.cxx ++++ b/sw/source/core/doc/doc.cxx +@@ -1650,6 +1650,40 @@ void SwDoc::CalculatePagePairsForProspectPrinting( + // thus we are done here. + } + ++namespace ++{ ++ class LockAllViews ++ { ++ std::vector m_aViewWasUnLocked; ++ SwViewShell* m_pViewShell; ++ public: ++ LockAllViews(SwViewShell *pViewShell) ++ : m_pViewShell(pViewShell) ++ { ++ if (!m_pViewShell) ++ return; ++ SwViewShell *pSh = m_pViewShell; ++ do ++ { ++ if (!pSh->IsViewLocked()) ++ { ++ m_aViewWasUnLocked.push_back(pSh); ++ pSh->LockView(true); ++ } ++ pSh = (SwViewShell*)pSh->GetNext(); ++ } while (pSh != m_pViewShell); ++ } ++ ~LockAllViews() ++ { ++ for (std::vector::iterator aI = m_aViewWasUnLocked.begin(); aI != m_aViewWasUnLocked.end(); ++aI) ++ { ++ SwViewShell *pSh = *aI; ++ pSh->LockView(false); ++ } ++ } ++ }; ++} ++ + // returns true while there is more to do + bool SwDoc::IncrementalDocStatCalculate(long nChars, bool bFields) + { +@@ -1720,7 +1754,7 @@ bool SwDoc::IncrementalDocStatCalculate(long nChars, bool bFields) + aStat[n++].Value <<= (sal_Int32)mpDocStat->nCharExcludingSpaces; + + // For e.g. autotext documents there is no pSwgInfo (#i79945) +- SfxObjectShell * const pObjShell( GetDocShell() ); ++ SwDocShell* pObjShell(GetDocShell()); + if (pObjShell) + { + const uno::Reference xDPS( +@@ -1730,6 +1764,9 @@ bool SwDoc::IncrementalDocStatCalculate(long nChars, bool bFields) + // #i96786#: do not set modified flag when updating statistics + const bool bDocWasModified( IsModified() ); + const ModifyBlocker_Impl b(pObjShell); ++ // rhbz#1081176: don't jump to cursor pos because of (temporary) ++ // activation of modified flag triggering move to input position ++ LockAllViews aViewGuard((SwViewShell*)pObjShell->GetWrtShell()); + xDocProps->setDocumentStatistics(aStat); + if (!bDocWasModified) + { +-- +1.8.5.3 + diff --git a/SOURCES/0001-Resolves-rhbz-1096295-hard-to-distinguish-selected-f.patch b/SOURCES/0001-Resolves-rhbz-1096295-hard-to-distinguish-selected-f.patch new file mode 100644 index 0000000..9dbc7a7 --- /dev/null +++ b/SOURCES/0001-Resolves-rhbz-1096295-hard-to-distinguish-selected-f.patch @@ -0,0 +1,102 @@ +From fd4b20efbb734f5a82c636ded2ec65dcb46c5129 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Mon, 12 May 2014 14:06:37 +0100 +Subject: [PATCH] Resolves: rhbz#1096295 hard to distinguish selected from + mouseover + +Change-Id: Id6c11afd161bea15266a54a595bf7ee305e954f0 +--- + .../ui/slidesorter/inc/view/SlsPageObjectPainter.hxx | 1 + + sd/source/ui/slidesorter/inc/view/SlsTheme.hxx | 1 + + sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx | 15 ++++++++------- + sd/source/ui/slidesorter/view/SlsTheme.cxx | 9 +++++---- + 4 files changed, 15 insertions(+), 11 deletions(-) + +diff --git a/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx b/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx +index ec698d0..7d417da 100644 +--- a/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx ++++ b/sd/source/ui/slidesorter/inc/view/SlsPageObjectPainter.hxx +@@ -85,6 +85,7 @@ private: + Bitmap maFocusedBackground; + Bitmap maMouseOverBackground; + Bitmap maMouseOverFocusedBackground; ++ Bitmap maMouseOverSelectedBackground; + Bitmap maMouseOverSelectedAndFocusedBackground; + Size maSize; + +diff --git a/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx b/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx +index 5a69142..55188af 100644 +--- a/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx ++++ b/sd/source/ui/slidesorter/inc/view/SlsTheme.hxx +@@ -82,6 +82,7 @@ public: + Gradient_SelectedPage, + Gradient_SelectedAndFocusedPage, + Gradient_MouseOverPage, ++ Gradient_MouseOverSelected, + Gradient_MouseOverSelectedAndFocusedPage, + Gradient_FocusedPage, + _GradientColorType_Size_ +diff --git a/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx b/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx +index 60c51fa..736c6dc 100644 +--- a/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx ++++ b/sd/source/ui/slidesorter/view/SlsPageObjectPainter.cxx +@@ -53,13 +53,7 @@ PageObjectPainter::PageObjectPainter ( + mpTheme(rSlideSorter.GetTheme()), + mpPageNumberFont(Theme::GetFont(Theme::Font_PageNumber, *rSlideSorter.GetContentWindow())), + mpShadowPainter(new FramePainter(mpTheme->GetIcon(Theme::Icon_RawShadow))), +- mpFocusBorderPainter(new FramePainter(mpTheme->GetIcon(Theme::Icon_FocusBorder))), +- maNormalBackground(), +- maSelectionBackground(), +- maFocusedSelectionBackground(), +- maMouseOverBackground(), +- maMouseOverFocusedBackground(), +- maSize() ++ mpFocusBorderPainter(new FramePainter(mpTheme->GetIcon(Theme::Icon_FocusBorder))) + { + // Replace the color (not the alpha values) in the focus border with a + // color derived from the current selection color. +@@ -148,6 +142,7 @@ void PageObjectPainter::InvalidateBitmaps (void) + maFocusedSelectionBackground.SetEmpty(); + maFocusedBackground.SetEmpty(); + maMouseOverBackground.SetEmpty(); ++ maMouseOverSelectedBackground.SetEmpty(); + maMouseOverFocusedBackground.SetEmpty(); + maMouseOverSelectedAndFocusedBackground.SetEmpty(); + } +@@ -399,6 +394,12 @@ Bitmap& PageObjectPainter::GetBackgroundForState ( + true); + + case MouseOver | Selected: ++ return GetBackground( ++ maMouseOverSelectedBackground, ++ Theme::Gradient_MouseOverSelected, ++ rReferenceDevice, ++ false); ++ + case MouseOver: + return GetBackground( + maMouseOverBackground, +diff --git a/sd/source/ui/slidesorter/view/SlsTheme.cxx b/sd/source/ui/slidesorter/view/SlsTheme.cxx +index c38951c..3ac38cc 100644 +--- a/sd/source/ui/slidesorter/view/SlsTheme.cxx ++++ b/sd/source/ui/slidesorter/view/SlsTheme.cxx +@@ -110,11 +110,12 @@ void Theme::Update (const ::boost::shared_ptr& rpPropert + maColor[Color_PageCountFontColor] = White; + + // Set up gradients. +- SetGradient(Gradient_SelectedPage, aSelectionColor, 50, 50, +100,+100, +50,+25); +- SetGradient(Gradient_MouseOverPage, aSelectionColor, 75, 75, +100,+100, +50,+25); +- SetGradient(Gradient_SelectedAndFocusedPage, aSelectionColor, 50, 50, +100,+100, -50,-75); +- SetGradient(Gradient_MouseOverSelectedAndFocusedPage, aSelectionColor, 75, 75, +100,+100, -50,-75); ++ SetGradient(Gradient_MouseOverPage, aSelectionColor, 0, 60, +80,+100, +50,+25); ++ SetGradient(Gradient_SelectedPage, aSelectionColor, 50, 50, +80,+100, +50,+25); + SetGradient(Gradient_FocusedPage, aSelectionColor, -1,-1, 0,0, -50,-75); ++ SetGradient(Gradient_MouseOverSelected, aSelectionColor, 55, 60, +80,+100, +50,+25); ++ SetGradient(Gradient_SelectedAndFocusedPage, aSelectionColor, 50, 50, +80,+100, -50,-75); ++ SetGradient(Gradient_MouseOverSelectedAndFocusedPage, aSelectionColor, 55, 60, +80,+100, -50,-75); + + SetGradient(Gradient_NormalPage, maBackgroundColor, -1,-1, 0,0, 0,0); + +-- +1.9.0 + diff --git a/SOURCES/0001-Resolves-rhbz-1121341-crash-on-closing-shrunk-validi.patch b/SOURCES/0001-Resolves-rhbz-1121341-crash-on-closing-shrunk-validi.patch new file mode 100644 index 0000000..b66ae92 --- /dev/null +++ b/SOURCES/0001-Resolves-rhbz-1121341-crash-on-closing-shrunk-validi.patch @@ -0,0 +1,82 @@ +From efb02fcddb7abe7f6f163ee8a47878b06d15a610 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Mon, 21 Jul 2014 13:14:19 +0100 +Subject: [PATCH] Resolves: rhbz#1121341 crash on closing shrunk validity + window + +Change-Id: I5fc1d6b909b3281ec3799b60bc3fd7b5f1163a75 +--- + sc/source/ui/dbgui/validate.cxx | 29 ++++++++++++++++++++++++----- + sc/source/ui/inc/validate.hxx | 2 ++ + 2 files changed, 26 insertions(+), 5 deletions(-) + +diff --git a/sc/source/ui/dbgui/validate.cxx b/sc/source/ui/dbgui/validate.cxx +index f40981c..d119747 100644 +--- a/sc/source/ui/dbgui/validate.cxx ++++ b/sc/source/ui/dbgui/validate.cxx +@@ -151,12 +151,14 @@ void ScTPValidationValue::RefInputDonePostHdl() + + } + +- + sal_Bool ScValidationDlg::Close() + { +- if( m_bOwnRefHdlr ) +- if( SfxTabPage* pPage = GetTabPage( TP_VALIDATION_VALUES ) ) +- static_cast(pPage)->RemoveRefDlg(); ++ SfxTabPage* pPage = GetTabPage(TP_VALIDATION_VALUES); ++ if (pPage) ++ static_cast(pPage)->ParkRefs(); ++ ++ if (m_bOwnRefHdlr && pPage) ++ static_cast(pPage)->RemoveRefDlg(); + + return ScValidationDlgBase::Close(); + } +@@ -168,7 +170,6 @@ ScValidationDlg::~ScValidationDlg() + delete mpHBox; + } + +- + // ============================================================================ + + namespace { +@@ -338,6 +339,22 @@ ScTPValidationValue::ScTPValidationValue( Window* pParent, const SfxItemSet& rAr + m_btnRef.Hide(); // cell range picker + } + ++void ScTPValidationValue::ParkRefs() ++{ ++ //if there are children of the mpHBox, i.e. ++ //in shrunk mode, this will crash ++ //after the mpHBox is deleted ++ if( m_pRefEdit && m_pRefEdit->GetParent()!= this ) ++ { ++ m_pRefEdit->SetParent( this ); ++ } ++ ++ if( m_btnRef.GetParent()!=this ) ++ { ++ m_btnRef.SetParent( this ); ++ } ++} ++ + ScTPValidationValue::~ScTPValidationValue() + { + } +diff --git a/sc/source/ui/inc/validate.hxx b/sc/source/ui/inc/validate.hxx +index 5cac401..12d1cec 100644 +--- a/sc/source/ui/inc/validate.hxx ++++ b/sc/source/ui/inc/validate.hxx +@@ -182,6 +182,8 @@ public: + virtual sal_Bool FillItemSet( SfxItemSet& rArgSet ); + virtual void Reset( const SfxItemSet& rArgSet ); + ++ void ParkRefs(); ++ + private: + void Init(); + +-- +1.9.3 + diff --git a/SOURCES/0001-Resolves-rhbz-1125588-port-LibreOffice-to-ppc64le.patch b/SOURCES/0001-Resolves-rhbz-1125588-port-LibreOffice-to-ppc64le.patch new file mode 100644 index 0000000..8fc2a2e --- /dev/null +++ b/SOURCES/0001-Resolves-rhbz-1125588-port-LibreOffice-to-ppc64le.patch @@ -0,0 +1,547 @@ +From 63a25f30c2b2eec9ebda54750b0e7e6bf889ef0b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Thu, 21 Aug 2014 08:52:16 +0100 +Subject: [PATCH] Resolves: rhbz#1125588 port LibreOffice to ppc64le + +Related: rhbz#1125588 first steps for ppc64le + +almost certainly won't get us too far, but a start + +(cherry picked from commit 170109708e6a082252efba3d2f1726bbd82b6452) + +openjdk appears to use ppc64/server/libjvm.so and not ppc64le/server/libjvm.so + +(cherry picked from commit 632e4095ad92196480ad82cfa1f106c4c08ae1cc) + +need to accept ppc64le as a lib64 using platform in ax_boost_base.m4 + +(cherry picked from commit 2d48c52da712f8fa3c4a579494c824491afb8515) + +linux_powerpc64le->linux_powerpc64_le to match dp_platform.cxx + +(cherry picked from commit 2ced4d39cc1b8de233cd886d3ef991b3079500d2) + +Related: rhbz#1125588 get as far as privateSnippetExecutor + +(cherry picked from commit 4c5bbbf059924f3aa24620a4cbbc35816978a606) + +Related: rhbz#1125588 get to the end of cpp_mediate on ppc64le + +(cherry picked from commit d8fcd8ca9af087e98a2f6d9cbcf6eb42cddd0c74) + +Related: rhbz#1125588 force existence of argument save area + +ELFv2 ABI on ppc64 optimises stack allocation +(http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01149.html +so we're getting no argument save area + +This now appears to pass the simple cases and onwards +to the tricky ones + +(cherry picked from commit 6396e18f4d49c24283b170310a1892db40c128d3) + +Related: rhbz#1125588 ppc64le has new struct passing rules + +http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01145.html +http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01147.html + +now we just fail instead of crash + +(cherry picked from commit 970ad502e3ea2cc992c6cc1c7583231aec5bf5da) + +Related: rhbz#1125588 ppc64le fix simple struct returning + +(cherry picked from commit ee6fcdd18b1a839d7d60617d4fda622f6e6e7e66) + +Resolves: rhbz#1125588 ppc64le passes testtools + +*bzzt*, , it's alive! + +(cherry picked from commit 6ab1951ea2e31f47bc9f211dd9b2681c794b8e7f) + +openjdk appears to use ppc64/server/libjvm.so and not ppc64le/server/libjvm.so + +(cherry picked from commit 632e4095ad92196480ad82cfa1f106c4c08ae1cc) + +Conflicts: + configure.ac + +need to accept ppc64le as a lib64 using platform in ax_boost_base.m4 + +(cherry picked from commit 2d48c52da712f8fa3c4a579494c824491afb8515) + +linux_powerpc64le->linux_powerpc64_le to match dp_platform.cxx + +(cherry picked from commit 2ced4d39cc1b8de233cd886d3ef991b3079500d2) + +Related: rhbz#1125588 get as far as privateSnippetExecutor + +(cherry picked from commit 4c5bbbf059924f3aa24620a4cbbc35816978a606) + +Related: rhbz#1125588 get to the end of cpp_mediate on ppc64le + +(cherry picked from commit d8fcd8ca9af087e98a2f6d9cbcf6eb42cddd0c74) + +Conflicts: + bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx + +Related: rhbz#1125588 force existence of argument save area + +ELFv2 ABI on ppc64 optimises stack allocation +(http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01149.html +so we're getting no argument save area + +This now appears to pass the simple cases and onwards +to the tricky ones + +(cherry picked from commit 6396e18f4d49c24283b170310a1892db40c128d3) + +Related: rhbz#1125588 ppc64le has new struct passing rules + +http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01145.html +http://gcc.gnu.org/ml/gcc-patches/2013-11/msg01147.html + +now we just fail instead of crash + +(cherry picked from commit 970ad502e3ea2cc992c6cc1c7583231aec5bf5da) + +Related: rhbz#1125588 ppc64le fix simple struct returning + +(cherry picked from commit ee6fcdd18b1a839d7d60617d4fda622f6e6e7e66) + +Conflicts: + bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx + +Resolves: rhbz#1125588 ppc64le passes testtools + +*bzzt*, , it's alive! + +(cherry picked from commit 6ab1951ea2e31f47bc9f211dd9b2681c794b8e7f) + +Change-Id: Ic20b97a97b6d506c32322173bd8332d15c3a4555 +ff9e2e0ac9921b0d9d36a49fdcd2323d5dd124ee +86ef068661082addbd165629d3d6905695090a6b +b63e5a28d7ff12780a1051d94c5976244eab1814 +cc386083ecd9faefbedebbb9d2496a4eddfa0b2b +d3928ef5ac68ea13a7aa8723bc8b068ecf8075a0 +e56d148ebea7fcfc023cb7183bc97f09186e66b4 +329c676337885bcf4fdfdcdb5912d75424862126 +1e253922fdb606648eff9865f1125a24e35b0d9a +0b42f4e2603e6d76200d63ab2e26bbb856ae1173 +ff9e2e0ac9921b0d9d36a49fdcd2323d5dd124ee +86ef068661082addbd165629d3d6905695090a6b +b63e5a28d7ff12780a1051d94c5976244eab1814 +cc386083ecd9faefbedebbb9d2496a4eddfa0b2b +d3928ef5ac68ea13a7aa8723bc8b068ecf8075a0 +e56d148ebea7fcfc023cb7183bc97f09186e66b4 +329c676337885bcf4fdfdcdb5912d75424862126 +1e253922fdb606648eff9865f1125a24e35b0d9a +0b42f4e2603e6d76200d63ab2e26bbb856ae1173 +--- + .../cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx | 64 ++++++++++++++---- + .../source/cpp_uno/gcc3_linux_powerpc64/share.hxx | 1 + + .../cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx | 79 ++++++++++++++++++++-- + configure.ac | 11 ++- + desktop/source/deployment/misc/dp_platform.cxx | 3 + + m4/ax_boost_base.m4 | 2 +- + 6 files changed, 137 insertions(+), 23 deletions(-) + +diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx +index 8bb611f..877c1ab 100644 +--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx ++++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx +@@ -31,6 +31,11 @@ + #include + #include + ++#ifdef OSL_BIGENDIAN ++#define IS_BIG_ENDIAN 1 ++#else ++#define IS_BIG_ENDIAN 0 ++#endif + + using namespace ::com::sun::star::uno; + +@@ -67,7 +72,7 @@ static typelib_TypeClass cpp2uno_call( + + if (pReturnTypeDescr) + { +- if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr )) ++ if (!ppc64::return_in_hidden_param(pReturnTypeRef)) + { + pUnoReturn = pRegisterReturn; // direct way for simple types + } +@@ -139,13 +144,13 @@ static typelib_TypeClass cpp2uno_call( + case typelib_TypeClass_BOOLEAN: + if (ng < ppc64::MAX_GPR_REGS) + { +- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-1)); ++ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + 7*IS_BIG_ENDIAN); + ng++; + gpreg++; + } + else + { +- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-1)); ++ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + 7*IS_BIG_ENDIAN); + bOverFlowUsed = true; + } + if (bOverFlowUsed) ovrflw++; +@@ -155,13 +160,13 @@ static typelib_TypeClass cpp2uno_call( + case typelib_TypeClass_UNSIGNED_SHORT: + if (ng < ppc64::MAX_GPR_REGS) + { +- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-2)); ++ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + 6*IS_BIG_ENDIAN); + ng++; + gpreg++; + } + else + { +- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-2)); ++ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + 6*IS_BIG_ENDIAN); + bOverFlowUsed = true; + } + if (bOverFlowUsed) ovrflw++; +@@ -171,13 +176,13 @@ static typelib_TypeClass cpp2uno_call( + case typelib_TypeClass_UNSIGNED_LONG: + if (ng < ppc64::MAX_GPR_REGS) + { +- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + (sizeof(void*)-4)); ++ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)gpreg) + 4*IS_BIG_ENDIAN); + ng++; + gpreg++; + } + else + { +- pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + (sizeof(void*)-4)); ++ pCppArgs[nPos] = pUnoArgs[nPos] = (((char *)ovrflw) + 4*IS_BIG_ENDIAN); + bOverFlowUsed = true; + } + if (bOverFlowUsed) ovrflw++; +@@ -321,6 +326,11 @@ static typelib_TypeClass cpp2uno_call( + } + } + ++#if _CALL_ELF == 2 ++# define PARAMSAVE 32 ++#else ++# define PARAMSAVE 48 ++#endif + + //================================================================================================== + static typelib_TypeClass cpp_mediate( +@@ -334,7 +344,7 @@ static typelib_TypeClass cpp_mediate( + sal_Int32 nFunctionIndex = (nOffsetAndIndex & 0xFFFFFFFF); + + long sf = *(long*)sp; +- void ** ovrflw = (void**)(sf + 112); ++ void ** ovrflw = (void**)(sf + PARAMSAVE + 64); + + // gpreg: [ret *], this, [other gpr params] + // fpreg: [fpr params] +@@ -540,7 +550,11 @@ extern "C" void privateSnippetExecutor( ... ) + "mr %0, 1\n\t" + : "=r" (sp) : ); + ++#if _CALL_ELF == 2 ++ volatile long nRegReturn[2]; ++#else + volatile long nRegReturn[1]; ++#endif + + typelib_TypeClass aType = + cpp_mediate( nOffsetAndIndex, (void**)gpreg, (void**)fpreg, sp, (sal_Int64*)nRegReturn); +@@ -583,14 +597,22 @@ extern "C" void privateSnippetExecutor( ... ) + default: + __asm__( "ld 3,%0\n\t" + : : "m" (nRegReturn[0]) ); ++#if _CALL_ELF == 2 ++ __asm__( "ld 4,%0\n\t" ++ : : "m" (nRegReturn[1]) ); ++#endif + break; + } + } + ++#if _CALL_ELF == 2 ++const int codeSnippetSize = 32; ++#else + const int codeSnippetSize = 24; ++#endif + + unsigned char * codeSnippet( unsigned char * code, sal_Int32 nFunctionIndex, sal_Int32 nVtableOffset, +- bool simpleRetType) ++ bool bHasHiddenParam) + { + #if OSL_DEBUG_LEVEL > 2 + fprintf(stderr,"in codeSnippet functionIndex is %x\n", nFunctionIndex); +@@ -599,15 +621,27 @@ unsigned char * codeSnippet( unsigned char * code, sal_Int32 nFunctionIndex, sa + + sal_uInt64 nOffsetAndIndex = ( ( (sal_uInt64) nVtableOffset ) << 32 ) | ( (sal_uInt64) nFunctionIndex ); + +- if ( !simpleRetType ) ++ if ( bHasHiddenParam ) + nOffsetAndIndex |= 0x80000000; +- ++#if _CALL_ELF == 2 ++ unsigned int *raw = (unsigned int *)&code[0]; ++ ++ raw[0] = 0xe96c0018; /* 0: ld 11,2f-0b(12) */ ++ raw[1] = 0xe98c0010; /* ld 12,1f-0b(12) */ ++ raw[2] = 0x7d8903a6; /* mtctr 12 */ ++ raw[3] = 0x4e800420; /* bctr */ ++ /* 1: .quad function_addr */ ++ /* 2: .quad context */ ++ *(void **)&raw[4] = (void *)privateSnippetExecutor; ++ *(void **)&raw[6] = (void*)nOffsetAndIndex; ++#else + void ** raw = (void **)&code[0]; + memcpy(raw, (char*) privateSnippetExecutor, 16); + raw[2] = (void*) nOffsetAndIndex; ++#endif + #if OSL_DEBUG_LEVEL > 2 + fprintf(stderr, "in: offset/index is %x %x %d, %lx\n", +- nFunctionIndex, nVtableOffset, !simpleRetType, raw[2]); ++ nFunctionIndex, nVtableOffset, bHasHiddenParam, raw[2]); + #endif + return (code + codeSnippetSize); + } +@@ -673,7 +707,7 @@ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions( + (s++)->fn = code + writetoexecdiff; + code = codeSnippet( + code, functionOffset++, vtableOffset, +- bridges::cpp_uno::shared::isSimpleType( ++ ppc64::return_in_hidden_param( + reinterpret_cast< + typelib_InterfaceAttributeTypeDescription * >( + member)->pAttributeTypeRef)); +@@ -684,7 +718,7 @@ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions( + member)->bReadOnly) + { + (s++)->fn = code + writetoexecdiff; +- code = codeSnippet(code, functionOffset++, vtableOffset, true); ++ code = codeSnippet(code, functionOffset++, vtableOffset, false); + } + break; + +@@ -692,7 +726,7 @@ unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions( + (s++)->fn = code + writetoexecdiff; + code = codeSnippet( + code, functionOffset++, vtableOffset, +- bridges::cpp_uno::shared::isSimpleType( ++ ppc64::return_in_hidden_param( + reinterpret_cast< + typelib_InterfaceMethodTypeDescription * >( + member)->pReturnTypeRef)); +diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx +index 4e7a197..a05193a 100644 +--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx ++++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/share.hxx +@@ -85,6 +85,7 @@ void fillUnoException( + namespace ppc64 + { + enum ppclimits { MAX_GPR_REGS = 8, MAX_SSE_REGS = 13 }; ++ bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef ); + } + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx +index a1874d8..105335eb 100644 +--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx ++++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx +@@ -37,9 +37,59 @@ + using namespace ::rtl; + using namespace ::com::sun::star::uno; + +-void MapReturn(long r3, double dret, typelib_TypeClass eTypeClass, void *pRegisterReturn) ++namespace ppc64 + { +- switch (eTypeClass) ++#if _CALL_ELF == 2 ++ bool is_complex_struct(const typelib_TypeDescription * type) ++ { ++ const typelib_CompoundTypeDescription * p ++ = reinterpret_cast< const typelib_CompoundTypeDescription * >(type); ++ for (sal_Int32 i = 0; i < p->nMembers; ++i) ++ { ++ if (p->ppTypeRefs[i]->eTypeClass == typelib_TypeClass_STRUCT || ++ p->ppTypeRefs[i]->eTypeClass == typelib_TypeClass_EXCEPTION) ++ { ++ typelib_TypeDescription * t = 0; ++ TYPELIB_DANGER_GET(&t, p->ppTypeRefs[i]); ++ bool b = is_complex_struct(t); ++ TYPELIB_DANGER_RELEASE(t); ++ if (b) { ++ return true; ++ } ++ } ++ else if (!bridges::cpp_uno::shared::isSimpleType(p->ppTypeRefs[i]->eTypeClass)) ++ return true; ++ } ++ if (p->pBaseTypeDescription != 0) ++ return is_complex_struct(&p->pBaseTypeDescription->aBase); ++ return false; ++ } ++#endif ++ ++ bool return_in_hidden_param( typelib_TypeDescriptionReference *pTypeRef ) ++ { ++ if (bridges::cpp_uno::shared::isSimpleType(pTypeRef)) ++ return false; ++#if _CALL_ELF == 2 ++ else if (pTypeRef->eTypeClass == typelib_TypeClass_STRUCT || pTypeRef->eTypeClass == typelib_TypeClass_EXCEPTION) ++ { ++ typelib_TypeDescription * pTypeDescr = 0; ++ TYPELIB_DANGER_GET( &pTypeDescr, pTypeRef ); ++ ++ //A Composite Type not larger than 16 bytes is returned in up to two GPRs ++ bool bRet = pTypeDescr->nSize > 16 || is_complex_struct(pTypeDescr); ++ ++ TYPELIB_DANGER_RELEASE( pTypeDescr ); ++ return bRet; ++ } ++#endif ++ return true; ++ } ++} ++ ++void MapReturn(long r3, long r4, double dret, typelib_TypeDescriptionReference* pReturnType, void *pRegisterReturn) ++{ ++ switch (pReturnType->eTypeClass) + { + case typelib_TypeClass_HYPER: + case typelib_TypeClass_UNSIGNED_HYPER: +@@ -65,6 +115,17 @@ void MapReturn(long r3, double dret, typelib_TypeClass eTypeClass, void *pRegist + case typelib_TypeClass_DOUBLE: + *reinterpret_cast( pRegisterReturn ) = dret; + break; ++#if _CALL_ELF == 2 ++ case typelib_TypeClass_STRUCT: ++ case typelib_TypeClass_EXCEPTION: ++ if (!ppc64::return_in_hidden_param(pReturnType)) ++ { ++ sal_uInt64 *pRegisters = reinterpret_cast(pRegisterReturn); ++ pRegisters[0] = r3; ++ if (pReturnType->pType->nSize > 8) ++ pRegisters[1] = r4; ++ } ++#endif + default: + break; + } +@@ -114,7 +175,11 @@ static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex, + pMethod += 8 * nVtableIndex; + pMethod = *((sal_uInt64 *)pMethod); + ++#if _CALL_ELF == 2 ++ typedef void (* FunctionCall )(...); ++#else + typedef void (* FunctionCall )( sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64 ); ++#endif + FunctionCall pFunc = (FunctionCall)pMethod; + + volatile double dret; +@@ -168,7 +233,7 @@ static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex, + "fmr %0, 1\n\t" + : "=f" (dret), "=r" (r3), "=r" (r4) : ); + +- MapReturn(r3, dret, pReturnTypeDescr->eTypeClass, pRegisterReturn); ++ MapReturn(r3, r4, dret, pReturnTypeRef, pRegisterReturn); + } + + // Macros for easier insertion of values to registers or stack +@@ -252,14 +317,18 @@ static void cpp_call( + + void * pCppReturn = 0; // if != 0 && != pUnoReturn, needs reconversion + +- bool bOverFlow = false; ++ bool bOverFlow = false; ++ bool bSimpleReturn = true; + + if (pReturnTypeDescr) + { + #if OSL_DEBUG_LEVEL > 2 + fprintf(stderr, "return type is %d\n", pReturnTypeDescr->eTypeClass); + #endif +- if (bridges::cpp_uno::shared::isSimpleType( pReturnTypeDescr )) ++ if (ppc64::return_in_hidden_param(pReturnTypeRef)) ++ bSimpleReturn = false; ++ ++ if (bSimpleReturn) + { + pCppReturn = pUnoReturn; // direct way for simple types + #if OSL_DEBUG_LEVEL > 2 +diff --git a/configure.ac b/configure.ac +index 2560a0d..d72d272 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -4157,6 +4157,13 @@ linux-gnu*) + PLATFORMID=linux_powerpc_64 + OUTPATH=unxlngppc64 + ;; ++ powerpc64le) ++ CPUNAME=POWERPC64 ++ RTL_ARCH=PowerPC_64_LE ++ LIB64="lib64" ++ PLATFORMID=linux_powerpc64_le ++ OUTPATH=unxlngppc64 ++ ;; + sparc) + CPUNAME=SPARC + RTL_ARCH=SPARC +@@ -7155,7 +7162,7 @@ if test -n "$ENABLE_JAVA" -a \( -z "$JAVALIB" -o -z "$JAVAINC" \); then + ;; + esac + ;; +- powerpc64) ++ powerpc64*) + JAVA_ARCH="ppc64" + if test "$JDK" = "gcj"; then + JAVA_TOOLKIT="client" +@@ -10809,7 +10816,7 @@ AC_SUBST(RHINO_JAR) + + supports_multilib= + case "$host_cpu" in +-x86_64 | powerpc64 | s390x) ++x86_64 | powerpc64 | powerpc64le | s390x) + if test "$SAL_TYPES_SIZEOFLONG" = "8"; then + supports_multilib="yes" + fi +diff --git a/desktop/source/deployment/misc/dp_platform.cxx b/desktop/source/deployment/misc/dp_platform.cxx +index 830f865..adb5a9a 100644 +--- a/desktop/source/deployment/misc/dp_platform.cxx ++++ b/desktop/source/deployment/misc/dp_platform.cxx +@@ -35,6 +35,7 @@ + #define PLATFORM_LINUX_SPARC "linux_sparc" + #define PLATFORM_LINUX_POWERPC "linux_powerpc" + #define PLATFORM_LINUX_POWERPC64 "linux_powerpc64" ++#define PLATFORM_LINUX_POWERPC64_LE "linux_powerpc64_le" + #define PLATFORM_LINUX_ARM_EABI "linux_arm_eabi" + #define PLATFORM_LINUX_ARM_OABI "linux_arm_oabi" + #define PLATFORM_LINUX_MIPS_EL "linux_mips_el" +@@ -129,6 +130,8 @@ namespace + ret = checkOSandCPU("Linux", "PowerPC"); + else if (token == PLATFORM_LINUX_POWERPC64) + ret = checkOSandCPU("Linux", "PowerPC_64"); ++ else if (token == PLATFORM_LINUX_POWERPC64_LE) ++ ret = checkOSandCPU("Linux", "PowerPC_64_LE"); + else if (token == PLATFORM_LINUX_ARM_EABI) + ret = checkOSandCPU("Linux", "ARM_EABI"); + else if (token == PLATFORM_LINUX_ARM_OABI) +diff --git a/m4/ax_boost_base.m4 b/m4/ax_boost_base.m4 +index 7a0cf52..55de0c4 100644 +--- a/m4/ax_boost_base.m4 ++++ b/m4/ax_boost_base.m4 +@@ -91,7 +91,7 @@ if test "x$want_boost" = "xyes"; then + dnl are found, e.g. when only header-only libraries are installed! + libsubdirs="lib" + ax_arch=`uname -m` +- if test $ax_arch = x86_64 -o $ax_arch = ppc64 -o $ax_arch = s390x -o $ax_arch = sparc64 -o $ax_arch = aarch64; then ++ if test $ax_arch = x86_64 -o $ax_arch = ppc64 -o $ax_arch = ppc64le -o $ax_arch = s390x -o $ax_arch = sparc64 -o $ax_arch = aarch64; then + libsubdirs="lib64 lib lib64" + fi + +-- +1.9.3 + diff --git a/SOURCES/0001-Resolves-rhbz-912529-Kerkis-SmallCaps-shown-instead-.patch b/SOURCES/0001-Resolves-rhbz-912529-Kerkis-SmallCaps-shown-instead-.patch new file mode 100644 index 0000000..aa68715 --- /dev/null +++ b/SOURCES/0001-Resolves-rhbz-912529-Kerkis-SmallCaps-shown-instead-.patch @@ -0,0 +1,47 @@ +From 1ded21bfb99951ca947bd11a7442398668202ca6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Wed, 4 Dec 2013 15:04:04 +0000 +Subject: [PATCH] Resolves: rhbz#912529 Kerkis SmallCaps shown instead of + Kerkis Regular + +we encounter both fonts, but all their properties that we compare +are the same, so we think they are two versions of the same font +and throw away the "Regular" version. + +Change-Id: I24369f10c7a0edba1faa02621bb78616e880966e +--- + vcl/source/gdi/outdev3.cxx | 11 +++++++++-- + 1 file changed, 9 insertions(+), 2 deletions(-) + +diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx +index c27cd93..f3f5a77 100644 +--- a/vcl/source/gdi/outdev3.cxx ++++ b/vcl/source/gdi/outdev3.cxx +@@ -665,7 +665,7 @@ PhysicalFontFace::PhysicalFontFace( const ImplDevFontAttributes& rDFA, int nMagi + + sal_Int32 PhysicalFontFace::CompareIgnoreSize( const PhysicalFontFace& rOther ) const + { +- // compare their width, weight, italic and style name ++ // compare their width, weight, italic, style name and family name + if( GetWidthType() < rOther.GetWidthType() ) + return -1; + else if( GetWidthType() > rOther.GetWidthType() ) +@@ -681,7 +681,14 @@ sal_Int32 PhysicalFontFace::CompareIgnoreSize( const PhysicalFontFace& rOther ) + else if( GetSlant() > rOther.GetSlant() ) + return 1; + +- return GetFamilyName().compareTo( rOther.GetFamilyName() ); ++ sal_Int32 nRet = GetFamilyName().compareTo( rOther.GetFamilyName() ); ++ ++ if (nRet == 0) ++ { ++ nRet = GetStyleName().compareTo( rOther.GetStyleName() ); ++ } ++ ++ return nRet; + } + + sal_Int32 PhysicalFontFace::CompareWithSize( const PhysicalFontFace& rOther ) const +-- +1.8.3.1 + diff --git a/SOURCES/0001-add-X-TryExec-entries-to-desktop-files.patch b/SOURCES/0001-add-X-TryExec-entries-to-desktop-files.patch new file mode 100644 index 0000000..6e63c83 --- /dev/null +++ b/SOURCES/0001-add-X-TryExec-entries-to-desktop-files.patch @@ -0,0 +1,90 @@ +From f04a62ef7e5146daefe19b04db95828198c0e1e0 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Mon, 28 Apr 2014 09:59:10 +0200 +Subject: [PATCH] add X-TryExec entries to desktop files + +Change-Id: Ic3626f79fa8b0b6e0d6696799445eaea8b0ab47f +--- + sysui/desktop/menus/base.desktop | 1 + + sysui/desktop/menus/calc.desktop | 1 + + sysui/desktop/menus/draw.desktop | 1 + + sysui/desktop/menus/impress.desktop | 1 + + sysui/desktop/menus/math.desktop | 1 + + sysui/desktop/menus/writer.desktop | 1 + + 6 files changed, 6 insertions(+) + +diff --git a/sysui/desktop/menus/base.desktop b/sysui/desktop/menus/base.desktop +index 62626d4..69ddaea 100755 +--- a/sysui/desktop/menus/base.desktop ++++ b/sysui/desktop/menus/base.desktop +@@ -32,6 +32,7 @@ Keywords=Data;SQL; + InitialPreference=5 + StartupWMClass=libreoffice-base + X-KDE-Protocols=file,http,smb,ftp,webdav ++X-TryExec=oobase + + Actions=NewDocument; + [Desktop Action NewDocument] +diff --git a/sysui/desktop/menus/calc.desktop b/sysui/desktop/menus/calc.desktop +index e50de65..8e9d7ea 100755 +--- a/sysui/desktop/menus/calc.desktop ++++ b/sysui/desktop/menus/calc.desktop +@@ -32,6 +32,7 @@ Keywords=Accounting;Stats;OpenDocument Spreadsheet;Chart;Microsoft Excel;Microso + InitialPreference=5 + StartupWMClass=libreoffice-calc + X-KDE-Protocols=file,http,smb,ftp,webdav ++X-TryExec=oocalc + + Actions=NewDocument; + [Desktop Action NewDocument] +diff --git a/sysui/desktop/menus/draw.desktop b/sysui/desktop/menus/draw.desktop +index a807fe0..4f5428f 100755 +--- a/sysui/desktop/menus/draw.desktop ++++ b/sysui/desktop/menus/draw.desktop +@@ -32,6 +32,7 @@ Keywords=Vector;Schema;Diagram;Layout;OpenDocument Graphics;Microsoft Publisher; + InitialPreference=5 + StartupWMClass=libreoffice-draw + X-KDE-Protocols=file,http,smb,ftp,webdav ++X-TryExec=oodraw + + Actions=NewDocument; + [Desktop Action NewDocument] +diff --git a/sysui/desktop/menus/impress.desktop b/sysui/desktop/menus/impress.desktop +index fda44e4..21336fe 100755 +--- a/sysui/desktop/menus/impress.desktop ++++ b/sysui/desktop/menus/impress.desktop +@@ -32,6 +32,7 @@ Keywords=Slideshow;Slides;OpenDocument Presentation;Microsoft PowerPoint;Microso + InitialPreference=5 + StartupWMClass=libreoffice-impress + X-KDE-Protocols=file,http,smb,ftp,webdav ++X-TryExec=ooimpress + + Actions=NewDocument; + [Desktop Action NewDocument] +diff --git a/sysui/desktop/menus/math.desktop b/sysui/desktop/menus/math.desktop +index 4822166..acb7d21 100755 +--- a/sysui/desktop/menus/math.desktop ++++ b/sysui/desktop/menus/math.desktop +@@ -33,6 +33,7 @@ Keywords=Equation;OpenDocument Formula;Formula;odf;MathML; + InitialPreference=5 + StartupWMClass=libreoffice-math + X-KDE-Protocols=file,http,smb,ftp,webdav ++X-TryExec=oomath + + Actions=NewDocument; + [Desktop Action NewDocument] +diff --git a/sysui/desktop/menus/writer.desktop b/sysui/desktop/menus/writer.desktop +index e59187e..ece25c2 100755 +--- a/sysui/desktop/menus/writer.desktop ++++ b/sysui/desktop/menus/writer.desktop +@@ -32,6 +32,7 @@ Keywords=Text;Letter;Fax;Document;OpenDocument Text;Microsoft Word;Microsoft Wor + InitialPreference=5 + StartupWMClass=libreoffice-writer + X-KDE-Protocols=file,http,smb,ftp,webdav ++X-TryExec=oowriter + + Actions=NewDocument; + [Desktop Action NewDocument] +-- +1.9.0 + diff --git a/SOURCES/0001-add-a-format-all-comments-feature.patch b/SOURCES/0001-add-a-format-all-comments-feature.patch new file mode 100644 index 0000000..0a05539 --- /dev/null +++ b/SOURCES/0001-add-a-format-all-comments-feature.patch @@ -0,0 +1,441 @@ +From ebb728c9c01b5e86926381fa816cf69cb3eb1e37 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Tue, 22 Apr 2014 17:06:26 +0100 +Subject: [PATCH] add a 'format all comments' feature + +Change-Id: Ie9530f0f58b38d014beda60b9efba3ce93fe5c0e +--- + .../org/openoffice/Office/UI/GenericCommands.xcu | 5 ++ + sw/inc/PostItMgr.hxx | 5 ++ + sw/inc/cmdid.h | 2 +- + sw/inc/swcommands.h | 1 + + sw/sdi/_annotsh.sdi | 6 ++ + sw/sdi/_textsh.sdi | 5 ++ + sw/sdi/swriter.sdi | 24 +++++++ + .../core/uibase/docvw/AnnotationMenuButton.cxx | 2 + + sw/source/core/uibase/docvw/PostItMgr.cxx | 77 +++++++++++++++++++++- + sw/source/core/uibase/docvw/SidebarWin.cxx | 1 + + sw/source/core/uibase/docvw/annotation.hrc | 1 + + sw/source/core/uibase/inc/annotsh.hxx | 2 + + sw/source/core/uibase/shells/annotsh.cxx | 17 +++-- + sw/source/core/uibase/shells/textfld.cxx | 14 +++- + sw/source/ui/app/mn.src | 6 ++ + sw/source/ui/docvw/annotation.src | 5 ++ + 16 files changed, 166 insertions(+), 7 deletions(-) + +diff --git a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu +index a16b900..a2d997c 100644 +--- a/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu ++++ b/officecfg/registry/data/org/openoffice/Office/UI/GenericCommands.xcu +@@ -5298,6 +5298,11 @@ + Delete All Comments + + ++ ++ ++ Format All Comments ++ ++ + + + Delete All Comments by This Author +diff --git a/sw/inc/PostItMgr.hxx b/sw/inc/PostItMgr.hxx +index 0ac0273..56760fd 100644 +--- a/sw/inc/PostItMgr.hxx ++++ b/sw/inc/PostItMgr.hxx +@@ -44,6 +44,8 @@ class SfxBroadcaster; + class SfxHint; + class SwEditWin; + class Color; ++class SfxItemPool; ++class SfxItemSet; + class SvxSearchItem; + class SvxLanguageItem; + namespace sw { namespace annotation { +@@ -219,6 +221,9 @@ class SwPostItMgr: public SfxListener + void Delete(OUString aAuthor); + void Delete(); + ++ void ExecuteFormatAllDialog(SwView& rView); ++ void FormatAll(const SfxItemSet &rNewAttr); ++ + void Hide( const OUString& rAuthor ); + void Hide(); + void Show(); +diff --git a/sw/inc/cmdid.h b/sw/inc/cmdid.h +index 7d506a3..b10359a 100644 +--- a/sw/inc/cmdid.h ++++ b/sw/inc/cmdid.h +@@ -780,7 +780,7 @@ included in c-context files, so c++ style stuff will cause problems. + + #define FN_DELETE_COMMENT (FN_NOTES+6) + #define FN_REPLY (FN_NOTES+7) +- ++#define FN_FORMAT_ALL_NOTES (FN_NOTES+8) + + #define FN_HEADERFOOTER_EDIT (FN_HEADERFOOTER+1) + #define FN_HEADERFOOTER_DELETE (FN_HEADERFOOTER+2) +diff --git a/sw/inc/swcommands.h b/sw/inc/swcommands.h +index 0f5cd54..cc9bc07 100644 +--- a/sw/inc/swcommands.h ++++ b/sw/inc/swcommands.h +@@ -116,6 +116,7 @@ + #define CMD_FN_DELETE_COMMENT ".uno:DeleteComment" + #define CMD_FN_DELETE_NOTE_AUTHOR ".uno:DeleteAuthor" + #define CMD_FN_DELETE_ALL_NOTES ".uno:DeleteAllNotes" ++#define CMD_FN_FORMAT_ALL_NOTES ".uno:FormatAllNotes" + #define CMD_FN_HIDE_NOTE ".uno:HideNote" + #define CMD_FN_HIDE_NOTE_AUTHOR ".uno:HideAuthor" + #define CMD_FN_HIDE_ALL_NOTES ".uno:HideAllNotes" +diff --git a/sw/sdi/_annotsh.sdi b/sw/sdi/_annotsh.sdi +index 142d5e7..15f03ad 100644 +--- a/sw/sdi/_annotsh.sdi ++++ b/sw/sdi/_annotsh.sdi +@@ -37,6 +37,12 @@ interface _Annotation + StateMethod = GetNoteState ; + ] + ++ FN_FORMAT_ALL_NOTES ++ [ ++ ExecMethod = NoteExec ; ++ StateMethod = GetNoteState ; ++ ] ++ + FN_HIDE_NOTE + [ + ExecMethod = NoteExec ; +diff --git a/sw/sdi/_textsh.sdi b/sw/sdi/_textsh.sdi +index 0fb5cdb..c90bfcd 100644 +--- a/sw/sdi/_textsh.sdi ++++ b/sw/sdi/_textsh.sdi +@@ -941,6 +941,11 @@ interface BaseText + ExecMethod = ExecField ; + StateMethod = StateField; + ] ++ FN_FORMAT_ALL_NOTES ++ [ ++ ExecMethod = ExecField ; ++ StateMethod = StateField; ++ ] + FN_HIDE_NOTE + [ + ExecMethod = ExecField ; +diff --git a/sw/sdi/swriter.sdi b/sw/sdi/swriter.sdi +index f8218fe..9312844 100644 +--- a/sw/sdi/swriter.sdi ++++ b/sw/sdi/swriter.sdi +@@ -9920,6 +9920,30 @@ SfxVoidItem DeleteAllNotes FN_DELETE_ALL_NOTES + GroupId = GID_EDIT; + ] + ++SfxVoidItem FormatAllNotes FN_FORMAT_ALL_NOTES ++() ++[ ++ /* flags: */ ++ AutoUpdate = FALSE, ++ Cachable = Cachable, ++ FastCall = FALSE, ++ HasCoreId = FALSE, ++ HasDialog = FALSE, ++ ReadOnlyDoc = FALSE, ++ Toggle = FALSE, ++ Container = FALSE, ++ RecordAbsolute = FALSE, ++ RecordPerSet; ++ Synchron; ++ ++ /* config: */ ++ AccelConfig = TRUE, ++ MenuConfig = TRUE, ++ StatusBarConfig = FALSE, ++ ToolBoxConfig = TRUE, ++ GroupId = GID_EDIT; ++] ++ + //-------------------------------------------------------------------------- + SfxVoidItem HideNote FN_HIDE_NOTE + () +diff --git a/sw/source/ui/app/mn.src b/sw/source/ui/app/mn.src +index eb5ee0e..94ddb2f 100644 +--- a/sw/source/ui/app/mn.src ++++ b/sw/source/ui/app/mn.src +@@ -761,6 +761,12 @@ location: /uiconfig/[swriter|sweb|sglobal]/menubar/menubar.xml + HelpId = CMD_FN_DELETE_ALL_NOTES ;\ + Text [ en-US ] = "~Delete All Comments" ;\ + };\ ++ MenuItem\ ++ {\ ++ Identifier = FN_FORMAT_ALL_NOTES ;\ ++ HelpId = CMD_FN_FORMAT_ALL_NOTES ;\ ++ Text [ en-US ] = "~Format All Comments" ;\ ++ };\ + /* + MenuItem\ + {\ +diff --git a/sw/source/ui/docvw/AnnotationMenuButton.cxx b/sw/source/ui/docvw/AnnotationMenuButton.cxx +index 0bd4bf2..218daee 100644 +--- a/sw/source/ui/docvw/AnnotationMenuButton.cxx ++++ b/sw/source/ui/docvw/AnnotationMenuButton.cxx +@@ -74,12 +74,14 @@ void AnnotationMenuButton::MouseButtonDown( const MouseEvent& rMEvt ) + pButtonPopup->EnableItem( FN_DELETE_COMMENT, false ); + pButtonPopup->EnableItem( FN_DELETE_NOTE_AUTHOR, false ); + pButtonPopup->EnableItem( FN_DELETE_ALL_NOTES, false ); ++ pButtonPopup->EnableItem( FN_FORMAT_ALL_NOTES, false ); + } + else + { + pButtonPopup->EnableItem( FN_DELETE_COMMENT, !mrSidebarWin.IsProtected() ); + pButtonPopup->EnableItem( FN_DELETE_NOTE_AUTHOR, true ); + pButtonPopup->EnableItem( FN_DELETE_ALL_NOTES, true ); ++ pButtonPopup->EnableItem( FN_FORMAT_ALL_NOTES, true ); + } + + if ( mrSidebarWin.IsProtected() ) +diff --git a/sw/source/ui/docvw/PostItMgr.cxx b/sw/source/ui/docvw/PostItMgr.cxx +index e6b7cb6..c2b1225 100644 +--- a/sw/source/ui/docvw/PostItMgr.cxx ++++ b/sw/source/ui/docvw/PostItMgr.cxx +@@ -34,8 +34,8 @@ + #include + #include + ++#include + #include +- + #include + #include + #include +@@ -67,11 +67,14 @@ + #include + #include + #include ++#include + #include + + #include + #include + ++#include "annotsh.hxx" ++#include "swabstdlg.hxx" + #include "swevent.hxx" + #include "switerator.hxx" + +@@ -1227,6 +1230,78 @@ void SwPostItMgr::Delete() + CalcRects(); + LayoutPostIts(); + } ++ ++void SwPostItMgr::ExecuteFormatAllDialog(SwView& rView) ++{ ++ if (mvPostItFlds.empty()) ++ return; ++ sw::sidebarwindows::SwSidebarWin *pOrigActiveWin = GetActiveSidebarWin(); ++ sw::sidebarwindows::SwSidebarWin *pWin = pOrigActiveWin; ++ if (!pWin) ++ { ++ for (SwSidebarItem_iterator i = mvPostItFlds.begin(); i != mvPostItFlds.end(); ++i) ++ { ++ pWin = (*i)->pPostIt; ++ if (pWin) ++ break; ++ } ++ } ++ if (!pWin) ++ return; ++ SetActiveSidebarWin(pWin); ++ OutlinerView* pOLV = pWin->GetOutlinerView(); ++ SfxItemSet aEditAttr(pOLV->GetAttribs()); ++ SfxItemPool* pPool(SwAnnotationShell::GetAnnotationPool(rView)); ++ SfxItemSet aDlgAttr(*pPool, EE_ITEMS_START, EE_ITEMS_END); ++ aDlgAttr.Put(aEditAttr); ++ SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create(); ++ SfxAbstractTabDialog* pDlg = pFact->CreateSwCharDlg(rView.GetWindow(), rView, aDlgAttr, DLG_CHAR_ANN); ++ sal_uInt16 nRet = pDlg->Execute(); ++ if (RET_OK == nRet) ++ { ++ aDlgAttr.Put(*pDlg->GetOutputItemSet()); ++ FormatAll(aDlgAttr); ++ } ++ delete pDlg; ++ SetActiveSidebarWin(pOrigActiveWin); ++} ++ ++void SwPostItMgr::FormatAll(const SfxItemSet &rNewAttr) ++{ ++ mpWrtShell->StartAllAction(); ++ SwRewriter aRewriter; ++ aRewriter.AddRule(UndoArg1, SW_RES(STR_FORMAT_ALL_NOTES) ); ++ mpWrtShell->StartUndo( UNDO_INSATTR, &aRewriter ); ++ ++ for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i != mvPostItFlds.end() ; ++i) ++ { ++ if (!(*i)->pPostIt) ++ continue; ++ OutlinerView* pOLV = (*i)->pPostIt->GetOutlinerView(); ++ //save old selection ++ ESelection aOrigSel(pOLV->GetSelection()); ++ //select all ++ Outliner *pOutliner = pOLV->GetOutliner(); ++ if (pOutliner) ++ { ++ sal_Int32 nParaCount = pOutliner->GetParagraphCount(); ++ if (nParaCount > 0) ++ pOLV->SelectRange(0, nParaCount); ++ } ++ //set new char properties ++ pOLV->SetAttribs(rNewAttr); ++ //restore old selection ++ pOLV->SetSelection(aOrigSel); ++ } ++ ++ mpWrtShell->EndUndo(); ++ PrepareView(); ++ mpWrtShell->EndAllAction(); ++ mbLayout = true; ++ CalcRects(); ++ LayoutPostIts(); ++} ++ + void SwPostItMgr::Hide( const OUString& rAuthor ) + { + for(SwSidebarItem_iterator i = mvPostItFlds.begin(); i != mvPostItFlds.end() ; ++i) +diff --git a/sw/source/ui/docvw/SidebarWin.cxx b/sw/source/ui/docvw/SidebarWin.cxx +index 275b72e..4a0d4a7 100644 +--- a/sw/source/ui/docvw/SidebarWin.cxx ++++ b/sw/source/ui/docvw/SidebarWin.cxx +@@ -971,6 +971,7 @@ void SwSidebarWin::ExecuteCommand(sal_uInt16 nSlot) + //Delete(); // do not kill the parent of our open popup menu + mnEventId = Application::PostUserEvent( LINK( this, SwSidebarWin, DeleteHdl), 0 ); + break; ++ case FN_FORMAT_ALL_NOTES: + case FN_DELETE_ALL_NOTES: + case FN_HIDE_ALL_NOTES: + // not possible as slot as this would require that "this" is the active postit +diff --git a/sw/source/ui/docvw/annotation.hrc b/sw/source/ui/docvw/annotation.hrc +index 7daf555..5fe3e49 100644 +--- a/sw/source/ui/docvw/annotation.hrc ++++ b/sw/source/ui/docvw/annotation.hrc +@@ -32,6 +32,7 @@ + #define STR_NOAUTHOR (RC_ANNOTATION_BEGIN + 6) + + #define STR_REPLY (RC_ANNOTATION_BEGIN + 7) ++#define STR_FORMAT_ALL_NOTES (RC_ANNOTATION_BEGIN + 8) + + + #define ANNOTATION_ACT_END STR_REPLY +diff --git a/sw/source/ui/docvw/annotation.src b/sw/source/ui/docvw/annotation.src +index 46afad9..a45c3ca 100644 +--- a/sw/source/ui/docvw/annotation.src ++++ b/sw/source/ui/docvw/annotation.src +@@ -35,6 +35,11 @@ String STR_DELETE_ALL_NOTES + Text [ en-US ] = "All Comments" ; + }; + ++String STR_FORMAT_ALL_NOTES ++{ ++ Text [ en-US ] = "All Comments" ; ++}; ++ + String STR_DELETE_AUTHOR_NOTES + { + Text [ en-US ] = "Comments by " ; +diff --git a/sw/source/ui/inc/annotsh.hxx b/sw/source/ui/inc/annotsh.hxx +index 5872c95..09961a7 100644 +--- a/sw/source/ui/inc/annotsh.hxx ++++ b/sw/source/ui/inc/annotsh.hxx +@@ -68,6 +68,8 @@ public: + + virtual ::svl::IUndoManager* + GetUndoManager(); ++ ++ static SfxItemPool* GetAnnotationPool(SwView& rV); + }; + + #endif +diff --git a/sw/source/ui/shells/annotsh.cxx b/sw/source/ui/shells/annotsh.cxx +index 1106013..c83a99d 100644 +--- a/sw/source/ui/shells/annotsh.cxx ++++ b/sw/source/ui/shells/annotsh.cxx +@@ -145,11 +145,16 @@ SFX_IMPL_INTERFACE(SwAnnotationShell, SfxShell, SW_RES(STR_SHELLNAME_DRAW_TEXT)) + + TYPEINIT1(SwAnnotationShell,SfxShell) + ++SfxItemPool* SwAnnotationShell::GetAnnotationPool(SwView& rV) ++{ ++ SwWrtShell &rSh = rV.GetWrtShell(); ++ return rSh.GetAttrPool().GetSecondaryPool(); ++} ++ + SwAnnotationShell::SwAnnotationShell( SwView& r ) +-: rView(r) ++ : rView(r) + { +- SwWrtShell &rSh = rView.GetWrtShell(); +- SetPool(rSh.GetAttrPool().GetSecondaryPool()); ++ SetPool(SwAnnotationShell::GetAnnotationPool(rView)); + SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_Annotation)); + } + +@@ -1087,9 +1092,12 @@ void SwAnnotationShell::NoteExec(SfxRequest &rReq) + pPostItMgr->GetActiveSidebarWin()->ExecuteCommand(nSlot); + break; + +- case FN_DELETE_ALL_NOTES: ++ case FN_DELETE_ALL_NOTES: + pPostItMgr->Delete(); + break; ++ case FN_FORMAT_ALL_NOTES: ++ pPostItMgr->ExecuteFormatAllDialog(rView); ++ break; + case FN_DELETE_NOTE_AUTHOR: + { + SFX_REQUEST_ARG( rReq, pItem, SfxStringItem, nSlot, sal_False); +@@ -1124,6 +1132,7 @@ void SwAnnotationShell::GetNoteState(SfxItemSet &rSet) + case FN_POSTIT: + case FN_DELETE_NOTE_AUTHOR: + case FN_DELETE_ALL_NOTES: ++ case FN_FORMAT_ALL_NOTES: + case FN_HIDE_NOTE: + case FN_HIDE_NOTE_AUTHOR: + case FN_HIDE_ALL_NOTES: +diff --git a/sw/source/ui/shells/textfld.cxx b/sw/source/ui/shells/textfld.cxx +index a7050c4..7289f37 100644 +--- a/sw/source/ui/shells/textfld.cxx ++++ b/sw/source/ui/shells/textfld.cxx +@@ -18,9 +18,13 @@ + */ + + ++#include + #include + #include +- ++#include ++#include ++#include ++#include + #include + #include + #include +@@ -321,6 +325,13 @@ void SwTextShell::ExecField(SfxRequest &rReq) + if ( GetView().GetPostItMgr() ) + GetView().GetPostItMgr()->Delete(); + break; ++ case FN_FORMAT_ALL_NOTES: ++ { ++ SwPostItMgr* pPostItMgr = GetView().GetPostItMgr(); ++ if (pPostItMgr) ++ pPostItMgr->ExecuteFormatAllDialog(GetView()); ++ } ++ break; + case FN_DELETE_NOTE_AUTHOR: + { + SFX_REQUEST_ARG( rReq, pNoteItem, SfxStringItem, nSlot, sal_False); +@@ -629,6 +640,7 @@ void SwTextShell::StateField( SfxItemSet &rSet ) + case FN_DELETE_COMMENT: + case FN_DELETE_NOTE_AUTHOR: + case FN_DELETE_ALL_NOTES: ++ case FN_FORMAT_ALL_NOTES: + case FN_HIDE_NOTE: + case FN_HIDE_NOTE_AUTHOR: + case FN_HIDE_ALL_NOTES: diff --git a/SOURCES/0001-add-a-status-bar-icon-to-fit-slide-to-window.patch b/SOURCES/0001-add-a-status-bar-icon-to-fit-slide-to-window.patch new file mode 100644 index 0000000..ac7f6da --- /dev/null +++ b/SOURCES/0001-add-a-status-bar-icon-to-fit-slide-to-window.patch @@ -0,0 +1,232 @@ +From d6f5d4ee2cd0654497f1af37421d788411db762c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Thu, 8 May 2014 14:27:53 +0100 +Subject: [PATCH] add a status bar icon to fit slide to window + +Change-Id: I2c1d1fc7425b0aaad2a2445e0ac71ddc38410fdb +--- + icon-themes/galaxy/svx/res/zoom_page_statusbar.png | Bin 0 -> 418 bytes + include/svx/dialogs.hrc | 6 ++- + include/svx/zoomctrl.hxx | 15 ++++++- + sd/source/ui/app/sddll.cxx | 1 + + sd/uiconfig/simpress/statusbar/statusbar.xml | 1 + + svx/source/stbctrls/modctrl.cxx | 7 ---- + svx/source/stbctrls/stbctrls.src | 13 ++++++ + svx/source/stbctrls/zoomctrl.cxx | 46 +++++++++++++++++---- + 8 files changed, 70 insertions(+), 19 deletions(-) + create mode 100644 icon-themes/galaxy/svx/res/zoom_page_statusbar.png + +diff --git a/icon-themes/galaxy/svx/res/zoom_page_statusbar.png b/icon-themes/galaxy/svx/res/zoom_page_statusbar.png +new file mode 100644 +index 0000000000000000000000000000000000000000..5fb2d59cf7549dbb665e9efc81f7a94c0f4e4980 +GIT binary patch +literal 418 +zcmeAS@N?(olHy`uVBq!ia0vp^d>}Rl8<3oNC%zs?aTa()76ZkPfH31!Z9ZwBAbW|Y +zuPggKRt_Em37r=8g+L+M%#er@=ltB<)VvZPmw~~#C^fMpHASI3vm`^o-P1Q9MK6_| +zfq_xN)5S4F<9zQVMQ;~Jf#dbYn_qus^<|gZlVlLhn=WYb!{o$M=H~ea)HIsH)+Pzs +zA7O3wTb1UD040>XycHdeXZiA&sHNY`QYup??3pE~^|b;>byRP|ES8VP<`l +z`Gp^To!vF}*zE59-5A<;>sii + #include +- +-// class SvxZoomToolBoxControl ------------------------------------------- ++#include + + class SVX_DLLPUBLIC SvxZoomStatusBarControl : public SfxStatusBarControl + { +@@ -42,6 +41,18 @@ public: + + }; + ++class SVX_DLLPUBLIC SvxZoomPageStatusBarControl : public SfxStatusBarControl ++{ ++private: ++ Image maImage; ++public: ++ virtual void Paint( const UserDrawEvent& rEvt ) SAL_OVERRIDE; ++ virtual sal_Bool MouseButtonDown( const MouseEvent & rEvt ) SAL_OVERRIDE; ++ ++ SFX_DECL_STATUSBAR_CONTROL(); ++ ++ SvxZoomPageStatusBarControl(sal_uInt16 nSlotId, sal_uInt16 nId, StatusBar& rStb); ++}; + + #endif + +diff --git a/sd/source/ui/app/sddll.cxx b/sd/source/ui/app/sddll.cxx +index f7a27c0..b37d934 100644 +--- a/sd/source/ui/app/sddll.cxx ++++ b/sd/source/ui/app/sddll.cxx +@@ -242,6 +242,7 @@ void SdDLL::RegisterControllers() + SvxCTLTextTbxCtrl::RegisterControl(SID_ATTR_PARA_RIGHT_TO_LEFT, pMod); + + // register StatusBarControls ++ SvxZoomPageStatusBarControl::RegisterControl( SID_ZOOM_ENTIRE_PAGE, pMod ); + SvxZoomStatusBarControl::RegisterControl( SID_ATTR_ZOOM, pMod ); + SvxPosSizeStatusBarControl::RegisterControl( SID_ATTR_SIZE, pMod ); + SvxModifyControl::RegisterControl( SID_DOC_MODIFIED, pMod ); +diff --git a/sd/uiconfig/simpress/statusbar/statusbar.xml b/sd/uiconfig/simpress/statusbar/statusbar.xml +index 24224fe..78042ef 100644 +--- a/sd/uiconfig/simpress/statusbar/statusbar.xml ++++ b/sd/uiconfig/simpress/statusbar/statusbar.xml +@@ -24,6 +24,7 @@ + + + ++ + + + +diff --git a/svx/source/stbctrls/modctrl.cxx b/svx/source/stbctrls/modctrl.cxx +index db94f49..aff7e75 100644 +--- a/svx/source/stbctrls/modctrl.cxx ++++ b/svx/source/stbctrls/modctrl.cxx +@@ -137,8 +137,6 @@ void SvxModifyControl::_repaint() + + // ----------------------------------------------------------------------- + +-namespace { +- + /** + * Given a bounding rectangle and an image, determine the top-left position + * of the image so that the image would look centered both horizontally and +@@ -160,9 +158,6 @@ Point centerImage(const Rectangle& rBoundingRect, const Image& rImg) + return aPt; + } + +-} +- +- + void SvxModifyControl::Paint( const UserDrawEvent& rUsrEvt ) + { + OutputDevice* pDev = rUsrEvt.GetDevice(); +diff --git a/svx/source/stbctrls/stbctrls.src b/svx/source/stbctrls/stbctrls.src +index 8d5beeb..5987d7a 100644 +--- a/svx/source/stbctrls/stbctrls.src ++++ b/svx/source/stbctrls/stbctrls.src +@@ -120,6 +120,11 @@ String RID_SVXSTR_DOC_LOAD + Text [ en-US ] = "Loading document..."; + }; + ++String RID_SVXSTR_FIT_SLIDE ++{ ++ Text [ en-US ] = "Fit slide to current window."; ++}; ++ + // PopupMenu ------------------------------------------------------------- + Menu RID_SVXMNU_ZOOM + { +@@ -337,5 +342,13 @@ Image RID_SVXBMP_DOC_MODIFIED_FEEDBACK + }; + MaskColor = STD_MASKCOLOR; + }; ++Image RID_SVXBMP_ZOOM_PAGE ++{ ++ ImageBitmap = Bitmap ++ { ++ File = "zoom_page_statusbar.png" ; ++ }; ++ MaskColor = STD_MASKCOLOR; ++}; + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/svx/source/stbctrls/zoomctrl.cxx b/svx/source/stbctrls/zoomctrl.cxx +index b5be076..229f98d 100644 +--- a/svx/source/stbctrls/zoomctrl.cxx ++++ b/svx/source/stbctrls/zoomctrl.cxx +@@ -25,7 +25,8 @@ + + #include + +-#include "svx/zoomctrl.hxx" ++#include ++#include + #include + #include "stbctrls.h" + #include +@@ -95,7 +96,6 @@ void ZoomPopup_Impl::Select() + } + + // class SvxZoomStatusBarControl ------------------------------------------ +- + SvxZoomStatusBarControl::SvxZoomStatusBarControl( sal_uInt16 _nSlotId, + sal_uInt16 _nId, + StatusBar& rStb ) : +@@ -183,5 +183,41 @@ void SvxZoomStatusBarControl::Command( const CommandEvent& rCEvt ) + SfxStatusBarControl::Command( rCEvt ); + } + ++SFX_IMPL_STATUSBAR_CONTROL(SvxZoomPageStatusBarControl,SfxVoidItem); ++ ++SvxZoomPageStatusBarControl::SvxZoomPageStatusBarControl(sal_uInt16 _nSlotId, ++ sal_uInt16 _nId, StatusBar& rStb) ++ : SfxStatusBarControl(_nSlotId, _nId, rStb) ++ , maImage(SVX_RES(RID_SVXBMP_ZOOM_PAGE)) ++{ ++ GetStatusBar().SetQuickHelpText(GetId(), SVX_RESSTR(RID_SVXSTR_FIT_SLIDE)); ++} ++ ++extern Point centerImage(const Rectangle& rBoundingRect, const Image& rImg); ++ ++void SvxZoomPageStatusBarControl::Paint(const UserDrawEvent& rUsrEvt) ++{ ++ OutputDevice* pDev = rUsrEvt.GetDevice(); ++ Rectangle aRect = rUsrEvt.GetRect(); ++ Point aPt = centerImage(aRect, maImage); ++ pDev->DrawImage(aPt, maImage); ++} ++ ++sal_Bool SvxZoomPageStatusBarControl::MouseButtonDown(const MouseEvent&) ++{ ++ SvxZoomItem aZoom( SVX_ZOOM_WHOLEPAGE, 0, GetId() ); ++ ++ ::com::sun::star::uno::Any a; ++ INetURLObject aObj( m_aCommandURL ); ++ ++ ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > aArgs( 1 ); ++ aArgs[0].Name = aObj.GetURLPath(); ++ aZoom.QueryValue( a ); ++ aArgs[0].Value = a; ++ ++ execute( aArgs ); ++ ++ return true; ++} + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ + diff --git a/SOURCES/0001-avoid-problems-detecting-HTML-files-with-.xls-ext.patch b/SOURCES/0001-avoid-problems-detecting-HTML-files-with-.xls-ext.patch new file mode 100644 index 0000000..76b3328 --- /dev/null +++ b/SOURCES/0001-avoid-problems-detecting-HTML-files-with-.xls-ext.patch @@ -0,0 +1,404 @@ +From df7ff240db01ee0e993c7cbc30d3370d6d1d0956 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Tue, 8 Jul 2014 17:01:27 +0200 +Subject: [PATCH] avoid problems detecting HTML files with .xls ext. + +(cherry picked from commit 86c6f18c2766aad43d6e3bfcf3530e40440ebca7) +Signed-off-by: David Tardon + +Conflicts: + filter/source/textfilterdetect/filterdetect.cxx + +Change-Id: I9955223aac20f3f640fde51bb7231666c269ca70 +--- + filter/Configuration_filter.mk | 1 + + filter/source/config/fragments/types/calc_HTML.xcu | 35 ++++ + sc/Library_scd.mk | 1 + + sc/inc/htmlfilterdetect.hxx | 80 +++++++++ + sc/source/filter/html/htmlfilterdetect.cxx | 180 +++++++++++++++++++++ + sc/source/ui/unoobj/detreg.cxx | 9 ++ + sc/util/scd.component | 3 + + 7 files changed, 309 insertions(+) + create mode 100644 filter/source/config/fragments/types/calc_HTML.xcu + create mode 100644 sc/inc/htmlfilterdetect.hxx + create mode 100644 sc/source/filter/html/htmlfilterdetect.cxx + +diff --git a/filter/Configuration_filter.mk b/filter/Configuration_filter.mk +index fe84350..36cf294 100644 +--- a/filter/Configuration_filter.mk ++++ b/filter/Configuration_filter.mk +@@ -514,6 +514,7 @@ $(call filter_Configuration_add_ui_filters,fcfg_langpack,filter/source/config/fr + $(call filter_Configuration_add_types,fcfg_langpack,fcfg_calc_types.xcu,filter/source/config/fragments/types,\ + calc_DIF \ + calc_ODS_FlatXML \ ++ calc_HTML \ + generic_HTML \ + generic_Text \ + calc_Lotus \ +diff --git a/filter/source/config/fragments/types/calc_HTML.xcu b/filter/source/config/fragments/types/calc_HTML.xcu +new file mode 100644 +index 0000000..f4682da +--- /dev/null ++++ b/filter/source/config/fragments/types/calc_HTML.xcu +@@ -0,0 +1,35 @@ ++ ++ ++ ++ com.sun.star.comp.calc.HtmlFilterDetect ++ ++ xls ++ text/html ++ false ++ ++ ++ HTML Table ++ ++ ++ +diff --git a/sc/Library_scd.mk b/sc/Library_scd.mk +index 4d02ae1..1b4d035 100644 +--- a/sc/Library_scd.mk ++++ b/sc/Library_scd.mk +@@ -37,6 +37,7 @@ $(eval $(call gb_Library_use_libraries,scd,\ + )) + + $(eval $(call gb_Library_add_exception_objects,scd,\ ++ sc/source/filter/html/htmlfilterdetect \ + sc/source/ui/unoobj/detreg \ + sc/source/ui/unoobj/scdetect \ + sc/source/ui/unoobj/exceldetect \ +diff --git a/sc/inc/htmlfilterdetect.hxx b/sc/inc/htmlfilterdetect.hxx +new file mode 100644 +index 0000000..f131e89 +--- /dev/null ++++ b/sc/inc/htmlfilterdetect.hxx +@@ -0,0 +1,80 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ * ++ * This file incorporates work covered by the following license notice: ++ * ++ * Licensed to the Apache Software Foundation (ASF) under one or more ++ * contributor license agreements. See the NOTICE file distributed ++ * with this work for additional information regarding copyright ++ * ownership. The ASF licenses this file to you under the Apache ++ * License, Version 2.0 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.apache.org/licenses/LICENSE-2.0 . ++ */ ++ ++#ifndef INCLUDED_SC_INC_HTMLFILTERDETECT_HXX ++#define INCLUDED_SC_INC_HTMLFILTERDETECT_HXX ++ ++#include ++#include ++#include ++#include ++ ++#include ++ ++namespace sc ++{ ++ ++class HtmlFilterDetect : public cppu::WeakImplHelper3< ++ com::sun::star::document::XExtendedFilterDetection, ++ com::sun::star::lang::XInitialization, ++ com::sun::star::lang::XServiceInfo> ++{ ++ com::sun::star::uno::Reference mxCxt; ++ ++public: ++ ++ HtmlFilterDetect (const com::sun::star::uno::Reference& xCxt); ++ virtual ~HtmlFilterDetect(); ++ ++ // XExtendedFilterDetection ++ ++ virtual OUString SAL_CALL detect(com::sun::star::uno::Sequence& lDescriptor) ++ throw( com::sun::star::uno::RuntimeException, std::exception ) SAL_OVERRIDE; ++ ++ // XInitialization ++ ++ virtual void SAL_CALL initialize( const ::com::sun::star::uno::Sequence& aArguments) ++ throw (com::sun::star::uno::Exception, com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; ++ ++ // XServiceInfo ++ ++ virtual OUString SAL_CALL getImplementationName() ++ throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; ++ ++ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) ++ throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; ++ ++ virtual com::sun::star::uno::Sequence SAL_CALL getSupportedServiceNames() ++ throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE; ++}; ++ ++OUString HtmlFilterDetect_getImplementationName(); ++ ++bool HtmlFilterDetect_supportsService(const OUString& ServiceName); ++ ++com::sun::star::uno::Sequence HtmlFilterDetect_getSupportedServiceNames(); ++ ++com::sun::star::uno::Reference ++HtmlFilterDetect_createInstance(const com::sun::star::uno::Reference& rCxt); ++ ++} ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/source/filter/html/htmlfilterdetect.cxx b/sc/source/filter/html/htmlfilterdetect.cxx +new file mode 100644 +index 0000000..f2f3db5 +--- /dev/null ++++ b/sc/source/filter/html/htmlfilterdetect.cxx +@@ -0,0 +1,180 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ */ ++ ++#include "htmlfilterdetect.hxx" ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#define CALC_HTML_FILTER "calc_HTML_WebQuery" ++ ++namespace sc ++{ ++ ++using namespace ::com::sun::star; ++using utl::MediaDescriptor; ++ ++namespace { ++ ++bool IsHTMLStream( const uno::Reference& xInStream ) ++{ ++ boost::scoped_ptr pInStream( utl::UcbStreamHelper::CreateStream( xInStream ) ); ++ if ( !pInStream || pInStream->GetError() ) ++ // No stream ++ return false; ++ ++ // Read the stream header ++ pInStream->StartReadingUnicodeText( RTL_TEXTENCODING_DONTKNOW ); ++ const sal_Size nUniPos = pInStream->Tell(); ++ const sal_uInt16 nSize = 4096; ++ ++ OString sHeader; ++ if ( nUniPos == 3 || nUniPos == 0 ) // UTF-8 or non-Unicode ++ sHeader = read_uInt8s_ToOString( *pInStream, nSize ); ++ else // UTF-16 (nUniPos = 2) ++ sHeader = OUStringToOString( read_uInt16s_ToOUString( *pInStream, nSize ), RTL_TEXTENCODING_ASCII_US ); ++ ++ // Now check whether the stream begins with a known HTML tag. ++ enum DetectPhase { BeforeTag, TagOpened, InTagName }; ++ DetectPhase dp = BeforeTag; ++ ++ const char* pHeader = sHeader.getStr(); ++ const int nLength = sHeader.getLength(); ++ int i = 0, nStartOfTagIndex = 0; ++ ++ for ( i = 0; i < nLength; ++i, ++pHeader ) ++ { ++ char c = *pHeader; ++ if ( c == ' ' || c == '\n' || c == '\t' || c == '\r' || c == '\f' ) ++ { ++ if ( dp == TagOpened ) ++ return false; // Invalid: Should start with a tag name ++ else if ( dp == InTagName ) ++ break; // End of tag name reached ++ } ++ else if ( c == '<' ) ++ { ++ if ( dp == BeforeTag ) ++ dp = TagOpened; ++ else ++ return false; // Invalid: Nested '<' ++ } ++ else if ( c == '>' ) ++ { ++ if ( dp == InTagName ) ++ break; // End of tag name reached ++ else ++ return false; // Invalid: Empty tag or before '<' ++ } ++ else if ( c == '!' ) ++ { ++ if ( dp == TagOpened ) ++ return true; // "& xCxt) : ++ mxCxt(xCxt) {} ++ ++HtmlFilterDetect::~HtmlFilterDetect() {} ++ ++OUString SAL_CALL HtmlFilterDetect::detect(uno::Sequence& lDescriptor) throw (uno::RuntimeException, std::exception) ++{ ++ MediaDescriptor aMediaDesc(lDescriptor); ++ ++ OUString aType = aMediaDesc.getUnpackedValueOrDefault(MediaDescriptor::PROP_TYPENAME(), OUString() ); ++ ++ uno::Reference xInStream(aMediaDesc[MediaDescriptor::PROP_INPUTSTREAM()], uno::UNO_QUERY); ++ if (!xInStream.is() || !IsHTMLStream(xInStream)) ++ return OUString(); ++ ++ aMediaDesc[MediaDescriptor::PROP_FILTERNAME()] <<= OUString(CALC_HTML_FILTER); ++ ++ aMediaDesc >> lDescriptor; ++ return aType; ++} ++ ++// XInitialization ++ ++void SAL_CALL HtmlFilterDetect::initialize(const uno::Sequence& /*aArguments*/) ++ throw (uno::Exception, uno::RuntimeException, std::exception) ++{ ++} ++ ++OUString HtmlFilterDetect_getImplementationName() ++{ ++ return OUString("com.sun.star.comp.calc.HtmlFilterDetect"); ++} ++ ++uno::Sequence HtmlFilterDetect_getSupportedServiceNames() ++{ ++ uno::Sequence aRet(2); ++ OUString* pArray = aRet.getArray(); ++ pArray[0] = "com.sun.star.document.ExtendedTypeDetection"; ++ pArray[1] = "com.sun.star.comp.filters.HtmlFilterDetect"; ++ return aRet; ++} ++ ++uno::Reference HtmlFilterDetect_createInstance( ++ const uno::Reference & rCxt) ++{ ++ return (cppu::OWeakObject*) new HtmlFilterDetect(rCxt); ++} ++ ++// XServiceInfo ++OUString SAL_CALL HtmlFilterDetect::getImplementationName() ++ throw (uno::RuntimeException, std::exception) ++{ ++ return HtmlFilterDetect_getImplementationName(); ++} ++ ++sal_Bool SAL_CALL HtmlFilterDetect::supportsService(const OUString& rServiceName) ++ throw (uno::RuntimeException, std::exception) ++{ ++ return cppu::supportsService(this, rServiceName); ++} ++ ++uno::Sequence SAL_CALL HtmlFilterDetect::getSupportedServiceNames() ++ throw (uno::RuntimeException, std::exception) ++{ ++ return HtmlFilterDetect_getSupportedServiceNames(); ++} ++ ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/source/ui/unoobj/detreg.cxx b/sc/source/ui/unoobj/detreg.cxx +index 6edc743..f840ac1 100644 +--- a/sc/source/ui/unoobj/detreg.cxx ++++ b/sc/source/ui/unoobj/detreg.cxx +@@ -18,6 +18,7 @@ + */ + + ++#include "htmlfilterdetect.hxx" + #include "scdetect.hxx" + #include "exceldetect.hxx" + #include +@@ -42,6 +43,14 @@ static const cppu::ImplementationEntry spServices[] = + 0, 0 + }, + ++ { ++ sc::HtmlFilterDetect_createInstance, ++ sc::HtmlFilterDetect_getImplementationName, ++ sc::HtmlFilterDetect_getSupportedServiceNames, ++ cppu::createSingleComponentFactory, ++ 0, 0 ++ }, ++ + { 0, 0, 0, 0, 0, 0 } + }; + +diff --git a/sc/util/scd.component b/sc/util/scd.component +index 767429a..76ed959 100644 +--- a/sc/util/scd.component ++++ b/sc/util/scd.component +@@ -25,4 +25,7 @@ + + + ++ ++ ++ + +-- +1.9.3 + diff --git a/SOURCES/0001-cast-arg-to-the-right-type.patch b/SOURCES/0001-cast-arg-to-the-right-type.patch new file mode 100644 index 0000000..31f4ea1 --- /dev/null +++ b/SOURCES/0001-cast-arg-to-the-right-type.patch @@ -0,0 +1,29 @@ +From 10a269784fd425c2bef2c91f7c7a5ddd1a6d105b Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Thu, 28 Aug 2014 16:10:11 +0200 +Subject: [PATCH] cast arg to the right type + +According to desc., typelib_TypeDescription can be safely used where +typelib_TypeDescriptionReference is expected. + +Change-Id: Ibc3effd7e2894ba6ff738503e747f5157c146454 +--- + bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx +index 5836d8b..b41cee6 100644 +--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx ++++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx +@@ -233,7 +233,7 @@ static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex, + "fmr %0, 1\n\t" + : "=f" (dret), "=r" (r3), "=r" (r4) : ); + +- MapReturn(r3, r4, dret, pReturnTypeDescr, pRegisterReturn); ++ MapReturn(r3, r4, dret, reinterpret_cast(pReturnTypeDescr), pRegisterReturn); + } + + // Macros for easier insertion of values to registers or stack +-- +1.9.3 + diff --git a/SOURCES/0001-center-slide-after-changing-zoom.patch b/SOURCES/0001-center-slide-after-changing-zoom.patch new file mode 100644 index 0000000..7afaf0d --- /dev/null +++ b/SOURCES/0001-center-slide-after-changing-zoom.patch @@ -0,0 +1,77 @@ +From b179235f702e474b115ca479b603052f422346fd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Wed, 7 May 2014 16:16:17 +0100 +Subject: [PATCH] center slide after changing zoom + +Change-Id: I08698b06d0485d2cd3573af665e0621b42d37349 +--- + sd/source/ui/inc/ViewShell.hxx | 1 + + sd/source/ui/view/viewshe2.cxx | 27 +++++++++++++++++++++++++++ + sd/source/ui/view/viewshel.cxx | 1 + + 3 files changed, 29 insertions(+) + +diff --git a/sd/source/ui/inc/ViewShell.hxx b/sd/source/ui/inc/ViewShell.hxx +index ce5ea31..87edbc5 100644 +--- a/sd/source/ui/inc/ViewShell.hxx ++++ b/sd/source/ui/inc/ViewShell.hxx +@@ -206,6 +206,7 @@ public: + virtual void UpdateScrollBars (void); + void Scroll(long nX, long nY); + void ScrollLines(long nX, long nY); ++ void ScrollCenter(); + virtual void SetZoom(long nZoom); + virtual void SetZoomRect(const Rectangle& rZoomRect); + void InitWindows(const Point& rViewOrigin, const Size& rViewSize, +diff --git a/sd/source/ui/view/viewshe2.cxx b/sd/source/ui/view/viewshe2.cxx +index 5f98d68..8f91d6c 100644 +--- a/sd/source/ui/view/viewshe2.cxx ++++ b/sd/source/ui/view/viewshe2.cxx +@@ -365,6 +365,33 @@ void ViewShell::SetZoom(long nZoom) + UpdateScrollBars(); + } + ++namespace ++{ ++ void CenterScrollBar(ScrollBar *pBar) ++ { ++ long nVisSize = pBar->GetVisibleSize(); ++ long nMin = pBar->GetRangeMin(); ++ long nMax = pBar->GetRangeMax(); ++ long nLen = nMax - nMin - nVisSize; ++ long nPos = nMin + nLen/2; ++ pBar->DoScroll(nPos); ++ } ++} ++ ++void ViewShell::ScrollCenter() ++{ ++ if (mpHorizontalScrollBar.get() != NULL) ++ CenterScrollBar(mpHorizontalScrollBar.get()); ++ ++ //zoom mode with no panning of the current slide, i.e. the ++ //scrollbar is in change slide mode not pan slide mode ++ if (IsPageFlipMode()) ++ return; ++ ++ if (mpVerticalScrollBar.get() != NULL) ++ CenterScrollBar(mpVerticalScrollBar.get()); ++} ++ + /** + * Set zoom rectangle for active window. Sets all split windows to the same zoom + * factor. +diff --git a/sd/source/ui/view/viewshel.cxx b/sd/source/ui/view/viewshel.cxx +index 28e272e..17bcf5f 100644 +--- a/sd/source/ui/view/viewshel.cxx ++++ b/sd/source/ui/view/viewshel.cxx +@@ -683,6 +683,7 @@ bool ViewShell::HandleScrollCommand(const CommandEvent& rCEvt, ::sd::Window* pWi + nNewZoom = std::min( (long) pWin->GetMaxZoom(), basegfx::zoomtools::zoomIn( nOldZoom )); + + SetZoom( nNewZoom ); ++ ScrollCenter(); //center slide after changing zoom + Invalidate( SID_ATTR_ZOOM ); + Invalidate( SID_ATTR_ZOOMSLIDER ); + +-- +1.9.0 + diff --git a/SOURCES/0001-disable-firebird-unit-test.patch b/SOURCES/0001-disable-firebird-unit-test.patch new file mode 100644 index 0000000..fcea6d2 --- /dev/null +++ b/SOURCES/0001-disable-firebird-unit-test.patch @@ -0,0 +1,24 @@ +From 47c076d6bbe8b4d131351642c8ba796271be74fe Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Mon, 3 Feb 2014 21:52:11 +0100 +Subject: [PATCH] disable firebird unit test + +--- + dbaccess/Module_dbaccess.mk | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/dbaccess/Module_dbaccess.mk b/dbaccess/Module_dbaccess.mk +index b9d7d56..824f3f5 100644 +--- a/dbaccess/Module_dbaccess.mk ++++ b/dbaccess/Module_dbaccess.mk +@@ -36,7 +36,6 @@ $(eval $(call gb_Module_add_l10n_targets,dbaccess,\ + + ifeq ($(ENABLE_FIREBIRD_SDBC),TRUE) + $(eval $(call gb_Module_add_check_targets,dbaccess,\ +- CppunitTest_dbaccess_firebird_test \ + )) + endif + +-- +1.8.4.2 + diff --git a/SOURCES/0001-disable-libe-book-support.patch b/SOURCES/0001-disable-libe-book-support.patch new file mode 100644 index 0000000..32cbdab --- /dev/null +++ b/SOURCES/0001-disable-libe-book-support.patch @@ -0,0 +1,106 @@ +From 192812819ed978d98cdec944cf51b40edbff1155 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Thu, 21 Aug 2014 14:49:53 +0200 +Subject: [PATCH] disable libe-book support + +Change-Id: I7aab13e9aac90f678231c0176d0d96aa09bea813 +--- + configure.ac | 5 ----- + filter/Configuration_filter.mk | 14 -------------- + writerperfect/Library_wpftwriter.mk | 2 -- + writerperfect/source/writer/wpftwriter_genericfilter.cxx | 4 ---- + 4 files changed, 25 deletions(-) + +diff --git a/configure.ac b/configure.ac +index 2560a0d..e46f407 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -7724,11 +7724,6 @@ fi + AC_SUBST([ENABLE_EOT]) + + dnl =================================================================== +-dnl Check for system libe-book +-dnl =================================================================== +-libo_CHECK_SYSTEM_MODULE([libebook],[EBOOK],[libe-book-0.0 >= 0.0.2],["-I${WORKDIR}/UnpackedTarball/libebook/inc"],["-L${WORKDIR}/UnpackedTarball/libebook/src/lib/.libs -le-book-0.0"]) +- +-dnl =================================================================== + dnl Check for system libetonyek + dnl =================================================================== + libo_CHECK_SYSTEM_MODULE([libetonyek],[ETONYEK],[libetonyek-0.0],["-I${WORKDIR}/UnpackedTarball/libetonyek/inc"],["-L${WORKDIR}/UnpackedTarball/libetonyek/src/lib/.libs -letonyek-0.0"]) +diff --git a/filter/Configuration_filter.mk b/filter/Configuration_filter.mk +index fe84350..7c520fc 100644 +--- a/filter/Configuration_filter.mk ++++ b/filter/Configuration_filter.mk +@@ -362,13 +362,6 @@ $(call filter_Configuration_add_types,fcfg_langpack,fcfg_writer_types.xcu,filter + writer_OOXML \ + writer_OOXML_Template \ + writer_layout_dump_xml \ +- writer_BroadBand_eBook \ +- writer_eReader_eBook \ +- writer_FictionBook_2 \ +- writer_PalmDoc \ +- writer_Plucker_eBook \ +- writer_TealDoc \ +- writer_zTXT \ + ) + + $(call filter_Configuration_add_filters,fcfg_langpack,fcfg_writer_filters.xcu,filter/source/config/fragments/filters,\ +@@ -424,13 +417,6 @@ $(call filter_Configuration_add_filters,fcfg_langpack,fcfg_writer_filters.xcu,fi + OOXML_Text \ + OOXML_Text_Template \ + writer_layout_dump \ +- BroadBand_eBook \ +- eReader_eBook \ +- FictionBook_2 \ +- PalmDoc \ +- Plucker_eBook \ +- TealDoc \ +- zTXT \ + ) + + $(call filter_Configuration_add_ui_filters,fcfg_langpack,filter/source/config/fragments/filters,\ +diff --git a/writerperfect/Library_wpftwriter.mk b/writerperfect/Library_wpftwriter.mk +index cfcdf5d..67207cf 100644 +--- a/writerperfect/Library_wpftwriter.mk ++++ b/writerperfect/Library_wpftwriter.mk +@@ -50,7 +50,6 @@ $(eval $(call gb_Library_use_static_libraries,wpftwriter,\ + $(eval $(call gb_Library_use_externals,wpftwriter,\ + abw \ + boost_headers \ +- ebook \ + etonyek \ + icui18n \ + icudata \ +@@ -66,7 +65,6 @@ $(eval $(call gb_Library_use_externals,wpftwriter,\ + + $(eval $(call gb_Library_add_exception_objects,wpftwriter,\ + writerperfect/source/writer/AbiWordImportFilter \ +- writerperfect/source/writer/EBookImportFilter \ + writerperfect/source/writer/MSWorksImportFilter \ + writerperfect/source/writer/MWAWImportFilter \ + writerperfect/source/writer/WordPerfectImportFilter \ +diff --git a/writerperfect/source/writer/wpftwriter_genericfilter.cxx b/writerperfect/source/writer/wpftwriter_genericfilter.cxx +index 05f6542..831bc38 100644 +--- a/writerperfect/source/writer/wpftwriter_genericfilter.cxx ++++ b/writerperfect/source/writer/wpftwriter_genericfilter.cxx +@@ -32,7 +32,6 @@ + #include "sal/types.h" + + #include "AbiWordImportFilter.hxx" +-#include "EBookImportFilter.hxx" + #include "WordPerfectImportFilter.hxx" + #include "MSWorksImportFilter.hxx" + #include "MWAWImportFilter.hxx" +@@ -52,9 +51,6 @@ static cppu::ImplementationEntry const services[] = { + { &MWAWImportFilter_createInstance, &MWAWImportFilter_getImplementationName, + &MWAWImportFilter_getSupportedServiceNames, + &cppu::createSingleComponentFactory, 0, 0 }, +- { &EBookImportFilter_createInstance, &EBookImportFilter_getImplementationName, +- &EBookImportFilter_getSupportedServiceNames, +- &cppu::createSingleComponentFactory, 0, 0 }, + { 0, 0, 0, 0, 0, 0 } }; + + } +-- +1.9.3 + diff --git a/SOURCES/0001-do-not-build-LibreOffice_Test.patch b/SOURCES/0001-do-not-build-LibreOffice_Test.patch deleted file mode 100644 index 076fa3c..0000000 --- a/SOURCES/0001-do-not-build-LibreOffice_Test.patch +++ /dev/null @@ -1,27 +0,0 @@ -From ac58f62832260af9473eca69e764586258692bb6 Mon Sep 17 00:00:00 2001 -From: David Tardon -Date: Thu, 23 May 2013 14:21:31 +0200 -Subject: [PATCH] do not build LibreOffice_Test - -Change-Id: I74d8d5192b007432a0943d10e82d0c5dad3a605c ---- - instsetoo_native/CustomTarget_install.mk | 3 --- - 1 file changed, 3 deletions(-) - -diff --git a/instsetoo_native/CustomTarget_install.mk b/instsetoo_native/CustomTarget_install.mk -index 0962ac8..d3d922285 100644 ---- a/instsetoo_native/CustomTarget_install.mk -+++ b/instsetoo_native/CustomTarget_install.mk -@@ -118,9 +118,6 @@ else # LIBO_DEV_INSTALL - ifeq (ODK,$(filter ODK,$(BUILD_TYPE))) - $(call instsetoo_native_install_command,sdkoo,en-US,_SDK,,$(PKGFORMAT)) - endif --ifeq (,$(filter WNT MACOSX,$(OS))) -- $(call instsetoo_native_install_command,not-used,en-US,_Test,,$(PKGFORMAT)) --endif - ifeq (HELP,$(filter HELP,$(BUILD_TYPE))$(filter MACOSX,$(OS))) - $(foreach lang,$(gb_HELP_LANGS),\ - $(call instsetoo_native_install_command,ooohelppack,$(lang),,-helppack,$(PKGFORMAT))) --- -1.8.1.4 - diff --git a/SOURCES/0001-drop-OnlyShowIn-from-.desktop-files.patch b/SOURCES/0001-drop-OnlyShowIn-from-.desktop-files.patch new file mode 100644 index 0000000..77c08da --- /dev/null +++ b/SOURCES/0001-drop-OnlyShowIn-from-.desktop-files.patch @@ -0,0 +1,114 @@ +From 84770f1fbfd456f70c5c48e158b268a773ca9c45 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Fri, 4 Apr 2014 13:52:01 +0100 +Subject: [PATCH] drop OnlyShowIn from .desktop files + + I see libreoffice installs desktop actions with OnlyShowIn=Unity + I believe OnlyShowIn for actions was kicked out when they got merged in the spec + mclasen: so drop the "OnlyShowIn" lines ? + would be my recommendation + +Change-Id: I5d119d361be197bac3fc20c08b4e43f11f4b0c0c +--- + sysui/desktop/menus/base.desktop | 1 - + sysui/desktop/menus/calc.desktop | 1 - + sysui/desktop/menus/draw.desktop | 1 - + sysui/desktop/menus/impress.desktop | 1 - + sysui/desktop/menus/math.desktop | 1 - + sysui/desktop/menus/startcenter.desktop | 6 ------ + sysui/desktop/menus/writer.desktop | 1 - + 7 files changed, 12 deletions(-) + +diff --git a/sysui/desktop/menus/base.desktop b/sysui/desktop/menus/base.desktop +index 62626d4..26f1c6a 100755 +--- a/sysui/desktop/menus/base.desktop ++++ b/sysui/desktop/menus/base.desktop +@@ -37,4 +37,3 @@ Actions=NewDocument; + [Desktop Action NewDocument] + Name=New Database + Exec=${UNIXBASISROOTNAME} --base +-OnlyShowIn=Unity; +diff --git a/sysui/desktop/menus/calc.desktop b/sysui/desktop/menus/calc.desktop +index e50de65..fc5e241 100755 +--- a/sysui/desktop/menus/calc.desktop ++++ b/sysui/desktop/menus/calc.desktop +@@ -37,4 +37,3 @@ Actions=NewDocument; + [Desktop Action NewDocument] + Name=New Spreadsheet + Exec=${UNIXBASISROOTNAME} --calc +-OnlyShowIn=Unity; +diff --git a/sysui/desktop/menus/draw.desktop b/sysui/desktop/menus/draw.desktop +index a807fe0..b5d58ce 100755 +--- a/sysui/desktop/menus/draw.desktop ++++ b/sysui/desktop/menus/draw.desktop +@@ -37,4 +37,3 @@ Actions=NewDocument; + [Desktop Action NewDocument] + Name=New Drawing + Exec=${UNIXBASISROOTNAME} --draw +-OnlyShowIn=Unity; +diff --git a/sysui/desktop/menus/impress.desktop b/sysui/desktop/menus/impress.desktop +index fda44e4..c1f6231 100755 +--- a/sysui/desktop/menus/impress.desktop ++++ b/sysui/desktop/menus/impress.desktop +@@ -37,4 +37,3 @@ Actions=NewDocument; + [Desktop Action NewDocument] + Name=New Presentation + Exec=${UNIXBASISROOTNAME} --impress +-OnlyShowIn=Unity; +diff --git a/sysui/desktop/menus/math.desktop b/sysui/desktop/menus/math.desktop +index 57b1734..b6981f5 100755 +--- a/sysui/desktop/menus/math.desktop ++++ b/sysui/desktop/menus/math.desktop +@@ -38,4 +38,3 @@ Actions=NewDocument; + [Desktop Action NewDocument] + Name=New Formula + Exec=${UNIXBASISROOTNAME} --math +-OnlyShowIn=Unity; +diff --git a/sysui/desktop/menus/startcenter.desktop b/sysui/desktop/menus/startcenter.desktop +index dabe887..3858c89 100755 +--- a/sysui/desktop/menus/startcenter.desktop ++++ b/sysui/desktop/menus/startcenter.desktop +@@ -38,31 +38,25 @@ Actions=Writer;Calc;Impress;Draw;Base;Math; + [Desktop Action Writer] + Name=Text Document + Exec=${UNIXBASISROOTNAME} --writer +-OnlyShowIn=Unity; + + [Desktop Action Calc] + Name=Spreadsheet + Exec=${UNIXBASISROOTNAME} --calc +-OnlyShowIn=Unity; + + [Desktop Action Impress] + Name=Presentation + Exec=${UNIXBASISROOTNAME} --impress +-OnlyShowIn=Unity; + + [Desktop Action Draw] + Name=Drawing + Exec=${UNIXBASISROOTNAME} --draw +-OnlyShowIn=Unity; + + [Desktop Action Base] + Name=Database + Exec=${UNIXBASISROOTNAME} --base +-OnlyShowIn=Unity; + + [Desktop Action Math] + Name=Formula + Exec=${UNIXBASISROOTNAME} --math +-OnlyShowIn=Unity; + + ##End of actions menu +diff --git a/sysui/desktop/menus/writer.desktop b/sysui/desktop/menus/writer.desktop +index e59187e..c4cea12 100755 +--- a/sysui/desktop/menus/writer.desktop ++++ b/sysui/desktop/menus/writer.desktop +@@ -37,4 +37,3 @@ Actions=NewDocument; + [Desktop Action NewDocument] + Name=New Document + Exec=${UNIXBASISROOTNAME} --writer +-OnlyShowIn=Unity; +-- +1.9.0 + diff --git a/SOURCES/0001-drop-useless-test-for-ant-apache-regexp.patch b/SOURCES/0001-drop-useless-test-for-ant-apache-regexp.patch new file mode 100644 index 0000000..961915b --- /dev/null +++ b/SOURCES/0001-drop-useless-test-for-ant-apache-regexp.patch @@ -0,0 +1,71 @@ +From cb6511354b500d1b1bd8ff140fdf0ea106b174d4 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Wed, 3 Sep 2014 16:20:40 +0200 +Subject: [PATCH] drop useless test for ant-apache-regexp + +It has not been needed since commit +1de48c417404464ca1e34e5c5d1c82a9342349bb 4 years ago. + +Change-Id: I53ceb5d8d6c02c7a13c86cdd884e4fc378a2c492 +--- + configure.ac | 44 -------------------------------------------- + 1 file changed, 44 deletions(-) + +diff --git a/configure.ac b/configure.ac +index f65ab66..897cb1e 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -12311,50 +12311,6 @@ EOF + AC_MSG_ERROR([no, you need at least Ant >= $ant_minver]) + fi + +- if test "$ENABLE_MEDIAWIKI" = "TRUE"; then +- AC_MSG_CHECKING([whether Ant supports mapper type="regexp"]) +- rm -rf confdir +- mkdir confdir +- cat > conftest.java << EOF +- public class conftest { +- int testmethod(int a, int b) { +- return a + b; +- } +- } +-EOF +- +- cat > conftest.xml << EOF +- +- +- +- +- +- +- +- +- +- +- +- +- +-EOF +- +- if test "$JAVACISGCJ" = "yes"; then +- JAVA_HOME=; export JAVA_HOME +- ant_gcj="-Dbuild.compiler=gcj" +- fi +- AC_TRY_COMMAND("$ANT" $ant_gcj -buildfile conftest.xml 1>&2) +- if test $? = 0 -a -f ./conftest.class; then +- AC_MSG_RESULT([yes]) +- rm -rf confdir +- else +- echo "configure: Ant test failed" >&5 +- cat conftest.java >&5 +- cat conftest.xml >&5 +- rm -rf confdir +- AC_MSG_ERROR([no. Did you install ant-apache-regexp?]) +- fi +- fi + rm -f conftest* core core.* *.core + fi + +-- +1.9.3 + diff --git a/SOURCES/0001-fix-KDE4-detection-on-aarch64.patch b/SOURCES/0001-fix-KDE4-detection-on-aarch64.patch new file mode 100644 index 0000000..fe479ec --- /dev/null +++ b/SOURCES/0001-fix-KDE4-detection-on-aarch64.patch @@ -0,0 +1,31 @@ +From fdb81f1a2012e558eaeb7fcf762736f1afcdeee9 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Wed, 3 Sep 2014 09:36:22 +0200 +Subject: [PATCH] fix KDE4 detection on aarch64 + +Change-Id: Iafe65564e8c2534cb03497d82d7dd3498abdf7c8 +--- + configure.ac | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/configure.ac b/configure.ac +index c0b5658..f65ab66 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -11045,9 +11045,12 @@ AC_SUBST(ENABLE_SCRIPTING_JAVASCRIPT) + AC_SUBST(SYSTEM_RHINO) + AC_SUBST(RHINO_JAR) + ++# This is only used in KDE3/KDE4/TDE checks to determine if /usr/lib64 ++# paths should be added to library search path. So lets put all 64-bit ++# platforms there. + supports_multilib= + case "$host_cpu" in +-x86_64 | powerpc64 | powerpc64le | s390x) ++x86_64 | powerpc64 | powerpc64le | s390x | aarch64) + if test "$SAL_TYPES_SIZEOFLONG" = "8"; then + supports_multilib="yes" + fi +-- +1.9.3 + diff --git a/SOURCES/0001-fix-variable-name.patch b/SOURCES/0001-fix-variable-name.patch new file mode 100644 index 0000000..064d86c --- /dev/null +++ b/SOURCES/0001-fix-variable-name.patch @@ -0,0 +1,26 @@ +From b38de1f8f3712f0a632ff9b6fa10df2cf3ce268f Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Thu, 28 Aug 2014 13:44:13 +0200 +Subject: [PATCH] fix variable name + +Change-Id: I170f0390f8f510591d444f44c20434b15077e687 +--- + bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx +index cfe720d..5836d8b 100644 +--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx ++++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx +@@ -233,7 +233,7 @@ static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex, + "fmr %0, 1\n\t" + : "=f" (dret), "=r" (r3), "=r" (r4) : ); + +- MapReturn(r3, r4, dret, pReturnTypeRef, pRegisterReturn); ++ MapReturn(r3, r4, dret, pReturnTypeDescr, pRegisterReturn); + } + + // Macros for easier insertion of values to registers or stack +-- +1.9.3 + diff --git a/SOURCES/0001-if-_CALL_ELF-if-defined-_CALL_ELF-_CALL_ELF-2.patch b/SOURCES/0001-if-_CALL_ELF-if-defined-_CALL_ELF-_CALL_ELF-2.patch new file mode 100644 index 0000000..b13277c --- /dev/null +++ b/SOURCES/0001-if-_CALL_ELF-if-defined-_CALL_ELF-_CALL_ELF-2.patch @@ -0,0 +1,103 @@ +From af73a28e8538f5b2df6bbfd592d8987511520d4d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Fri, 22 Aug 2014 21:08:47 +0100 +Subject: [PATCH] if _CALL_ELF -> if defined(_CALL_ELF) && _CALL_ELF == 2 + +Change-Id: I34e9a98586b795a3fa31ae775aee7898b36e65d4 +--- + bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx | 10 +++++----- + bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx | 8 ++++---- + 2 files changed, 9 insertions(+), 9 deletions(-) + +diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx +index 35cc16f..430999f 100644 +--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx ++++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx +@@ -326,7 +326,7 @@ static typelib_TypeClass cpp2uno_call( + } + } + +-#if _CALL_ELF == 2 ++#if defined(_CALL_ELF) && _CALL_ELF == 2 + # define PARAMSAVE 32 + #else + # define PARAMSAVE 48 +@@ -545,7 +545,7 @@ extern "C" void privateSnippetExecutor( ... ) + "mr %0, 1\n\t" + : "=r" (sp) : ); + +-#if _CALL_ELF == 2 ++#if defined(_CALL_ELF) && _CALL_ELF == 2 + volatile long nRegReturn[2]; + #else + volatile long nRegReturn[1]; +@@ -592,7 +592,7 @@ extern "C" void privateSnippetExecutor( ... ) + default: + __asm__( "ld 3,%0\n\t" + : : "m" (nRegReturn[0]) ); +-#if _CALL_ELF == 2 ++#if defined(_CALL_ELF) && _CALL_ELF == 2 + __asm__( "ld 4,%0\n\t" + : : "m" (nRegReturn[1]) ); + #endif +@@ -600,7 +600,7 @@ extern "C" void privateSnippetExecutor( ... ) + } + } + +-#if _CALL_ELF == 2 ++#if defined(_CALL_ELF) && _CALL_ELF == 2 + const int codeSnippetSize = 32; + #else + const int codeSnippetSize = 24; +@@ -618,7 +618,7 @@ unsigned char * codeSnippet( unsigned char * code, sal_Int32 nFunctionIndex, sa + + if ( bHasHiddenParam ) + nOffsetAndIndex |= 0x80000000; +-#if _CALL_ELF == 2 ++#if defined(_CALL_ELF) && _CALL_ELF == 2 + unsigned int *raw = (unsigned int *)&code[0]; + + raw[0] = 0xe96c0018; /* 0: ld 11,2f-0b(12) */ +diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx +index 391ef219..cfe720d 100644 +--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx ++++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/uno2cpp.cxx +@@ -39,7 +39,7 @@ using namespace ::com::sun::star::uno; + + namespace ppc64 + { +-#if _CALL_ELF == 2 ++#if defined(_CALL_ELF) && _CALL_ELF == 2 + bool is_complex_struct(const typelib_TypeDescription * type) + { + const typelib_CompoundTypeDescription * p +@@ -70,7 +70,7 @@ namespace ppc64 + { + if (bridges::cpp_uno::shared::isSimpleType(pTypeRef)) + return false; +-#if _CALL_ELF == 2 ++#if defined(_CALL_ELF) && _CALL_ELF == 2 + else if (pTypeRef->eTypeClass == typelib_TypeClass_STRUCT || pTypeRef->eTypeClass == typelib_TypeClass_EXCEPTION) + { + typelib_TypeDescription * pTypeDescr = 0; +@@ -115,7 +115,7 @@ void MapReturn(long r3, long r4, double dret, typelib_TypeDescriptionReference* + case typelib_TypeClass_DOUBLE: + *reinterpret_cast( pRegisterReturn ) = dret; + break; +-#if _CALL_ELF == 2 ++#if defined(_CALL_ELF) && _CALL_ELF == 2 + case typelib_TypeClass_STRUCT: + case typelib_TypeClass_EXCEPTION: + if (!ppc64::return_in_hidden_param(pReturnType)) +@@ -175,7 +175,7 @@ static void callVirtualMethod(void * pThis, sal_uInt32 nVtableIndex, + pMethod += 8 * nVtableIndex; + pMethod = *((sal_uInt64 *)pMethod); + +-#if _CALL_ELF == 2 ++#if defined(_CALL_ELF) && _CALL_ELF == 2 + typedef void (* FunctionCall )(...); + #else + typedef void (* FunctionCall )( sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64, sal_uInt64 ); +-- +1.9.3 + diff --git a/SOURCES/0001-move-UOF-and-Office-2003-filters-to-xsltfilter-modul.patch b/SOURCES/0001-move-UOF-and-Office-2003-filters-to-xsltfilter-modul.patch new file mode 100644 index 0000000..da53573 --- /dev/null +++ b/SOURCES/0001-move-UOF-and-Office-2003-filters-to-xsltfilter-modul.patch @@ -0,0 +1,168 @@ +From be4b837ed225af13d6f964eca7e3f95e44c8e45a Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Mon, 9 Jun 2014 13:51:36 +0200 +Subject: [PATCH] move UOF and Office 2003 filters to xsltfilter module + +Change-Id: I6e5ac310567bb7bd12fbba444e4e1deb9fea30d5 +--- + filter/Configuration_filter.mk | 15 +++++++++------ + postprocess/CustomTarget_registry.mk | 1 + + scp2/source/ooo/file_ooo.scp | 7 ------- + scp2/source/ooo/module_hidden_ooo.scp | 1 - + scp2/source/xsltfilter/file_xsltfilter.scp | 7 +++++++ + scp2/source/xsltfilter/module_xsltfilter.scp | 1 + + 6 files changed, 18 insertions(+), 14 deletions(-) + +diff --git a/filter/Configuration_filter.mk b/filter/Configuration_filter.mk +index 9256a6c..57d6940 100644 +--- a/filter/Configuration_filter.mk ++++ b/filter/Configuration_filter.mk +@@ -357,7 +357,6 @@ $(call filter_Configuration_add_types,fcfg_langpack,fcfg_writer_types.xcu,filter + pdf_Portable_Document_Format \ + writer8_template \ + writer8 \ +- writer_MS_Word_2003_XML \ + writer_MS_Word_2007_XML \ + writer_MS_Word_2007_XML_Template \ + writer_OOXML \ +@@ -419,7 +418,6 @@ $(call filter_Configuration_add_filters,fcfg_langpack,fcfg_writer_filters.xcu,fi + writer_pdf_Export\ + writer8\ + writer8_template \ +- MS_Word_2003_XML \ + MS_Word_2007_XML \ + MS_Word_2007_XML_Template \ + OOXML_Text \ +@@ -444,7 +442,6 @@ $(call filter_Configuration_add_ui_filters,fcfg_langpack,filter/source/config/fr + writer_StarOffice_XML_Writer_Template_ui \ + writer8_ui \ + writer8_template_ui \ +- MS_Word_2003_XML_ui \ + MS_Word_2007_XML_ui \ + MS_Word_2007_XML_Template_ui \ + OOXML_Text_ui \ +@@ -535,7 +532,6 @@ $(call filter_Configuration_add_types,fcfg_langpack,fcfg_calc_types.xcu,filter/s + calc_dBase\ + calc8 \ + calc8_template \ +- calc_MS_Excel_2003_XML \ + MS_Excel_2007_XML \ + MS_Excel_2007_XML_Template \ + MS_Excel_2007_Binary \ +@@ -574,7 +570,6 @@ $(call filter_Configuration_add_filters,fcfg_langpack,fcfg_calc_filters.xcu,filt + dBase \ + calc8 \ + calc8_template \ +- MS_Excel_2003_XML \ + calc_MS_Excel_2007_XML \ + calc_MS_Excel_2007_XML_Template \ + calc_MS_Excel_2007_Binary \ +@@ -601,7 +596,6 @@ $(call filter_Configuration_add_ui_filters,fcfg_langpack,filter/source/config/fr + calc_StarOffice_XML_Calc_Template_ui \ + calc8_ui \ + calc8_template_ui \ +- MS_Excel_2003_XML_ui \ + calc_MS_Excel_2007_XML_ui \ + calc_MS_Excel_2007_XML_Template_ui \ + calc_MS_Excel_2007_Binary_ui \ +@@ -993,7 +987,9 @@ $(call filter_Configuration_add_internal_filters,fcfg_langpack,fcfg_internalgrap + + # fcfg_xslt + $(call filter_Configuration_add_types,fcfg_langpack,fcfg_xslt_types.xcu,filter/source/config/fragments/types,\ ++ calc_MS_Excel_2003_XML \ + writer_DocBook_File \ ++ writer_MS_Word_2003_XML \ + XHTML_File \ + Unified_Office_Format_text \ + Unified_Office_Format_spreadsheet \ +@@ -1002,6 +998,8 @@ $(call filter_Configuration_add_types,fcfg_langpack,fcfg_xslt_types.xcu,filter/s + + $(call filter_Configuration_add_filters,fcfg_langpack,fcfg_xslt_filters.xcu,filter/source/config/fragments/filters,\ + DocBook_File \ ++ MS_Excel_2003_XML \ ++ MS_Word_2003_XML \ + XHTML_Calc_File \ + XHTML_Draw_File \ + XHTML_Impress_File \ +@@ -1011,4 +1009,9 @@ $(call filter_Configuration_add_filters,fcfg_langpack,fcfg_xslt_filters.xcu,filt + UOF_presentation \ + ) + ++$(call filter_Configuration_add_ui_filters,fcfg_langpack,filter/source/config/fragments/filters,\ ++ MS_Excel_2003_XML_ui \ ++ MS_Word_2003_XML_ui \ ++) ++ + # vim: set noet sw=4 ts=4: +diff --git a/postprocess/CustomTarget_registry.mk b/postprocess/CustomTarget_registry.mk +index 2ae4ab6..b147251 100644 +--- a/postprocess/CustomTarget_registry.mk ++++ b/postprocess/CustomTarget_registry.mk +@@ -427,6 +427,7 @@ postprocess_FILES_writer := \ + $(postprocess_MOD)/org/openoffice/Setup-writer.xcu + + postprocess_DEPS_xsltfilter := main ++postprocess_OPTDEPS_xsltfilter := calc writer + postprocess_FILES_xsltfilter := \ + $(call gb_XcuFilterFiltersTarget_get_target,fcfg_xslt_filters.xcu) \ + $(call gb_XcuFilterTypesTarget_get_target,fcfg_xslt_types.xcu) +diff --git a/scp2/source/ooo/file_ooo.scp b/scp2/source/ooo/file_ooo.scp +index f643a52..5875930 100644 +--- a/scp2/source/ooo/file_ooo.scp ++++ b/scp2/source/ooo/file_ooo.scp +@@ -598,13 +598,6 @@ End + + #endif + +-File gid_File_filter_xslt +- TXT_FILE_BODY; +- Styles = (FILELIST, PACKED); +- Dir = FILELIST_DIR; +- Name = "filter_xslt.filelist"; +-End +- + File gid_Starregistry_Services_Rdb + TXT_FILE_BODY; + Name = "services.rdb"; +diff --git a/scp2/source/ooo/module_hidden_ooo.scp b/scp2/source/ooo/module_hidden_ooo.scp +index 7b3c2ca..6b36645 100644 +--- a/scp2/source/ooo/module_hidden_ooo.scp ++++ b/scp2/source/ooo/module_hidden_ooo.scp +@@ -274,7 +274,6 @@ Module gid_Module_Root_Files_6 + gid_File_Share_Registry_Main_Xcd, + gid_File_Share_Registry_Forcedefault_Xcd, + gid_File_Pymailmerge, +- gid_File_filter_xslt, + gid_File_Extra_Fontunxpsprint, + gid_File_Extra_Fontunxppds, + gid_File_Extra_Fontunxafm); +diff --git a/scp2/source/xsltfilter/file_xsltfilter.scp b/scp2/source/xsltfilter/file_xsltfilter.scp +index 9cc699b..36ba626 100644 +--- a/scp2/source/xsltfilter/file_xsltfilter.scp ++++ b/scp2/source/xsltfilter/file_xsltfilter.scp +@@ -38,3 +38,10 @@ File gid_File_filter_xhtml + Dir = FILELIST_DIR; + Name = "filter_xhtml.filelist"; + End ++ ++File gid_File_filter_xslt ++ TXT_FILE_BODY; ++ Styles = (FILELIST, PACKED); ++ Dir = FILELIST_DIR; ++ Name = "filter_xslt.filelist"; ++End +diff --git a/scp2/source/xsltfilter/module_xsltfilter.scp b/scp2/source/xsltfilter/module_xsltfilter.scp +index ad3af2b..8ae95ba 100644 +--- a/scp2/source/xsltfilter/module_xsltfilter.scp ++++ b/scp2/source/xsltfilter/module_xsltfilter.scp +@@ -26,6 +26,7 @@ Module gid_Module_Optional_Xsltfiltersamples + ParentID = gid_Module_Optional; + Files = ( gid_File_filter_docbook, + gid_File_filter_xhtml, ++ gid_File_filter_xslt, + gid_File_Share_Registry_Xsltfilter_Xcd ); + Minimal = NO; + Default = YES; +-- +1.9.3 + diff --git a/SOURCES/0001-n-839727-rhbz-1038176-Crash-fix.patch b/SOURCES/0001-n-839727-rhbz-1038176-Crash-fix.patch deleted file mode 100644 index d6745df..0000000 --- a/SOURCES/0001-n-839727-rhbz-1038176-Crash-fix.patch +++ /dev/null @@ -1,32 +0,0 @@ -From e8ac85752a2e07ceacb3b2f3e4eab3bc35a45c3d Mon Sep 17 00:00:00 2001 -From: Muthu Subramanian -Date: Tue, 22 Oct 2013 15:13:41 +0530 -Subject: [PATCH 1/9] n#839727 / rhbz#1038176 Crash fix - -(cherry picked from commit e5f24e0c7c8f4799223c19359f4228f0b1a71461) - -Change-Id: I8d733afbbc05900c68217ead44de798c1263ca84 -Reviewed-on: https://gerrit.libreoffice.org/7309 -Reviewed-by: Andras Timar -Tested-by: Andras Timar ---- - oox/source/drawingml/chart/seriesconverter.cxx | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/oox/source/drawingml/chart/seriesconverter.cxx b/oox/source/drawingml/chart/seriesconverter.cxx -index 9ef1f3f..020b141 100644 ---- a/oox/source/drawingml/chart/seriesconverter.cxx -+++ b/oox/source/drawingml/chart/seriesconverter.cxx -@@ -632,7 +632,8 @@ Reference< XDataSeries > SeriesConverter::createDataSeries( const TypeGroupConve - { - // Use number format code from Value series - DataSourceModel* pValues = mrModel.maSources.get( SeriesModel::VALUES ).get(); -- xLabels->maNumberFormat.maFormatCode = pValues->mxDataSeq->maFormatCode; -+ if( pValues ) -+ xLabels->maNumberFormat.maFormatCode = pValues->mxDataSeq->maFormatCode; - } - DataLabelsConverter aLabelsConv( *this, *xLabels ); - aLabelsConv.convertFromModel( xDataSeries, rTypeGroup ); --- -1.8.4.2 - diff --git a/SOURCES/0001-never-run-autogen.sh.patch b/SOURCES/0001-never-run-autogen.sh.patch new file mode 100644 index 0000000..3adc728 --- /dev/null +++ b/SOURCES/0001-never-run-autogen.sh.patch @@ -0,0 +1,25 @@ +From 820efe20886e41fdea8353f54e8a54bba7fccd84 Mon Sep 17 00:00:00 2001 +From: rpmbuild +Date: Thu, 20 Feb 2014 19:44:49 +0100 +Subject: [PATCH] never run autogen.sh + +--- + Makefile.in | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile.in b/Makefile.in +index 206f5ed..14620da 100644 +--- a/Makefile.in ++++ b/Makefile.in +@@ -14,7 +14,7 @@ MAKECMDGOALS?=all + SHELL=/usr/bin/env bash + SRCDIR := @SRC_ROOT@ + BUILDDIR := @BUILDDIR@ +-GIT_BUILD := $(if $(wildcard $(SRCDIR)/.git),T) ++GIT_BUILD := + + # Run autogen.sh if needed and force make to restart itself. + # ... but there are several cases where we do not want to run +-- +1.8.5.3 + diff --git a/SOURCES/0001-refine-current-date-time-hotkey-handling.patch b/SOURCES/0001-refine-current-date-time-hotkey-handling.patch new file mode 100644 index 0000000..14eb1ce --- /dev/null +++ b/SOURCES/0001-refine-current-date-time-hotkey-handling.patch @@ -0,0 +1,316 @@ +From 351235d046c48cf2d9ccbca4175c5b70bdbae847 Mon Sep 17 00:00:00 2001 +Message-Id: <351235d046c48cf2d9ccbca4175c5b70bdbae847.1409054200.git.erack@redhat.com> +From: Eike Rathke +Date: Mon, 25 Aug 2014 16:34:20 +0200 +Subject: [PATCH] refine current date/time hotkey handling +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="------------erAck-patch-parts" + +This is a multi-part message in MIME format. +--------------erAck-patch-parts +Content-Type: text/plain; charset=UTF-8; format=fixed +Content-Transfer-Encoding: 8bit + + +Previously, a date or time hotkey lead to always the current date+time +value being set at the current cell, just formatted differently to +either date or time. This not only looked strange in the input line that +still displayed the full date+time value, but also affected day and time +calculations involving these values. + +With this change the result depends on the previous value and formatting +of the cell. Furthermore, inserting a current date or time value at the +cursor position while editing a cell is now possible. + +If cell is in input or edit mode, insert date/time at cursor position, +else create a date or time or date+time cell as follows: + +* key date on time cell => current date + time of cell => date+time formatted cell + * unless time cell was empty or 00:00 time => current date => date formatted cell +* key date on date+time cell => current date + 00:00 time => date+time formatted cell + * unless date was current date => current date => date formatted cell +* key date on other cell => current date => date formatted cell +* key time on date cell => date of cell + current time => date+time formatted cell + * unless date cell was empty => current time => time formatted cell +* key time on date+time cell => current time => time formatted cell + * unless cell was empty => current date+time => date+time formatted cell +* key time on other cell => current time => time formatted cell + +This is a backport of a series of commits on master, i.e. mainly +32e8c47df81292c71ce1d885762358f18559bdb7 +0f4a999e02aff56043506e38dfa53ea3b349ce25 +and others. + +Conflicts: + sc/source/ui/view/viewfun6.cxx + +Change-Id: Ief48b3e312345ad5e289921ff5120dd074661882 +--- + sc/source/ui/view/viewfun6.cxx | 229 ++++++++++++++++++++++++++++++++++++----- + 1 file changed, 205 insertions(+), 24 deletions(-) + + +--------------erAck-patch-parts +Content-Type: text/x-patch; name="0001-refine-current-date-time-hotkey-handling.patch" +Content-Transfer-Encoding: 8bit +Content-Disposition: attachment; filename="0001-refine-current-date-time-hotkey-handling.patch" + +diff --git a/sc/source/ui/view/viewfun6.cxx b/sc/source/ui/view/viewfun6.cxx +index 8ec8bf1..a55dec3 100644 +--- a/sc/source/ui/view/viewfun6.cxx ++++ b/sc/source/ui/view/viewfun6.cxx +@@ -25,6 +25,7 @@ + #include + #include "svl/zforlist.hxx" + #include "svl/zformat.hxx" ++#include + + #include "viewfunc.hxx" + #include "detfunc.hxx" +@@ -44,6 +45,7 @@ + #include "markdata.hxx" + #include "drawview.hxx" + #include "globalnames.hxx" ++#include "inputhdl.hxx" + + #include + +@@ -237,31 +239,210 @@ void ScViewFunc::DetectiveMarkSucc() + MarkAndJumpToRanges(aDestRanges); + } + +-void ScViewFunc::InsertCurrentTime(short nCellFmt, const OUString& rUndoStr) ++/** Insert date or time into current cell. ++ ++ If cell is in input or edit mode, insert date/time at cursor position, else ++ create a date or time or date+time cell as follows: ++ ++ - key date on time cell => current date + time of cell => date+time formatted cell ++ - unless time cell was empty or 00:00 time => current date => date formatted cell ++ - key date on date+time cell => current date + 00:00 time => date+time formatted cell ++ - unless date was current date => current date => date formatted cell ++ - key date on other cell => current date => date formatted cell ++ - key time on date cell => date of cell + current time => date+time formatted cell ++ - unless date cell was empty => current time => time formatted cell ++ - key time on date+time cell => current time => time formatted cell ++ - unless cell was empty => current date+time => date+time formatted cell ++ - key time on other cell => current time => time formatted cell ++ */ ++void ScViewFunc::InsertCurrentTime(short nReqFmt, const OUString& rUndoStr) + { +- ScViewData* pViewData = GetViewData(); +- ScAddress aCurPos = pViewData->GetCurPos(); +- ScDocShell* pDocSh = pViewData->GetDocShell(); +- ScDocument* pDoc = pDocSh->GetDocument(); +- ::svl::IUndoManager* pUndoMgr = pDocSh->GetUndoManager(); +- SvNumberFormatter* pFormatter = pDoc->GetFormatTable(); +- Date aActDate( Date::SYSTEM ); +- double fDate = aActDate - *pFormatter->GetNullDate(); +- Time aActTime( Time::SYSTEM ); +- double fTime = aActTime.GetHour() / static_cast(::Time::hourPerDay) + +- aActTime.GetMin() / static_cast(::Time::minutePerDay) + +- aActTime.GetSec() / static_cast(::Time::secondPerDay) + +- aActTime.GetNanoSec() / static_cast(::Time::nanoSecPerDay); +- pUndoMgr->EnterListAction(rUndoStr, rUndoStr); +- pDocSh->GetDocFunc().SetValueCell(aCurPos, fDate+fTime, true); +- +- // Set the new cell format only when it differs from the current cell +- // format type. +- sal_uInt32 nCurNumFormat = pDoc->GetNumberFormat(aCurPos); +- const SvNumberformat* pEntry = pFormatter->GetEntry(nCurNumFormat); +- if (!pEntry || !(pEntry->GetType() & nCellFmt)) +- SetNumberFormat(nCellFmt); +- pUndoMgr->LeaveListAction(); ++ ScViewData& rViewData = *GetViewData(); ++ ++ ScInputHandler* pInputHdl = SC_MOD()->GetInputHdl( rViewData.GetViewShell()); ++ bool bInputMode = (pInputHdl && pInputHdl->IsInputMode()); ++ ++ ScDocShell* pDocSh = rViewData.GetDocShell(); ++ ScDocument& rDoc = *pDocSh->GetDocument(); ++ ScAddress aCurPos = rViewData.GetCurPos(); ++ const sal_uInt32 nCurNumFormat = rDoc.GetNumberFormat(aCurPos); ++ SvNumberFormatter* pFormatter = rDoc.GetFormatTable(); ++ const SvNumberformat* pCurNumFormatEntry = pFormatter->GetEntry(nCurNumFormat); ++ ++ if (bInputMode) ++ { ++ double fVal = 0.0; ++ switch (nReqFmt) ++ { ++ case NUMBERFORMAT_DATE: ++ { ++ Date aActDate( Date::SYSTEM ); ++ fVal = aActDate - *pFormatter->GetNullDate(); ++ } ++ break; ++ case NUMBERFORMAT_TIME: ++ { ++ Time aActTime( Time::SYSTEM ); ++ fVal = aActTime.GetTimeInDays(); ++ } ++ break; ++ default: ++ assert(!"unhandled current date/time request"); ++ nReqFmt = NUMBERFORMAT_DATETIME; ++ // fallthru ++ case NUMBERFORMAT_DATETIME: ++ { ++ DateTime aActDateTime( DateTime::SYSTEM ); ++ fVal = aActDateTime - DateTime( *pFormatter->GetNullDate()); ++ } ++ break; ++ } ++ ++ LanguageType nLang = (pCurNumFormatEntry ? pCurNumFormatEntry->GetLanguage() : ScGlobal::eLnge); ++ sal_uInt32 nFormat = pFormatter->GetStandardFormat( nReqFmt, nLang); ++ // This would return a more precise format with seconds and 100th ++ // seconds for a time request. ++ //nFormat = pFormatter->GetStandardFormat( fVal, nFormat, nReqFmt, nLang); ++ OUString aString; ++ Color* pColor; ++ pFormatter->GetOutputString( fVal, nFormat, aString, &pColor); ++ ++ pInputHdl->DataChanging(); ++ EditView* pTopView = pInputHdl->GetTopView(); ++ if (pTopView) ++ pTopView->InsertText( aString); ++ EditView* pTableView = pInputHdl->GetTableView(); ++ if (pTableView) ++ pTableView->InsertText( aString); ++ pInputHdl->DataChanged( false, true); ++ } ++ else ++ { ++ const short nCurNumFormatType = (pCurNumFormatEntry ? ++ (pCurNumFormatEntry->GetType() & ~NUMBERFORMAT_DEFINED) : NUMBERFORMAT_UNDEFINED); ++ bool bForceReqFmt = false; ++ const double fCell = rDoc.GetValue( aCurPos); ++ // Combine requested date/time stamp with existing cell time/date, if any. ++ switch (nReqFmt) ++ { ++ case NUMBERFORMAT_DATE: ++ switch (nCurNumFormatType) ++ { ++ case NUMBERFORMAT_TIME: ++ // An empty cell formatted as time (or 00:00 time) shall ++ // not result in the current date with 00:00 time, but only ++ // in current date. ++ if (fCell != 0.0) ++ nReqFmt = NUMBERFORMAT_DATETIME; ++ break; ++ case NUMBERFORMAT_DATETIME: ++ { ++ // Force to only date if the existing date+time is the ++ // current date. This way inserting current date twice ++ // on an existing date+time cell can be used to force ++ // date, which otherwise would only be possible by ++ // applying a date format. ++ double fDate = rtl::math::approxFloor( fCell); ++ if (fDate == (Date( Date::SYSTEM) - *pFormatter->GetNullDate())) ++ bForceReqFmt = true; ++ } ++ break; ++ } ++ break; ++ case NUMBERFORMAT_TIME: ++ switch (nCurNumFormatType) ++ { ++ case NUMBERFORMAT_DATE: ++ // An empty cell formatted as date shall not result in the ++ // null date and current time, but only in current time. ++ if (fCell != 0.0) ++ nReqFmt = NUMBERFORMAT_DATETIME; ++ break; ++ case NUMBERFORMAT_DATETIME: ++ // Requesting current time on an empty date+time cell ++ // inserts both current date+time. ++ if (fCell == 0.0) ++ nReqFmt = NUMBERFORMAT_DATETIME; ++ else ++ { ++ // Add current time to an existing date+time where time is ++ // zero and date is current date, else force time only. ++ double fDate = rtl::math::approxFloor( fCell); ++ double fTime = fCell - fDate; ++ if (fTime == 0.0 && fDate == (Date( Date::SYSTEM) - *pFormatter->GetNullDate())) ++ nReqFmt = NUMBERFORMAT_DATETIME; ++ else ++ bForceReqFmt = true; ++ } ++ break; ++ } ++ break; ++ default: ++ assert(!"unhandled current date/time request"); ++ nReqFmt = NUMBERFORMAT_DATETIME; ++ // fallthru ++ case NUMBERFORMAT_DATETIME: ++ break; ++ } ++ double fVal = 0.0; ++ switch (nReqFmt) ++ { ++ case NUMBERFORMAT_DATE: ++ { ++ Date aActDate( Date::SYSTEM ); ++ fVal = aActDate - *pFormatter->GetNullDate(); ++ } ++ break; ++ case NUMBERFORMAT_TIME: ++ { ++ Time aActTime( Time::SYSTEM ); ++ fVal = aActTime.GetTimeInDays(); ++ } ++ break; ++ case NUMBERFORMAT_DATETIME: ++ switch (nCurNumFormatType) ++ { ++ case NUMBERFORMAT_DATE: ++ { ++ double fDate = rtl::math::approxFloor( fCell); ++ Time aActTime( Time::SYSTEM ); ++ fVal = fDate + aActTime.GetTimeInDays(); ++ } ++ break; ++ case NUMBERFORMAT_TIME: ++ { ++ double fTime = fCell - rtl::math::approxFloor( fCell); ++ Date aActDate( Date::SYSTEM ); ++ fVal = (aActDate - *pFormatter->GetNullDate()) + fTime; ++ } ++ break; ++ default: ++ { ++ DateTime aActDateTime( DateTime::SYSTEM ); ++ // Converting the null date to DateTime forces the ++ // correct operator-() to be used, resulting in a ++ // fractional date+time instead of only date value. ++ fVal = aActDateTime - DateTime( *pFormatter->GetNullDate()); ++ } ++ } ++ break; ++ } ++ ++ ::svl::IUndoManager* pUndoMgr = pDocSh->GetUndoManager(); ++ pUndoMgr->EnterListAction(rUndoStr, rUndoStr); ++ ++ pDocSh->GetDocFunc().SetValueCell(aCurPos, fVal, true); ++ ++ // Set the new cell format only when it differs from the current cell ++ // format type. Preserve a date+time format unless we force a format ++ // through. ++ if (bForceReqFmt || (nReqFmt != nCurNumFormatType && nCurNumFormatType != NUMBERFORMAT_DATETIME)) ++ SetNumberFormat(nReqFmt); ++ else ++ rViewData.UpdateInputHandler(); // update input bar with new value ++ ++ pUndoMgr->LeaveListAction(); ++ } + } + + void ScViewFunc::ShowNote( bool bShow ) + +--------------erAck-patch-parts-- + + diff --git a/SOURCES/0001-resolved-fdo-62250-absent-value-cell-values-are-not-.patch b/SOURCES/0001-resolved-fdo-62250-absent-value-cell-values-are-not-.patch new file mode 100644 index 0000000..c45e9f0 --- /dev/null +++ b/SOURCES/0001-resolved-fdo-62250-absent-value-cell-values-are-not-.patch @@ -0,0 +1,35 @@ +From 4e69127246028f72eee6279e9a810bb865ce654c Mon Sep 17 00:00:00 2001 +From: Eike Rathke +Date: Wed, 9 Jul 2014 19:16:19 +0200 +Subject: [PATCH 001/137] resolved fdo#62250 absent value cell values are not + NaN, set to 0.0 + +Change-Id: I41459d72adbaa8f6c0c7c22447f6eba5eb8be3e1 +(cherry picked from commit fea6f83df8d2183b108695217bc4ff7a93e942c9) +Reviewed-on: https://gerrit.libreoffice.org/10176 +Reviewed-by: Kohei Yoshida +Tested-by: Kohei Yoshida +--- + sc/source/filter/xml/xmlcelli.cxx | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx +index 41e6111..a3321c2 100644 +--- a/sc/source/filter/xml/xmlcelli.cxx ++++ b/sc/source/filter/xml/xmlcelli.cxx +@@ -1151,6 +1151,12 @@ void ScXMLTableRowCellContext::PutValueCell( const ScAddress& rCurrentPos ) + } + else //regular value cell + { ++ // fdo#62250 absent values are not NaN, set to 0.0 ++ // PutValueCell() is called only for a known cell value type, ++ // bIsEmpty==false in all these cases, no sense to check it here. ++ if (::rtl::math::isNan( fValue)) ++ fValue = 0.0; ++ + // #i62435# Initialize the value cell's script type if the default + // style's number format is latin-only. If the cell uses a different + // format, the script type will be reset when the style is applied. +-- +1.9.3 + diff --git a/SOURCES/0001-rhbz-1016758-Dispose-bridges-when-disposing-bridge-f.patch b/SOURCES/0001-rhbz-1016758-Dispose-bridges-when-disposing-bridge-f.patch new file mode 100644 index 0000000..a7ffc2c --- /dev/null +++ b/SOURCES/0001-rhbz-1016758-Dispose-bridges-when-disposing-bridge-f.patch @@ -0,0 +1,86 @@ +From bf3ebcc6aae09d233df6632e72cf06b1d9256692 Mon Sep 17 00:00:00 2001 +From: Stephan Bergmann +Date: Mon, 19 May 2014 18:06:16 +0200 +Subject: [PATCH] rhbz#1016758: Dispose bridges when disposing bridge factory + +... (which happens when the service manager is disposed), so that no bridges can +still run during exit. But this is so glaring that I wonder whether I missed +the obvious when I originally wrote that code, or whether I rather miss the +obvious now. So better let this rest for a while on master before deciding +about any backports. + +(cherry picked from commit 184e4ef35641403fd293262ee413ceee37b3761a) +Conflicts: + binaryurp/source/bridgefactory.cxx + +Change-Id: I7c9ad6c8a53dfd1a7b702640920dcb0a9a2c3007 +--- + binaryurp/source/bridgefactory.cxx | 31 +++++++++++++++++++++++++++++++ + binaryurp/source/bridgefactory.hxx | 2 ++ + 2 files changed, 33 insertions(+) + +diff --git a/binaryurp/source/bridgefactory.cxx b/binaryurp/source/bridgefactory.cxx +index 34182b3..6f13614 100644 +--- a/binaryurp/source/bridgefactory.cxx ++++ b/binaryurp/source/bridgefactory.cxx +@@ -115,6 +115,11 @@ css::uno::Reference< css::bridge::XBridge > BridgeFactory::createBridge( + rtl::Reference< Bridge > b; + { + osl::MutexGuard g(*this); ++ if (rBHelper.bDisposed) { ++ throw css::lang::DisposedException( ++ "BridgeFactory disposed", ++ static_cast< cppu::OWeakObject * >(this)); ++ } + if (named_.find(sName) != named_.end()) { + throw css::bridge::BridgeExistsException( + sName, static_cast< cppu::OWeakObject * >(this)); +@@ -172,6 +177,32 @@ BridgeFactory::getExistingBridges() throw (css::uno::RuntimeException) { + return s; + } + ++void BridgeFactory::disposing() { ++ BridgeList l1; ++ BridgeMap l2; ++ { ++ osl::MutexGuard g(*this); ++ l1.swap(unnamed_); ++ l2.swap(named_); ++ } ++ for (BridgeList::iterator i(l1.begin()); i != l1.end(); ++i) { ++ try { ++ css::uno::Reference( ++ *i, css::uno::UNO_QUERY_THROW)->dispose(); ++ } catch (css::uno::Exception & e) { ++ SAL_WARN("binaryurp", "ignoring Exception " << e.Message); ++ } ++ } ++ for (BridgeMap::iterator i(l2.begin()); i != l2.end(); ++i) { ++ try { ++ css::uno::Reference( ++ i->second, css::uno::UNO_QUERY_THROW)->dispose(); ++ } catch (css::uno::Exception & e) { ++ SAL_WARN("binaryurp", "ignoring Exception " << e.Message); ++ } ++ } ++} ++ + } + + namespace { +diff --git a/binaryurp/source/bridgefactory.hxx b/binaryurp/source/bridgefactory.hxx +index a949e63..98f1ab2 100644 +--- a/binaryurp/source/bridgefactory.hxx ++++ b/binaryurp/source/bridgefactory.hxx +@@ -114,6 +114,8 @@ private: + com::sun::star::uno::Reference< com::sun::star::bridge::XBridge > > + SAL_CALL getExistingBridges() throw (com::sun::star::uno::RuntimeException); + ++ void SAL_CALL disposing() SAL_OVERRIDE; ++ + typedef + std::list< + com::sun::star::uno::Reference< com::sun::star::bridge::XBridge > > +-- +1.9.3 + diff --git a/SOURCES/0001-rhbz-1057977-avoid-use-of-invalidated-pointers.patch b/SOURCES/0001-rhbz-1057977-avoid-use-of-invalidated-pointers.patch new file mode 100644 index 0000000..ec33607 --- /dev/null +++ b/SOURCES/0001-rhbz-1057977-avoid-use-of-invalidated-pointers.patch @@ -0,0 +1,156 @@ +From 35f78e48582caa691a855101a0d661985ba067bb Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Wed, 5 Feb 2014 10:55:25 +0100 +Subject: [PATCH] rhbz#1057977 avoid use of invalidated pointers + +Change-Id: Ib81f79da696b5e8002f5a2ddcf160903231dc3f1 +--- + include/vcl/outdev.hxx | 6 +++++ + vcl/source/gdi/outdev3.cxx | 59 +++++++++++++++++++++++++++++++++++++++++----- + 2 files changed, 59 insertions(+), 6 deletions(-) + +diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx +index 047a79d..4f157b7 100644 +--- a/include/vcl/outdev.hxx ++++ b/include/vcl/outdev.hxx +@@ -547,9 +547,15 @@ protected: + OutputDevice(); + + private: ++ typedef void ( OutputDevice::* FontUpdateHandler_t )( bool ); ++ + SAL_DLLPRIVATE OutputDevice( const OutputDevice& rOutDev ); + SAL_DLLPRIVATE OutputDevice& operator =( const OutputDevice& rOutDev ); + ++ SAL_DLLPRIVATE void ImplClearFontData( bool bNewFontLists ); ++ SAL_DLLPRIVATE void ImplRefreshFontData( bool bNewFontLists ); ++ SAL_DLLPRIVATE static void ImplUpdateFontDataForAllFrames( FontUpdateHandler_t pHdl, bool bNewFontLists ); ++ + public: + virtual ~OutputDevice(); + +diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx +index afe06f7..d789eb9 100644 +--- a/vcl/source/gdi/outdev3.cxx ++++ b/vcl/source/gdi/outdev3.cxx +@@ -156,7 +156,7 @@ static void ImplRotatePos( long nOriginX, long nOriginY, long& rX, long& rY, + } + } + +-void OutputDevice::ImplUpdateFontData( bool bNewFontLists ) ++void OutputDevice::ImplClearFontData( const bool bNewFontLists ) + { + // the currently selected logical font is no longer needed + if ( mpFontEntry ) +@@ -207,6 +207,38 @@ void OutputDevice::ImplUpdateFontData( bool bNewFontLists ) + delete mpFontList; + if( mpFontCache && mpFontCache != pSVData->maGDIData.mpScreenFontCache ) + delete mpFontCache; ++ mpFontList = 0; ++ mpFontCache = 0; ++ } ++ } ++ } ++ } ++ ++ // also update child windows if needed ++ if ( GetOutDevType() == OUTDEV_WINDOW ) ++ { ++ Window* pChild = ((Window*)this)->mpWindowImpl->mpFirstChild; ++ while ( pChild ) ++ { ++ pChild->ImplClearFontData( true ); ++ pChild = pChild->mpWindowImpl->mpNext; ++ } ++ } ++} ++ ++void OutputDevice::ImplRefreshFontData( const bool bNewFontLists ) ++{ ++// if ( GetOutDevType() == OUTDEV_PRINTER || mpPDFWriter ) ++ { ++ ImplSVData* pSVData = ImplGetSVData(); ++ ++ if ( bNewFontLists ) ++ { ++ // we need a graphics ++ if ( ImplGetGraphics() ) ++ { ++ if( mpPDFWriter ) ++ { + mpFontList = pSVData->maGDIData.mpScreenFontList->Clone( true, true ); + mpFontCache = new ImplFontCache( sal_False ); + } +@@ -227,16 +259,24 @@ void OutputDevice::ImplUpdateFontData( bool bNewFontLists ) + Window* pChild = ((Window*)this)->mpWindowImpl->mpFirstChild; + while ( pChild ) + { +- pChild->ImplUpdateFontData( true ); ++ pChild->ImplRefreshFontData( true ); + pChild = pChild->mpWindowImpl->mpNext; + } + } + } + ++void OutputDevice::ImplUpdateFontData( bool bNewFontLists ) ++{ ++ ImplClearFontData( bNewFontLists ); ++ ImplRefreshFontData( bNewFontLists ); ++} ++ + void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists ) + { + ImplSVData* pSVData = ImplGetSVData(); + ++ ImplUpdateFontDataForAllFrames( &OutputDevice::ImplClearFontData, bNewFontLists ); ++ + // clear global font lists to have them updated + pSVData->maGDIData.mpScreenFontCache->Invalidate(); + if ( bNewFontLists ) +@@ -255,16 +295,23 @@ void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists ) + } + } + ++ ImplUpdateFontDataForAllFrames( &OutputDevice::ImplRefreshFontData, bNewFontLists ); ++} ++ ++void OutputDevice::ImplUpdateFontDataForAllFrames( const FontUpdateHandler_t pHdl, const bool bNewFontLists ) ++{ ++ ImplSVData* const pSVData = ImplGetSVData(); ++ + // update all windows + Window* pFrame = pSVData->maWinData.mpFirstFrame; + while ( pFrame ) + { +- pFrame->ImplUpdateFontData( bNewFontLists ); ++ ( pFrame->*pHdl )( bNewFontLists ); + + Window* pSysWin = pFrame->mpWindowImpl->mpFrameData->mpFirstOverlap; + while ( pSysWin ) + { +- pSysWin->ImplUpdateFontData( bNewFontLists ); ++ ( pSysWin->*pHdl )( bNewFontLists ); + pSysWin = pSysWin->mpWindowImpl->mpNextOverlap; + } + +@@ -275,7 +322,7 @@ void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists ) + VirtualDevice* pVirDev = pSVData->maGDIData.mpFirstVirDev; + while ( pVirDev ) + { +- pVirDev->ImplUpdateFontData( bNewFontLists ); ++ ( pVirDev->*pHdl )( bNewFontLists ); + pVirDev = pVirDev->mpNext; + } + +@@ -283,7 +330,7 @@ void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists ) + Printer* pPrinter = pSVData->maGDIData.mpFirstPrinter; + while ( pPrinter ) + { +- pPrinter->ImplUpdateFontData( bNewFontLists ); ++ ( pPrinter->*pHdl )( bNewFontLists ); + pPrinter = pPrinter->mpNext; + } + } +-- +1.8.5.3 + diff --git a/SOURCES/0001-rhbz-1079672-FileDialogHelper-don-t-hand-out-stale-p.patch b/SOURCES/0001-rhbz-1079672-FileDialogHelper-don-t-hand-out-stale-p.patch new file mode 100644 index 0000000..0cc64d8 --- /dev/null +++ b/SOURCES/0001-rhbz-1079672-FileDialogHelper-don-t-hand-out-stale-p.patch @@ -0,0 +1,60 @@ +From e1b57d025b0523479fe906f050c5639ad280b481 Mon Sep 17 00:00:00 2001 +From: Michael Stahl +Date: Thu, 7 Aug 2014 11:24:18 +0200 +Subject: [PATCH] rhbz#1079672: FileDialogHelper: don't hand out stale preview + Graphic + +The maGraphic is updated from a timer, and if you double-click on a file +then the dialog may exit with the previous file still previewed in +maGraphic, so the wrong image is returned by the dialog. + +Change-Id: I99094d85d8d68d5c8a842f52e7039dbbbf095995 +(cherry picked from commit f1589f768bbd1d8baea6e442f392831851bdbb3b) +Reviewed-on: https://gerrit.libreoffice.org/10804 +Reviewed-by: David Tardon +Tested-by: David Tardon +--- + sfx2/source/dialog/filedlghelper.cxx | 23 ++++++++++------------- + 1 file changed, 10 insertions(+), 13 deletions(-) + +diff --git a/sfx2/source/dialog/filedlghelper.cxx b/sfx2/source/dialog/filedlghelper.cxx +index c8178a4..28a8060 100644 +--- a/sfx2/source/dialog/filedlghelper.cxx ++++ b/sfx2/source/dialog/filedlghelper.cxx +@@ -789,23 +789,20 @@ ErrCode FileDialogHelper_Impl::getGraphic( Graphic& rGraphic ) const + { + ErrCode nRet = ERRCODE_NONE; + +- if ( ! maGraphic ) +- { +- OUString aPath;; +- Sequence < OUString > aPathSeq = mxFileDlg->getFiles(); ++ // rhbz#1079672 do not return maGraphic, it need not be the selected file + +- if ( aPathSeq.getLength() == 1 ) +- { +- aPath = aPathSeq[0]; +- } ++ OUString aPath;; ++ Sequence aPathSeq = mxFileDlg->getFiles(); + +- if ( !aPath.isEmpty() ) +- nRet = getGraphic( aPath, rGraphic ); +- else +- nRet = ERRCODE_IO_GENERAL; ++ if (aPathSeq.getLength() == 1) ++ { ++ aPath = aPathSeq[0]; + } ++ ++ if (!aPath.isEmpty()) ++ nRet = getGraphic(aPath, rGraphic); + else +- rGraphic = maGraphic; ++ nRet = ERRCODE_IO_GENERAL; + + return nRet; + } +-- +1.9.3 + diff --git a/SOURCES/0001-rhbz-1111216-allow-to-export-an-empty-sheet-to-PDF.patch b/SOURCES/0001-rhbz-1111216-allow-to-export-an-empty-sheet-to-PDF.patch new file mode 100644 index 0000000..a5d7264 --- /dev/null +++ b/SOURCES/0001-rhbz-1111216-allow-to-export-an-empty-sheet-to-PDF.patch @@ -0,0 +1,29 @@ +From 0b793116deaf35ce67245c1106e5ed5a722c7560 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Thu, 19 Jun 2014 16:57:03 +0200 +Subject: [PATCH] rhbz#1111216 allow to export an empty sheet to PDF + +This is to consolidate Calc's behaviour with the other applications, +which always present at least one page for printing / PDF export. + +Change-Id: Iedf438618020c1e6d8ded5ac950c8ca2b12ad439 +--- + sc/source/ui/unoobj/docuno.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx +index 9aeceb7..75cabca 100644 +--- a/sc/source/ui/unoobj/docuno.cxx ++++ b/sc/source/ui/unoobj/docuno.cxx +@@ -958,7 +958,7 @@ sal_Int32 SAL_CALL ScModelObj::getRendererCount(const uno::Any& aSelection, + StringRangeEnumerator aRangeEnum( aPagesStr, 0, nPages-1 ); + nSelectCount = aRangeEnum.size(); + } +- return nSelectCount; ++ return (nSelectCount > 0) ? nSelectCount : 1; + } + + static sal_Int32 lcl_GetRendererNum( sal_Int32 nSelRenderer, const OUString& rPagesStr, sal_Int32 nTotalPages ) +-- +2.1.0 + diff --git a/SOURCES/0001-rhbz-1121254-reload-font-list-from-shell-on-change.patch b/SOURCES/0001-rhbz-1121254-reload-font-list-from-shell-on-change.patch new file mode 100644 index 0000000..5c56321 --- /dev/null +++ b/SOURCES/0001-rhbz-1121254-reload-font-list-from-shell-on-change.patch @@ -0,0 +1,30 @@ +From 0497864bd4f603605997938d504ef9598623e713 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Fri, 25 Jul 2014 15:40:27 +0200 +Subject: [PATCH] rhbz#1121254 reload font list from shell on change + +Change-Id: Ief88373c210b3b6f65c1df5b31870aca561095bb +--- + svx/source/tbxctrls/tbcontrl.cxx | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx +index 816afbe..5728791 100644 +--- a/svx/source/tbxctrls/tbcontrl.cxx ++++ b/svx/source/tbxctrls/tbcontrl.cxx +@@ -891,6 +891,12 @@ void SvxFontNameBox_Impl::DataChanged( const DataChangedEvent& rDCEvt ) + Size aDropSize( aLogicalSize.Width(), LOGICAL_EDIT_HEIGHT); + SetDropDownSizePixel(LogicToPixel(aDropSize, MAP_APPFONT)); + } ++ else if ( rDCEvt.GetType() == DATACHANGED_FONTS ) ++ { ++ // The old font list in shell has likely been destroyed at this point, so we need to get ++ // the new one before doing anything further. ++ lcl_GetDocFontList( &pFontList, this ); ++ } + + FontNameBox::DataChanged( rDCEvt ); + } +-- +1.9.3 + diff --git a/SOURCES/0001-scrolling-very-slow-in-calc.patch b/SOURCES/0001-scrolling-very-slow-in-calc.patch new file mode 100644 index 0000000..30143c3 --- /dev/null +++ b/SOURCES/0001-scrolling-very-slow-in-calc.patch @@ -0,0 +1,139 @@ +From 52ac64848e41c6c3bba86c98361757aaf89ef3c6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Tue, 15 Jul 2014 16:42:42 +0100 +Subject: [PATCH] scrolling very slow in calc + +even on a short spreadsheet scrolling up and down leaves +the first/last row (depending on the direction of scroll) +unchanged until the scrolling stops. + +http://people.freedesktop.org/~mst/calc_4.2_scrolling.webm + +On larger document there are rendering artifacts during scrolling which go away +after scrolling for me and mstahl, but a bunch of people can show us piles of +horribly broken spreadsheets after scrolling, esp wheel scrolling + +Revert "fdo#75026: Sometimes we need to update grid view... + +while not being active." + +This reverts commit 52cc88d6191ba0c4b6477e5c4b9c5d0f0228030d. + +Revert "fdo#68961: Check visible range during scrolling, and re-paint if necessary." + +This reverts commit e36c8a674845ab19577fc06d44b780549757e1e7. + +Revert "Repaint grid view when the visible area changes." + +This reverts commit b54c1a53b4d400b1c2d282c186af1fa8f151894e. + +Conflicts: + sc/source/ui/app/scmod.cxx + +Revert "Update visible ranges when updating the scroll bars." + +This reverts commit 391a57ef65687f2e373bac8d410e551aafa780ec. + +Change-Id: Ie170308cba18a9a74c7c72daf07dfa0a4ef7bd13 +--- + sc/source/ui/inc/tabview.hxx | 6 ------ + sc/source/ui/view/gridwin4.cxx | 2 ++ + sc/source/ui/view/tabview.cxx | 4 ---- + sc/source/ui/view/tabview3.cxx | 10 ---------- + sc/source/ui/view/tabview4.cxx | 7 ++++++- + 5 files changed, 8 insertions(+), 21 deletions(-) + +diff --git a/sc/source/ui/inc/tabview.hxx b/sc/source/ui/inc/tabview.hxx +index a5d7392..891af9e 100644 +--- a/sc/source/ui/inc/tabview.hxx ++++ b/sc/source/ui/inc/tabview.hxx +@@ -204,12 +204,6 @@ private: + + void PaintRangeFinderEntry (ScRangeFindData* pData, SCTAB nTab); + +- /** +- * Check the visible grid area to see if the visible range has changed. If +- * so, update the stored visible range, and re-paint the grid area. +- */ +- void UpdateGrid(); +- + protected: + void UpdateHeaderWidth( const ScVSplitPos* pWhich = NULL, + const SCROW* pPosY = NULL ); +diff --git a/sc/source/ui/view/gridwin4.cxx b/sc/source/ui/view/gridwin4.cxx +index fa697ee5..a60fb82 100644 +--- a/sc/source/ui/view/gridwin4.cxx ++++ b/sc/source/ui/view/gridwin4.cxx +@@ -390,6 +390,8 @@ void ScGridWindow::Draw( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2, ScUpdateMod + + OSL_ENSURE( ValidCol(nX2) && ValidRow(nY2), "GridWin Draw Bereich zu gross" ); + ++ UpdateVisibleRange(); ++ + if (nX2 < maVisibleRange.mnCol1 || nY2 < maVisibleRange.mnRow1) + return; + // unsichtbar +diff --git a/sc/source/ui/view/tabview.cxx b/sc/source/ui/view/tabview.cxx +index aafd114..02b99b9 100644 +--- a/sc/source/ui/view/tabview.cxx ++++ b/sc/source/ui/view/tabview.cxx +@@ -1198,8 +1198,6 @@ void ScTabView::ScrollX( long nDeltaX, ScHSplitPos eWhich, bool bUpdBars ) + if (pColOutline[eWhich]) pColOutline[eWhich]->ScrollPixel( nDiff ); + if (bUpdBars) + UpdateScrollBars(); +- else +- UpdateGrid(); + } + + if (nDeltaX==1 || nDeltaX==-1) +@@ -1285,8 +1283,6 @@ void ScTabView::ScrollY( long nDeltaY, ScVSplitPos eWhich, bool bUpdBars ) + if (pRowOutline[eWhich]) pRowOutline[eWhich]->ScrollPixel( nDiff ); + if (bUpdBars) + UpdateScrollBars(); +- else +- UpdateGrid(); + } + + if (nDeltaY==1 || nDeltaY==-1) +diff --git a/sc/source/ui/view/tabview3.cxx b/sc/source/ui/view/tabview3.cxx +index 7053037..50066ba 100644 +--- a/sc/source/ui/view/tabview3.cxx ++++ b/sc/source/ui/view/tabview3.cxx +@@ -2089,16 +2089,6 @@ void ScTabView::PaintRangeFinderEntry (ScRangeFindData* pData, const SCTAB nTab) + } + } + +-void ScTabView::UpdateGrid() +-{ +- if (!UpdateVisibleRange()) +- // Visible range hasn't changed. No need to re-paint. +- return; +- +- SC_MOD()->AnythingChanged(); // if visible area has changed +- PaintGrid(); +-} +- + void ScTabView::PaintRangeFinder( long nNumber ) + { + ScInputHandler* pHdl = SC_MOD()->GetInputHdl( aViewData.GetViewShell() ); +diff --git a/sc/source/ui/view/tabview4.cxx b/sc/source/ui/view/tabview4.cxx +index 2f72a20..8528431 100644 +--- a/sc/source/ui/view/tabview4.cxx ++++ b/sc/source/ui/view/tabview4.cxx +@@ -421,7 +421,12 @@ void ScTabView::UpdateScrollBars() + } + + // set visible area for online spelling +- UpdateGrid(); ++ ++ if ( aViewData.IsActive() ) ++ { ++ if (UpdateVisibleRange()) ++ SC_MOD()->AnythingChanged(); // if visible area has changed ++ } + } + + #ifndef HDR_SLIDERSIZE +-- +1.9.3 + diff --git a/SOURCES/0001-select-sheet-menu-as-a-right-click-popup-to-the-prev.patch b/SOURCES/0001-select-sheet-menu-as-a-right-click-popup-to-the-prev.patch deleted file mode 100644 index fe5b49d..0000000 --- a/SOURCES/0001-select-sheet-menu-as-a-right-click-popup-to-the-prev.patch +++ /dev/null @@ -1,239 +0,0 @@ -From f4bfce94abc10fbd2d8b37113e27b36c1e79fc61 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= -Date: Fri, 13 Sep 2013 20:13:25 +0100 -Subject: [PATCH] select sheet menu as a right-click popup to the prev/next - sheet dingus - -Change-Id: Ifc9baeabedeab526d040220e9e45f171b5353bcf ---- - include/svtools/tabbar.hxx | 6 ++++ - sc/source/ui/inc/tabcont.hxx | 3 ++ - sc/source/ui/view/tabcont.cxx | 69 ++++++++++++++++++++++++++++++--------- - svtools/source/control/tabbar.cxx | 34 +++++++++++++++++-- - 4 files changed, 93 insertions(+), 19 deletions(-) - -diff --git a/include/svtools/tabbar.hxx b/include/svtools/tabbar.hxx -index 0bf3be6..44bcc48 100644 ---- a/include/svtools/tabbar.hxx -+++ b/include/svtools/tabbar.hxx -@@ -369,6 +369,7 @@ private: - sal_Bool mbSelTextColor; - bool mbMirrored; - bool mbHasInsertTab; // if true, the tab bar has an extra tab at the end. -+ bool mbScrollAlwaysEnabled; - Link maSelectHdl; - Link maDoubleClickHdl; - Link maSplitHdl; -@@ -377,6 +378,7 @@ private: - Link maStartRenamingHdl; - Link maAllowRenamingHdl; - Link maEndRenamingHdl; -+ Link maScrollAreaContextHdl; - size_t maCurrentItemList; - - using Window::ImplInit; -@@ -529,6 +531,8 @@ public: - void SetStyle( WinBits nStyle ); - WinBits GetStyle() const { return mnWinStyle; } - -+ void SetScrollAlwaysEnabled(bool bScrollAlwaysEnabled); -+ - Size CalcWindowSizePixel() const; - - void SetSelectHdl( const Link& rLink ) { maSelectHdl = rLink; } -@@ -547,6 +551,8 @@ public: - const Link& GetAllowRenamingHdl() const { return maAllowRenamingHdl; } - void SetEndRenamingHdl( const Link& rLink ) { maEndRenamingHdl = rLink; } - const Link& GetEndRenamingHdl() const { return maEndRenamingHdl; } -+ void SetScrollAreaContextHdl( const Link& rLink ) { maScrollAreaContextHdl = rLink; } -+ const Link& GetScrollAreaContextHdl() const { return maScrollAreaContextHdl; } - - // accessibility - virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible(); -diff --git a/sc/source/ui/inc/tabcont.hxx b/sc/source/ui/inc/tabcont.hxx -index c0bde9e..2c87f89 100644 ---- a/sc/source/ui/inc/tabcont.hxx -+++ b/sc/source/ui/inc/tabcont.hxx -@@ -46,6 +46,9 @@ private: - sal_uInt16 GetMaxId() const; - SCTAB GetPrivatDropPos(const Point& rPos ); - -+ DECL_LINK(ShowPageList, const CommandEvent*); -+ -+ void SwitchToPageId(sal_uInt16 nId); - protected: - virtual void Select(); - virtual void Command( const CommandEvent& rCEvt ); -diff --git a/sc/source/ui/view/tabcont.cxx b/sc/source/ui/view/tabcont.cxx -index 4fce113..4056748 100644 ---- a/sc/source/ui/view/tabcont.cxx -+++ b/sc/source/ui/view/tabcont.cxx -@@ -81,6 +81,39 @@ ScTabControl::ScTabControl( Window* pParent, ScViewData* pData ) : - - EnableEditMode(); - UpdateInputContext(); -+ -+ SetScrollAlwaysEnabled(true); -+ -+ SetScrollAreaContextHdl( LINK( this, ScTabControl, ShowPageList ) ); -+} -+ -+IMPL_LINK(ScTabControl, ShowPageList, const CommandEvent *, pEvent) -+{ -+ PopupMenu aPopup; -+ -+ sal_uInt16 nCurPageId = GetCurPageId(); -+ -+ ScDocument* pDoc = pViewData->GetDocument(); -+ SCTAB nCount = pDoc->GetTableCount(); -+ for (SCTAB i=0; iIsVisible(i)) -+ { -+ OUString aString; -+ if (pDoc->GetName(i, aString)) -+ { -+ sal_uInt16 nId = static_cast(i)+1; -+ aPopup.InsertItem(nId, aString, MIB_CHECKABLE); -+ if (nId == nCurPageId) -+ aPopup.CheckItem(nId); -+ } -+ } -+ } -+ -+ sal_uInt16 nItemId = aPopup.Execute( this, pEvent->GetMousePosPixel() ); -+ SwitchToPageId(nItemId); -+ -+ return 0; - } - - ScTabControl::~ScTabControl() -@@ -368,6 +401,25 @@ void ScTabControl::SetSheetLayoutRTL( sal_Bool bSheetRTL ) - nSelPageIdByMouse = TabBar::PAGE_NOT_FOUND; - } - -+void ScTabControl::SwitchToPageId(sal_uInt16 nId) -+{ -+ if (nId) -+ { -+ sal_Bool bAlreadySelected = IsPageSelected( nId ); -+ //make the clicked page the current one -+ SetCurPageId( nId ); -+ //change the selection when the current one is not already -+ //selected or part of a multi selection -+ if(!bAlreadySelected) -+ { -+ sal_uInt16 nCount = GetMaxId(); -+ -+ for (sal_uInt16 i=1; i<=nCount; i++) -+ SelectPage( i, i==nId ); -+ Select(); -+ } -+ } -+} - - void ScTabControl::Command( const CommandEvent& rCEvt ) - { -@@ -387,22 +439,7 @@ void ScTabControl::Command( const CommandEvent& rCEvt ) - // if multiple tables are selected and the one under the cursor - // is not part of them then unselect them - sal_uInt16 nId = GetPageId( rCEvt.GetMousePosPixel() ); -- if (nId) -- { -- sal_Bool bAlreadySelected = IsPageSelected( nId ); -- //make the clicked page the current one -- SetCurPageId( nId ); -- //change the selection when the current one is not already -- //selected or part of a multi selection -- if(!bAlreadySelected) -- { -- sal_uInt16 nCount = GetMaxId(); -- -- for (sal_uInt16 i=1; i<=nCount; i++) -- SelectPage( i, i==nId ); -- Select(); -- } -- } -+ SwitchToPageId(nId); - - // #i52073# OLE inplace editing has to be stopped before showing the sheet tab context menu - pViewSh->DeactivateOle(); -diff --git a/svtools/source/control/tabbar.cxx b/svtools/source/control/tabbar.cxx -index 4152f9d..c0b8059 100644 ---- a/svtools/source/control/tabbar.cxx -+++ b/svtools/source/control/tabbar.cxx -@@ -100,13 +100,33 @@ class ImplTabButton : public PushButton - { - public: - ImplTabButton( TabBar* pParent, WinBits nWinStyle = 0 ) : -- PushButton( pParent, nWinStyle | WB_RECTSTYLE | WB_SMALLSTYLE | WB_NOLIGHTBORDER | WB_NOPOINTERFOCUS ) {} -+ PushButton( pParent, nWinStyle | WB_RECTSTYLE | WB_SMALLSTYLE | WB_NOLIGHTBORDER | WB_NOPOINTERFOCUS ) {} - - TabBar* GetParent() const { return (TabBar*)Window::GetParent(); } - - virtual long PreNotify( NotifyEvent& rNEvt ); -+ -+ virtual void MouseButtonDown( const MouseEvent& rMEvt ); -+ -+ virtual void Command( const CommandEvent& rCEvt ); - }; - -+void ImplTabButton::MouseButtonDown( const MouseEvent& rMEvt ) -+{ -+ PushButton::MouseButtonDown(rMEvt); -+} -+ -+void ImplTabButton::Command( const CommandEvent& rCEvt ) -+{ -+ sal_uInt16 nCmd = rCEvt.GetCommand(); -+ if ( nCmd == COMMAND_CONTEXTMENU ) -+ { -+ TabBar *pParent = GetParent(); -+ pParent->maScrollAreaContextHdl.Call((void*)&rCEvt); -+ } -+ PushButton::Command(rCEvt); -+} -+ - // ======================================================================= - - long ImplTabButton::PreNotify( NotifyEvent& rNEvt ) -@@ -398,6 +418,8 @@ void TabBar::ImplInit( WinBits nWinStyle ) - mbSelColor = sal_False; - mbSelTextColor = sal_False; - mbMirrored = sal_False; -+ mbMirrored = sal_False; -+ mbScrollAlwaysEnabled = false; - - if ( nWinStyle & WB_3DTAB ) - mnOffY++; -@@ -752,19 +774,25 @@ void TabBar::ImplEnableControls() - return; - - // Buttons enablen/disblen -- sal_Bool bEnableBtn = mnFirstPos > 0; -+ sal_Bool bEnableBtn = mbScrollAlwaysEnabled || mnFirstPos > 0; - if ( mpFirstBtn ) - mpFirstBtn->Enable( bEnableBtn ); - if ( mpPrevBtn ) - mpPrevBtn->Enable( bEnableBtn ); - -- bEnableBtn = mnFirstPos < ImplGetLastFirstPos(); -+ bEnableBtn = mbScrollAlwaysEnabled || mnFirstPos < ImplGetLastFirstPos(); - if ( mpNextBtn ) - mpNextBtn->Enable( bEnableBtn ); - if ( mpLastBtn ) - mpLastBtn->Enable( bEnableBtn ); - } - -+void TabBar::SetScrollAlwaysEnabled(bool bScrollAlwaysEnabled) -+{ -+ mbScrollAlwaysEnabled = bScrollAlwaysEnabled; -+ ImplEnableControls(); -+} -+ - // ----------------------------------------------------------------------- - - void TabBar::ImplShowPage( sal_uInt16 nPos ) --- -1.8.3.1 - diff --git a/SOURCES/0001-set-up-java-on-aarch64.patch b/SOURCES/0001-set-up-java-on-aarch64.patch new file mode 100644 index 0000000..88fdc7e --- /dev/null +++ b/SOURCES/0001-set-up-java-on-aarch64.patch @@ -0,0 +1,28 @@ +From 6910ddd32da7f65ac38627aa5e5d2b0524cb4ef1 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Fri, 5 Sep 2014 08:23:50 +0200 +Subject: [PATCH] set up java on aarch64 + +Change-Id: I76c9c79e5d21a99fa2578a4d98a7a7d41d32edb5 +--- + configure.ac | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/configure.ac b/configure.ac +index 2560a0d..873bcaa 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -7097,6 +7097,10 @@ if test -n "$ENABLE_JAVA" -a \( -z "$JAVALIB" -o -z "$JAVAINC" \); then + + case "$host_cpu" in + ++ aarch64) ++ JAVA_ARCH="aarch64" ++ JAVA_TOOLKIT="server" ++ ;; + alpha) + JAVA_ARCH="alpha" + JAVA_TOOLKIT="server" +-- +1.9.3 + diff --git a/SOURCES/0001-sigh-simply-forgot-to-include-the-endian-header.patch b/SOURCES/0001-sigh-simply-forgot-to-include-the-endian-header.patch new file mode 100644 index 0000000..91f165e --- /dev/null +++ b/SOURCES/0001-sigh-simply-forgot-to-include-the-endian-header.patch @@ -0,0 +1,29 @@ +From 8b865a1f2f35f591e8004a75765bd9b3133229a5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Fri, 29 Aug 2014 11:29:36 +0100 +Subject: [PATCH] sigh, simply forgot to include the endian header + +so the ppc64 bridge was broken + +Change-Id: Ib60274ed25531f500bcd97f5ea9b04091ce01825 +(cherry picked from commit 7da6716e98f22d6cb968c3218b5f4936f868a977) +--- + bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx +index eaee739..acee17d 100644 +--- a/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx ++++ b/bridges/source/cpp_uno/gcc3_linux_powerpc64/cpp2uno.cxx +@@ -21,7 +21,7 @@ + #include + #include + #include +- ++#include + #include "bridges/cpp_uno/shared/bridge.hxx" + #include "bridges/cpp_uno/shared/cppinterfaceproxy.hxx" + #include "bridges/cpp_uno/shared/types.hxx" +-- +1.9.3 + diff --git a/SOURCES/0001-update-libxmlsec-config.-to-support-ppc64le.patch b/SOURCES/0001-update-libxmlsec-config.-to-support-ppc64le.patch new file mode 100644 index 0000000..6966a08 --- /dev/null +++ b/SOURCES/0001-update-libxmlsec-config.-to-support-ppc64le.patch @@ -0,0 +1,1663 @@ +From 106d9b392bd59f52775eeb09e2a4e8b20828894b Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Tue, 13 May 2014 16:48:40 +0200 +Subject: [PATCH] update libxmlsec config.* to support ppc64le + +Change-Id: I4b31729481b7fd538483db5b6e39e1d80e03b3b6 +--- + external/libxmlsec/UnpackedTarball_xmlsec.mk | 1 + + .../libxmlsec/xmlsec1-update-config.guess.patch.1 | 1630 ++++++++++++++++++++ + 2 files changed, 1631 insertions(+) + create mode 100644 external/libxmlsec/xmlsec1-update-config.guess.patch.1 + +diff --git a/external/libxmlsec/UnpackedTarball_xmlsec.mk b/external/libxmlsec/UnpackedTarball_xmlsec.mk +index 6d1cb43..a72deed 100644 +--- a/external/libxmlsec/UnpackedTarball_xmlsec.mk ++++ b/external/libxmlsec/UnpackedTarball_xmlsec.mk +@@ -25,6 +25,7 @@ $(eval $(call gb_UnpackedTarball_add_patches,xmlsec,\ + external/libxmlsec/xmlsec1-android.patch \ + external/libxmlsec/xmlsec1-1.2.14-ansi.patch \ + external/libxmlsec/xmlsec1-customkeymanage.patch \ ++ external/libxmlsec/xmlsec1-update-config.guess.patch.1 \ + )) + + $(eval $(call gb_UnpackedTarball_add_file,xmlsec,include/xmlsec/mscrypto/akmngr.h,external/libxmlsec/include/akmngr_mscrypto.h)) +diff --git a/external/libxmlsec/xmlsec1-update-config.guess.patch.1 b/external/libxmlsec/xmlsec1-update-config.guess.patch.1 +new file mode 100644 +index 0000000..1b8ea40 +--- /dev/null ++++ b/external/libxmlsec/xmlsec1-update-config.guess.patch.1 +@@ -0,0 +1,1630 @@ ++From dd15aae9ce221198be486a6e75d5a42f75ff9de6 Mon Sep 17 00:00:00 2001 ++From: David Tardon ++Date: Tue, 13 May 2014 16:35:04 +0200 ++Subject: [PATCH] update config.* to support ppc64le ++ ++--- ++ config.guess | 541 +++++++++++++++++++++++++++++------------------------------ ++ config.sub | 301 ++++++++++++++++++++++----------- ++ 2 files changed, 472 insertions(+), 370 deletions(-) ++ ++diff --git a/config.guess b/config.guess ++index da83314..b79252d 100755 ++--- a/config.guess +++++ b/config.guess ++@@ -1,14 +1,12 @@ ++ #! /bin/sh ++ # Attempt to guess a canonical system name. ++-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, ++-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 ++-# Free Software Foundation, Inc. +++# Copyright 1992-2013 Free Software Foundation, Inc. ++ ++-timestamp='2009-04-27' +++timestamp='2013-06-10' ++ ++ # This file is free software; you can redistribute it and/or modify it ++ # under the terms of the GNU General Public License as published by ++-# the Free Software Foundation; either version 2 of the License, or +++# the Free Software Foundation; either version 3 of the License, or ++ # (at your option) any later version. ++ # ++ # This program is distributed in the hope that it will be useful, but ++@@ -17,26 +15,22 @@ timestamp='2009-04-27' ++ # General Public License for more details. ++ # ++ # You should have received a copy of the GNU General Public License ++-# along with this program; if not, write to the Free Software ++-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA ++-# 02110-1301, USA. +++# along with this program; if not, see . ++ # ++ # As a special exception to the GNU General Public License, if you ++ # distribute this file as part of a program that contains a ++ # configuration script generated by Autoconf, you may include it under ++-# the same distribution terms that you use for the rest of that program. ++- ++- ++-# Originally written by Per Bothner . ++-# Please send patches to . Submit a context ++-# diff and a properly formatted ChangeLog entry. +++# the same distribution terms that you use for the rest of that +++# program. This Exception is an additional permission under section 7 +++# of the GNU General Public License, version 3 ("GPLv3"). +++# +++# Originally written by Per Bothner. ++ # ++-# This script attempts to guess a canonical system name similar to ++-# config.sub. If it succeeds, it prints the system name on stdout, and ++-# exits with 0. Otherwise, it exits with 1. +++# You can get the latest version of this script from: +++# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD ++ # ++-# The plan is that this can be called by configure scripts if you ++-# don't specify an explicit build system type. +++# Please send patches with a ChangeLog entry to config-patches@gnu.org. +++ ++ ++ me=`echo "$0" | sed -e 's,.*/,,'` ++ ++@@ -56,8 +50,7 @@ version="\ ++ GNU config.guess ($timestamp) ++ ++ Originally written by Per Bothner. ++-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, ++-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +++Copyright 1992-2013 Free Software Foundation, Inc. ++ ++ This is free software; see the source for copying conditions. There is NO ++ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." ++@@ -139,12 +132,33 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown ++ UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown ++ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown ++ +++case "${UNAME_SYSTEM}" in +++Linux|GNU|GNU/*) +++ # If the system lacks a compiler, then just pick glibc. +++ # We could probably try harder. +++ LIBC=gnu +++ +++ eval $set_cc_for_build +++ cat <<-EOF > $dummy.c +++ #include +++ #if defined(__UCLIBC__) +++ LIBC=uclibc +++ #elif defined(__dietlibc__) +++ LIBC=dietlibc +++ #else +++ LIBC=gnu +++ #endif +++ EOF +++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` +++ ;; +++esac +++ ++ # Note: order is significant - the case branches are not exclusive. ++ ++ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ++ *:NetBSD:*:*) ++ # NetBSD (nbsd) targets should (where applicable) match one or ++- # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, +++ # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, ++ # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently ++ # switched to ELF, *-*-netbsd* would select the old ++ # object file format. This provides both forward ++@@ -170,7 +184,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ++ arm*|i386|m68k|ns32k|sh3*|sparc|vax) ++ eval $set_cc_for_build ++ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ ++- | grep __ELF__ >/dev/null +++ | grep -q __ELF__ ++ then ++ # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). ++ # Return netbsd for either. FIX? ++@@ -180,7 +194,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ++ fi ++ ;; ++ *) ++- os=netbsd +++ os=netbsd ++ ;; ++ esac ++ # The OS release ++@@ -201,6 +215,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ++ # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. ++ echo "${machine}-${os}${release}" ++ exit ;; +++ *:Bitrig:*:*) +++ UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` +++ echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} +++ exit ;; ++ *:OpenBSD:*:*) ++ UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` ++ echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} ++@@ -223,7 +241,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ++ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ++ ;; ++ *5.*) ++- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` +++ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ++ ;; ++ esac ++ # According to Compaq, /usr/sbin/psrinfo has been available on ++@@ -269,7 +287,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ++ # A Xn.n version is an unreleased experimental baselevel. ++ # 1.2 uses "1.2" for uname -r. ++ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` ++- exit ;; +++ # Reset EXIT trap before exiting to avoid spurious non-zero exit code. +++ exitcode=$? +++ trap '' 0 +++ exit $exitcode ;; ++ Alpha\ *:Windows_NT*:*) ++ # How do we know it's Interix rather than the generic POSIX subsystem? ++ # Should we change UNAME_MACHINE based on the output of uname instead ++@@ -295,12 +316,12 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ++ echo s390-ibm-zvmoe ++ exit ;; ++ *:OS400:*:*) ++- echo powerpc-ibm-os400 +++ echo powerpc-ibm-os400 ++ exit ;; ++ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) ++ echo arm-acorn-riscix${UNAME_RELEASE} ++ exit ;; ++- arm:riscos:*:*|arm:RISCOS:*:*) +++ arm*:riscos:*:*|arm*:RISCOS:*:*) ++ echo arm-unknown-riscos ++ exit ;; ++ SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) ++@@ -333,6 +354,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ++ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) ++ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` ++ exit ;; +++ i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) +++ echo i386-pc-auroraux${UNAME_RELEASE} +++ exit ;; ++ i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) ++ eval $set_cc_for_build ++ SUN_ARCH="i386" ++@@ -391,23 +415,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ++ # MiNT. But MiNT is downward compatible to TOS, so this should ++ # be no problem. ++ atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) ++- echo m68k-atari-mint${UNAME_RELEASE} +++ echo m68k-atari-mint${UNAME_RELEASE} ++ exit ;; ++ atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) ++ echo m68k-atari-mint${UNAME_RELEASE} ++- exit ;; +++ exit ;; ++ *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) ++- echo m68k-atari-mint${UNAME_RELEASE} +++ echo m68k-atari-mint${UNAME_RELEASE} ++ exit ;; ++ milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) ++- echo m68k-milan-mint${UNAME_RELEASE} ++- exit ;; +++ echo m68k-milan-mint${UNAME_RELEASE} +++ exit ;; ++ hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) ++- echo m68k-hades-mint${UNAME_RELEASE} ++- exit ;; +++ echo m68k-hades-mint${UNAME_RELEASE} +++ exit ;; ++ *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) ++- echo m68k-unknown-mint${UNAME_RELEASE} ++- exit ;; +++ echo m68k-unknown-mint${UNAME_RELEASE} +++ exit ;; ++ m68k:machten:*:*) ++ echo m68k-apple-machten${UNAME_RELEASE} ++ exit ;; ++@@ -477,8 +501,8 @@ EOF ++ echo m88k-motorola-sysv3 ++ exit ;; ++ AViiON:dgux:*:*) ++- # DG/UX returns AViiON for all architectures ++- UNAME_PROCESSOR=`/usr/bin/uname -p` +++ # DG/UX returns AViiON for all architectures +++ UNAME_PROCESSOR=`/usr/bin/uname -p` ++ if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] ++ then ++ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ ++@@ -491,7 +515,7 @@ EOF ++ else ++ echo i586-dg-dgux${UNAME_RELEASE} ++ fi ++- exit ;; +++ exit ;; ++ M88*:DolphinOS:*:*) # DolphinOS (SVR3) ++ echo m88k-dolphin-sysv3 ++ exit ;; ++@@ -548,7 +572,7 @@ EOF ++ echo rs6000-ibm-aix3.2 ++ fi ++ exit ;; ++- *:AIX:*:[456]) +++ *:AIX:*:[4567]) ++ IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` ++ if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then ++ IBM_ARCH=rs6000 ++@@ -591,52 +615,52 @@ EOF ++ 9000/[678][0-9][0-9]) ++ if [ -x /usr/bin/getconf ]; then ++ sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` ++- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` ++- case "${sc_cpu_version}" in ++- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 ++- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 ++- 532) # CPU_PA_RISC2_0 ++- case "${sc_kernel_bits}" in ++- 32) HP_ARCH="hppa2.0n" ;; ++- 64) HP_ARCH="hppa2.0w" ;; +++ sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` +++ case "${sc_cpu_version}" in +++ 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 +++ 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 +++ 532) # CPU_PA_RISC2_0 +++ case "${sc_kernel_bits}" in +++ 32) HP_ARCH="hppa2.0n" ;; +++ 64) HP_ARCH="hppa2.0w" ;; ++ '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 ++- esac ;; ++- esac +++ esac ;; +++ esac ++ fi ++ if [ "${HP_ARCH}" = "" ]; then ++ eval $set_cc_for_build ++- sed 's/^ //' << EOF >$dummy.c +++ sed 's/^ //' << EOF >$dummy.c ++ ++- #define _HPUX_SOURCE ++- #include ++- #include +++ #define _HPUX_SOURCE +++ #include +++ #include ++ ++- int main () ++- { ++- #if defined(_SC_KERNEL_BITS) ++- long bits = sysconf(_SC_KERNEL_BITS); ++- #endif ++- long cpu = sysconf (_SC_CPU_VERSION); +++ int main () +++ { +++ #if defined(_SC_KERNEL_BITS) +++ long bits = sysconf(_SC_KERNEL_BITS); +++ #endif +++ long cpu = sysconf (_SC_CPU_VERSION); ++ ++- switch (cpu) ++- { ++- case CPU_PA_RISC1_0: puts ("hppa1.0"); break; ++- case CPU_PA_RISC1_1: puts ("hppa1.1"); break; ++- case CPU_PA_RISC2_0: ++- #if defined(_SC_KERNEL_BITS) ++- switch (bits) ++- { ++- case 64: puts ("hppa2.0w"); break; ++- case 32: puts ("hppa2.0n"); break; ++- default: puts ("hppa2.0"); break; ++- } break; ++- #else /* !defined(_SC_KERNEL_BITS) */ ++- puts ("hppa2.0"); break; ++- #endif ++- default: puts ("hppa1.0"); break; ++- } ++- exit (0); ++- } +++ switch (cpu) +++ { +++ case CPU_PA_RISC1_0: puts ("hppa1.0"); break; +++ case CPU_PA_RISC1_1: puts ("hppa1.1"); break; +++ case CPU_PA_RISC2_0: +++ #if defined(_SC_KERNEL_BITS) +++ switch (bits) +++ { +++ case 64: puts ("hppa2.0w"); break; +++ case 32: puts ("hppa2.0n"); break; +++ default: puts ("hppa2.0"); break; +++ } break; +++ #else /* !defined(_SC_KERNEL_BITS) */ +++ puts ("hppa2.0"); break; +++ #endif +++ default: puts ("hppa1.0"); break; +++ } +++ exit (0); +++ } ++ EOF ++ (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` ++ test -z "$HP_ARCH" && HP_ARCH=hppa ++@@ -656,7 +680,7 @@ EOF ++ # => hppa64-hp-hpux11.23 ++ ++ if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | ++- grep __LP64__ >/dev/null +++ grep -q __LP64__ ++ then ++ HP_ARCH="hppa2.0w" ++ else ++@@ -727,22 +751,22 @@ EOF ++ exit ;; ++ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) ++ echo c1-convex-bsd ++- exit ;; +++ exit ;; ++ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) ++ if getsysinfo -f scalar_acc ++ then echo c32-convex-bsd ++ else echo c2-convex-bsd ++ fi ++- exit ;; +++ exit ;; ++ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) ++ echo c34-convex-bsd ++- exit ;; +++ exit ;; ++ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) ++ echo c38-convex-bsd ++- exit ;; +++ exit ;; ++ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) ++ echo c4-convex-bsd ++- exit ;; +++ exit ;; ++ CRAY*Y-MP:*:*:*) ++ echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' ++ exit ;; ++@@ -766,14 +790,14 @@ EOF ++ exit ;; ++ F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) ++ FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` ++- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` ++- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` ++- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" ++- exit ;; +++ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` +++ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` +++ echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" +++ exit ;; ++ 5000:UNIX_System_V:4.*:*) ++- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` ++- FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` ++- echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" +++ FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` +++ FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` +++ echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" ++ exit ;; ++ i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) ++ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} ++@@ -785,34 +809,39 @@ EOF ++ echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} ++ exit ;; ++ *:FreeBSD:*:*) ++- case ${UNAME_MACHINE} in ++- pc98) ++- echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; +++ UNAME_PROCESSOR=`/usr/bin/uname -p` +++ case ${UNAME_PROCESSOR} in ++ amd64) ++ echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; ++ *) ++- echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; +++ echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; ++ esac ++ exit ;; ++ i*:CYGWIN*:*) ++ echo ${UNAME_MACHINE}-pc-cygwin ++ exit ;; +++ *:MINGW64*:*) +++ echo ${UNAME_MACHINE}-pc-mingw64 +++ exit ;; ++ *:MINGW*:*) ++ echo ${UNAME_MACHINE}-pc-mingw32 ++ exit ;; +++ i*:MSYS*:*) +++ echo ${UNAME_MACHINE}-pc-msys +++ exit ;; ++ i*:windows32*:*) ++- # uname -m includes "-pc" on this system. ++- echo ${UNAME_MACHINE}-mingw32 +++ # uname -m includes "-pc" on this system. +++ echo ${UNAME_MACHINE}-mingw32 ++ exit ;; ++ i*:PW*:*) ++ echo ${UNAME_MACHINE}-pc-pw32 ++ exit ;; ++- *:Interix*:[3456]*) ++- case ${UNAME_MACHINE} in +++ *:Interix*:*) +++ case ${UNAME_MACHINE} in ++ x86) ++ echo i586-pc-interix${UNAME_RELEASE} ++ exit ;; ++- EM64T | authenticamd | genuineintel) +++ authenticamd | genuineintel | EM64T) ++ echo x86_64-unknown-interix${UNAME_RELEASE} ++ exit ;; ++ IA64) ++@@ -822,6 +851,9 @@ EOF ++ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) ++ echo i${UNAME_MACHINE}-pc-mks ++ exit ;; +++ 8664:Windows_NT:*) +++ echo x86_64-pc-mks +++ exit ;; ++ i*:Windows_NT*:* | Pentium*:Windows_NT*:*) ++ # How do we know it's Interix rather than the generic POSIX subsystem? ++ # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we ++@@ -842,210 +874,157 @@ EOF ++ exit ;; ++ *:GNU:*:*) ++ # the GNU system ++- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` +++ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` ++ exit ;; ++ *:GNU/*:*:*) ++ # other systems with GNU libc and userland ++- echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu +++ echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} ++ exit ;; ++ i*86:Minix:*:*) ++ echo ${UNAME_MACHINE}-pc-minix ++ exit ;; +++ aarch64:Linux:*:*) +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} +++ exit ;; +++ aarch64_be:Linux:*:*) +++ UNAME_MACHINE=aarch64_be +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} +++ exit ;; +++ alpha:Linux:*:*) +++ case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in +++ EV5) UNAME_MACHINE=alphaev5 ;; +++ EV56) UNAME_MACHINE=alphaev56 ;; +++ PCA56) UNAME_MACHINE=alphapca56 ;; +++ PCA57) UNAME_MACHINE=alphapca56 ;; +++ EV6) UNAME_MACHINE=alphaev6 ;; +++ EV67) UNAME_MACHINE=alphaev67 ;; +++ EV68*) UNAME_MACHINE=alphaev68 ;; +++ esac +++ objdump --private-headers /bin/sh | grep -q ld.so.1 +++ if test "$?" = 0 ; then LIBC="gnulibc1" ; fi +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} +++ exit ;; +++ arc:Linux:*:* | arceb:Linux:*:*) +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} +++ exit ;; ++ arm*:Linux:*:*) ++ eval $set_cc_for_build ++ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ ++ | grep -q __ARM_EABI__ ++ then ++- echo ${UNAME_MACHINE}-unknown-linux-gnu +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ else ++- echo ${UNAME_MACHINE}-unknown-linux-gnueabi +++ if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ +++ | grep -q __ARM_PCS_VFP +++ then +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi +++ else +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf +++ fi ++ fi ++ exit ;; ++ avr32*:Linux:*:*) ++- echo ${UNAME_MACHINE}-unknown-linux-gnu +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ cris:Linux:*:*) ++- echo cris-axis-linux-gnu +++ echo ${UNAME_MACHINE}-axis-linux-${LIBC} ++ exit ;; ++ crisv32:Linux:*:*) ++- echo crisv32-axis-linux-gnu +++ echo ${UNAME_MACHINE}-axis-linux-${LIBC} ++ exit ;; ++ frv:Linux:*:*) ++- echo frv-unknown-linux-gnu +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} +++ exit ;; +++ hexagon:Linux:*:*) +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} +++ exit ;; +++ i*86:Linux:*:*) +++ echo ${UNAME_MACHINE}-pc-linux-${LIBC} ++ exit ;; ++ ia64:Linux:*:*) ++- echo ${UNAME_MACHINE}-unknown-linux-gnu +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ m32r*:Linux:*:*) ++- echo ${UNAME_MACHINE}-unknown-linux-gnu +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ m68*:Linux:*:*) ++- echo ${UNAME_MACHINE}-unknown-linux-gnu +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++- mips:Linux:*:*) ++- eval $set_cc_for_build ++- sed 's/^ //' << EOF >$dummy.c ++- #undef CPU ++- #undef mips ++- #undef mipsel ++- #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) ++- CPU=mipsel ++- #else ++- #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) ++- CPU=mips ++- #else ++- CPU= ++- #endif ++- #endif ++-EOF ++- eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' ++- /^CPU/{ ++- s: ::g ++- p ++- }'`" ++- test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ++- ;; ++- mips64:Linux:*:*) +++ mips:Linux:*:* | mips64:Linux:*:*) ++ eval $set_cc_for_build ++ sed 's/^ //' << EOF >$dummy.c ++ #undef CPU ++- #undef mips64 ++- #undef mips64el +++ #undef ${UNAME_MACHINE} +++ #undef ${UNAME_MACHINE}el ++ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) ++- CPU=mips64el +++ CPU=${UNAME_MACHINE}el ++ #else ++ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) ++- CPU=mips64 +++ CPU=${UNAME_MACHINE} ++ #else ++ CPU= ++ #endif ++ #endif ++ EOF ++- eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' ++- /^CPU/{ ++- s: ::g ++- p ++- }'`" ++- test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } +++ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` +++ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ++ ;; ++- or32:Linux:*:*) ++- echo or32-unknown-linux-gnu ++- exit ;; ++- ppc:Linux:*:*) ++- echo powerpc-unknown-linux-gnu +++ or1k:Linux:*:*) +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++- ppc64:Linux:*:*) ++- echo powerpc64-unknown-linux-gnu ++- exit ;; ++- alpha:Linux:*:*) ++- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in ++- EV5) UNAME_MACHINE=alphaev5 ;; ++- EV56) UNAME_MACHINE=alphaev56 ;; ++- PCA56) UNAME_MACHINE=alphapca56 ;; ++- PCA57) UNAME_MACHINE=alphapca56 ;; ++- EV6) UNAME_MACHINE=alphaev6 ;; ++- EV67) UNAME_MACHINE=alphaev67 ;; ++- EV68*) UNAME_MACHINE=alphaev68 ;; ++- esac ++- objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null ++- if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi ++- echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} +++ or32:Linux:*:*) +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ padre:Linux:*:*) ++- echo sparc-unknown-linux-gnu +++ echo sparc-unknown-linux-${LIBC} +++ exit ;; +++ parisc64:Linux:*:* | hppa64:Linux:*:*) +++ echo hppa64-unknown-linux-${LIBC} ++ exit ;; ++ parisc:Linux:*:* | hppa:Linux:*:*) ++ # Look for CPU level ++ case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in ++- PA7*) echo hppa1.1-unknown-linux-gnu ;; ++- PA8*) echo hppa2.0-unknown-linux-gnu ;; ++- *) echo hppa-unknown-linux-gnu ;; +++ PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; +++ PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; +++ *) echo hppa-unknown-linux-${LIBC} ;; ++ esac ++ exit ;; ++- parisc64:Linux:*:* | hppa64:Linux:*:*) ++- echo hppa64-unknown-linux-gnu +++ ppc64:Linux:*:*) +++ echo powerpc64-unknown-linux-${LIBC} +++ exit ;; +++ ppc:Linux:*:*) +++ echo powerpc-unknown-linux-${LIBC} +++ exit ;; +++ ppc64le:Linux:*:*) +++ echo powerpc64le-unknown-linux-${LIBC} +++ exit ;; +++ ppcle:Linux:*:*) +++ echo powerpcle-unknown-linux-${LIBC} ++ exit ;; ++ s390:Linux:*:* | s390x:Linux:*:*) ++- echo ${UNAME_MACHINE}-ibm-linux +++ echo ${UNAME_MACHINE}-ibm-linux-${LIBC} ++ exit ;; ++ sh64*:Linux:*:*) ++- echo ${UNAME_MACHINE}-unknown-linux-gnu +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ sh*:Linux:*:*) ++- echo ${UNAME_MACHINE}-unknown-linux-gnu +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ sparc:Linux:*:* | sparc64:Linux:*:*) ++- echo ${UNAME_MACHINE}-unknown-linux-gnu +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} +++ exit ;; +++ tile*:Linux:*:*) +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ vax:Linux:*:*) ++- echo ${UNAME_MACHINE}-dec-linux-gnu +++ echo ${UNAME_MACHINE}-dec-linux-${LIBC} ++ exit ;; ++ x86_64:Linux:*:*) ++- echo x86_64-unknown-linux-gnu +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++ xtensa*:Linux:*:*) ++- echo ${UNAME_MACHINE}-unknown-linux-gnu +++ echo ${UNAME_MACHINE}-unknown-linux-${LIBC} ++ exit ;; ++- i*86:Linux:*:*) ++- # The BFD linker knows what the default object file format is, so ++- # first see if it will tell us. cd to the root directory to prevent ++- # problems with other programs or directories called `ld' in the path. ++- # Set LC_ALL=C to ensure ld outputs messages in English. ++- ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ ++- | sed -ne '/supported targets:/!d ++- s/[ ][ ]*/ /g ++- s/.*supported targets: *// ++- s/ .*// ++- p'` ++- case "$ld_supported_targets" in ++- elf32-i386) ++- TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ++- ;; ++- a.out-i386-linux) ++- echo "${UNAME_MACHINE}-pc-linux-gnuaout" ++- exit ;; ++- "") ++- # Either a pre-BFD a.out linker (linux-gnuoldld) or ++- # one that does not give us useful --help. ++- echo "${UNAME_MACHINE}-pc-linux-gnuoldld" ++- exit ;; ++- esac ++- # Determine whether the default compiler is a.out or elf ++- eval $set_cc_for_build ++- sed 's/^ //' << EOF >$dummy.c ++- #include ++- #ifdef __ELF__ ++- # ifdef __GLIBC__ ++- # if __GLIBC__ >= 2 ++- LIBC=gnu ++- # else ++- LIBC=gnulibc1 ++- # endif ++- # else ++- LIBC=gnulibc1 ++- # endif ++- #else ++- #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) ++- LIBC=gnu ++- #else ++- LIBC=gnuaout ++- #endif ++- #endif ++- #ifdef __dietlibc__ ++- LIBC=dietlibc ++- #endif ++-EOF ++- eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' ++- /^LIBC/{ ++- s: ::g ++- p ++- }'`" ++- test x"${LIBC}" != x && { ++- echo "${UNAME_MACHINE}-pc-linux-${LIBC}" ++- exit ++- } ++- test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ++- ;; ++ i*86:DYNIX/ptx:4*:*) ++ # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. ++ # earlier versions are messed up and put the nodename in both ++@@ -1053,11 +1032,11 @@ EOF ++ echo i386-sequent-sysv4 ++ exit ;; ++ i*86:UNIX_SV:4.2MP:2.*) ++- # Unixware is an offshoot of SVR4, but it has its own version ++- # number series starting with 2... ++- # I am not positive that other SVR4 systems won't match this, +++ # Unixware is an offshoot of SVR4, but it has its own version +++ # number series starting with 2... +++ # I am not positive that other SVR4 systems won't match this, ++ # I just have to hope. -- rms. ++- # Use sysv4.2uw... so that sysv4* matches it. +++ # Use sysv4.2uw... so that sysv4* matches it. ++ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} ++ exit ;; ++ i*86:OS/2:*:*) ++@@ -1074,7 +1053,7 @@ EOF ++ i*86:syllable:*:*) ++ echo ${UNAME_MACHINE}-pc-syllable ++ exit ;; ++- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) +++ i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) ++ echo i386-unknown-lynxos${UNAME_RELEASE} ++ exit ;; ++ i*86:*DOS:*:*) ++@@ -1089,7 +1068,7 @@ EOF ++ fi ++ exit ;; ++ i*86:*:5:[678]*) ++- # UnixWare 7.x, OpenUNIX and OpenServer 6. +++ # UnixWare 7.x, OpenUNIX and OpenServer 6. ++ case `/bin/uname -X | grep "^Machine"` in ++ *486*) UNAME_MACHINE=i486 ;; ++ *Pentium) UNAME_MACHINE=i586 ;; ++@@ -1117,13 +1096,13 @@ EOF ++ exit ;; ++ pc:*:*:*) ++ # Left here for compatibility: ++- # uname -m prints for DJGPP always 'pc', but it prints nothing about ++- # the processor, so we play safe by assuming i586. +++ # uname -m prints for DJGPP always 'pc', but it prints nothing about +++ # the processor, so we play safe by assuming i586. ++ # Note: whatever this is, it MUST be the same as what config.sub ++ # prints for the "djgpp" host, or else GDB configury will decide that ++ # this is a cross-build. ++ echo i586-pc-msdosdjgpp ++- exit ;; +++ exit ;; ++ Intel:Mach:3*:*) ++ echo i386-pc-mach3 ++ exit ;; ++@@ -1158,8 +1137,8 @@ EOF ++ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ ++ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; ++ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) ++- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ ++- && { echo i486-ncr-sysv4; exit; } ;; +++ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ +++ && { echo i486-ncr-sysv4; exit; } ;; ++ NCR*:*:4.2:* | MPRAS*:*:4.2:*) ++ OS_REL='.3' ++ test -r /etc/.relid \ ++@@ -1182,7 +1161,7 @@ EOF ++ rs6000:LynxOS:2.*:*) ++ echo rs6000-unknown-lynxos${UNAME_RELEASE} ++ exit ;; ++- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) +++ PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) ++ echo powerpc-unknown-lynxos${UNAME_RELEASE} ++ exit ;; ++ SM[BE]S:UNIX_SV:*:*) ++@@ -1202,10 +1181,10 @@ EOF ++ echo ns32k-sni-sysv ++ fi ++ exit ;; ++- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort ++- # says ++- echo i586-unisys-sysv4 ++- exit ;; +++ PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort +++ # says +++ echo i586-unisys-sysv4 +++ exit ;; ++ *:UNIX_System_V:4*:FTX*) ++ # From Gerald Hewes . ++ # How about differentiating between stratus architectures? -djm ++@@ -1231,11 +1210,11 @@ EOF ++ exit ;; ++ R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) ++ if [ -d /usr/nec ]; then ++- echo mips-nec-sysv${UNAME_RELEASE} +++ echo mips-nec-sysv${UNAME_RELEASE} ++ else ++- echo mips-unknown-sysv${UNAME_RELEASE} +++ echo mips-unknown-sysv${UNAME_RELEASE} ++ fi ++- exit ;; +++ exit ;; ++ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. ++ echo powerpc-be-beos ++ exit ;; ++@@ -1248,6 +1227,9 @@ EOF ++ BePC:Haiku:*:*) # Haiku running on Intel PC compatible. ++ echo i586-pc-haiku ++ exit ;; +++ x86_64:Haiku:*:*) +++ echo x86_64-unknown-haiku +++ exit ;; ++ SX-4:SUPER-UX:*:*) ++ echo sx4-nec-superux${UNAME_RELEASE} ++ exit ;; ++@@ -1274,9 +1256,21 @@ EOF ++ exit ;; ++ *:Darwin:*:*) ++ UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown ++- case $UNAME_PROCESSOR in ++- unknown) UNAME_PROCESSOR=powerpc ;; ++- esac +++ eval $set_cc_for_build +++ if test "$UNAME_PROCESSOR" = unknown ; then +++ UNAME_PROCESSOR=powerpc +++ fi +++ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then +++ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ +++ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ +++ grep IS_64BIT_ARCH >/dev/null +++ then +++ case $UNAME_PROCESSOR in +++ i386) UNAME_PROCESSOR=x86_64 ;; +++ powerpc) UNAME_PROCESSOR=powerpc64 ;; +++ esac +++ fi +++ fi ++ echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} ++ exit ;; ++ *:procnto*:*:* | *:QNX:[0123456789]*:*) ++@@ -1290,7 +1284,10 @@ EOF ++ *:QNX:*:4*) ++ echo i386-pc-qnx ++ exit ;; ++- NSE-?:NONSTOP_KERNEL:*:*) +++ NEO-?:NONSTOP_KERNEL:*:*) +++ echo neo-tandem-nsk${UNAME_RELEASE} +++ exit ;; +++ NSE-*:NONSTOP_KERNEL:*:*) ++ echo nse-tandem-nsk${UNAME_RELEASE} ++ exit ;; ++ NSR-?:NONSTOP_KERNEL:*:*) ++@@ -1335,13 +1332,13 @@ EOF ++ echo pdp10-unknown-its ++ exit ;; ++ SEI:*:*:SEIUX) ++- echo mips-sei-seiux${UNAME_RELEASE} +++ echo mips-sei-seiux${UNAME_RELEASE} ++ exit ;; ++ *:DragonFly:*:*) ++ echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ++ exit ;; ++ *:*VMS:*:*) ++- UNAME_MACHINE=`(uname -p) 2>/dev/null` +++ UNAME_MACHINE=`(uname -p) 2>/dev/null` ++ case "${UNAME_MACHINE}" in ++ A*) echo alpha-dec-vms ; exit ;; ++ I*) echo ia64-dec-vms ; exit ;; ++@@ -1359,11 +1356,11 @@ EOF ++ i*86:AROS:*:*) ++ echo ${UNAME_MACHINE}-pc-aros ++ exit ;; +++ x86_64:VMkernel:*:*) +++ echo ${UNAME_MACHINE}-unknown-esx +++ exit ;; ++ esac ++ ++-#echo '(No uname command or uname output not recognized.)' 1>&2 ++-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 ++- ++ eval $set_cc_for_build ++ cat >$dummy.c < ++ printf ("m68k-sony-newsos%s\n", ++ #ifdef NEWSOS4 ++- "4" +++ "4" ++ #else ++- "" +++ "" ++ #endif ++- ); exit (0); +++ ); exit (0); ++ #endif ++ #endif ++ ++diff --git a/config.sub b/config.sub ++index 45bad78..d2a9613 100755 ++--- a/config.sub +++++ b/config.sub ++@@ -1,44 +1,40 @@ ++ #! /bin/sh ++ # Configuration validation subroutine script. ++-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, ++-# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 ++-# Free Software Foundation, Inc. +++# Copyright 1992-2013 Free Software Foundation, Inc. ++ ++-timestamp='2009-04-17' +++timestamp='2013-08-10' ++ ++-# This file is (in principle) common to ALL GNU software. ++-# The presence of a machine in this file suggests that SOME GNU software ++-# can handle that machine. It does not imply ALL GNU software can. ++-# ++-# This file is free software; you can redistribute it and/or modify ++-# it under the terms of the GNU General Public License as published by ++-# the Free Software Foundation; either version 2 of the License, or +++# This file is free software; you can redistribute it and/or modify it +++# under the terms of the GNU General Public License as published by +++# the Free Software Foundation; either version 3 of the License, or ++ # (at your option) any later version. ++ # ++-# This program is distributed in the hope that it will be useful, ++-# but WITHOUT ANY WARRANTY; without even the implied warranty of ++-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++-# GNU General Public License for more details. +++# This program is distributed in the hope that it will be useful, but +++# WITHOUT ANY WARRANTY; without even the implied warranty of +++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +++# General Public License for more details. ++ # ++ # You should have received a copy of the GNU General Public License ++-# along with this program; if not, write to the Free Software ++-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA ++-# 02110-1301, USA. +++# along with this program; if not, see . ++ # ++ # As a special exception to the GNU General Public License, if you ++ # distribute this file as part of a program that contains a ++ # configuration script generated by Autoconf, you may include it under ++-# the same distribution terms that you use for the rest of that program. +++# the same distribution terms that you use for the rest of that +++# program. This Exception is an additional permission under section 7 +++# of the GNU General Public License, version 3 ("GPLv3"). ++ ++ ++-# Please send patches to . Submit a context ++-# diff and a properly formatted ChangeLog entry. +++# Please send patches with a ChangeLog entry to config-patches@gnu.org. ++ # ++ # Configuration subroutine to validate and canonicalize a configuration type. ++ # Supply the specified configuration type as an argument. ++ # If it is invalid, we print an error message on stderr and exit with code 1. ++ # Otherwise, we print the canonical config type on stdout and succeed. ++ +++# You can get the latest version of this script from: +++# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +++ ++ # This file is supposed to be the same for all GNU packages ++ # and recognize all the CPU types, system types and aliases ++ # that are meaningful with *any* GNU software. ++@@ -72,8 +68,7 @@ Report bugs and patches to ." ++ version="\ ++ GNU config.sub ($timestamp) ++ ++-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, ++-2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +++Copyright 1992-2013 Free Software Foundation, Inc. ++ ++ This is free software; see the source for copying conditions. There is NO ++ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." ++@@ -120,13 +115,18 @@ esac ++ # Here we must recognize all the valid KERNEL-OS combinations. ++ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` ++ case $maybe_os in ++- nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ ++- uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ +++ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ +++ linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ +++ knetbsd*-gnu* | netbsd*-gnu* | \ ++ kopensolaris*-gnu* | \ ++ storm-chaos* | os2-emx* | rtmk-nova*) ++ os=-$maybe_os ++ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ++ ;; +++ android-linux) +++ os=-linux-android +++ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown +++ ;; ++ *) ++ basic_machine=`echo $1 | sed 's/-[^-]*$//'` ++ if [ $basic_machine != $1 ] ++@@ -149,10 +149,13 @@ case $os in ++ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ ++ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ ++ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ ++- -apple | -axis | -knuth | -cray) +++ -apple | -axis | -knuth | -cray | -microblaze*) ++ os= ++ basic_machine=$1 ++ ;; +++ -bluegene*) +++ os=-cnk +++ ;; ++ -sim | -cisco | -oki | -wec | -winbond) ++ os= ++ basic_machine=$1 ++@@ -167,10 +170,10 @@ case $os in ++ os=-chorusos ++ basic_machine=$1 ++ ;; ++- -chorusrdb) ++- os=-chorusrdb +++ -chorusrdb) +++ os=-chorusrdb ++ basic_machine=$1 ++- ;; +++ ;; ++ -hiux*) ++ os=-hiuxwe2 ++ ;; ++@@ -215,6 +218,12 @@ case $os in ++ -isc*) ++ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ++ ;; +++ -lynx*178) +++ os=-lynxos178 +++ ;; +++ -lynx*5) +++ os=-lynxos5 +++ ;; ++ -lynx*) ++ os=-lynxos ++ ;; ++@@ -239,20 +248,27 @@ case $basic_machine in ++ # Some are omitted here because they have special meanings below. ++ 1750a | 580 \ ++ | a29k \ +++ | aarch64 | aarch64_be \ ++ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ ++ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ ++ | am33_2.0 \ ++- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ +++ | arc | arceb \ +++ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ +++ | avr | avr32 \ +++ | be32 | be64 \ ++ | bfin \ ++- | c4x | clipper \ +++ | c4x | c8051 | clipper \ ++ | d10v | d30v | dlx | dsp16xx \ +++ | epiphany \ ++ | fido | fr30 | frv \ ++ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ +++ | hexagon \ ++ | i370 | i860 | i960 | ia64 \ ++ | ip2k | iq2000 \ +++ | le32 | le64 \ ++ | lm32 \ ++ | m32c | m32r | m32rle | m68000 | m68k | m88k \ ++- | maxq | mb | microblaze | mcore | mep | metag \ +++ | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ ++ | mips | mipsbe | mipseb | mipsel | mipsle \ ++ | mips16 \ ++ | mips64 | mips64el \ ++@@ -270,32 +286,45 @@ case $basic_machine in ++ | mipsisa64r2 | mipsisa64r2el \ ++ | mipsisa64sb1 | mipsisa64sb1el \ ++ | mipsisa64sr71k | mipsisa64sr71kel \ +++ | mipsr5900 | mipsr5900el \ ++ | mipstx39 | mipstx39el \ ++ | mn10200 | mn10300 \ ++ | moxie \ ++ | mt \ ++ | msp430 \ ++- | nios | nios2 \ +++ | nds32 | nds32le | nds32be \ +++ | nios | nios2 | nios2eb | nios2el \ ++ | ns16k | ns32k \ ++- | or32 \ +++ | open8 \ +++ | or1k | or32 \ ++ | pdp10 | pdp11 | pj | pjl \ ++- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ +++ | powerpc | powerpc64 | powerpc64le | powerpcle \ ++ | pyramid \ +++ | rl78 | rx \ ++ | score \ ++ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ ++ | sh64 | sh64le \ ++ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ ++ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ ++- | spu | strongarm \ ++- | tahoe | thumb | tic4x | tic80 | tron \ ++- | v850 | v850e \ +++ | spu \ +++ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ +++ | ubicom32 \ +++ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ ++ | we32k \ ++- | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ +++ | x86 | xc16x | xstormy16 | xtensa \ ++ | z8k | z80) ++ basic_machine=$basic_machine-unknown ++ ;; ++- m6811 | m68hc11 | m6812 | m68hc12) ++- # Motorola 68HC11/12. +++ c54x) +++ basic_machine=tic54x-unknown +++ ;; +++ c55x) +++ basic_machine=tic55x-unknown +++ ;; +++ c6x) +++ basic_machine=tic6x-unknown +++ ;; +++ m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) ++ basic_machine=$basic_machine-unknown ++ os=-none ++ ;; ++@@ -305,6 +334,21 @@ case $basic_machine in ++ basic_machine=mt-unknown ++ ;; ++ +++ strongarm | thumb | xscale) +++ basic_machine=arm-unknown +++ ;; +++ xgate) +++ basic_machine=$basic_machine-unknown +++ os=-none +++ ;; +++ xscaleeb) +++ basic_machine=armeb-unknown +++ ;; +++ +++ xscaleel) +++ basic_machine=armel-unknown +++ ;; +++ ++ # We use `pc' rather than `unknown' ++ # because (1) that's what they normally are, and ++ # (2) the word "unknown" tends to confuse beginning users. ++@@ -319,25 +363,30 @@ case $basic_machine in ++ # Recognize the basic CPU types with company name. ++ 580-* \ ++ | a29k-* \ +++ | aarch64-* | aarch64_be-* \ ++ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ ++ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ ++- | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ +++ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ ++ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ ++ | avr-* | avr32-* \ +++ | be32-* | be64-* \ ++ | bfin-* | bs2000-* \ ++- | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ ++- | clipper-* | craynv-* | cydra-* \ +++ | c[123]* | c30-* | [cjt]90-* | c4x-* \ +++ | c8051-* | clipper-* | craynv-* | cydra-* \ ++ | d10v-* | d30v-* | dlx-* \ ++ | elxsi-* \ ++ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ ++ | h8300-* | h8500-* \ ++ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ +++ | hexagon-* \ ++ | i*86-* | i860-* | i960-* | ia64-* \ ++ | ip2k-* | iq2000-* \ +++ | le32-* | le64-* \ ++ | lm32-* \ ++ | m32c-* | m32r-* | m32rle-* \ ++ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ ++ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ +++ | microblaze-* | microblazeel-* \ ++ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ ++ | mips16-* \ ++ | mips64-* | mips64el-* \ ++@@ -355,28 +404,34 @@ case $basic_machine in ++ | mipsisa64r2-* | mipsisa64r2el-* \ ++ | mipsisa64sb1-* | mipsisa64sb1el-* \ ++ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ +++ | mipsr5900-* | mipsr5900el-* \ ++ | mipstx39-* | mipstx39el-* \ ++ | mmix-* \ ++ | mt-* \ ++ | msp430-* \ ++- | nios-* | nios2-* \ +++ | nds32-* | nds32le-* | nds32be-* \ +++ | nios-* | nios2-* | nios2eb-* | nios2el-* \ ++ | none-* | np1-* | ns16k-* | ns32k-* \ +++ | open8-* \ ++ | orion-* \ ++ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ ++- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ +++ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ ++ | pyramid-* \ ++- | romp-* | rs6000-* \ +++ | rl78-* | romp-* | rs6000-* | rx-* \ ++ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ ++ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ ++ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ ++ | sparclite-* \ ++- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ ++- | tahoe-* | thumb-* \ ++- | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ +++ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ +++ | tahoe-* \ +++ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ +++ | tile*-* \ ++ | tron-* \ ++- | v850-* | v850e-* | vax-* \ +++ | ubicom32-* \ +++ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ +++ | vax-* \ ++ | we32k-* \ ++- | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ +++ | x86-* | x86_64-* | xc16x-* | xps100-* \ ++ | xstormy16-* | xtensa*-* \ ++ | ymp-* \ ++ | z8k-* | z80-*) ++@@ -401,7 +456,7 @@ case $basic_machine in ++ basic_machine=a29k-amd ++ os=-udi ++ ;; ++- abacus) +++ abacus) ++ basic_machine=abacus-unknown ++ ;; ++ adobe68k) ++@@ -467,11 +522,24 @@ case $basic_machine in ++ basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` ++ os=-linux ++ ;; +++ bluegene*) +++ basic_machine=powerpc-ibm +++ os=-cnk +++ ;; +++ c54x-*) +++ basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` +++ ;; +++ c55x-*) +++ basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` +++ ;; +++ c6x-*) +++ basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` +++ ;; ++ c90) ++ basic_machine=c90-cray ++ os=-unicos ++ ;; ++- cegcc) +++ cegcc) ++ basic_machine=arm-unknown ++ os=-cegcc ++ ;; ++@@ -503,7 +571,7 @@ case $basic_machine in ++ basic_machine=craynv-cray ++ os=-unicosmp ++ ;; ++- cr16) +++ cr16 | cr16-*) ++ basic_machine=cr16-unknown ++ os=-elf ++ ;; ++@@ -661,7 +729,6 @@ case $basic_machine in ++ i370-ibm* | ibm*) ++ basic_machine=i370-ibm ++ ;; ++-# I'm not sure what "Sysv32" means. Should this be sysv3.2? ++ i*86v32) ++ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` ++ os=-sysv32 ++@@ -719,8 +786,15 @@ case $basic_machine in ++ basic_machine=ns32k-utek ++ os=-sysv ++ ;; +++ microblaze*) +++ basic_machine=microblaze-xilinx +++ ;; +++ mingw64) +++ basic_machine=x86_64-pc +++ os=-mingw64 +++ ;; ++ mingw32) ++- basic_machine=i386-pc +++ basic_machine=i686-pc ++ os=-mingw32 ++ ;; ++ mingw32ce) ++@@ -755,10 +829,18 @@ case $basic_machine in ++ ms1-*) ++ basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ++ ;; +++ msys) +++ basic_machine=i686-pc +++ os=-msys +++ ;; ++ mvs) ++ basic_machine=i370-ibm ++ os=-mvs ++ ;; +++ nacl) +++ basic_machine=le32-unknown +++ os=-nacl +++ ;; ++ ncr3000) ++ basic_machine=i486-ncr ++ os=-sysv4 ++@@ -823,6 +905,12 @@ case $basic_machine in ++ np1) ++ basic_machine=np1-gould ++ ;; +++ neo-tandem) +++ basic_machine=neo-tandem +++ ;; +++ nse-tandem) +++ basic_machine=nse-tandem +++ ;; ++ nsr-tandem) ++ basic_machine=nsr-tandem ++ ;; ++@@ -905,9 +993,10 @@ case $basic_machine in ++ ;; ++ power) basic_machine=power-ibm ++ ;; ++- ppc) basic_machine=powerpc-unknown +++ ppc | ppcbe) basic_machine=powerpc-unknown ++ ;; ++- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` +++ ppc-* | ppcbe-*) +++ basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ ppcle | powerpclittle | ppc-le | powerpc-little) ++ basic_machine=powerpcle-unknown ++@@ -917,7 +1006,7 @@ case $basic_machine in ++ ;; ++ ppc64) basic_machine=powerpc64-unknown ++ ;; ++- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` +++ ppc64-* | ppc64p7-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ ppc64le | powerpc64little | ppc64-le | powerpc64-little) ++ basic_machine=powerpc64le-unknown ++@@ -932,7 +1021,11 @@ case $basic_machine in ++ basic_machine=i586-unknown ++ os=-pw32 ++ ;; ++- rdos) +++ rdos | rdos64) +++ basic_machine=x86_64-pc +++ os=-rdos +++ ;; +++ rdos32) ++ basic_machine=i386-pc ++ os=-rdos ++ ;; ++@@ -1001,6 +1094,9 @@ case $basic_machine in ++ basic_machine=i860-stratus ++ os=-sysv4 ++ ;; +++ strongarm-* | thumb-*) +++ basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` +++ ;; ++ sun2) ++ basic_machine=m68000-sun ++ ;; ++@@ -1057,20 +1153,8 @@ case $basic_machine in ++ basic_machine=t90-cray ++ os=-unicos ++ ;; ++- tic54x | c54x*) ++- basic_machine=tic54x-unknown ++- os=-coff ++- ;; ++- tic55x | c55x*) ++- basic_machine=tic55x-unknown ++- os=-coff ++- ;; ++- tic6x | c6x*) ++- basic_machine=tic6x-unknown ++- os=-coff ++- ;; ++ tile*) ++- basic_machine=tile-unknown +++ basic_machine=$basic_machine-unknown ++ os=-linux-gnu ++ ;; ++ tx39) ++@@ -1140,6 +1224,9 @@ case $basic_machine in ++ xps | xps100) ++ basic_machine=xps100-honeywell ++ ;; +++ xscale-* | xscalee[bl]-*) +++ basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` +++ ;; ++ ymp) ++ basic_machine=ymp-cray ++ os=-unicos ++@@ -1237,9 +1324,12 @@ esac ++ if [ x"$os" != x"" ] ++ then ++ case $os in ++- # First match some system type aliases ++- # that might get confused with valid system types. +++ # First match some system type aliases +++ # that might get confused with valid system types. ++ # -solaris* is a basic system type, with this one exception. +++ -auroraux) +++ os=-auroraux +++ ;; ++ -solaris1 | -solaris1.*) ++ os=`echo $os | sed -e 's|solaris1|sunos4|'` ++ ;; ++@@ -1260,22 +1350,23 @@ case $os in ++ # Each alternative MUST END IN A *, to match a version number. ++ # -sysv* is not here because it comes later, after sysvr4. ++ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ ++- | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ ++- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ ++- | -kopensolaris* \ +++ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ +++ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ +++ | -sym* | -kopensolaris* | -plan9* \ ++ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ ++ | -aos* | -aros* \ ++ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ ++ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ ++ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ ++- | -openbsd* | -solidbsd* \ +++ | -bitrig* | -openbsd* | -solidbsd* \ ++ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ ++ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ ++ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ ++ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ ++ | -chorusos* | -chorusrdb* | -cegcc* \ ++- | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ ++- | -mingw32* | -linux-gnu* | -linux-androideabi* | -linux-newlib* | -linux-uclibc* \ +++ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ +++ | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ +++ | -linux-newlib* | -linux-musl* | -linux-uclibc* \ ++ | -uxpv* | -beos* | -mpeix* | -udk* \ ++ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ ++ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ ++@@ -1283,7 +1374,7 @@ case $os in ++ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ ++ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ ++ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ ++- | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) +++ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) ++ # Remember, each alternative MUST END IN *, to match a version number. ++ ;; ++ -qnx*) ++@@ -1322,7 +1413,7 @@ case $os in ++ -opened*) ++ os=-openedition ++ ;; ++- -os400*) +++ -os400*) ++ os=-os400 ++ ;; ++ -wince*) ++@@ -1371,7 +1462,7 @@ case $os in ++ -sinix*) ++ os=-sysv4 ++ ;; ++- -tpf*) +++ -tpf*) ++ os=-tpf ++ ;; ++ -triton*) ++@@ -1407,15 +1498,14 @@ case $os in ++ -aros*) ++ os=-aros ++ ;; ++- -kaos*) ++- os=-kaos ++- ;; ++ -zvmoe) ++ os=-zvmoe ++ ;; ++ -dicos*) ++ os=-dicos ++ ;; +++ -nacl*) +++ ;; ++ -none) ++ ;; ++ *) ++@@ -1438,10 +1528,10 @@ else ++ # system, and we'll never get to this point. ++ ++ case $basic_machine in ++- score-*) +++ score-*) ++ os=-elf ++ ;; ++- spu-*) +++ spu-*) ++ os=-elf ++ ;; ++ *-acorn) ++@@ -1453,8 +1543,23 @@ case $basic_machine in ++ arm*-semi) ++ os=-aout ++ ;; ++- c4x-* | tic4x-*) ++- os=-coff +++ c4x-* | tic4x-*) +++ os=-coff +++ ;; +++ c8051-*) +++ os=-elf +++ ;; +++ hexagon-*) +++ os=-elf +++ ;; +++ tic54x-*) +++ os=-coff +++ ;; +++ tic55x-*) +++ os=-coff +++ ;; +++ tic6x-*) +++ os=-coff ++ ;; ++ # This must come before the *-dec entry. ++ pdp10-*) ++@@ -1474,14 +1579,11 @@ case $basic_machine in ++ ;; ++ m68000-sun) ++ os=-sunos3 ++- # This also exists in the configure program, but was not the ++- # default. ++- # os=-sunos4 ++ ;; ++ m68*-cisco) ++ os=-aout ++ ;; ++- mep-*) +++ mep-*) ++ os=-elf ++ ;; ++ mips*-cisco) ++@@ -1490,6 +1592,9 @@ case $basic_machine in ++ mips*-*) ++ os=-elf ++ ;; +++ or1k-*) +++ os=-elf +++ ;; ++ or32-*) ++ os=-coff ++ ;; ++@@ -1508,7 +1613,7 @@ case $basic_machine in ++ *-ibm) ++ os=-aix ++ ;; ++- *-knuth) +++ *-knuth) ++ os=-mmixware ++ ;; ++ *-wec) ++@@ -1613,7 +1718,7 @@ case $basic_machine in ++ -sunos*) ++ vendor=sun ++ ;; ++- -aix*) +++ -cnk*|-aix*) ++ vendor=ibm ++ ;; ++ -beos*) ++-- ++1.9.0 ++ +-- +1.9.0 + diff --git a/SOURCES/0002-EMF-Stroke-size-is-always-supposed-to-be-absolute.patch b/SOURCES/0002-EMF-Stroke-size-is-always-supposed-to-be-absolute.patch deleted file mode 100644 index 2ebe3ef..0000000 --- a/SOURCES/0002-EMF-Stroke-size-is-always-supposed-to-be-absolute.patch +++ /dev/null @@ -1,29 +0,0 @@ -From d32eea1634cff144a45c3ee6b0bb54e1cc7663c5 Mon Sep 17 00:00:00 2001 -From: Jan Holesovsky -Date: Tue, 19 Nov 2013 10:02:12 +0100 -Subject: [PATCH 002/109] EMF+: Stroke size is always supposed to be absolute. - -Change-Id: I7221311e5dee6384dc2d1c071bf6f1c61811895a -Reviewed-on: https://gerrit.libreoffice.org/6827 -Reviewed-by: Andras Timar -Tested-by: Andras Timar ---- - cppcanvas/source/mtfrenderer/emfplus.cxx | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx -index 9d9c311..daed614 100644 ---- a/cppcanvas/source/mtfrenderer/emfplus.cxx -+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx -@@ -613,7 +613,7 @@ namespace cppcanvas - SAL_INFO ("cppcanvas.emf", "TODO: pen with zero width - using minimal which might not be correct\n"); - } - #endif -- rStrokeAttributes.StrokeWidth = (rState.mapModeTransform * rR.MapSize (width == 0.0 ? 0.05 : width, 0)).getX (); -+ rStrokeAttributes.StrokeWidth = fabs((rState.mapModeTransform * rR.MapSize (width == 0.0 ? 0.05 : width, 0)).getX()); - } - - void Read (SvStream& s, ImplRenderer& rR, sal_Int32, sal_Int32 ) --- -1.8.4.2 - diff --git a/SOURCES/0002-Linux-AArch64-port.patch b/SOURCES/0002-Linux-AArch64-port.patch new file mode 100644 index 0000000..db7bfa6 --- /dev/null +++ b/SOURCES/0002-Linux-AArch64-port.patch @@ -0,0 +1,1497 @@ +From 09f49fc55104ee7b0fe18dbb5068a4cad7d9fc25 Mon Sep 17 00:00:00 2001 +From: Stephan Bergmann +Date: Fri, 29 Aug 2014 17:17:42 +0200 +Subject: [PATCH 2/2] Linux AArch64 port + +(cherry picked from commit 235fa0334e0b45c736b636ba1689e2f8c7458697) +Conflicts: + bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx + bridges/source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx + bridges/source/cpp_uno/gcc3_linux_aarch64/uno2cpp.cxx + configure.ac + +Change-Id: I37044a37348b203944a8eb9d2204e619055f069d +--- + bridges/Library_cpp_uno.mk | 5 + + bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx | 310 ++++++++++++++ + bridges/source/cpp_uno/gcc3_linux_aarch64/abi.hxx | 87 ++++ + .../gcc3_linux_aarch64/callvirtualfunction.cxx | 66 +++ + .../gcc3_linux_aarch64/callvirtualfunction.hxx | 33 ++ + .../source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx | 464 +++++++++++++++++++++ + .../source/cpp_uno/gcc3_linux_aarch64/uno2cpp.cxx | 376 +++++++++++++++++ + configure.ac | 6 + + desktop/source/deployment/misc/dp_platform.cxx | 4 +- + jvmfwk/plugins/sunmajor/pluginlib/vendorbase.hxx | 2 + + solenv/gbuild/platform/LINUX_AARCH64_GCC.mk | 14 + + 11 files changed, 1366 insertions(+), 1 deletion(-) + create mode 100644 bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx + create mode 100644 bridges/source/cpp_uno/gcc3_linux_aarch64/abi.hxx + create mode 100644 bridges/source/cpp_uno/gcc3_linux_aarch64/callvirtualfunction.cxx + create mode 100644 bridges/source/cpp_uno/gcc3_linux_aarch64/callvirtualfunction.hxx + create mode 100644 bridges/source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx + create mode 100644 bridges/source/cpp_uno/gcc3_linux_aarch64/uno2cpp.cxx + create mode 100644 solenv/gbuild/platform/LINUX_AARCH64_GCC.mk + +diff --git a/bridges/Library_cpp_uno.mk b/bridges/Library_cpp_uno.mk +index c6ab9a0..0fcaf6b 100644 +--- a/bridges/Library_cpp_uno.mk ++++ b/bridges/Library_cpp_uno.mk +@@ -35,6 +35,11 @@ $(call gb_LinkTarget_get_target,$(call gb_Library_get_linktarget,gcc3_uno)) : \ + EXTRAOBJECTLISTS += $(call gb_CustomTarget_get_workdir,bridges/source/cpp_uno/gcc3_linux_arm)/armhelper.objectlist + endif + ++else ifeq ($(OS)-$(CPUNAME),LINUX-AARCH64) ++ ++bridges_SELECTED_BRIDGE := gcc3_linux_aarch64 ++bridge_exception_objects := abi callvirtualfunction cpp2uno uno2cpp ++ + else ifeq ($(OS)-$(CPUNAME),LINUX-AXP) + + bridges_SELECTED_BRIDGE := gcc3_linux_alpha +diff --git a/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx b/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx +new file mode 100644 +index 0000000..c177b22 +--- /dev/null ++++ b/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.cxx +@@ -0,0 +1,310 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ * ++ * This file incorporates work covered by the following license notice: ++ * ++ * Licensed to the Apache Software Foundation (ASF) under one or more ++ * contributor license agreements. See the NOTICE file distributed ++ * with this work for additional information regarding copyright ++ * ownership. The ASF licenses this file to you under the Apache ++ * License, Version 2.0 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.apache.org/licenses/LICENSE-2.0 . ++ */ ++ ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++namespace { ++ ++OUString toUnoName(char const * name) { ++ assert(name != 0); ++ OUStringBuffer b; ++ bool scoped = *name == 'N'; ++ if (scoped) { ++ ++name; ++ } ++ for (;;) { ++ assert(*name >= '0' && *name <= '9'); ++ std::size_t n = *name++ - '0'; ++ while (*name >= '0' && *name <= '9') { ++ n = 10 * n + (*name++ - '0'); ++ } ++ b.appendAscii(name, n); ++ name += n; ++ if (!scoped) { ++ assert(*name == 0); ++ break; ++ } ++ if (*name == 'E') { ++ assert(name[1] == 0); ++ break; ++ } ++ b.append('.'); ++ } ++ return b.makeStringAndClear(); ++} ++ ++class Rtti { ++public: ++ Rtti(): app_(dlopen(0, RTLD_LAZY)) {} ++ ++ ~Rtti() { dlclose(app_); } ++ ++ std::type_info * getRtti(typelib_TypeDescription const & type); ++ ++private: ++ typedef boost::unordered_map Map; ++ ++ void * app_; ++ ++ osl::Mutex mutex_; ++ Map map_; ++}; ++ ++std::type_info * Rtti::getRtti(typelib_TypeDescription const & type) { ++ OUString unoName(type.pTypeName); ++ osl::MutexGuard g(mutex_); ++ Map::iterator i(map_.find(unoName)); ++ if (i == map_.end()) { ++ OStringBuffer b; ++ b.append("_ZTIN"); ++ for (sal_Int32 j = 0; j != -1;) { ++ OString t( ++ OUStringToOString( ++ unoName.getToken(0, '.', j), RTL_TEXTENCODING_ASCII_US)); ++ b.append(t.getLength()); ++ b.append(t); ++ } ++ b.append('E'); ++ OString sym(b.makeStringAndClear()); ++ std::type_info * rtti = static_cast( ++ dlsym(app_, sym.getStr())); ++ if (rtti == 0) { ++ char const * rttiName = sym.getStr() + std::strlen("_ZTI"); ++ assert(type.eTypeClass == typelib_TypeClass_EXCEPTION); ++ typelib_CompoundTypeDescription const & ctd ++ = reinterpret_cast( ++ type); ++ if (ctd.pBaseTypeDescription == 0) { ++ rtti = new __cxxabiv1::__class_type_info(strdup(rttiName)); ++ } else { ++ std::type_info * base = getRtti( ++ ctd.pBaseTypeDescription->aBase); ++ rtti = new __cxxabiv1::__si_class_type_info( ++ strdup(rttiName), ++ static_cast<__cxxabiv1::__class_type_info *>(base)); ++ } ++ } ++ i = map_.insert(Map::value_type(unoName, rtti)).first; ++ } ++ return i->second; ++} ++ ++struct theRttiFactory: public rtl::Static {}; ++ ++std::type_info * getRtti(typelib_TypeDescription const & type) { ++ return theRttiFactory::get().getRtti(type); ++} ++ ++extern "C" void _GLIBCXX_CDTOR_CALLABI deleteException(void * exception) { ++ abi_aarch64::__cxa_exception * header = ++ static_cast(exception) - 1; ++ OUString unoName(toUnoName(header->exceptionType->name())); ++ typelib_TypeDescription * td = 0; ++ typelib_typedescription_getByName(&td, unoName.pData); ++ assert(td != 0); ++ uno_destructData(exception, td, &css::uno::cpp_release); ++ typelib_typedescription_release(td); ++} ++ ++enum StructKind { ++ STRUCT_KIND_EMPTY, STRUCT_KIND_FLOAT, STRUCT_KIND_DOUBLE, STRUCT_KIND_POD, ++ STRUCT_KIND_DTOR ++}; ++ ++StructKind getStructKind(typelib_CompoundTypeDescription const * type) { ++ StructKind k = type->pBaseTypeDescription == 0 ++ ? STRUCT_KIND_EMPTY : getStructKind(type->pBaseTypeDescription); ++ for (sal_Int32 i = 0; i != type->nMembers; ++i) { ++ StructKind k2 = StructKind(); ++ switch (type->ppTypeRefs[i]->eTypeClass) { ++ case typelib_TypeClass_BOOLEAN: ++ case typelib_TypeClass_BYTE: ++ case typelib_TypeClass_SHORT: ++ case typelib_TypeClass_UNSIGNED_SHORT: ++ case typelib_TypeClass_LONG: ++ case typelib_TypeClass_UNSIGNED_LONG: ++ case typelib_TypeClass_HYPER: ++ case typelib_TypeClass_UNSIGNED_HYPER: ++ case typelib_TypeClass_CHAR: ++ case typelib_TypeClass_ENUM: ++ k2 = STRUCT_KIND_POD; ++ break; ++ case typelib_TypeClass_FLOAT: ++ k2 = STRUCT_KIND_FLOAT; ++ break; ++ case typelib_TypeClass_DOUBLE: ++ k2 = STRUCT_KIND_DOUBLE; ++ break; ++ case typelib_TypeClass_STRING: ++ case typelib_TypeClass_TYPE: ++ case typelib_TypeClass_ANY: ++ case typelib_TypeClass_SEQUENCE: ++ case typelib_TypeClass_INTERFACE: ++ k2 = STRUCT_KIND_DTOR; ++ break; ++ case typelib_TypeClass_STRUCT: ++ { ++ typelib_TypeDescription * td = 0; ++ TYPELIB_DANGER_GET(&td, type->ppTypeRefs[i]); ++ k2 = getStructKind( ++ reinterpret_cast( ++ td)); ++ TYPELIB_DANGER_RELEASE(td); ++ break; ++ } ++ default: ++ assert(false); ++ } ++ switch (k2) { ++ case STRUCT_KIND_EMPTY: ++ // this means an empty sub-object, which nevertheless obtains a byte ++ // of storage (TODO: does it?), so the full object cannot be a ++ // homogenous collection of float or double ++ case STRUCT_KIND_POD: ++ assert(k != STRUCT_KIND_DTOR); ++ k = STRUCT_KIND_POD; ++ break; ++ case STRUCT_KIND_FLOAT: ++ case STRUCT_KIND_DOUBLE: ++ if (k == STRUCT_KIND_EMPTY) { ++ k = k2; ++ } else if (k != k2) { ++ assert(k != STRUCT_KIND_DTOR); ++ k = STRUCT_KIND_POD; ++ } ++ break; ++ case STRUCT_KIND_DTOR: ++ return STRUCT_KIND_DTOR; ++ } ++ } ++ return k; ++} ++ ++} ++ ++namespace abi_aarch64 { ++ ++void mapException( ++ __cxa_exception * exception, uno_Any * any, uno_Mapping * mapping) ++{ ++ assert(exception != 0); ++ OUString unoName(toUnoName(exception->exceptionType->name())); ++ typelib_TypeDescription * td = 0; ++ typelib_typedescription_getByName(&td, unoName.pData); ++ if (td == 0) { ++ css::uno::RuntimeException e( ++ "exception type not found: " + unoName, ++ css::uno::Reference()); ++ uno_type_any_constructAndConvert( ++ any, &e, ++ cppu::UnoType::get().getTypeLibType(), ++ mapping); ++ } else { ++ uno_any_constructAndConvert(any, exception->adjustedPtr, td, mapping); ++ typelib_typedescription_release(td); ++ } ++} ++ ++void raiseException(uno_Any * any, uno_Mapping * mapping) { ++ typelib_TypeDescription * td = 0; ++ TYPELIB_DANGER_GET(&td, any->pType); ++ if (td == 0) { ++ throw css::uno::RuntimeException( ++ "no typedescription for " + OUString(any->pType->pTypeName), ++ css::uno::Reference()); ++ } ++ void * exc = __cxxabiv1::__cxa_allocate_exception(td->nSize); ++ uno_copyAndConvertData(exc, any->pData, td, mapping); ++ uno_any_destruct(any, 0); ++ std::type_info * rtti = getRtti(*td); ++ TYPELIB_DANGER_RELEASE(td); ++ __cxxabiv1::__cxa_throw(exc, rtti, deleteException); ++} ++ ++ReturnKind getReturnKind(typelib_TypeDescription const * type) { ++ switch (type->eTypeClass) { ++ default: ++ assert(false); ++ // fall through to avoid warnings ++ case typelib_TypeClass_VOID: ++ case typelib_TypeClass_BOOLEAN: ++ case typelib_TypeClass_BYTE: ++ case typelib_TypeClass_SHORT: ++ case typelib_TypeClass_UNSIGNED_SHORT: ++ case typelib_TypeClass_LONG: ++ case typelib_TypeClass_UNSIGNED_LONG: ++ case typelib_TypeClass_HYPER: ++ case typelib_TypeClass_UNSIGNED_HYPER: ++ case typelib_TypeClass_FLOAT: ++ case typelib_TypeClass_DOUBLE: ++ case typelib_TypeClass_CHAR: ++ case typelib_TypeClass_ENUM: ++ assert(type->nSize <= 16); ++ return RETURN_KIND_REG; ++ case typelib_TypeClass_STRING: ++ case typelib_TypeClass_TYPE: ++ case typelib_TypeClass_ANY: ++ case typelib_TypeClass_SEQUENCE: ++ case typelib_TypeClass_INTERFACE: ++ return RETURN_KIND_INDIRECT; ++ case typelib_TypeClass_STRUCT: ++ if (type->nSize > 16) { ++ return RETURN_KIND_INDIRECT; ++ } ++ switch (getStructKind( ++ reinterpret_cast( ++ type))) ++ { ++ case STRUCT_KIND_FLOAT: ++ return RETURN_KIND_HFA_FLOAT; ++ case STRUCT_KIND_DOUBLE: ++ return RETURN_KIND_HFA_DOUBLE; ++ case STRUCT_KIND_DTOR: ++ return RETURN_KIND_INDIRECT; ++ default: ++ return RETURN_KIND_REG; ++ } ++ } ++} ++ ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.hxx b/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.hxx +new file mode 100644 +index 0000000..2e3ce61 +--- /dev/null ++++ b/bridges/source/cpp_uno/gcc3_linux_aarch64/abi.hxx +@@ -0,0 +1,87 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ * ++ * This file incorporates work covered by the following license notice: ++ * ++ * Licensed to the Apache Software Foundation (ASF) under one or more ++ * contributor license agreements. See the NOTICE file distributed ++ * with this work for additional information regarding copyright ++ * ownership. The ASF licenses this file to you under the Apache ++ * License, Version 2.0 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.apache.org/licenses/LICENSE-2.0 . ++ */ ++ ++#ifndef INCLUDED_BRIDGES_SOURCE_CPP_UNO_GCC3_LINUX_AARCH64_ABI_HXX ++#define INCLUDED_BRIDGES_SOURCE_CPP_UNO_GCC3_LINUX_AARCH64_ABI_HXX ++ ++#include ++ ++#include ++#include ++ ++#include ++#include ++#include ++ ++namespace abi_aarch64 { ++ ++// Following declarations from libstdc++-v3/libsupc++/unwind-cxx.h and ++// lib/gcc/*-*-*/*/include/unwind.h: ++ ++struct _Unwind_Exception ++{ ++ unsigned exception_class __attribute__((__mode__(__DI__))); ++ void * exception_cleanup; ++ unsigned private_1 __attribute__((__mode__(__word__))); ++ unsigned private_2 __attribute__((__mode__(__word__))); ++} __attribute__((__aligned__)); ++ ++struct __cxa_exception ++{ ++ std::type_info *exceptionType; ++ void (*exceptionDestructor)(void *); ++ ++ std::unexpected_handler unexpectedHandler; ++ std::terminate_handler terminateHandler; ++ ++ __cxa_exception *nextException; ++ ++ int handlerCount; ++ ++ int handlerSwitchValue; ++ const unsigned char *actionRecord; ++ const unsigned char *languageSpecificData; ++ void *catchTemp; ++ void *adjustedPtr; ++ ++ _Unwind_Exception unwindHeader; ++}; ++ ++struct __cxa_eh_globals ++{ ++ __cxa_exception *caughtExceptions; ++ unsigned int uncaughtExceptions; ++}; ++ ++void mapException( ++ __cxa_exception * exception, uno_Any * any, uno_Mapping * mapping); ++ ++void raiseException(uno_Any * any, uno_Mapping * mapping); ++ ++enum ReturnKind { ++ RETURN_KIND_REG, RETURN_KIND_HFA_FLOAT, RETURN_KIND_HFA_DOUBLE, ++ RETURN_KIND_INDIRECT }; ++ ++ReturnKind getReturnKind(typelib_TypeDescription const * type); ++ ++} ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/bridges/source/cpp_uno/gcc3_linux_aarch64/callvirtualfunction.cxx b/bridges/source/cpp_uno/gcc3_linux_aarch64/callvirtualfunction.cxx +new file mode 100644 +index 0000000..09f7696 +--- /dev/null ++++ b/bridges/source/cpp_uno/gcc3_linux_aarch64/callvirtualfunction.cxx +@@ -0,0 +1,66 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ * ++ * This file incorporates work covered by the following license notice: ++ * ++ * Licensed to the Apache Software Foundation (ASF) under one or more ++ * contributor license agreements. See the NOTICE file distributed ++ * with this work for additional information regarding copyright ++ * ownership. The ASF licenses this file to you under the Apache ++ * License, Version 2.0 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.apache.org/licenses/LICENSE-2.0 . ++ */ ++ ++#include ++ ++#include ++ ++#include ++#include ++ ++#include ++ ++void callVirtualFunction( ++ unsigned long function, unsigned long * gpr, unsigned long * fpr, ++ unsigned long * stack, sal_Int32 sp, void * ret) ++{ ++ void * stackargs; ++ if (sp != 0) { ++ stackargs = alloca(((sp + 1) >> 1) * 16); ++ std::memcpy(stackargs, stack, sp * 8); ++ } ++ asm volatile( ++ "ldp x0, x1, [%[gpr_]]\n\t" ++ "ldp x2, x3, [%[gpr_], #16]\n\t" ++ "ldp x4, x5, [%[gpr_], #32]\n\t" ++ "ldp x6, x7, [%[gpr_], #48]\n\t" ++ "ldr x8, %[ret_]\n\t" ++ "ldr x9, %[function_]\n\t" ++ "ldp d0, d1, [%[fpr_]]\n\t" ++ "ldp d2, d3, [%[fpr_], #16]\n\t" ++ "ldp d4, d5, [%[fpr_], #32]\n\t" ++ "ldp d6, d7, [%[fpr_], #48]\n\t" ++ "blr x9\n\t" ++ "stp x0, x1, [%[gpr_]]\n\t" ++ "stp d0, d1, [%[fpr_]]\n\t" ++ "stp d2, d3, [%[fpr_], #16]\n\t" ++ :: [gpr_]"r" (gpr), [fpr_]"r" (fpr), [function_]"m" (function), ++ [ret_]"m" (ret), ++ "m" (stackargs) // dummy input to prevent optimizing the alloca away ++ : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", ++ "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18"/*TODO?*/, "v0", ++ "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11", ++ "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", ++ "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", ++ "memory" ++ // only the bottom 64 bits of v8--15 need to be preserved by callees ++ ); ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/bridges/source/cpp_uno/gcc3_linux_aarch64/callvirtualfunction.hxx b/bridges/source/cpp_uno/gcc3_linux_aarch64/callvirtualfunction.hxx +new file mode 100644 +index 0000000..b1b003f +--- /dev/null ++++ b/bridges/source/cpp_uno/gcc3_linux_aarch64/callvirtualfunction.hxx +@@ -0,0 +1,33 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ * ++ * This file incorporates work covered by the following license notice: ++ * ++ * Licensed to the Apache Software Foundation (ASF) under one or more ++ * contributor license agreements. See the NOTICE file distributed ++ * with this work for additional information regarding copyright ++ * ownership. The ASF licenses this file to you under the Apache ++ * License, Version 2.0 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.apache.org/licenses/LICENSE-2.0 . ++ */ ++ ++#ifndef INCLUDED_BRIDGES_SOURCE_CPP_UNO_GCC3_LINUX_AARCH64_CALLVIRTUALFUNCTION_HXX ++#define INCLUDED_BRIDGES_SOURCE_CPP_UNO_GCC3_LINUX_AARCH64_CALLVIRTUALFUNCTION_HXX ++ ++#include ++ ++#include ++ ++void callVirtualFunction( ++ unsigned long function, unsigned long * gpr, unsigned long * fpr, ++ unsigned long * stack, sal_Int32 sp, void * ret); ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/bridges/source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx b/bridges/source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx +new file mode 100644 +index 0000000..a73d9be +--- /dev/null ++++ b/bridges/source/cpp_uno/gcc3_linux_aarch64/cpp2uno.cxx +@@ -0,0 +1,464 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ * ++ * This file incorporates work covered by the following license notice: ++ * ++ * Licensed to the Apache Software Foundation (ASF) under one or more ++ * contributor license agreements. See the NOTICE file distributed ++ * with this work for additional information regarding copyright ++ * ownership. The ASF licenses this file to you under the Apache ++ * License, Version 2.0 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.apache.org/licenses/LICENSE-2.0 . ++ */ ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++ ++extern "C" void vtableSlotCall_(); ++ ++namespace { ++ ++void call( ++ bridges::cpp_uno::shared::CppInterfaceProxy * proxy, ++ css::uno::TypeDescription const & description, ++ typelib_TypeDescriptionReference * returnType, sal_Int32 count, ++ typelib_MethodParameter * parameters, unsigned long * gpr, ++ unsigned long * fpr, unsigned long * stack, void * indirectRet) ++{ ++ typelib_TypeDescription * rtd = 0; ++ if (returnType != 0) { ++ TYPELIB_DANGER_GET(&rtd, returnType); ++ } ++ abi_aarch64::ReturnKind retKind = rtd == 0 ++ ? abi_aarch64::RETURN_KIND_REG : abi_aarch64::getReturnKind(rtd); ++ bool retConv = rtd != 0 ++ && bridges::cpp_uno::shared::relatesToInterfaceType(rtd); ++ void * retin = retKind == abi_aarch64::RETURN_KIND_INDIRECT && !retConv ++ ? indirectRet : rtd == 0 ? 0 : alloca(rtd->nSize); ++ void ** args = static_cast< void ** >(alloca(count * sizeof (void *))); ++ void ** cppArgs = static_cast< void ** >(alloca(count * sizeof (void *))); ++ typelib_TypeDescription ** argtds = static_cast( ++ alloca(count * sizeof (typelib_TypeDescription *))); ++ sal_Int32 ngpr = 1; ++ sal_Int32 nfpr = 0; ++ sal_Int32 sp = 0; ++ for (sal_Int32 i = 0; i != count; ++i) { ++ if (!parameters[i].bOut ++ && bridges::cpp_uno::shared::isSimpleType(parameters[i].pTypeRef)) ++ { ++ switch (parameters[i].pTypeRef->eTypeClass) { ++ case typelib_TypeClass_BOOLEAN: ++ case typelib_TypeClass_BYTE: ++ case typelib_TypeClass_SHORT: ++ case typelib_TypeClass_UNSIGNED_SHORT: ++ case typelib_TypeClass_LONG: ++ case typelib_TypeClass_UNSIGNED_LONG: ++ case typelib_TypeClass_HYPER: ++ case typelib_TypeClass_UNSIGNED_HYPER: ++ case typelib_TypeClass_CHAR: ++ case typelib_TypeClass_ENUM: ++ args[i] = ngpr == 8 ? stack + sp++ : gpr + ngpr++; ++ break; ++ case typelib_TypeClass_FLOAT: ++ case typelib_TypeClass_DOUBLE: ++ args[i] = nfpr == 8 ? stack + sp++ : fpr + nfpr++; ++ break; ++ default: ++ assert(false); ++ } ++ argtds[i] = 0; ++ } else { ++ cppArgs[i] = reinterpret_cast( ++ ngpr == 8 ? stack[sp++] : gpr[ngpr++]); ++ typelib_TypeDescription * ptd = 0; ++ TYPELIB_DANGER_GET(&ptd, parameters[i].pTypeRef); ++ if (!parameters[i].bIn) { ++ args[i] = alloca(ptd->nSize); ++ argtds[i] = ptd; ++ } else if (bridges::cpp_uno::shared::relatesToInterfaceType(ptd)) { ++ args[i] = alloca(ptd->nSize); ++ uno_copyAndConvertData( ++ args[i], cppArgs[i], ptd, proxy->getBridge()->getCpp2Uno()); ++ argtds[i] = ptd; ++ } else { ++ args[i] = cppArgs[i]; ++ argtds[i] = 0; ++ TYPELIB_DANGER_RELEASE(ptd); ++ } ++ } ++ } ++ uno_Any exc; ++ uno_Any * pexc = &exc; ++ proxy->getUnoI()->pDispatcher( ++ proxy->getUnoI(), description.get(), retin, args, &pexc); ++ if (pexc != 0) { ++ for (sal_Int32 i = 0; i != count; ++i) { ++ if (argtds[i] != 0) { ++ if (parameters[i].bIn) { ++ uno_destructData(args[i], argtds[i], 0); ++ } ++ TYPELIB_DANGER_RELEASE(argtds[i]); ++ } ++ } ++ if (rtd != 0) { ++ TYPELIB_DANGER_RELEASE(rtd); ++ } ++ abi_aarch64::raiseException(&exc, proxy->getBridge()->getUno2Cpp()); ++ } ++ for (sal_Int32 i = 0; i != count; ++i) { ++ if (argtds[i] != 0) { ++ if (parameters[i].bOut) { ++ uno_destructData( ++ cppArgs[i], argtds[i], ++ reinterpret_cast(css::uno::cpp_release)); ++ uno_copyAndConvertData( ++ cppArgs[i], args[i], argtds[i], ++ proxy->getBridge()->getUno2Cpp()); ++ } ++ uno_destructData(args[i], argtds[i], 0); ++ TYPELIB_DANGER_RELEASE(argtds[i]); ++ } ++ } ++ void * retout = 0; // avoid false -Werror=maybe-uninitialized ++ switch (retKind) { ++ case abi_aarch64::RETURN_KIND_REG: ++ switch (rtd == 0 ? typelib_TypeClass_VOID : rtd->eTypeClass) { ++ case typelib_TypeClass_VOID: ++ break; ++ case typelib_TypeClass_BOOLEAN: ++ case typelib_TypeClass_BYTE: ++ case typelib_TypeClass_SHORT: ++ case typelib_TypeClass_UNSIGNED_SHORT: ++ case typelib_TypeClass_LONG: ++ case typelib_TypeClass_UNSIGNED_LONG: ++ case typelib_TypeClass_HYPER: ++ case typelib_TypeClass_UNSIGNED_HYPER: ++ case typelib_TypeClass_CHAR: ++ case typelib_TypeClass_ENUM: ++ std::memcpy(gpr, retin, rtd->nSize); ++ assert(!retConv); ++ break; ++ case typelib_TypeClass_FLOAT: ++ case typelib_TypeClass_DOUBLE: ++ std::memcpy(fpr, retin, rtd->nSize); ++ assert(!retConv); ++ break; ++ case typelib_TypeClass_STRUCT: ++ if (retConv) { ++ retout = gpr; ++ } else { ++ std::memcpy(gpr, retin, rtd->nSize); ++ } ++ break; ++ default: ++ assert(false); ++ } ++ break; ++ case abi_aarch64::RETURN_KIND_HFA_FLOAT: ++ assert(rtd != 0); ++ switch (rtd->nSize) { ++ case 16: ++ std::memcpy(fpr + 3, static_cast(retin) + 12, 4); ++ // fall through ++ case 12: ++ std::memcpy(fpr + 2, static_cast(retin) + 8, 4); ++ // fall through ++ case 8: ++ std::memcpy(fpr + 1, static_cast(retin) + 4, 4); ++ // fall through ++ case 4: ++ std::memcpy(fpr, retin, 4); ++ break; ++ default: ++ assert(false); ++ } ++ assert(!retConv); ++ break; ++ case abi_aarch64::RETURN_KIND_HFA_DOUBLE: ++ assert(rtd != 0); ++ std::memcpy(fpr, retin, rtd->nSize); ++ assert(!retConv); ++ break; ++ case abi_aarch64::RETURN_KIND_INDIRECT: ++ retout = indirectRet; ++ break; ++ } ++ if (retConv) { ++ uno_copyAndConvertData( ++ retout, retin, rtd, proxy->getBridge()->getUno2Cpp()); ++ uno_destructData(retin, rtd, 0); ++ } ++ if (rtd != 0) { ++ TYPELIB_DANGER_RELEASE(rtd); ++ } ++} ++ ++extern "C" void vtableCall( ++ sal_Int32 functionIndex, sal_Int32 vtableOffset, ++ unsigned long * gpr, unsigned long * fpr, unsigned long * stack, ++ void * indirectRet) ++{ ++ bridges::cpp_uno::shared::CppInterfaceProxy * proxy ++ = bridges::cpp_uno::shared::CppInterfaceProxy::castInterfaceToProxy( ++ reinterpret_cast(gpr[0]) - vtableOffset); ++ typelib_InterfaceTypeDescription * type = proxy->getTypeDescr(); ++ assert(functionIndex < type->nMapFunctionIndexToMemberIndex); ++ sal_Int32 pos = type->pMapFunctionIndexToMemberIndex[functionIndex]; ++ css::uno::TypeDescription desc(type->ppAllMembers[pos]); ++ switch (desc.get()->eTypeClass) { ++ case typelib_TypeClass_INTERFACE_ATTRIBUTE: ++ if (type->pMapMemberIndexToFunctionIndex[pos] == functionIndex) { ++ // Getter: ++ call( ++ proxy, desc, ++ reinterpret_cast( ++ desc.get())->pAttributeTypeRef, ++ 0, 0, gpr, fpr, stack, indirectRet); ++ } else { ++ // Setter: ++ typelib_MethodParameter param = { ++ 0, ++ reinterpret_cast( ++ desc.get())->pAttributeTypeRef, ++ true, false }; ++ call(proxy, desc, 0, 1, ¶m, gpr, fpr, stack, indirectRet); ++ } ++ break; ++ case typelib_TypeClass_INTERFACE_METHOD: ++ switch (functionIndex) { ++ case 1: ++ proxy->acquireProxy(); ++ break; ++ case 2: ++ proxy->releaseProxy(); ++ break; ++ case 0: ++ { ++ typelib_TypeDescription * td = 0; ++ TYPELIB_DANGER_GET( ++ &td, ++ (reinterpret_cast(gpr[1]) ++ ->getTypeLibType())); ++ if (td != 0 && td->eTypeClass == typelib_TypeClass_INTERFACE) { ++ css::uno::XInterface * ifc = 0; ++ proxy->getBridge()->getCppEnv()->getRegisteredInterface( ++ proxy->getBridge()->getCppEnv(), ++ reinterpret_cast(&ifc), proxy->getOid().pData, ++ reinterpret_cast( ++ td)); ++ if (ifc != 0) { ++ uno_any_construct( ++ reinterpret_cast(indirectRet), &ifc, td, ++ reinterpret_cast( ++ css::uno::cpp_acquire)); ++ ifc->release(); ++ TYPELIB_DANGER_RELEASE(td); ++ break; ++ } ++ TYPELIB_DANGER_RELEASE(td); ++ } ++ } ++ // fall through ++ default: ++ call( ++ proxy, desc, ++ reinterpret_cast( ++ desc.get())->pReturnTypeRef, ++ reinterpret_cast( ++ desc.get())->nParams, ++ reinterpret_cast( ++ desc.get())->pParams, ++ gpr, fpr, stack, indirectRet); ++ } ++ break; ++ default: ++ assert(false); ++ } ++} ++ ++struct aarch64_va_list { ++ void * stack; ++ void * gr_top; ++ void * vr_top; ++ int gr_offs; ++ int vr_offs; ++}; ++ ++#pragma GCC diagnostic push ++#pragma GCC diagnostic ignored "-Wvolatile-register-var" ++extern "C" void vtableSlotCall( ++ unsigned long gpr0, unsigned long gpr1, unsigned long gpr2, ++ unsigned long gpr3, unsigned long gpr4, unsigned long gpr5, ++ unsigned long gpr6, unsigned long gpr7, double fpr0, double fpr1, ++ double fpr2, double fpr3, double fpr4, double fpr5, double fpr6, ++ double fpr7, ...) ++{ ++ register void * volatile indirectRet asm ("x8"); ++ register sal_Int32 volatile functionIndex asm ("x9"); ++ register sal_Int32 volatile vtableOffset asm ("x10"); ++ va_list ap; ++ va_start(ap, fpr7); ++ assert(sizeof (va_list) == sizeof (aarch64_va_list)); ++ unsigned long gpr[8]; ++ gpr[0] = gpr0; ++ gpr[1] = gpr1; ++ gpr[2] = gpr2; ++ gpr[3] = gpr3; ++ gpr[4] = gpr4; ++ gpr[5] = gpr5; ++ gpr[6] = gpr6; ++ gpr[7] = gpr7; ++ double fpr[8]; ++ fpr[0] = fpr0; ++ fpr[1] = fpr1; ++ fpr[2] = fpr2; ++ fpr[3] = fpr3; ++ fpr[4] = fpr4; ++ fpr[5] = fpr5; ++ fpr[6] = fpr6; ++ fpr[7] = fpr7; ++ vtableCall( ++ functionIndex, vtableOffset, gpr, ++ reinterpret_cast(fpr), ++ static_cast( ++ reinterpret_cast(&ap)->stack), ++ indirectRet); ++ asm volatile( ++ "ldp x0, x1, [%[gpr_]]\n\t" ++ "ldp d0, d1, [%[fpr_]]\n\t" ++ "ldp d2, d3, [%[fpr_], #16]\n\t" ++ :: [gpr_]"r" (gpr), [fpr_]"r" (fpr) ++ : "r0", "r1", "v0", "v1", "v2", "v3"); ++} ++#pragma GCC diagnostic pop ++ ++std::size_t const codeSnippetSize = 8 * 4; ++ ++unsigned char * generateCodeSnippet( ++ unsigned char * code, sal_Int32 functionIndex, sal_Int32 vtableOffset) ++{ ++ // movz x9, ++ reinterpret_cast(code)[0] = 0xD2800009 ++ | ((functionIndex & 0xFFFF) << 5); ++ // movk x9, , LSL #16 ++ reinterpret_cast(code)[1] = 0xF2A00009 ++ | ((functionIndex >> 16) << 5); ++ // movz x10, ++ reinterpret_cast(code)[2] = 0xD280000A ++ | ((vtableOffset & 0xFFFF) << 5); ++ // movk x10, , LSL #16 ++ reinterpret_cast(code)[3] = 0xF2A0000A ++ | ((vtableOffset >> 16) << 5); ++ // ldr x11, +2*4 ++ reinterpret_cast(code)[4] = 0x5800004B; ++ // br x11 ++ reinterpret_cast(code)[5] = 0xD61F0160; ++ reinterpret_cast(code)[3] ++ = reinterpret_cast(&vtableSlotCall); ++ return code + codeSnippetSize; ++} ++ ++} ++ ++struct bridges::cpp_uno::shared::VtableFactory::Slot { void * fn; }; ++ ++bridges::cpp_uno::shared::VtableFactory::Slot * ++bridges::cpp_uno::shared::VtableFactory::mapBlockToVtable(void * block) { ++ return static_cast(block) + 2; ++} ++ ++sal_Size bridges::cpp_uno::shared::VtableFactory::getBlockSize( ++ sal_Int32 slotCount) ++{ ++ return (slotCount + 2) * sizeof (Slot) + slotCount * codeSnippetSize; ++} ++ ++bridges::cpp_uno::shared::VtableFactory::Slot * ++bridges::cpp_uno::shared::VtableFactory::initializeBlock( ++ void * block, sal_Int32 slotCount) ++{ ++ Slot * slots = mapBlockToVtable(block); ++ slots[-2].fn = 0; ++ slots[-1].fn = 0; ++ return slots + slotCount; ++} ++ ++unsigned char * bridges::cpp_uno::shared::VtableFactory::addLocalFunctions( ++ Slot ** slots, unsigned char * code, sal_PtrDiff writetoexecdiff, ++ typelib_InterfaceTypeDescription const * type, sal_Int32 functionOffset, ++ sal_Int32 functionCount, sal_Int32 vtableOffset) ++{ ++ (*slots) -= functionCount; ++ Slot * s = *slots; ++ for (sal_Int32 i = 0; i != type->nMembers; ++i) { ++ typelib_TypeDescription * td = 0; ++ TYPELIB_DANGER_GET(&td, type->ppMembers[i]); ++ assert(td != 0); ++ switch (td->eTypeClass) { ++ case typelib_TypeClass_INTERFACE_ATTRIBUTE: ++ { ++ typelib_InterfaceAttributeTypeDescription * atd ++ = reinterpret_cast< ++ typelib_InterfaceAttributeTypeDescription *>(td); ++ // Getter: ++ (s++)->fn = code + writetoexecdiff; ++ code = generateCodeSnippet( ++ code, functionOffset++, vtableOffset); ++ // Setter: ++ if (!atd->bReadOnly) { ++ (s++)->fn = code + writetoexecdiff; ++ code = generateCodeSnippet( ++ code, functionOffset++, vtableOffset); ++ } ++ break; ++ } ++ case typelib_TypeClass_INTERFACE_METHOD: ++ (s++)->fn = code + writetoexecdiff; ++ code = generateCodeSnippet(code, functionOffset++, vtableOffset); ++ break; ++ default: ++ assert(false); ++ } ++ TYPELIB_DANGER_RELEASE(td); ++ } ++ return code; ++} ++ ++void bridges::cpp_uno::shared::VtableFactory::flushCode( ++ unsigned char const * begin, unsigned char const * end) ++{ ++ static void (*clear_cache)(unsigned char const *, unsigned char const *) ++ = (void (*)(unsigned char const *, unsigned char const *)) dlsym( ++ RTLD_DEFAULT, "__clear_cache"); ++ (*clear_cache)(begin, end); ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/bridges/source/cpp_uno/gcc3_linux_aarch64/uno2cpp.cxx b/bridges/source/cpp_uno/gcc3_linux_aarch64/uno2cpp.cxx +new file mode 100644 +index 0000000..9c9a24a +--- /dev/null ++++ b/bridges/source/cpp_uno/gcc3_linux_aarch64/uno2cpp.cxx +@@ -0,0 +1,376 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ * ++ * This file incorporates work covered by the following license notice: ++ * ++ * Licensed to the Apache Software Foundation (ASF) under one or more ++ * contributor license agreements. See the NOTICE file distributed ++ * with this work for additional information regarding copyright ++ * ownership. The ASF licenses this file to you under the Apache ++ * License, Version 2.0 (the "License"); you may not use this file ++ * except in compliance with the License. You may obtain a copy of ++ * the License at http://www.apache.org/licenses/LICENSE-2.0 . ++ */ ++ ++#include ++ ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++namespace { ++ ++void pushArgument( ++ unsigned long value, unsigned long * stack, sal_Int32 * sp, ++ unsigned long * regs, sal_Int32 * nregs) ++{ ++ (*nregs != 8 ? regs[(*nregs)++] : stack[(*sp)++]) = value; ++} ++ ++void call( ++ bridges::cpp_uno::shared::UnoInterfaceProxy * proxy, ++ bridges::cpp_uno::shared::VtableSlot slot, ++ typelib_TypeDescriptionReference * returnType, sal_Int32 count, ++ typelib_MethodParameter * parameters, void * returnValue, void ** arguments, ++ uno_Any ** exception) ++{ ++ typelib_TypeDescription * rtd = 0; ++ TYPELIB_DANGER_GET(&rtd, returnType); ++ abi_aarch64::ReturnKind retKind = abi_aarch64::getReturnKind(rtd); ++ bool retConv = bridges::cpp_uno::shared::relatesToInterfaceType(rtd); ++ void * ret = retConv ? alloca(rtd->nSize) : returnValue; ++ unsigned long ** thisPtr ++ = reinterpret_cast(proxy->getCppI()) + slot.offset; ++ unsigned long * stack = static_cast( ++ alloca(count * sizeof (unsigned long))); ++ sal_Int32 sp = 0; ++ unsigned long gpr[8]; ++ sal_Int32 ngpr = 0; ++ unsigned long fpr[8]; ++ sal_Int32 nfpr = 0; ++ gpr[ngpr++] = reinterpret_cast(thisPtr); ++ void ** cppArgs = static_cast(alloca(count * sizeof (void *))); ++ typelib_TypeDescription ** ptds = ++ static_cast( ++ alloca(count * sizeof (typelib_TypeDescription *))); ++ for (sal_Int32 i = 0; i != count; ++i) { ++ if (!parameters[i].bOut && ++ bridges::cpp_uno::shared::isSimpleType(parameters[i].pTypeRef)) ++ { ++ cppArgs[i] = 0; ++ switch (parameters[i].pTypeRef->eTypeClass) { ++ case typelib_TypeClass_BOOLEAN: ++ pushArgument( ++ *static_cast(arguments[i]), stack, &sp, gpr, ++ &ngpr); ++ break; ++ case typelib_TypeClass_BYTE: ++ pushArgument( ++ *static_cast(arguments[i]), stack, &sp, gpr, ++ &ngpr); ++ break; ++ case typelib_TypeClass_SHORT: ++ pushArgument( ++ *static_cast(arguments[i]), stack, &sp, gpr, ++ &ngpr); ++ break; ++ case typelib_TypeClass_UNSIGNED_SHORT: ++ pushArgument( ++ *static_cast(arguments[i]), stack, &sp, gpr, ++ &ngpr); ++ break; ++ case typelib_TypeClass_LONG: ++ case typelib_TypeClass_ENUM: ++ pushArgument( ++ *static_cast(arguments[i]), stack, &sp, gpr, ++ &ngpr); ++ break; ++ case typelib_TypeClass_UNSIGNED_LONG: ++ pushArgument( ++ *static_cast(arguments[i]), stack, &sp, gpr, ++ &ngpr); ++ break; ++ case typelib_TypeClass_HYPER: ++ pushArgument( ++ *static_cast(arguments[i]), stack, &sp, gpr, ++ &ngpr); ++ break; ++ case typelib_TypeClass_UNSIGNED_HYPER: ++ pushArgument( ++ *static_cast(arguments[i]), stack, &sp, gpr, ++ &ngpr); ++ break; ++ case typelib_TypeClass_FLOAT: ++ pushArgument( ++ *static_cast(arguments[i]), stack, &sp, fpr, ++ &nfpr); ++ break; ++ case typelib_TypeClass_DOUBLE: ++ pushArgument( ++ *static_cast(arguments[i]), stack, &sp, ++ fpr, &nfpr); ++ break; ++ case typelib_TypeClass_CHAR: ++ pushArgument( ++ *static_cast(arguments[i]), stack, &sp, gpr, ++ &ngpr); ++ break; ++ default: ++ assert(false); ++ } ++ } else { ++ typelib_TypeDescription * ptd = 0; ++ TYPELIB_DANGER_GET(&ptd, parameters[i].pTypeRef); ++ if (!parameters[i].bIn) { ++ cppArgs[i] = alloca(ptd->nSize); ++ uno_constructData(cppArgs[i], ptd); ++ ptds[i] = ptd; ++ pushArgument( ++ reinterpret_cast(cppArgs[i]), stack, &sp, ++ gpr, &ngpr); ++ } else if (bridges::cpp_uno::shared::relatesToInterfaceType(ptd)) { ++ cppArgs[i] = alloca(ptd->nSize); ++ uno_copyAndConvertData( ++ cppArgs[i], arguments[i], ptd, ++ proxy->getBridge()->getUno2Cpp()); ++ ptds[i] = ptd; ++ pushArgument( ++ reinterpret_cast(cppArgs[i]), stack, &sp, ++ gpr, &ngpr); ++ } else { ++ cppArgs[i] = 0; ++ pushArgument( ++ reinterpret_cast(arguments[i]), stack, &sp, ++ gpr, &ngpr); ++ TYPELIB_DANGER_RELEASE(ptd); ++ } ++ } ++ } ++ try { ++ try { ++ callVirtualFunction( ++ (*thisPtr)[slot.index], gpr, fpr, stack, sp, ret); ++ } catch (css::uno::Exception &) { ++ throw; ++ } catch (std::exception & e) { ++ throw css::uno::RuntimeException( ++ ("C++ code threw " ++ + OStringToOUString(typeid(e).name(), RTL_TEXTENCODING_UTF8) ++ + ": " + OStringToOUString(e.what(), RTL_TEXTENCODING_UTF8)), ++ css::uno::Reference()); ++ } catch (...) { ++ throw css::uno::RuntimeException( ++ "C++ code threw unknown exception", ++ css::uno::Reference()); ++ } ++ } catch (css::uno::Exception &) { ++ abi_aarch64::mapException( ++ reinterpret_cast( ++ __cxxabiv1::__cxa_get_globals())->caughtExceptions, ++ *exception, proxy->getBridge()->getCpp2Uno()); ++ for (sal_Int32 i = 0; i != count; ++i) { ++ if (cppArgs[i] != 0) { ++ uno_destructData( ++ cppArgs[i], ptds[i], ++ reinterpret_cast(css::uno::cpp_release)); ++ TYPELIB_DANGER_RELEASE(ptds[i]); ++ } ++ } ++ TYPELIB_DANGER_RELEASE(rtd); ++ return; ++ } ++ *exception = 0; ++ for (sal_Int32 i = 0; i != count; ++i) { ++ if (cppArgs[i] != 0) { ++ if (parameters[i].bOut) { ++ if (parameters[i].bIn) { ++ uno_destructData(arguments[i], ptds[i], 0); ++ } ++ uno_copyAndConvertData( ++ arguments[i], cppArgs[i], ptds[i], ++ proxy->getBridge()->getCpp2Uno()); ++ } ++ uno_destructData( ++ cppArgs[i], ptds[i], ++ reinterpret_cast(css::uno::cpp_release)); ++ TYPELIB_DANGER_RELEASE(ptds[i]); ++ } ++ } ++ switch (retKind) { ++ case abi_aarch64::RETURN_KIND_REG: ++ switch (rtd->eTypeClass) { ++ case typelib_TypeClass_VOID: ++ break; ++ case typelib_TypeClass_BOOLEAN: ++ case typelib_TypeClass_BYTE: ++ case typelib_TypeClass_SHORT: ++ case typelib_TypeClass_UNSIGNED_SHORT: ++ case typelib_TypeClass_LONG: ++ case typelib_TypeClass_UNSIGNED_LONG: ++ case typelib_TypeClass_HYPER: ++ case typelib_TypeClass_UNSIGNED_HYPER: ++ case typelib_TypeClass_CHAR: ++ case typelib_TypeClass_ENUM: ++ case typelib_TypeClass_STRUCT: ++ std::memcpy(ret, gpr, rtd->nSize); ++ break; ++ case typelib_TypeClass_FLOAT: ++ case typelib_TypeClass_DOUBLE: ++ std::memcpy(ret, fpr, rtd->nSize); ++ break; ++ default: ++ assert(false); ++ } ++ break; ++ case abi_aarch64::RETURN_KIND_HFA_FLOAT: ++ switch (rtd->nSize) { ++ case 16: ++ std::memcpy(static_cast(ret) + 12, fpr + 3, 4); ++ // fall through ++ case 12: ++ std::memcpy(static_cast(ret) + 8, fpr + 2, 4); ++ // fall through ++ case 8: ++ std::memcpy(static_cast(ret) + 4, fpr + 1, 4); ++ // fall through ++ case 4: ++ std::memcpy(ret, fpr, 4); ++ break; ++ default: ++ assert(false); ++ } ++ break; ++ case abi_aarch64::RETURN_KIND_HFA_DOUBLE: ++ std::memcpy(ret, fpr, rtd->nSize); ++ break; ++ case abi_aarch64::RETURN_KIND_INDIRECT: ++ break; ++ } ++ if (retConv) { ++ uno_copyAndConvertData( ++ returnValue, ret, rtd, proxy->getBridge()->getCpp2Uno()); ++ uno_destructData( ++ ret, rtd, reinterpret_cast(css::uno::cpp_release)); ++ } ++ TYPELIB_DANGER_RELEASE(rtd); ++} ++ ++} ++ ++namespace bridges { namespace cpp_uno { namespace shared { ++ ++void unoInterfaceProxyDispatch( ++ uno_Interface * pUnoI, typelib_TypeDescription const * pMemberDescr, ++ void * pReturn, void ** pArgs, uno_Any ** ppException) ++{ ++ UnoInterfaceProxy * proxy = static_cast(pUnoI); ++ switch (pMemberDescr->eTypeClass) { ++ case typelib_TypeClass_INTERFACE_ATTRIBUTE: ++ { ++ typelib_InterfaceAttributeTypeDescription const * atd ++ = reinterpret_cast< ++ typelib_InterfaceAttributeTypeDescription const *>( ++ pMemberDescr); ++ VtableSlot slot(getVtableSlot(atd)); ++ if (pReturn != 0) { // getter ++ call( ++ proxy, slot, atd->pAttributeTypeRef, 0, 0, pReturn, pArgs, ++ ppException); ++ } else { // setter ++ typelib_MethodParameter param = { ++ 0, atd->pAttributeTypeRef, true, false }; ++ typelib_TypeDescriptionReference * rtd = 0; ++ typelib_typedescriptionreference_new( ++ &rtd, typelib_TypeClass_VOID, OUString("void").pData); ++ slot.index += 1; ++ call(proxy, slot, rtd, 1, ¶m, pReturn, pArgs, ppException); ++ typelib_typedescriptionreference_release(rtd); ++ } ++ break; ++ } ++ case typelib_TypeClass_INTERFACE_METHOD: ++ { ++ typelib_InterfaceMethodTypeDescription const * mtd ++ = reinterpret_cast< ++ typelib_InterfaceMethodTypeDescription const *>( ++ pMemberDescr); ++ VtableSlot slot(getVtableSlot(mtd)); ++ switch (slot.index) { ++ case 1: ++ pUnoI->acquire(pUnoI); ++ *ppException = 0; ++ break; ++ case 2: ++ pUnoI->release(pUnoI); ++ *ppException = 0; ++ break; ++ case 0: ++ { ++ typelib_TypeDescription * td = 0; ++ TYPELIB_DANGER_GET( ++ &td, ++ (reinterpret_cast(pArgs[0]) ++ ->getTypeLibType())); ++ if (td != 0) { ++ uno_Interface * ifc = 0; ++ proxy->pBridge->getUnoEnv()->getRegisteredInterface( ++ proxy->pBridge->getUnoEnv(), ++ reinterpret_cast(&ifc), proxy->oid.pData, ++ reinterpret_cast< ++ typelib_InterfaceTypeDescription *>(td)); ++ if (ifc != 0) { ++ uno_any_construct( ++ reinterpret_cast(pReturn), &ifc, td, ++ 0); ++ ifc->release(ifc); ++ TYPELIB_DANGER_RELEASE(td); ++ *ppException = 0; ++ break; ++ } ++ TYPELIB_DANGER_RELEASE(td); ++ } ++ } ++ // fall through ++ default: ++ call( ++ proxy, slot, mtd->pReturnTypeRef, mtd->nParams, ++ mtd->pParams, pReturn, pArgs, ppException); ++ break; ++ } ++ break; ++ } ++ default: ++ assert(false); ++ } ++} ++ ++} } } ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/configure.ac b/configure.ac +index 5ead2a0..826797f8 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -4292,6 +4292,12 @@ linux-gnu*) + + case "$host_cpu" in + ++ aarch64) ++ CPUNAME=AARCH64 ++ PLATFORMID=linux_aarch64 ++ RTL_ARCH=AARCH64 ++ OUTPATH=unxlngaarch64 ++ ;; + alpha) + CPUNAME=AXP + RTL_ARCH=ALPHA +diff --git a/desktop/source/deployment/misc/dp_platform.cxx b/desktop/source/deployment/misc/dp_platform.cxx +index 09b3fcd..6b04004 100644 +--- a/desktop/source/deployment/misc/dp_platform.cxx ++++ b/desktop/source/deployment/misc/dp_platform.cxx +@@ -45,7 +45,7 @@ + #define PLATFORM_LINUX_S390x "linux_s390x" + #define PLATFORM_LINUX_HPPA "linux_hppa" + #define PLATFORM_LINUX_ALPHA "linux_alpha" +- ++#define PLATFORM_LINUX_AARCH64 "linux_aarch64" + + + #define PLATFORM_SOLARIS_SPARC "solaris_sparc" +@@ -149,6 +149,8 @@ namespace + ret = checkOSandCPU("Linux", "HPPA"); + else if (token == PLATFORM_LINUX_ALPHA) + ret = checkOSandCPU("Linux", "ALPHA"); ++ else if (token == PLATFORM_LINUX_AARCH64) ++ ret = checkOSandCPU("Linux", "AARCH64"); + else if (token == PLATFORM_SOLARIS_SPARC) + ret = checkOSandCPU("Solaris", "SPARC"); + else if (token == PLATFORM_SOLARIS_SPARC64) +diff --git a/jvmfwk/plugins/sunmajor/pluginlib/vendorbase.hxx b/jvmfwk/plugins/sunmajor/pluginlib/vendorbase.hxx +index 25baaee5..29f2641 100644 +--- a/jvmfwk/plugins/sunmajor/pluginlib/vendorbase.hxx ++++ b/jvmfwk/plugins/sunmajor/pluginlib/vendorbase.hxx +@@ -65,6 +65,8 @@ OpenJDK at least, but probably not true for Lemotes JDK */ + #define JFW_PLUGIN_ARCH "parisc" + #elif defined AXP + #define JFW_PLUGIN_ARCH "alpha" ++#elif defined AARCH64 ++#define JFW_PLUGIN_ARCH "aarch64" + #else // SPARC, INTEL, POWERPC, MIPS, ARM, IA64, M68K, HPPA, ALPHA + #error unknown platform + #endif // SPARC, INTEL, POWERPC, MIPS, ARM, IA64, M68K, HPPA, ALPHA +diff --git a/solenv/gbuild/platform/LINUX_AARCH64_GCC.mk b/solenv/gbuild/platform/LINUX_AARCH64_GCC.mk +new file mode 100644 +index 0000000..682199e +--- /dev/null ++++ b/solenv/gbuild/platform/LINUX_AARCH64_GCC.mk +@@ -0,0 +1,14 @@ ++# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- ++# ++# This file is part of the LibreOffice project. ++# ++# This Source Code Form is subject to the terms of the Mozilla Public ++# License, v. 2.0. If a copy of the MPL was not distributed with this ++# file, You can obtain one at http://mozilla.org/MPL/2.0/. ++# ++ ++gb_COMPILERDEFAULTOPTFLAGS := -Os ++ ++include $(GBUILDDIR)/platform/linux.mk ++ ++# vim: set noet sw=4: +-- +1.9.3 + diff --git a/SOURCES/0002-fdo-72645-Allow-GETPIVOTDATA-to-get-result-from-leaf.patch b/SOURCES/0002-fdo-72645-Allow-GETPIVOTDATA-to-get-result-from-leaf.patch deleted file mode 100644 index 9027911..0000000 --- a/SOURCES/0002-fdo-72645-Allow-GETPIVOTDATA-to-get-result-from-leaf.patch +++ /dev/null @@ -1,213 +0,0 @@ -From 83eb0b64980b405bc94ed19f3bcb60860f86e7d4 Mon Sep 17 00:00:00 2001 -From: Kohei Yoshida -Date: Mon, 6 Jan 2014 23:45:46 -0500 -Subject: [PATCH 2/9] fdo#72645: Allow GETPIVOTDATA to get result from leaf - node of result tree. - -Change-Id: I0fc1fd069440ed6fee378fc2dfd2ed761afbdeab -Reviewed-on: https://gerrit.libreoffice.org/7284 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - sc/inc/dpresfilter.hxx | 12 ++++++++++ - sc/source/core/data/dpobject.cxx | 4 ++-- - sc/source/core/data/dpresfilter.cxx | 44 +++++++++++++++++++++++++++++++++++++ - sc/source/core/data/dptabsrc.cxx | 28 +++++++++++++++++------ - 4 files changed, 79 insertions(+), 9 deletions(-) - -diff --git a/sc/inc/dpresfilter.hxx b/sc/inc/dpresfilter.hxx -index be84b8c..bc7ffc1 100644 ---- a/sc/inc/dpresfilter.hxx -+++ b/sc/inc/dpresfilter.hxx -@@ -15,6 +15,7 @@ - #include - #include - #include -+#include - - - namespace com { namespace sun { namespace star { namespace sheet { -@@ -85,6 +86,15 @@ private: - #endif - }; - -+ typedef std::pair NamePairType; -+ -+ struct NamePairHash -+ { -+ size_t operator() (const NamePairType& rPair) const; -+ }; -+ typedef boost::unordered_map LeafValuesType; -+ LeafValuesType maLeafValues; -+ - OUString maPrimaryDimName; - MemberNode* mpRoot; - -@@ -115,6 +125,8 @@ public: - const com::sun::star::uno::Sequence< - com::sun::star::sheet::DataPilotFieldFilter>& rFilters) const; - -+ double getLeafResult(const com::sun::star::sheet::DataPilotFieldFilter& rFilter) const; -+ - #if DEBUG_PIVOT_TABLE - void dump() const; - #endif -diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx -index 653bc0c..3d9f5af 100644 ---- a/sc/source/core/data/dpobject.cxx -+++ b/sc/source/core/data/dpobject.cxx -@@ -1328,8 +1328,8 @@ public: - { - // Layout name takes precedence. - const OUString* pLayoutName = pDim->GetLayoutName(); -- if (pLayoutName) -- return *pLayoutName == maName; -+ if (pLayoutName && *pLayoutName == maName) -+ return true; - - sheet::GeneralFunction eGenFunc = static_cast(pDim->GetFunction()); - ScSubTotalFunc eFunc = ScDPUtil::toSubTotalFunc(eGenFunc); -diff --git a/sc/source/core/data/dpresfilter.cxx b/sc/source/core/data/dpresfilter.cxx -index 968be6b..41b2d7e 100644 ---- a/sc/source/core/data/dpresfilter.cxx -+++ b/sc/source/core/data/dpresfilter.cxx -@@ -10,6 +10,8 @@ - #include "dpresfilter.hxx" - #include "global.hxx" - -+#include -+ - #include - - using namespace com::sun::star; -@@ -21,6 +23,12 @@ ScDPResultFilter::ScDPResultFilter(const OUString& rDimName, bool bDataLayout) : - ScDPResultFilterContext::ScDPResultFilterContext() : - mnCol(0), mnRow(0) {} - -+size_t ScDPResultTree::NamePairHash::operator() (const NamePairType& rPair) const -+{ -+ OUStringHash aHash; -+ return aHash(rPair.first) + aHash(rPair.second); -+} -+ - ScDPResultTree::DimensionNode::DimensionNode(const MemberNode* pParent) : - mpParent(pParent) {} - -@@ -89,6 +97,8 @@ void ScDPResultTree::add( - { - // TODO: I'll work on the col / row to value node mapping later. - -+ const OUString* pDimName = NULL; -+ const OUString* pMemName = NULL; - MemberNode* pMemNode = mpRoot; - - std::vector::const_iterator itFilter = rFilters.begin(), itFilterEnd = rFilters.end(); -@@ -117,6 +127,8 @@ void ScDPResultTree::add( - itDim = r.first; - } - -+ pDimName = &itDim->first; -+ - // Now, see if this dimension member exists. - DimensionNode* pDim = itDim->second; - MembersType& rMembers = pDim->maChildMembers; -@@ -135,9 +147,26 @@ void ScDPResultTree::add( - itMem = r.first; - } - -+ pMemName = &itMem->first; - pMemNode = itMem->second; - } - -+ if (pDimName && pMemName) -+ { -+ NamePairType aNames(*pDimName, *pMemName); -+ LeafValuesType::iterator it = maLeafValues.find(aNames); -+ if (it == maLeafValues.end()) -+ { -+ // This name pair doesn't exist. Associate a new value for it. -+ maLeafValues.insert(LeafValuesType::value_type(aNames, fVal)); -+ } -+ else -+ { -+ // This name pair already exists. Set the value to NaN. -+ rtl::math::setNan(&it->second); -+ } -+ } -+ - pMemNode->maValues.push_back(fVal); - } - -@@ -145,6 +174,7 @@ void ScDPResultTree::swap(ScDPResultTree& rOther) - { - std::swap(maPrimaryDimName, rOther.maPrimaryDimName); - std::swap(mpRoot, rOther.mpRoot); -+ maLeafValues.swap(rOther.maLeafValues); - } - - bool ScDPResultTree::empty() const -@@ -184,6 +214,20 @@ const ScDPResultTree::ValuesType* ScDPResultTree::getResults( - return &pMember->maValues; - } - -+double ScDPResultTree::getLeafResult(const com::sun::star::sheet::DataPilotFieldFilter& rFilter) const -+{ -+ NamePairType aPair(rFilter.FieldName, rFilter.MatchValue); -+ LeafValuesType::const_iterator it = maLeafValues.find(aPair); -+ if (it != maLeafValues.end()) -+ // Found! -+ return it->second; -+ -+ // Not found. Return an NaN. -+ double fNan; -+ rtl::math::setNan(&fNan); -+ return fNan; -+} -+ - #if DEBUG_PIVOT_TABLE - void ScDPResultTree::dump() const - { -diff --git a/sc/source/core/data/dptabsrc.cxx b/sc/source/core/data/dptabsrc.cxx -index 96fe330..08df85d 100644 ---- a/sc/source/core/data/dptabsrc.cxx -+++ b/sc/source/core/data/dptabsrc.cxx -@@ -423,15 +423,29 @@ uno::Sequence ScDPSource::getFilteredResults( - - // Get result values from the tree. - const ScDPResultTree::ValuesType* pVals = maResFilterSet.getResults(aFilters); -- if (!pVals) -- return uno::Sequence(); -+ if (pVals) -+ { -+ size_t n = pVals->size(); -+ uno::Sequence aRet(n); -+ for (size_t i = 0; i < n; ++i) -+ aRet[i] = (*pVals)[i]; - -- size_t n = pVals->size(); -- uno::Sequence aRet(n); -- for (size_t i = 0; i < n; ++i) -- aRet[i] = (*pVals)[i]; -+ return aRet; -+ } - -- return aRet; -+ if (aFilters.getLength() == 1) -+ { -+ // Try to get result from the leaf nodes. -+ double fVal = maResFilterSet.getLeafResult(aFilters[0]); -+ if (!rtl::math::isNan(fVal)) -+ { -+ uno::Sequence aRet(1); -+ aRet[0] = fVal; -+ return aRet; -+ } -+ } -+ -+ return uno::Sequence(); - } - - void SAL_CALL ScDPSource::refresh() throw(uno::RuntimeException) --- -1.8.4.2 - diff --git a/SOURCES/0002-localized-GetFullName.patch b/SOURCES/0002-localized-GetFullName.patch new file mode 100644 index 0000000..ff4d777 --- /dev/null +++ b/SOURCES/0002-localized-GetFullName.patch @@ -0,0 +1,77 @@ +From 848ee355904db1453f343c8257a86635c1dddcac Mon Sep 17 00:00:00 2001 +From: Andras Timar +Date: Wed, 9 Jul 2014 11:44:32 +0200 +Subject: [PATCH 002/137] localized GetFullName() + +Change-Id: I4f2bffadef3db1bd07432202525734ab9b0cb0de +(cherry picked from commit 33c36fb9fbc69bbc32088532dd21db7153aee09d) +--- + unotools/source/config/useroptions.cxx | 38 ++++++++++++++++++++++++++++------ + 1 file changed, 32 insertions(+), 6 deletions(-) + +diff --git a/unotools/source/config/useroptions.cxx b/unotools/source/config/useroptions.cxx +index 01ae9e6..1dadaf3 100644 +--- a/unotools/source/config/useroptions.cxx ++++ b/unotools/source/config/useroptions.cxx +@@ -19,7 +19,7 @@ + + + #include +- ++#include + #include + #include + #include +@@ -39,6 +39,7 @@ + #include + #include + #include ++#include + + using namespace utl; + using namespace com::sun::star; +@@ -210,11 +211,36 @@ void SvtUserOptions::Impl::SetToken (sal_uInt16 nToken, OUString const& sToken) + + OUString SvtUserOptions::Impl::GetFullName () const + { +- // TODO international name +- OUString sFullName = GetToken(USER_OPT_FIRSTNAME).trim(); +- if (!sFullName.isEmpty()) +- sFullName += " "; +- sFullName += GetToken(USER_OPT_LASTNAME).trim(); ++ OUString sFullName; ++ switch (LanguageType const eLang = SvtSysLocale().GetUILanguageTag().getLanguageType()) ++ { ++ case LANGUAGE_RUSSIAN: ++ sFullName = GetToken(USER_OPT_FIRSTNAME).trim(); ++ if (!sFullName.isEmpty()) ++ sFullName += " "; ++ sFullName += GetToken(USER_OPT_FATHERSNAME).trim(); ++ if (!sFullName.isEmpty()) ++ sFullName += " "; ++ sFullName += GetToken(USER_OPT_LASTNAME).trim(); ++ break; ++ default: ++ if (MsLangId::isFamilyNameFirst(eLang)) ++ { ++ sFullName = GetToken(USER_OPT_LASTNAME).trim(); ++ if (!sFullName.isEmpty()) ++ sFullName += " "; ++ sFullName += GetToken(USER_OPT_FIRSTNAME).trim(); ++ } ++ else ++ { ++ sFullName = GetToken(USER_OPT_FIRSTNAME).trim(); ++ if (!sFullName.isEmpty()) ++ sFullName += " "; ++ sFullName += GetToken(USER_OPT_LASTNAME).trim(); ++ } ++ break; ++ } ++ + return sFullName; + } + +-- +1.9.3 + diff --git a/SOURCES/0003-Resolves-i119287-corrected-default-style-for-draw-ob.patch b/SOURCES/0003-Resolves-i119287-corrected-default-style-for-draw-ob.patch new file mode 100644 index 0000000..c77808d --- /dev/null +++ b/SOURCES/0003-Resolves-i119287-corrected-default-style-for-draw-ob.patch @@ -0,0 +1,62 @@ +From 2b8f66388450fcf7fb2f8087ee7c66c142fe72c0 Mon Sep 17 00:00:00 2001 +From: Armin Le Grand +Date: Wed, 9 Jul 2014 11:57:21 +0000 +Subject: [PATCH 003/137] Resolves: #i119287# corrected default style for draw + objects... + +created using UNO API + +(cherry picked from commit d07778f62ed386672a60ef7570a89b5fa109e026) + +Conflicts: + sd/source/ui/unoidl/unopage.cxx + +(cherry picked from commit 0aa3dee5e88a1494a7a6a8401e084cbdb4324727) +Signed-off-by: Andras Timar + +Conflicts: + sd/source/ui/unoidl/unopage.cxx + +Change-Id: I016d801edefb5ab32b7b6a8e13a1dc3e8fdb866e +--- + sd/source/ui/unoidl/unopage.cxx | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/sd/source/ui/unoidl/unopage.cxx b/sd/source/ui/unoidl/unopage.cxx +index 9ad3473..fa61e5f 100644 +--- a/sd/source/ui/unoidl/unopage.cxx ++++ b/sd/source/ui/unoidl/unopage.cxx +@@ -69,6 +69,7 @@ + #include "unopback.hxx" + #include "unohelp.hxx" + #include ++#include + + using ::com::sun::star::animations::XAnimationNode; + using ::com::sun::star::animations::XAnimationNodeSupplier; +@@ -410,7 +411,22 @@ SdrObject * SdGenericDrawPage::_CreateSdrObject( const Reference< drawing::XShap + { + SdDrawDocument* pDoc = (SdDrawDocument*)GetPage()->GetModel(); + if( pDoc ) ++ { ++ // #i119287# similar to the code in the SdrObject methods the graphic and ole ++ // SdrObjects need another default style than the rest, see task. Adding here, too. ++ // TTTT: Same as for #i119287#: Can be removed in branch aw080 again ++ const bool bIsSdrGrafObj(0 != dynamic_cast< SdrGrafObj* >(pObj)); ++ const bool bIsSdrOle2Obj(0 != dynamic_cast< SdrOle2Obj* >(pObj)); ++ ++ if(bIsSdrGrafObj || bIsSdrOle2Obj) ++ { ++ pObj->NbcSetStyleSheet(pDoc->GetDefaultStyleSheetForSdrGrafObjAndSdrOle2Obj(), sal_True); ++ } ++ else ++ { + pObj->NbcSetStyleSheet( pDoc->GetDefaultStyleSheet(), sal_True ); ++ } ++ } + } + return pObj; + } +-- +1.9.3 + diff --git a/SOURCES/0003-fdo-61272-Do-the-mapping-correctly-both-for-WMF-and-.patch b/SOURCES/0003-fdo-61272-Do-the-mapping-correctly-both-for-WMF-and-.patch deleted file mode 100644 index b7f5a41..0000000 --- a/SOURCES/0003-fdo-61272-Do-the-mapping-correctly-both-for-WMF-and-.patch +++ /dev/null @@ -1,125 +0,0 @@ -From 22f63e3e7be99f13fd719ffc03aa78e34bd545af Mon Sep 17 00:00:00 2001 -From: Jan Holesovsky -Date: Wed, 27 Nov 2013 12:12:42 +0100 -Subject: [PATCH 003/109] fdo#61272: Do the mapping correctly both for WMF and - EMF. - -Turns out that for the WMF, we already had everything set up correctly, we -were just overwriting the right settings with default data again :-) - fix -that. - -Includes the following commits: - -* Revert "wmf-mm-text-1.diff: Fix WMF rendering, n#417818" -* Revert "wmf-mm-text.diff: Fix WMF rendering, n#417818" -* fdo#56886 EMF: Fixes some scaling problems of clipped regions, Twips - -Change-Id: I7ff859246dbaea3868438d3632f9adc60fc4ee37 -Reviewed-on: https://gerrit.libreoffice.org/6829 -Reviewed-by: Andras Timar -Tested-by: Andras Timar ---- - vcl/source/filter/wmf/winmtf.cxx | 33 +-------------------------------- - vcl/source/filter/wmf/winmtf.hxx | 1 - - vcl/source/filter/wmf/winwmf.cxx | 1 - - 3 files changed, 1 insertion(+), 34 deletions(-) - -diff --git a/vcl/source/filter/wmf/winmtf.cxx b/vcl/source/filter/wmf/winmtf.cxx -index c8c6652..6d44084 100644 ---- a/vcl/source/filter/wmf/winmtf.cxx -+++ b/vcl/source/filter/wmf/winmtf.cxx -@@ -374,19 +374,6 @@ Point WinMtfOutput::ImplMap( const Point& rPt ) - { - switch( mnMapMode ) - { -- case MM_TEXT: -- fX2 -= mnWinOrgX; -- fY2 -= mnWinOrgY; -- if( mnDevWidth != 1 || mnDevHeight != 1 ) { -- fX2 *= HUNDREDTH_MILLIMETERS_PER_MILLIINCH*1000/mnUnitsPerInch; -- fY2 *= HUNDREDTH_MILLIMETERS_PER_MILLIINCH*1000/mnUnitsPerInch; -- } -- fX2 += mnDevOrgX; -- fY2 += mnDevOrgY; -- fX2 *= (double)mnMillX * 100.0 / (double)mnPixX; -- fY2 *= (double)mnMillY * 100.0 / (double)mnPixY; -- -- break; - case MM_LOENGLISH : - { - fX2 -= mnWinOrgX; -@@ -471,15 +458,6 @@ Size WinMtfOutput::ImplMap( const Size& rSz ) - { - switch( mnMapMode ) - { -- case MM_TEXT: -- if( mnDevWidth != 1 && mnDevHeight != 1 ) { -- fWidth *= HUNDREDTH_MILLIMETERS_PER_MILLIINCH*1000/mnUnitsPerInch; -- fHeight*= HUNDREDTH_MILLIMETERS_PER_MILLIINCH*1000/mnUnitsPerInch; -- } else { -- fWidth *= (double)mnMillX * 100 / (double)mnPixX; -- fHeight *= (double)mnMillY * 100 / (double)mnPixY; -- } -- break; - case MM_LOENGLISH : - { - fWidth *= HUNDREDTH_MILLIMETERS_PER_MILLIINCH*10; -@@ -916,7 +894,6 @@ WinMtfOutput::WinMtfOutput( GDIMetaFile& rGDIMetaFile ) : - mbComplexClip ( false ), - mnGfxMode ( GM_COMPATIBLE ), - mnMapMode ( MM_TEXT ), -- mnUnitsPerInch ( 96 ), - mnDevOrgX ( 0 ), - mnDevOrgY ( 0 ), - mnDevWidth ( 1 ), -@@ -2025,7 +2002,7 @@ void WinMtfOutput::SetRefMill( const Size& rSize ) - void WinMtfOutput::SetMapMode( sal_uInt32 nMapMode ) - { - mnMapMode = nMapMode; -- if ( nMapMode == MM_TEXT ) -+ if ( nMapMode == MM_TEXT && !mbIsMapWinSet ) - { - mnWinExtX = mnDevWidth; - mnWinExtY = mnDevHeight; -@@ -2039,14 +2016,6 @@ void WinMtfOutput::SetMapMode( sal_uInt32 nMapMode ) - - - --void WinMtfOutput::SetUnitsPerInch( sal_uInt16 nUnitsPerInch ) --{ -- if( nUnitsPerInch != 0 ) -- mnUnitsPerInch = nUnitsPerInch; --} -- -- -- - void WinMtfOutput::SetWorldTransform( const XForm& rXForm ) - { - maXForm.eM11 = rXForm.eM11; -diff --git a/vcl/source/filter/wmf/winmtf.hxx b/vcl/source/filter/wmf/winmtf.hxx -index bec5d8a..8e18f7e 100644 ---- a/vcl/source/filter/wmf/winmtf.hxx -+++ b/vcl/source/filter/wmf/winmtf.hxx -@@ -679,7 +679,6 @@ public: - - sal_uInt32 GetMapMode() const { return mnMapMode; }; - void SetMapMode( sal_uInt32 mnMapMode ); -- void SetUnitsPerInch( sal_uInt16 nUnitsPerInch ); - void SetWorldTransform( const XForm& rXForm ); - void ModifyWorldTransform( const XForm& rXForm, sal_uInt32 nMode ); - -diff --git a/vcl/source/filter/wmf/winwmf.cxx b/vcl/source/filter/wmf/winwmf.cxx -index 84b1a78..3777c3b 100644 ---- a/vcl/source/filter/wmf/winwmf.cxx -+++ b/vcl/source/filter/wmf/winwmf.cxx -@@ -1108,7 +1108,6 @@ sal_Bool WMFReader::ReadHeader() - } - } - -- pOut->SetUnitsPerInch( nUnitsPerInch ); - pOut->SetWinOrg( aPlaceableBound.TopLeft() ); - Size aWMFSize( labs( aPlaceableBound.GetWidth() ), labs( aPlaceableBound.GetHeight() ) ); - pOut->SetWinExt( aWMFSize ); --- -1.8.4.2 - diff --git a/SOURCES/0003-fdo-72645-Case-insensitive-string-comparison-in-GETP.patch b/SOURCES/0003-fdo-72645-Case-insensitive-string-comparison-in-GETP.patch deleted file mode 100644 index 42101db..0000000 --- a/SOURCES/0003-fdo-72645-Case-insensitive-string-comparison-in-GETP.patch +++ /dev/null @@ -1,151 +0,0 @@ -From 7c4a58833df3931c168c57be3239e904e3a3baba Mon Sep 17 00:00:00 2001 -From: Kohei Yoshida -Date: Tue, 7 Jan 2014 00:48:10 -0500 -Subject: [PATCH 3/9] fdo#72645: Case-insensitive string comparison in - GETPIVOTDATA. - -Change-Id: Ibdb2b7ab2bae03875a3462816e860f58d9076457 -Reviewed-on: https://gerrit.libreoffice.org/7285 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - sc/source/core/data/dpobject.cxx | 12 +++++++----- - sc/source/core/data/dpresfilter.cxx | 29 +++++++++++++++++++++-------- - 2 files changed, 28 insertions(+), 13 deletions(-) - -diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx -index 3d9f5af..f9344aa 100644 ---- a/sc/source/core/data/dpobject.cxx -+++ b/sc/source/core/data/dpobject.cxx -@@ -1321,24 +1321,24 @@ namespace { - - class FindByName : std::unary_function - { -- OUString maName; -+ OUString maName; // must be all uppercase. - public: - FindByName(const OUString& rName) : maName(rName) {} - bool operator() (const ScDPSaveDimension* pDim) const - { - // Layout name takes precedence. - const OUString* pLayoutName = pDim->GetLayoutName(); -- if (pLayoutName && *pLayoutName == maName) -+ if (pLayoutName && ScGlobal::pCharClass->uppercase(*pLayoutName) == maName) - return true; - - sheet::GeneralFunction eGenFunc = static_cast(pDim->GetFunction()); - ScSubTotalFunc eFunc = ScDPUtil::toSubTotalFunc(eGenFunc); - OUString aSrcName = ScDPUtil::getSourceDimensionName(pDim->GetName()); - OUString aFuncName = ScDPUtil::getDisplayedMeasureName(aSrcName, eFunc); -- if (maName == aFuncName) -+ if (maName == ScGlobal::pCharClass->uppercase(aFuncName)) - return true; - -- return maName == aSrcName; -+ return maName == ScGlobal::pCharClass->uppercase(aSrcName); - } - }; - -@@ -1382,7 +1382,9 @@ double ScDPObject::GetPivotData(const OUString& rDataFieldName, std::vector::iterator it = std::find_if( -- aDataDims.begin(), aDataDims.end(), FindByName(rDataFieldName)); -+ aDataDims.begin(), aDataDims.end(), -+ FindByName(ScGlobal::pCharClass->uppercase(rDataFieldName))); -+ - if (it == aDataDims.end()) - return fRet; - -diff --git a/sc/source/core/data/dpresfilter.cxx b/sc/source/core/data/dpresfilter.cxx -index 41b2d7e..d4895b8 100644 ---- a/sc/source/core/data/dpresfilter.cxx -+++ b/sc/source/core/data/dpresfilter.cxx -@@ -10,6 +10,7 @@ - #include "dpresfilter.hxx" - #include "global.hxx" - -+#include - #include - - #include -@@ -113,12 +114,13 @@ void ScDPResultTree::add( - - // See if this dimension exists. - DimensionsType& rDims = pMemNode->maChildDimensions; -- DimensionsType::iterator itDim = rDims.find(filter.maDimName); -+ OUString aUpperName = ScGlobal::pCharClass->uppercase(filter.maDimName); -+ DimensionsType::iterator itDim = rDims.find(aUpperName); - if (itDim == rDims.end()) - { - // New dimenison. Insert it. - std::pair r = -- rDims.insert(DimensionsType::value_type(filter.maDimName, new DimensionNode(pMemNode))); -+ rDims.insert(DimensionsType::value_type(aUpperName, new DimensionNode(pMemNode))); - - if (!r.second) - // Insertion failed! -@@ -132,13 +134,14 @@ void ScDPResultTree::add( - // Now, see if this dimension member exists. - DimensionNode* pDim = itDim->second; - MembersType& rMembers = pDim->maChildMembers; -- MembersType::iterator itMem = rMembers.find(filter.maValue); -+ aUpperName = ScGlobal::pCharClass->uppercase(filter.maValue); -+ MembersType::iterator itMem = rMembers.find(aUpperName); - if (itMem == rMembers.end()) - { - // New member. Insert it. - std::pair r = - rMembers.insert( -- MembersType::value_type(filter.maValue, new MemberNode(pDim))); -+ MembersType::value_type(aUpperName, new MemberNode(pDim))); - - if (!r.second) - // Insertion failed! -@@ -153,7 +156,10 @@ void ScDPResultTree::add( - - if (pDimName && pMemName) - { -- NamePairType aNames(*pDimName, *pMemName); -+ NamePairType aNames( -+ ScGlobal::pCharClass->uppercase(*pDimName), -+ ScGlobal::pCharClass->uppercase(*pMemName)); -+ - LeafValuesType::iterator it = maLeafValues.find(aNames); - if (it == maLeafValues.end()) - { -@@ -197,13 +203,17 @@ const ScDPResultTree::ValuesType* ScDPResultTree::getResults( - const MemberNode* pMember = mpRoot; - for (; p != pEnd; ++p) - { -- DimensionsType::const_iterator itDim = pMember->maChildDimensions.find(p->FieldName); -+ DimensionsType::const_iterator itDim = pMember->maChildDimensions.find( -+ ScGlobal::pCharClass->uppercase(p->FieldName)); -+ - if (itDim == pMember->maChildDimensions.end()) - // Specified dimension not found. - return NULL; - - const DimensionNode* pDim = itDim->second; -- MembersType::const_iterator itMem = pDim->maChildMembers.find(p->MatchValue); -+ MembersType::const_iterator itMem = pDim->maChildMembers.find( -+ ScGlobal::pCharClass->uppercase(p->MatchValue)); -+ - if (itMem == pDim->maChildMembers.end()) - // Specified member not found. - return NULL; -@@ -216,7 +226,10 @@ const ScDPResultTree::ValuesType* ScDPResultTree::getResults( - - double ScDPResultTree::getLeafResult(const com::sun::star::sheet::DataPilotFieldFilter& rFilter) const - { -- NamePairType aPair(rFilter.FieldName, rFilter.MatchValue); -+ NamePairType aPair( -+ ScGlobal::pCharClass->uppercase(rFilter.FieldName), -+ ScGlobal::pCharClass->uppercase(rFilter.MatchValue)); -+ - LeafValuesType::const_iterator it = maLeafValues.find(aPair); - if (it != maLeafValues.end()) - // Found! --- -1.8.4.2 - diff --git a/SOURCES/0004-Adjust-for-the-splitting-of-number-format-properties.patch b/SOURCES/0004-Adjust-for-the-splitting-of-number-format-properties.patch new file mode 100644 index 0000000..5f86b7e --- /dev/null +++ b/SOURCES/0004-Adjust-for-the-splitting-of-number-format-properties.patch @@ -0,0 +1,84 @@ +From 74a22d42753350039ee8fcdb5e6df1e0807c0cca Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Mon, 7 Jul 2014 13:26:23 -0400 +Subject: [PATCH 004/137] Adjust for the splitting of number format properties + in chart. + +Since 1d38cb365543924f9c50014e6b2227e77de1d0c9, "number format" and +"link number format to source" properties are 2 separate properties. Adjust +OOXML import code for that split. + +Also, always set axis' number format via NumberFormat property even when it's +a percent format. The axis object doesn't keep a non-percent and percent +number formats separately. + +Change-Id: I8667b6f1a78d88cc37d059518919ad1b37f154e1 +(cherry picked from commit af5a6615dfdbe5c2cacdcacb00fc6f418b925c06) +(cherry picked from commit 29d5f3db525e275c62cd2eafb18899fe68198ea3) +Signed-off-by: Andras Timar +--- + oox/source/drawingml/chart/axisconverter.cxx | 8 +------- + oox/source/drawingml/chart/objectformatter.cxx | 8 +++----- + oox/source/token/properties.txt | 1 + + 3 files changed, 5 insertions(+), 12 deletions(-) + +diff --git a/oox/source/drawingml/chart/axisconverter.cxx b/oox/source/drawingml/chart/axisconverter.cxx +index da1a732..f290992 100644 +--- a/oox/source/drawingml/chart/axisconverter.cxx ++++ b/oox/source/drawingml/chart/axisconverter.cxx +@@ -307,13 +307,7 @@ void AxisConverter::convertFromModel( const Reference< XCoordinateSystem >& rxCo + // number format ------------------------------------------------------ + + if( (aScaleData.AxisType == cssc2::AxisType::REALNUMBER) || (aScaleData.AxisType == cssc2::AxisType::PERCENT) ) +- { +- bool bPercent = false; +- if( mrModel.maNumberFormat.maFormatCode.indexOf('%') >= 0) +- bPercent = true; +- mrModel.maNumberFormat.mbSourceLinked = false; +- getFormatter().convertNumberFormat( aAxisProp, mrModel.maNumberFormat, bPercent ); +- } ++ getFormatter().convertNumberFormat(aAxisProp, mrModel.maNumberFormat, false); + + // position of crossing axis ------------------------------------------ + +diff --git a/oox/source/drawingml/chart/objectformatter.cxx b/oox/source/drawingml/chart/objectformatter.cxx +index a69dae0..b5b0a5b 100644 +--- a/oox/source/drawingml/chart/objectformatter.cxx ++++ b/oox/source/drawingml/chart/objectformatter.cxx +@@ -1111,11 +1111,7 @@ void ObjectFormatter::convertNumberFormat( PropertySet& rPropSet, const NumberFo + if( mxData->mxNumFmts.is() ) + { + sal_Int32 nPropId = bPercentFormat ? PROP_PercentageNumberFormat : PROP_NumberFormat; +- if( rNumberFormat.mbSourceLinked || rNumberFormat.maFormatCode.isEmpty() ) +- { +- rPropSet.setAnyProperty( nPropId, Any() ); +- } +- else try ++ try + { + sal_Int32 nIndex = rNumberFormat.maFormatCode.equalsIgnoreAsciiCase("general") ? + mxData->mxNumTypes->getStandardIndex( mxData->maFromLocale ) : +@@ -1128,6 +1124,8 @@ void ObjectFormatter::convertNumberFormat( PropertySet& rPropSet, const NumberFo + OSL_FAIL( OStringBuffer( "ObjectFormatter::convertNumberFormat - cannot create number format '" ). + append( OUStringToOString( rNumberFormat.maFormatCode, osl_getThreadTextEncoding() ) ).append( '\'' ).getStr() ); + } ++ ++ rPropSet.setProperty(PROP_LinkNumberFormatToSource, makeAny(rNumberFormat.mbSourceLinked)); + } + } + +diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt +index b0001e3..6d384b8 100644 +--- a/oox/source/token/properties.txt ++++ b/oox/source/token/properties.txt +@@ -291,6 +291,7 @@ LineStartWidth + LineStyle + LineTransparence + LineWidth ++LinkNumberFormatToSource + LinkURL + LoadReadonly + LookUpLabels +-- +1.9.3 + diff --git a/SOURCES/0004-EMF-Implement-line-dashing.patch b/SOURCES/0004-EMF-Implement-line-dashing.patch deleted file mode 100644 index 6f71b50..0000000 --- a/SOURCES/0004-EMF-Implement-line-dashing.patch +++ /dev/null @@ -1,106 +0,0 @@ -From 34de60961b098416b38af8e8595e2579b2b6bc66 Mon Sep 17 00:00:00 2001 -From: Jan Holesovsky -Date: Fri, 22 Nov 2013 12:01:15 +0100 -Subject: [PATCH 004/109] EMF+: Implement line dashing. - -Change-Id: I9eb21c0a8b5baa5b0080845f61b12fc65034d959 -Reviewed-on: https://gerrit.libreoffice.org/6830 -Reviewed-by: Andras Timar -Tested-by: Andras Timar ---- - cppcanvas/source/mtfrenderer/emfplus.cxx | 51 ++++++++++++++++++++++++++++++-- - 1 file changed, 49 insertions(+), 2 deletions(-) - -diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx -index daed614..a1b6ebd 100644 ---- a/cppcanvas/source/mtfrenderer/emfplus.cxx -+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx -@@ -89,6 +89,13 @@ - - #define EmfPlusRegionInitialStateInfinite 0x10000003 - -+const sal_Int32 EmfPlusLineStyleSolid = 0x00000000; -+const sal_Int32 EmfPlusLineStyleDash = 0x00000001; -+const sal_Int32 EmfPlusLineStyleDot = 0x00000002; -+const sal_Int32 EmfPlusLineStyleDashDot = 0x00000003; -+const sal_Int32 EmfPlusLineStyleDashDotDot = 0x00000004; -+const sal_Int32 EmfPlusLineStyleCustom = 0x00000005; -+ - using namespace ::com::sun::star; - using namespace ::basegfx; - -@@ -614,6 +621,34 @@ namespace cppcanvas - } - #endif - rStrokeAttributes.StrokeWidth = fabs((rState.mapModeTransform * rR.MapSize (width == 0.0 ? 0.05 : width, 0)).getX()); -+ -+ // set dashing -+ if (dashStyle != EmfPlusLineStyleSolid) -+ { -+ const float dash[] = {3, 3}; -+ const float dot[] = {1, 3}; -+ const float dashdot[] = {3, 3, 1, 3}; -+ const float dashdotdot[] = {3, 3, 1, 3, 1, 3}; -+ -+ sal_Int32 nLen = 0; -+ const float *pPattern; -+ switch (dashStyle) -+ { -+ case EmfPlusLineStyleDash: nLen = SAL_N_ELEMENTS(dash); pPattern = dash; break; -+ case EmfPlusLineStyleDot: nLen = SAL_N_ELEMENTS(dot); pPattern = dot; break; -+ case EmfPlusLineStyleDashDot: nLen = SAL_N_ELEMENTS(dashdot); pPattern = dashdot; break; -+ case EmfPlusLineStyleDashDotDot: nLen = SAL_N_ELEMENTS(dashdotdot); pPattern = dashdotdot; break; -+ case EmfPlusLineStyleCustom: nLen = dashPatternLen; pPattern = dashPattern; break; -+ } -+ if (nLen > 0) -+ { -+ uno::Sequence aDashArray(nLen); -+ for (int i = 0; i < nLen; ++i) -+ aDashArray[i] = pPattern[i]; -+ -+ rStrokeAttributes.DashArray = aDashArray; -+ } -+ } - } - - void Read (SvStream& s, ImplRenderer& rR, sal_Int32, sal_Int32 ) -@@ -651,7 +686,10 @@ namespace cppcanvas - mitterLimit = 0; - - if (penFlags & 32) -+ { - s >> dashStyle; -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tdashStyle: 0x" << std::hex << dashStyle); -+ } - else - dashStyle = 0; - -@@ -665,14 +703,23 @@ namespace cppcanvas - else - dashOffset = 0; - -- if (penFlags & 256) { -+ if (penFlags & 256) -+ { -+ dashStyle = EmfPlusLineStyleCustom; -+ - s >> dashPatternLen; -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tdashPatternLen: " << dashPatternLen); -+ - if( dashPatternLen<0 || sal_uInt32(dashPatternLen)>SAL_MAX_INT32/sizeof(float) ) - dashPatternLen = SAL_MAX_INT32/sizeof(float); - dashPattern = new float [dashPatternLen]; - for (i = 0; i < dashPatternLen; i++) -+ { - s >> dashPattern [i]; -- } else -+ SAL_INFO("cppcanvas.emf", "EMF+\t\t\tdashPattern[" << i << "]: " << dashPattern[i]); -+ } -+ } -+ else - dashPatternLen = 0; - - if (penFlags & 512) --- -1.8.4.2 - diff --git a/SOURCES/0004-fdo-72774-Ensure-that-all-the-group-fields-are-in-ca.patch b/SOURCES/0004-fdo-72774-Ensure-that-all-the-group-fields-are-in-ca.patch deleted file mode 100644 index 4e4a7ab..0000000 --- a/SOURCES/0004-fdo-72774-Ensure-that-all-the-group-fields-are-in-ca.patch +++ /dev/null @@ -1,34 +0,0 @@ -From d391dd145631ffdbc6e506ba59db7d1977331aff Mon Sep 17 00:00:00 2001 -From: Kohei Yoshida -Date: Tue, 7 Jan 2014 16:36:55 -0500 -Subject: [PATCH 4/9] fdo#72774: Ensure that all the group fields are in cache - upon file load. - -This resolves the originally reported issue in that bug (in Comment 1). - -Change-Id: I6fb85cff1eafb78d784605aa08e7d992a1ac36e0 -(cherry picked from commit 256e4ccba8a331f2d30c6b5da9dca70206deadae) -Reviewed-on: https://gerrit.libreoffice.org/7302 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - sc/source/core/data/dpobject.cxx | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx -index f9344aa..3ade4cf 100644 ---- a/sc/source/core/data/dpobject.cxx -+++ b/sc/source/core/data/dpobject.cxx -@@ -2858,6 +2858,9 @@ const ScDPCache* ScDPCollection::SheetCaches::getCache(const ScRange& rRange, co - return NULL; - } - -+ if (pDimData) -+ pDimData->WriteToCache(*itCache->second); -+ - return itCache->second; - } - --- -1.8.4.2 - diff --git a/SOURCES/0005-EMF-Parse-and-render-custom-line-cap-data.patch b/SOURCES/0005-EMF-Parse-and-render-custom-line-cap-data.patch deleted file mode 100644 index 1f449aa..0000000 --- a/SOURCES/0005-EMF-Parse-and-render-custom-line-cap-data.patch +++ /dev/null @@ -1,465 +0,0 @@ -From 51a8b809a999b390b26287c9f3d4d45fc8ecd8f9 Mon Sep 17 00:00:00 2001 -From: Jan Holesovsky -Date: Fri, 22 Nov 2013 17:06:10 +0100 -Subject: [PATCH 005/109] EMF+: Parse and render custom line cap data. - -Contains the following commits: - -* EMF+: Small cleanup & more logging in preparation for line starts & ends. -* EMF+: Parse custom line cap data for start and end line caps. -* EMF+: Render custom line cap data. -* EMF+: Set the stroke attributes on the custom line caps. - -Change-Id: Ibdf69c7944e4d027d9dc6974bd740f9b70fb5079 -Reviewed-on: https://gerrit.libreoffice.org/6831 -Reviewed-by: Andras Timar -Tested-by: Andras Timar ---- - cppcanvas/source/inc/implrenderer.hxx | 9 +- - cppcanvas/source/mtfrenderer/emfplus.cxx | 314 +++++++++++++++++++++++++++---- - 2 files changed, 290 insertions(+), 33 deletions(-) - -diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx -index 79a2967..270c0de 100644 ---- a/cppcanvas/source/inc/implrenderer.hxx -+++ b/cppcanvas/source/inc/implrenderer.hxx -@@ -280,7 +280,14 @@ static float GetSwapFloat( SvStream& rSt ) - /* EMF+ */ - void processEMFPlus( MetaCommentAction* pAct, const ActionFactoryParameters& rFactoryParms, OutDevState& rState, const CanvasSharedPtr& rCanvas ); - double setFont( sal_uInt8 objectId, const ActionFactoryParameters& rParms, OutDevState& rState ); -- void EMFPPlusDrawPolygon (::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, OutDevState& rState, const CanvasSharedPtr& rCanvas, sal_uInt32 penIndex); -+ -+ /// Render LineCap, like the start or end arrow of a polygon. -+ void EMFPPlusDrawLineCap(const ::basegfx::B2DPolygon& rPolygon, double fPolyLength, -+ const ::basegfx::B2DPolyPolygon& rLineCap, bool bStart, -+ const com::sun::star::rendering::StrokeAttributes& rAttributes, -+ const ActionFactoryParameters& rParms, OutDevState& rState); -+ -+ void EMFPPlusDrawPolygon (const ::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, OutDevState& rState, const CanvasSharedPtr& rCanvas, sal_uInt32 penIndex); - void EMFPPlusFillPolygon (::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, OutDevState& rState, const CanvasSharedPtr& rCanvas, bool isColor, sal_uInt32 brushIndexOrColor); - - ActionVector maActions; -diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx -index a1b6ebd..1d752e7 100644 ---- a/cppcanvas/source/mtfrenderer/emfplus.cxx -+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx -@@ -28,6 +28,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -36,8 +37,10 @@ - #include - #include - --#include -+#include -+#include - #include -+#include - - #include - #include -@@ -96,6 +99,22 @@ const sal_Int32 EmfPlusLineStyleDashDot = 0x00000003; - const sal_Int32 EmfPlusLineStyleDashDotDot = 0x00000004; - const sal_Int32 EmfPlusLineStyleCustom = 0x00000005; - -+const sal_uInt32 EmfPlusCustomLineCapDataTypeDefault = 0x00000000; -+const sal_uInt32 EmfPlusCustomLineCapDataTypeAdjustableArrow = 0x00000001; -+ -+const sal_uInt32 EmfPlusCustomLineCapDataFillPath = 0x00000001; -+const sal_uInt32 EmfPlusCustomLineCapDataLinePath = 0x00000002; -+ -+const sal_uInt32 EmfPlusLineCapTypeFlat = 0x00000000; -+const sal_uInt32 EmfPlusLineCapTypeSquare = 0x00000001; -+const sal_uInt32 EmfPlusLineCapTypeRound = 0x00000002; -+const sal_uInt32 EmfPlusLineCapTypeTriangle = 0x00000003; -+ -+const sal_uInt32 EmfPlusLineJoinTypeMiter = 0x00000000; -+const sal_uInt32 EmfPlusLineJoinTypeBevel = 0x00000001; -+const sal_uInt32 EmfPlusLineJoinTypeRound = 0x00000002; -+const sal_uInt32 EmfPlusLineJoinTypeMiterClipped = 0x00000003; -+ - using namespace ::com::sun::star; - using namespace ::basegfx; - -@@ -587,6 +606,137 @@ namespace cppcanvas - } - }; - -+ /// Convert stroke caps between EMF+ and rendering API -+ sal_Int8 lcl_convertStrokeCap(sal_uInt32 nEmfStroke) -+ { -+ switch (nEmfStroke) -+ { -+ case EmfPlusLineCapTypeSquare: return rendering::PathCapType::SQUARE; -+ case EmfPlusLineCapTypeRound: return rendering::PathCapType::ROUND; -+ } -+ -+ // we have no mapping for EmfPlusLineCapTypeTriangle, so return -+ // BUTT always -+ return rendering::PathCapType::BUTT; -+ } -+ -+ struct EMFPCustomLineCap : public EMFPObject -+ { -+ sal_uInt32 type; -+ sal_uInt32 strokeStartCap, strokeEndCap, strokeJoin; -+ float miterLimit; -+ basegfx::B2DPolyPolygon polygon; -+ -+ public: -+ EMFPCustomLineCap() : EMFPObject() -+ { -+ } -+ -+ ~EMFPCustomLineCap() -+ { -+ } -+ -+ void SetAttributes(rendering::StrokeAttributes& aAttributes) -+ { -+ aAttributes.StartCapType = lcl_convertStrokeCap(strokeStartCap); -+ aAttributes.EndCapType = lcl_convertStrokeCap(strokeEndCap); -+ -+ switch (strokeJoin) -+ { -+ case EmfPlusLineJoinTypeMiter: // fall-through -+ case EmfPlusLineJoinTypeMiterClipped: aAttributes.JoinType = rendering::PathJoinType::MITER; break; -+ case EmfPlusLineJoinTypeBevel: aAttributes.JoinType = rendering::PathJoinType::BEVEL; break; -+ case EmfPlusLineJoinTypeRound: aAttributes.JoinType = rendering::PathJoinType::ROUND; break; -+ } -+ -+ aAttributes.MiterLimit = miterLimit; -+ } -+ -+ void ReadPath(SvStream& s, ImplRenderer& rR, bool bClosed) -+ { -+ sal_Int32 pathLength; -+ s >> pathLength; -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tpath length: " << pathLength); -+ -+ sal_uInt32 pathHeader; -+ sal_Int32 pathPoints, pathFlags; -+ s >> pathHeader >> pathPoints >> pathFlags; -+ -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tpath (custom cap line path)"); -+ SAL_INFO("cppcanvas.emf", "EMF+\t\theader: 0x" << std::hex << pathHeader << " points: " << std::dec << pathPoints << " additional flags: 0x" << std::hex << pathFlags << std::dec ); -+ -+ EMFPPath path(pathPoints); -+ path.Read(s, pathFlags, rR); -+ -+ polygon = path.GetPolygon(rR, false); -+ polygon.setClosed(bClosed); -+ -+ // transformation to convert the path to what LibreOffice -+ // expects -+ B2DHomMatrix aMatrix; -+ aMatrix.scale(1.0, -1.0); -+ -+ polygon.transform(aMatrix); -+ }; -+ -+ void Read (SvStream& s, ImplRenderer& rR) -+ { -+ sal_uInt32 header; -+ -+ s >> header >> type; -+ -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tcustom cap"); -+ SAL_INFO("cppcanvas.emf", "EMF+\t\theader: 0x" << std::hex << header << " type: " << type << std::dec); -+ -+ if (type == EmfPlusCustomLineCapDataTypeDefault) -+ { -+ sal_uInt32 customLineCapDataFlags, baseCap; -+ float baseInset; -+ float widthScale; -+ float fillHotSpotX, fillHotSpotY, strokeHotSpotX, strokeHotSpotY; -+ -+ s >> customLineCapDataFlags >> baseCap >> baseInset -+ >> strokeStartCap >> strokeEndCap >> strokeJoin -+ >> miterLimit >> widthScale -+ >> fillHotSpotX >> fillHotSpotY >> strokeHotSpotX >> strokeHotSpotY; -+ -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tcustomLineCapDataFlags: 0x" << std::hex << customLineCapDataFlags); -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tbaseCap: 0x" << std::hex << baseCap); -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tbaseInset: " << baseInset); -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tstrokeStartCap: 0x" << std::hex << strokeStartCap); -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tstrokeEndCap: 0x" << std::hex << strokeEndCap); -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tstrokeJoin: 0x" << std::hex << strokeJoin); -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tmiterLimit: " << miterLimit); -+ SAL_INFO("cppcanvas.emf", "EMF+\t\twidthScale: " << widthScale); -+ -+ if (customLineCapDataFlags & EmfPlusCustomLineCapDataFillPath) -+ { -+ ReadPath(s, rR, true); -+ } -+ -+ if (customLineCapDataFlags & EmfPlusCustomLineCapDataLinePath) -+ { -+ ReadPath(s, rR, false); -+ } -+ } -+ else if (type == EmfPlusCustomLineCapDataTypeAdjustableArrow) -+ { -+ // TODO only reads the data, does not use them [I've had -+ // no test document to be able to implement it] -+ -+ sal_Int32 width, height, middleInset, fillState, lineStartCap; -+ sal_Int32 lineEndCap, lineJoin, widthScale; -+ float fillHotSpotX, fillHotSpotY, lineHotSpotX, lineHotSpotY; -+ -+ s >> width >> height >> middleInset >> fillState >> lineStartCap -+ >> lineEndCap >> lineJoin >> miterLimit >> widthScale -+ >> fillHotSpotX >> fillHotSpotY >> lineHotSpotX >> lineHotSpotY; -+ -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tTODO - actually read EmfPlusCustomLineCapArrowData object (section 2.2.2.12)"); -+ } -+ } -+ }; -+ - struct EMFPPen : public EMFPBrush - { - XForm transformation; -@@ -604,16 +754,28 @@ namespace cppcanvas - sal_Int32 compoundArrayLen; - float *compoundArray; - sal_Int32 customStartCapLen; -- sal_uInt8 *customStartCap; -+ EMFPCustomLineCap *customStartCap; - sal_Int32 customEndCapLen; -- sal_uInt8 *customEndCap; -+ EMFPCustomLineCap *customEndCap; - - public: - EMFPPen () : EMFPBrush () - { -+ dashPattern = NULL; -+ compoundArray = NULL; -+ customStartCap = NULL; -+ customEndCap = NULL; - } - -- void SetStrokeAttributes (rendering::StrokeAttributes& rStrokeAttributes, ImplRenderer& rR, const OutDevState& rState) -+ ~EMFPPen () -+ { -+ delete[] dashPattern; -+ delete[] compoundArray; -+ delete customStartCap; -+ delete customEndCap; -+ } -+ -+ void SetStrokeWidth(rendering::StrokeAttributes& rStrokeAttributes, ImplRenderer& rR, const OutDevState& rState) - { - #if OSL_DEBUG_LEVEL > 1 - if (width == 0.0) { -@@ -621,8 +783,10 @@ namespace cppcanvas - } - #endif - rStrokeAttributes.StrokeWidth = fabs((rState.mapModeTransform * rR.MapSize (width == 0.0 ? 0.05 : width, 0)).getX()); -+ } - -- // set dashing -+ void SetStrokeDashing(rendering::StrokeAttributes& rStrokeAttributes) -+ { - if (dashStyle != EmfPlusLineStyleSolid) - { - const float dash[] = {3, 3}; -@@ -666,12 +830,18 @@ namespace cppcanvas - s >> transformation; - - if (penFlags & 2) -+ { - s >> startCap; -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tstartCap: 0x" << std::hex << startCap); -+ } - else - startCap = 0; - - if (penFlags & 4) -+ { - s >> endCap; -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tendCap: 0x" << std::hex << endCap); -+ } - else - endCap = 0; - -@@ -737,24 +907,34 @@ namespace cppcanvas - } else - compoundArrayLen = 0; - -- if (penFlags & 2048) { -+ if (penFlags & 2048) -+ { - s >> customStartCapLen; -- if( customStartCapLen<0 ) -- customStartCapLen=0; -- customStartCap = new sal_uInt8 [customStartCapLen]; -- for (i = 0; i < customStartCapLen; i++) -- s >> customStartCap [i]; -- } else -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tcustomStartCapLen: " << customStartCapLen); -+ sal_uInt32 pos = s.Tell(); -+ -+ customStartCap = new EMFPCustomLineCap(); -+ customStartCap->Read(s, rR); -+ -+ // maybe we don't read everything yet, play it safe ;-) -+ s.Seek(pos + customStartCapLen); -+ } -+ else - customStartCapLen = 0; - -- if (penFlags & 4096) { -+ if (penFlags & 4096) -+ { - s >> customEndCapLen; -- if( customEndCapLen<0 ) -- customEndCapLen=0; -- customEndCap = new sal_uInt8 [customEndCapLen]; -- for (i = 0; i < customEndCapLen; i++) -- s >> customEndCap [i]; -- } else -+ SAL_INFO("cppcanvas.emf", "EMF+\t\tcustomEndCapLen: " << customEndCapLen); -+ sal_uInt32 pos = s.Tell(); -+ -+ customEndCap = new EMFPCustomLineCap(); -+ customEndCap->Read(s, rR); -+ -+ // maybe we don't read everything yet, play it safe ;-) -+ s.Seek(pos + customEndCapLen); -+ } -+ else - customEndCapLen = 0; - - EMFPBrush::Read (s, rR); -@@ -1140,7 +1320,39 @@ namespace cppcanvas - } - } - -- void ImplRenderer::EMFPPlusDrawPolygon (::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, -+ -+ void ImplRenderer::EMFPPlusDrawLineCap(const ::basegfx::B2DPolygon& rPolygon, double fPolyLength, -+ const ::basegfx::B2DPolyPolygon& rLineCap, bool bStart, const rendering::StrokeAttributes& rAttributes, -+ const ActionFactoryParameters& rParms, OutDevState& rState) -+ { -+ if (!rLineCap.count()) -+ return; -+ -+ // it seems the line caps in EMF+ are 4*larger than what -+ // LibreOffice expects, and the mapping in -+ // createAreaGeometryForLineStartEnd scales that down, so -+ // correct it -+ // [unfortunately found no proof for this in the spec :-( - please -+ // feel free to correct this if it causes trouble] -+ double fWidth = rAttributes.StrokeWidth*4; -+ -+ basegfx::B2DPolyPolygon aArrow(basegfx::tools::createAreaGeometryForLineStartEnd( -+ rPolygon, rLineCap, bStart, -+ fWidth, fPolyLength, 0.0, NULL)); -+ -+ // createAreaGeometryForLineStartEnd from some reason always sets -+ // the path as closed, correct it -+ aArrow.setClosed(rLineCap.isClosed()); -+ -+ ActionSharedPtr pAction(internal::PolyPolyActionFactory::createPolyPolyAction(aArrow, rParms.mrCanvas, rState, rAttributes)); -+ if (pAction) -+ { -+ maActions.push_back(MtfAction(pAction, rParms.mrCurrActionIndex)); -+ rParms.mrCurrActionIndex += pAction->getActionCount()-1; -+ } -+ } -+ -+ void ImplRenderer::EMFPPlusDrawPolygon (const ::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, - OutDevState& rState, const CanvasSharedPtr& rCanvas, sal_uInt32 penIndex) - { - EMFPPen* pen = (EMFPPen*) aObjects [penIndex & 0xff]; -@@ -1154,24 +1366,62 @@ namespace cppcanvas - rState.lineColor = ::vcl::unotools::colorToDoubleSequence (pen->GetColor (), - rCanvas->getUNOCanvas ()->getDevice()->getDeviceColorSpace()); - -- polygon.transform( rState.mapModeTransform ); -- rendering::StrokeAttributes aStrokeAttributes; -+ basegfx::B2DPolyPolygon aPolyPolygon(polygon); -+ aPolyPolygon.transform(rState.mapModeTransform); -+ rendering::StrokeAttributes aCommonAttributes; - -- pen->SetStrokeAttributes (aStrokeAttributes, *this, rState); -+ // some attributes are common for the polygon, and the line -+ // starts & ends - like the stroke width -+ pen->SetStrokeWidth(aCommonAttributes, *this, rState); - -- ActionSharedPtr pPolyAction( -- internal::PolyPolyActionFactory::createPolyPolyAction( -- polygon, rParms.mrCanvas, rState, aStrokeAttributes ) ); -+ // but eg. dashing has to be additionally set only on the -+ // polygon -+ rendering::StrokeAttributes aPolygonAttributes(aCommonAttributes); -+ pen->SetStrokeDashing(aPolygonAttributes); - -+ // render the polygon -+ ActionSharedPtr pPolyAction(internal::PolyPolyActionFactory::createPolyPolyAction(aPolyPolygon, rParms.mrCanvas, rState, aPolygonAttributes)); - if( pPolyAction ) - { -- maActions.push_back( -- MtfAction( -- pPolyAction, -- rParms.mrCurrActionIndex ) ); -- -+ maActions.push_back(MtfAction(pPolyAction, rParms.mrCurrActionIndex)); - rParms.mrCurrActionIndex += pPolyAction->getActionCount()-1; - } -+ -+ // render line starts & ends -+ if (pen->customStartCap || pen->customEndCap) -+ { -+ for (sal_uInt32 i = 0; i < aPolyPolygon.count(); ++i) -+ { -+ // break the polypolygon into polygons -+ basegfx::B2DPolygon aPolygon(aPolyPolygon.getB2DPolygon(i)); -+ -+ if (aPolygon.isClosed()) -+ continue; -+ -+ double fPolyLength = basegfx::tools::getLength(aPolygon); -+ -+ // line start -+ if (pen->customStartCap) -+ { -+ rendering::StrokeAttributes aAttributes(aCommonAttributes); -+ pen->customStartCap->SetAttributes(aAttributes); -+ -+ EMFPPlusDrawLineCap(aPolygon, fPolyLength, pen->customStartCap->polygon, -+ true, aAttributes, rParms, rState); -+ } -+ -+ // line end -+ if (pen->customEndCap) -+ { -+ rendering::StrokeAttributes aAttributes(aCommonAttributes); -+ pen->customEndCap->SetAttributes(aAttributes); -+ -+ EMFPPlusDrawLineCap(aPolygon, fPolyLength, pen->customEndCap->polygon, -+ false, aAttributes, rParms, rState); -+ } -+ } -+ } -+ - } - } - -@@ -1550,7 +1800,7 @@ namespace cppcanvas - - rendering::StrokeAttributes aStrokeAttributes; - -- pen->SetStrokeAttributes (aStrokeAttributes, *this, rState); -+ pen->SetStrokeWidth (aStrokeAttributes, *this, rState); - - ActionSharedPtr pPolyAction( - internal::PolyPolyActionFactory::createPolyPolyAction( --- -1.8.4.2 - diff --git a/SOURCES/0005-bnc-881025-Mark-axis-a-percent-axis-only-when-all-da.patch b/SOURCES/0005-bnc-881025-Mark-axis-a-percent-axis-only-when-all-da.patch new file mode 100644 index 0000000..0be72bd --- /dev/null +++ b/SOURCES/0005-bnc-881025-Mark-axis-a-percent-axis-only-when-all-da.patch @@ -0,0 +1,155 @@ +From c1ed90d187eac6abae9f7e50137b20d2ce93f7ff Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Mon, 7 Jul 2014 16:38:29 -0400 +Subject: [PATCH 005/137] bnc#881025: Mark axis a percent axis only when all + data series are percent. + +(cherry picked from commit b8c444a46b2f41dae673c6118d84276be0e6c87d) +Signed-off-by: Andras Timar + +Conflicts: + oox/inc/drawingml/chart/axisconverter.hxx + +Change-Id: I302cc1e5b164b2ce9999087293b034ec930951af +(cherry picked from commit 3997f7b8e5f07312466e66f6bcf0a4ac1c8c5a39) +Signed-off-by: Andras Timar +--- + include/oox/drawingml/chart/axisconverter.hxx | 10 +++---- + oox/source/drawingml/chart/axisconverter.cxx | 38 +++++++++++++++++++----- + oox/source/drawingml/chart/plotareaconverter.cxx | 6 ++-- + 3 files changed, 38 insertions(+), 16 deletions(-) + +diff --git a/include/oox/drawingml/chart/axisconverter.hxx b/include/oox/drawingml/chart/axisconverter.hxx +index e107057..f2df756 100644 +--- a/include/oox/drawingml/chart/axisconverter.hxx ++++ b/include/oox/drawingml/chart/axisconverter.hxx +@@ -45,12 +45,10 @@ public: + virtual ~AxisConverter(); + + /** Creates a chart2 axis and inserts it into the passed coordinate system. */ +- void convertFromModel( +- const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XCoordinateSystem >& rxCoordSystem, +- TypeGroupConverter& rTypeGroup, +- const AxisModel* pCrossingAxis, +- sal_Int32 nAxesSetIdx, +- sal_Int32 nAxisIdx ); ++ void convertFromModel( ++ const css::uno::Reference& rxCoordSystem, ++ RefVector& rTypeGroups, const AxisModel* pCrossingAxis, ++ sal_Int32 nAxesSetIdx, sal_Int32 nAxisIdx ); + }; + + // ============================================================================ +diff --git a/oox/source/drawingml/chart/axisconverter.cxx b/oox/source/drawingml/chart/axisconverter.cxx +index f290992..d30595d 100644 +--- a/oox/source/drawingml/chart/axisconverter.cxx ++++ b/oox/source/drawingml/chart/axisconverter.cxx +@@ -107,6 +107,26 @@ sal_Int32 lclGetTickMark( sal_Int32 nToken ) + return NONE; + } + ++/** ++ * The groups is of percent type only when all of its members are of percent ++ * type. ++ */ ++bool isPercent( const RefVector& rTypeGroups ) ++{ ++ if (rTypeGroups.empty()) ++ return false; ++ ++ RefVector::const_iterator it = rTypeGroups.begin(), itEnd = rTypeGroups.end(); ++ for (; it != itEnd; ++it) ++ { ++ TypeGroupConverter& rConv = **it; ++ if (!rConv.isPercent()) ++ return false; ++ } ++ ++ return true; ++} ++ + } // namespace + + // ============================================================================ +@@ -120,16 +140,20 @@ AxisConverter::~AxisConverter() + { + } + +-void AxisConverter::convertFromModel( const Reference< XCoordinateSystem >& rxCoordSystem, +- TypeGroupConverter& rTypeGroup, const AxisModel* pCrossingAxis, sal_Int32 nAxesSetIdx, sal_Int32 nAxisIdx ) ++void AxisConverter::convertFromModel( ++ const Reference< XCoordinateSystem >& rxCoordSystem, ++ RefVector& rTypeGroups, const AxisModel* pCrossingAxis, sal_Int32 nAxesSetIdx, sal_Int32 nAxisIdx ) + { ++ if (rTypeGroups.empty()) ++ return; ++ + Reference< XAxis > xAxis; + try + { + namespace cssc = ::com::sun::star::chart; + namespace cssc2 = ::com::sun::star::chart2; + +- const TypeGroupInfo& rTypeInfo = rTypeGroup.getTypeInfo(); ++ const TypeGroupInfo& rTypeInfo = rTypeGroups.front()->getTypeInfo(); + ObjectFormatter& rFormatter = getFormatter(); + + // create the axis object (always) +@@ -189,7 +213,7 @@ void AxisConverter::convertFromModel( const Reference< XCoordinateSystem >& rxCo + currently). */ + aScaleData.AxisType = (bDateAxis && !mrModel.mbAuto) ? cssc2::AxisType::DATE : cssc2::AxisType::CATEGORY; + aScaleData.AutoDateAxis = mrModel.mbAuto; +- aScaleData.Categories = rTypeGroup.createCategorySequence(); ++ aScaleData.Categories = rTypeGroups.front()->createCategorySequence(); + } + else + { +@@ -199,11 +223,11 @@ void AxisConverter::convertFromModel( const Reference< XCoordinateSystem >& rxCo + break; + case API_Y_AXIS: + OSL_ENSURE( mrModel.mnTypeId == C_TOKEN( valAx ), "AxisConverter::convertFromModel - unexpected axis model type (must: c:valAx)" ); +- aScaleData.AxisType = rTypeGroup.isPercent() ? cssc2::AxisType::PERCENT : cssc2::AxisType::REALNUMBER; ++ aScaleData.AxisType = isPercent(rTypeGroups) ? cssc2::AxisType::PERCENT : cssc2::AxisType::REALNUMBER; + break; + case API_Z_AXIS: + OSL_ENSURE( mrModel.mnTypeId == C_TOKEN( serAx ), "AxisConverter::convertFromModel - unexpected axis model type (must: c:serAx)" ); +- OSL_ENSURE( rTypeGroup.isDeep3dChart(), "AxisConverter::convertFromModel - series axis not supported by this chart type" ); ++ OSL_ENSURE( rTypeGroups.front()->isDeep3dChart(), "AxisConverter::convertFromModel - series axis not supported by this chart type" ); + aScaleData.AxisType = cssc2::AxisType::SERIES; + break; + } +@@ -330,7 +354,7 @@ void AxisConverter::convertFromModel( const Reference< XCoordinateSystem >& rxCo + // axis title --------------------------------------------------------- + + // in radar charts, title objects may exist, but are not shown +- if( mrModel.mxTitle.is() && (rTypeGroup.getTypeInfo().meTypeCategory != TYPECATEGORY_RADAR) ) ++ if( mrModel.mxTitle.is() && (rTypeGroups.front()->getTypeInfo().meTypeCategory != TYPECATEGORY_RADAR) ) + { + Reference< XTitled > xTitled( xAxis, UNO_QUERY_THROW ); + TitleConverter aTitleConv( *this, *mrModel.mxTitle ); +diff --git a/oox/source/drawingml/chart/plotareaconverter.cxx b/oox/source/drawingml/chart/plotareaconverter.cxx +index ff67b5f..eaa51e0 100644 +--- a/oox/source/drawingml/chart/plotareaconverter.cxx ++++ b/oox/source/drawingml/chart/plotareaconverter.cxx +@@ -171,15 +171,15 @@ void AxesSetConverter::convertFromModel( const Reference< XDiagram >& rxDiagram, + ModelRef< AxisModel > xYAxis = lclGetOrCreateAxis( mrModel.maAxes, API_Y_AXIS, C_TOKEN( valAx ) ); + + AxisConverter aXAxisConv( *this, *xXAxis ); +- aXAxisConv.convertFromModel( xCoordSystem, rFirstTypeGroup, xYAxis.get(), nAxesSetIdx, API_X_AXIS ); ++ aXAxisConv.convertFromModel( xCoordSystem, aTypeGroups, xYAxis.get(), nAxesSetIdx, API_X_AXIS ); + AxisConverter aYAxisConv( *this, *xYAxis ); +- aYAxisConv.convertFromModel( xCoordSystem, rFirstTypeGroup, xXAxis.get(), nAxesSetIdx, API_Y_AXIS ); ++ aYAxisConv.convertFromModel( xCoordSystem, aTypeGroups, xXAxis.get(), nAxesSetIdx, API_Y_AXIS ); + + if( rFirstTypeGroup.isDeep3dChart() ) + { + ModelRef< AxisModel > xZAxis = lclGetOrCreateAxis( mrModel.maAxes, API_Z_AXIS, C_TOKEN( serAx ) ); + AxisConverter aZAxisConv( *this, *xZAxis ); +- aZAxisConv.convertFromModel( xCoordSystem, rFirstTypeGroup, 0, nAxesSetIdx, API_Z_AXIS ); ++ aZAxisConv.convertFromModel( xCoordSystem, aTypeGroups, 0, nAxesSetIdx, API_Z_AXIS ); + } + + // convert all chart type groups, this converts all series data and formatting +-- +1.9.3 + diff --git a/SOURCES/0005-fdo-72774-Generate-correct-group-items-for-the-year-.patch b/SOURCES/0005-fdo-72774-Generate-correct-group-items-for-the-year-.patch deleted file mode 100644 index 234443f..0000000 --- a/SOURCES/0005-fdo-72774-Generate-correct-group-items-for-the-year-.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 584b8621afec7a77ceab2e2f029687a7dd1a18c3 Mon Sep 17 00:00:00 2001 -From: Kohei Yoshida -Date: Tue, 7 Jan 2014 22:13:07 -0500 -Subject: [PATCH 5/9] fdo#72774: Generate correct group items for the year - group. - -This changes bring it back to the same algorithm used in 3.5. - -Change-Id: I16855cef1de133a1f886baa823d5b0d2b148e781 -(cherry picked from commit c2e88a32314012afb799e321ec1d658f99f71781) -Reviewed-on: https://gerrit.libreoffice.org/7306 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - sc/inc/dputil.hxx | 2 +- - sc/source/core/data/dpdimsave.cxx | 4 ++-- - sc/source/core/data/dpgroup.cxx | 2 +- - sc/source/core/data/dputil.cxx | 13 ++++++++----- - 4 files changed, 12 insertions(+), 9 deletions(-) - -diff --git a/sc/inc/dputil.hxx b/sc/inc/dputil.hxx -index e4ed831..9568e95 100644 ---- a/sc/inc/dputil.hxx -+++ b/sc/inc/dputil.hxx -@@ -45,7 +45,7 @@ public: - SvNumberFormatter* pFormatter); - - static sal_Int32 getDatePartValue( -- double fValue, const ScDPNumGroupInfo& rInfo, sal_Int32 nDatePart, -+ double fValue, const ScDPNumGroupInfo* pInfo, sal_Int32 nDatePart, - SvNumberFormatter* pFormatter); - - static OUString getDisplayedMeasureName(const OUString& rName, ScSubTotalFunc eFunc); -diff --git a/sc/source/core/data/dpdimsave.cxx b/sc/source/core/data/dpdimsave.cxx -index 16f68b8..2db4023 100644 ---- a/sc/source/core/data/dpdimsave.cxx -+++ b/sc/source/core/data/dpdimsave.cxx -@@ -338,8 +338,8 @@ void fillDateGroupDimension( - { - case sheet::DataPilotFieldGroupBy::YEARS: - nStart = ScDPUtil::getDatePartValue( -- fSourceMin, rDateInfo, sheet::DataPilotFieldGroupBy::YEARS, pFormatter); -- nEnd = ScDPUtil::getDatePartValue(fSourceMax, rDateInfo, sheet::DataPilotFieldGroupBy::YEARS, pFormatter); -+ fSourceMin, NULL, sheet::DataPilotFieldGroupBy::YEARS, pFormatter); -+ nEnd = ScDPUtil::getDatePartValue(fSourceMax, NULL, sheet::DataPilotFieldGroupBy::YEARS, pFormatter); - break; - case sheet::DataPilotFieldGroupBy::QUARTERS: nStart = 1; nEnd = 4; break; - case sheet::DataPilotFieldGroupBy::MONTHS: nStart = 1; nEnd = 12; break; -diff --git a/sc/source/core/data/dpgroup.cxx b/sc/source/core/data/dpgroup.cxx -index 1e8059a..6a9f824 100644 ---- a/sc/source/core/data/dpgroup.cxx -+++ b/sc/source/core/data/dpgroup.cxx -@@ -911,7 +911,7 @@ void ScDPGroupTableData::FillGroupValues(vector& rItems, const vectorGetFormatTable(); - sal_Int32 nPartValue = ScDPUtil::getDatePartValue( -- pData->GetValue(), *pNumInfo, nDatePart, pFormatter); -+ pData->GetValue(), pNumInfo, nDatePart, pFormatter); - - ScDPItemData aItem(nDatePart, nPartValue); - rItems[i] = pCache->GetIdByItemData(nColumn, aItem); -diff --git a/sc/source/core/data/dputil.cxx b/sc/source/core/data/dputil.cxx -index e34bc79..558e189 100644 ---- a/sc/source/core/data/dputil.cxx -+++ b/sc/source/core/data/dputil.cxx -@@ -294,16 +294,19 @@ OUString ScDPUtil::getNumGroupName( - } - - sal_Int32 ScDPUtil::getDatePartValue( -- double fValue, const ScDPNumGroupInfo& rInfo, sal_Int32 nDatePart, -+ double fValue, const ScDPNumGroupInfo* pInfo, sal_Int32 nDatePart, - SvNumberFormatter* pFormatter) - { - // Start and end are inclusive - // (End date without a time value is included, with a time value it's not) - -- if (fValue < rInfo.mfStart && !rtl::math::approxEqual(fValue, rInfo.mfStart)) -- return ScDPItemData::DateFirst; -- if (fValue > rInfo.mfEnd && !rtl::math::approxEqual(fValue, rInfo.mfEnd)) -- return ScDPItemData::DateLast; -+ if (pInfo) -+ { -+ if (fValue < pInfo->mfStart && !rtl::math::approxEqual(fValue, pInfo->mfStart)) -+ return ScDPItemData::DateFirst; -+ if (fValue > pInfo->mfEnd && !rtl::math::approxEqual(fValue, pInfo->mfEnd)) -+ return ScDPItemData::DateLast; -+ } - - sal_Int32 nResult = 0; - --- -1.8.4.2 - diff --git a/SOURCES/0006-EMF-Line-thickness-has-to-be-considered-when-drawing.patch b/SOURCES/0006-EMF-Line-thickness-has-to-be-considered-when-drawing.patch deleted file mode 100644 index 9a026e4..0000000 --- a/SOURCES/0006-EMF-Line-thickness-has-to-be-considered-when-drawing.patch +++ /dev/null @@ -1,217 +0,0 @@ -From 26bfc77430c40530113d3ce739896139522565f4 Mon Sep 17 00:00:00 2001 -From: Jan Holesovsky -Date: Wed, 27 Nov 2013 11:51:32 +0100 -Subject: [PATCH 006/109] EMF+: Line thickness has to be considered when - drawing the caps. - -Change-Id: I6043ee3c214f453afaef06125993c73be624c07e -Reviewed-on: https://gerrit.libreoffice.org/6832 -Reviewed-by: Andras Timar -Tested-by: Andras Timar ---- - basegfx/source/polygon/b2dlinegeometry.cxx | 7 +-- - cppcanvas/source/inc/implrenderer.hxx | 3 +- - cppcanvas/source/mtfrenderer/emfplus.cxx | 75 +++++++++++++++++------------ - include/basegfx/polygon/b2dlinegeometry.hxx | 7 ++- - 4 files changed, 55 insertions(+), 37 deletions(-) - -diff --git a/basegfx/source/polygon/b2dlinegeometry.cxx b/basegfx/source/polygon/b2dlinegeometry.cxx -index 5c016bb..417944d 100644 ---- a/basegfx/source/polygon/b2dlinegeometry.cxx -+++ b/basegfx/source/polygon/b2dlinegeometry.cxx -@@ -44,7 +44,8 @@ namespace basegfx - double fWidth, - double fCandidateLength, - double fDockingPosition, // 0->top, 1->bottom -- double* pConsumedLength) -+ double* pConsumedLength, -+ double fShift) - { - B2DPolyPolygon aRetval; - OSL_ENSURE(rCandidate.count() > 1L, "createAreaGeometryForLineStartEnd: Line polygon has too less points (!)"); -@@ -89,7 +90,7 @@ namespace basegfx - const double fArrowYLength(B2DVector(aUpperCenter).getLength()); - - // move arrow to have docking position centered -- aArrowTransform.translate(0.0, -fArrowYLength * fDockingPosition); -+ aArrowTransform.translate(0.0, -fArrowYLength * fDockingPosition + fShift); - - // prepare polygon length - if(fTools::equalZero(fCandidateLength)) -@@ -98,7 +99,7 @@ namespace basegfx - } - - // get the polygon vector we want to plant this arrow on -- const double fConsumedLength(fArrowYLength * (1.0 - fDockingPosition)); -+ const double fConsumedLength(fArrowYLength * (1.0 - fDockingPosition) - fShift); - const B2DVector aHead(rCandidate.getB2DPoint((bStart) ? 0L : rCandidate.count() - 1L)); - const B2DVector aTail(getPositionAbsolute(rCandidate, - (bStart) ? fConsumedLength : fCandidateLength - fConsumedLength, fCandidateLength)); -diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx -index 270c0de..d602945 100644 ---- a/cppcanvas/source/inc/implrenderer.hxx -+++ b/cppcanvas/source/inc/implrenderer.hxx -@@ -282,7 +282,8 @@ static float GetSwapFloat( SvStream& rSt ) - double setFont( sal_uInt8 objectId, const ActionFactoryParameters& rParms, OutDevState& rState ); - - /// Render LineCap, like the start or end arrow of a polygon. -- void EMFPPlusDrawLineCap(const ::basegfx::B2DPolygon& rPolygon, double fPolyLength, -+ /// @return how much we should shorten the original polygon. -+ double EMFPPlusDrawLineCap(const ::basegfx::B2DPolygon& rPolygon, double fPolyLength, - const ::basegfx::B2DPolyPolygon& rLineCap, bool bStart, - const com::sun::star::rendering::StrokeAttributes& rAttributes, - const ActionFactoryParameters& rParms, OutDevState& rState); -diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx -index 1d752e7..bf9720b 100644 ---- a/cppcanvas/source/mtfrenderer/emfplus.cxx -+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx -@@ -1320,13 +1320,12 @@ namespace cppcanvas - } - } - -- -- void ImplRenderer::EMFPPlusDrawLineCap(const ::basegfx::B2DPolygon& rPolygon, double fPolyLength, -+ double ImplRenderer::EMFPPlusDrawLineCap(const ::basegfx::B2DPolygon& rPolygon, double fPolyLength, - const ::basegfx::B2DPolyPolygon& rLineCap, bool bStart, const rendering::StrokeAttributes& rAttributes, - const ActionFactoryParameters& rParms, OutDevState& rState) - { - if (!rLineCap.count()) -- return; -+ return 0.0; - - // it seems the line caps in EMF+ are 4*larger than what - // LibreOffice expects, and the mapping in -@@ -1338,7 +1337,7 @@ namespace cppcanvas - - basegfx::B2DPolyPolygon aArrow(basegfx::tools::createAreaGeometryForLineStartEnd( - rPolygon, rLineCap, bStart, -- fWidth, fPolyLength, 0.0, NULL)); -+ fWidth, fPolyLength, 0, NULL, rAttributes.StrokeWidth)); - - // createAreaGeometryForLineStartEnd from some reason always sets - // the path as closed, correct it -@@ -1350,6 +1349,8 @@ namespace cppcanvas - maActions.push_back(MtfAction(pAction, rParms.mrCurrActionIndex)); - rParms.mrCurrActionIndex += pAction->getActionCount()-1; - } -+ -+ return rAttributes.StrokeWidth; - } - - void ImplRenderer::EMFPPlusDrawPolygon (const ::basegfx::B2DPolyPolygon& polygon, const ActionFactoryParameters& rParms, -@@ -1379,49 +1380,59 @@ namespace cppcanvas - rendering::StrokeAttributes aPolygonAttributes(aCommonAttributes); - pen->SetStrokeDashing(aPolygonAttributes); - -- // render the polygon -- ActionSharedPtr pPolyAction(internal::PolyPolyActionFactory::createPolyPolyAction(aPolyPolygon, rParms.mrCanvas, rState, aPolygonAttributes)); -- if( pPolyAction ) -- { -- maActions.push_back(MtfAction(pPolyAction, rParms.mrCurrActionIndex)); -- rParms.mrCurrActionIndex += pPolyAction->getActionCount()-1; -- } -+ basegfx::B2DPolyPolygon aFinalPolyPolygon; - -- // render line starts & ends -- if (pen->customStartCap || pen->customEndCap) -+ // render line starts & ends if present -+ if (!pen->customStartCap && !pen->customEndCap) -+ aFinalPolyPolygon = aPolyPolygon; -+ else - { - for (sal_uInt32 i = 0; i < aPolyPolygon.count(); ++i) - { -- // break the polypolygon into polygons - basegfx::B2DPolygon aPolygon(aPolyPolygon.getB2DPolygon(i)); - -- if (aPolygon.isClosed()) -- continue; -+ if (!aPolygon.isClosed()) -+ { -+ double fStart = 0.0; -+ double fEnd = 0.0; -+ double fPolyLength = basegfx::tools::getLength(aPolygon); - -- double fPolyLength = basegfx::tools::getLength(aPolygon); -+ // line start -+ if (pen->customStartCap) -+ { -+ rendering::StrokeAttributes aAttributes(aCommonAttributes); -+ pen->customStartCap->SetAttributes(aAttributes); - -- // line start -- if (pen->customStartCap) -- { -- rendering::StrokeAttributes aAttributes(aCommonAttributes); -- pen->customStartCap->SetAttributes(aAttributes); -+ fStart = EMFPPlusDrawLineCap(aPolygon, fPolyLength, pen->customStartCap->polygon, -+ true, aAttributes, rParms, rState); -+ } - -- EMFPPlusDrawLineCap(aPolygon, fPolyLength, pen->customStartCap->polygon, -- true, aAttributes, rParms, rState); -- } -+ // line end -+ if (pen->customEndCap) -+ { -+ rendering::StrokeAttributes aAttributes(aCommonAttributes); -+ pen->customEndCap->SetAttributes(aAttributes); - -- // line end -- if (pen->customEndCap) -- { -- rendering::StrokeAttributes aAttributes(aCommonAttributes); -- pen->customEndCap->SetAttributes(aAttributes); -+ fEnd = EMFPPlusDrawLineCap(aPolygon, fPolyLength, pen->customEndCap->polygon, -+ false, aAttributes, rParms, rState); -+ } - -- EMFPPlusDrawLineCap(aPolygon, fPolyLength, pen->customEndCap->polygon, -- false, aAttributes, rParms, rState); -+ // build new poly, consume something from the old poly -+ if (fStart != 0.0 || fEnd != 0.0) -+ aPolygon = basegfx::tools::getSnippetAbsolute(aPolygon, fStart, fPolyLength - fEnd, fPolyLength); - } -+ -+ aFinalPolyPolygon.append(aPolygon); - } - } - -+ // finally render the polygon -+ ActionSharedPtr pPolyAction(internal::PolyPolyActionFactory::createPolyPolyAction(aFinalPolyPolygon, rParms.mrCanvas, rState, aPolygonAttributes)); -+ if( pPolyAction ) -+ { -+ maActions.push_back(MtfAction(pPolyAction, rParms.mrCurrActionIndex)); -+ rParms.mrCurrActionIndex += pPolyAction->getActionCount()-1; -+ } - } - } - -diff --git a/include/basegfx/polygon/b2dlinegeometry.hxx b/include/basegfx/polygon/b2dlinegeometry.hxx -index 934158f..62e230f 100644 ---- a/include/basegfx/polygon/b2dlinegeometry.hxx -+++ b/include/basegfx/polygon/b2dlinegeometry.hxx -@@ -63,6 +63,10 @@ namespace basegfx - again calculating the length (which may be expensive with beziers). If 0.0 is - given, the length is calculated on demand. - -+ @param fShift -+ When it is necessary to count with the thickness of the line, it -+ makes sense to move the start position slightly - so define the shift. -+ - @return - The Line start and end polygon, correctly rotated and scaled - */ -@@ -73,7 +77,8 @@ namespace basegfx - double fWidth, - double fCandidateLength = 0.0, // 0.0 -> calculate self - double fDockingPosition = 0.5, // 0->top, 1->bottom -- double* pConsumedLength = 0L); -+ double* pConsumedLength = 0L, -+ double fShift = 0.0); - - /** create filled polygon geometry for lines with a line width - --- -1.8.4.2 - diff --git a/SOURCES/0006-bnc-883684-Make-chart-objects-exempt-from-automatic-.patch b/SOURCES/0006-bnc-883684-Make-chart-objects-exempt-from-automatic-.patch new file mode 100644 index 0000000..9cf5c48 --- /dev/null +++ b/SOURCES/0006-bnc-883684-Make-chart-objects-exempt-from-automatic-.patch @@ -0,0 +1,92 @@ +From bac8126cf1d485eaa65d9ab480118346eff90ad2 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Wed, 9 Jul 2014 21:46:34 -0400 +Subject: [PATCH 006/137] bnc#883684: Make chart objects exempt from automatic + unloading. + +The Memory option page contains "Number of objects" setting which controls +how many OLE objects can be loaded at any given time. When the number of +total OLE objects exceeds this number the oldest ones get unloaded. Note +that the total number is across all open documents, not per document. + +Technically, chart objects are OLE objects, but unlike other OLE objects +that are embedded Calc, Writer, Draw documents, chart objects normally +"belong" to the host document. It therefore makes no sense to subject +chart objects to this automatic unloading. + +In the future we may want to apply this exemption to other types of OLE +objects, like formula objects for example.. Or maybe this setting can be +removed altogether... + +(cherry picked from commit b023565d4f064cd0312e8c1fcc23a9f552112935) +Signed-off-by: Andras Timar + +Conflicts: + include/svx/svdoole2.hxx + svx/source/svdraw/svdetc.cxx + svx/source/svdraw/svdoole2.cxx + +Change-Id: I7dd92550880efb4db8fc843cf1c915c712166da4 +(cherry picked from commit 55612305b645a1c0872373c0a9f434763708732a) +Signed-off-by: Andras Timar +--- + include/svx/svdoole2.hxx | 7 +++++++ + svx/source/svdraw/svdetc.cxx | 4 ++++ + svx/source/svdraw/svdoole2.cxx | 8 +++++++- + 3 files changed, 18 insertions(+), 1 deletion(-) + +diff --git a/include/svx/svdoole2.hxx b/include/svx/svdoole2.hxx +index 7a93f4b..0f1df14 100644 +--- a/include/svx/svdoole2.hxx ++++ b/include/svx/svdoole2.hxx +@@ -167,6 +167,13 @@ public: + sal_Bool IsChart() const; + sal_Bool IsCalc() const; + ++ /** ++ * Unloadable OLE objects are subject to automatic unloading per memory ++ * setting. The "Number of objects" setting in the Memory option controls ++ * how many OLE objects can be loaded at any given moment. ++ */ ++ bool IsUnloadable() const; ++ + sal_Bool UpdateLinkURL_Impl(); + void BreakFileLink_Impl(); + void DisconnectFileLink_Impl(); +diff --git a/svx/source/svdraw/svdetc.cxx b/svx/source/svdraw/svdetc.cxx +index 4caca94..afcc792 100644 +--- a/svx/source/svdraw/svdetc.cxx ++++ b/svx/source/svdraw/svdetc.cxx +@@ -165,6 +165,10 @@ void OLEObjCache::UnloadOnDemand() + + void OLEObjCache::InsertObj(SdrOle2Obj* pObj) + { ++ if (!pObj->IsUnloadable()) ++ // This OLE object is exempt from automatic unloading. ++ return; ++ + if ( !empty() ) + { + SdrOle2Obj* pExistingObj = front(); +diff --git a/svx/source/svdraw/svdoole2.cxx b/svx/source/svdraw/svdoole2.cxx +index 2929252..1102de8 100644 +--- a/svx/source/svdraw/svdoole2.cxx ++++ b/svx/source/svdraw/svdoole2.cxx +@@ -2142,7 +2142,13 @@ sal_Bool SdrOle2Obj::IsCalc() const + return sal_False; + } + +-// ----------------------------------------------------------------------------- ++bool SdrOle2Obj::IsUnloadable() const ++{ ++ // Right now, chart OLE objects are the only ones exempt from automatic ++ // unloading. ++ return !IsChart(); ++} ++ + uno::Reference< frame::XModel > SdrOle2Obj::GetParentXModel() const + { + uno::Reference< frame::XModel > xDoc; +-- +1.9.3 + diff --git a/SOURCES/0006-fix-occasional-crash-on-dragging-and-dropping-pages-.patch b/SOURCES/0006-fix-occasional-crash-on-dragging-and-dropping-pages-.patch deleted file mode 100644 index a7f9c7d..0000000 --- a/SOURCES/0006-fix-occasional-crash-on-dragging-and-dropping-pages-.patch +++ /dev/null @@ -1,143 +0,0 @@ -From 152b0dd43165106f9c01bab33017e23dadf91fb6 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= -Date: Thu, 12 Dec 2013 10:39:06 +0000 -Subject: [PATCH 6/9] fix occasional crash on dragging and dropping pages in - slidesorters - -pages go into the cache, and sometimes they get deleted before the -cache gets processed. Remove deleted pages when they go away - -Change-Id: I291072a8541f4ca36979e9914975d81cc23a9497 -(cherry picked from commit abe9d1463282690313aaf91d2a54011d10b900b9) -(cherry picked from commit 026e9335d792c6557255f064960e0ef6d28728e0) -Reviewed-on: https://gerrit.libreoffice.org/7053 -Reviewed-by: David Tardon -Tested-by: David Tardon ---- - sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx | 33 +++++++++++++++++++--- - sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx | 12 ++++++-- - 2 files changed, 38 insertions(+), 7 deletions(-) - -diff --git a/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx b/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx -index 835787b..cdc2b57 100644 ---- a/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx -+++ b/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx -@@ -94,6 +94,7 @@ RequestQueue::RequestQueue (const SharedCacheContext& rpCacheContext) - - RequestQueue::~RequestQueue (void) - { -+ Clear(); - } - - -@@ -120,7 +121,15 @@ void RequestQueue::AddRequest ( - // order. - sal_Int32 nPriority (mpCacheContext->GetPriority(aKey)); - Request aRequest (aKey, nPriority, eRequestClass); -- mpRequestQueue->insert(aRequest); -+ -+ std::pair ret = mpRequestQueue->insert(aRequest); -+ bool bInserted = ret.second == true; -+ -+ if (bInserted) -+ { -+ SdrPage *pPage = const_cast(aRequest.maKey); -+ pPage->AddPageUser(*this); -+ } - - SSCD_SET_REQUEST_CLASS(aKey,eRequestClass); - -@@ -131,8 +140,11 @@ void RequestQueue::AddRequest ( - #endif - } - -- -- -+void RequestQueue::PageInDestruction(const SdrPage& rPage) -+{ -+ //remove any requests pending for this page which is going away now -+ RemoveRequest(&rPage); -+} - - bool RequestQueue::RemoveRequest ( - CacheKey aKey) -@@ -152,7 +164,11 @@ bool RequestQueue::RemoveRequest ( - mnMinimumPriority++; - else if (aRequestIterator->mnPriorityInClass == mnMaximumPriority-1) - mnMaximumPriority--; -+ -+ SdrPage *pPage = const_cast(aRequestIterator->maKey); -+ pPage->RemovePageUser(*this); - mpRequestQueue->erase(aRequestIterator); -+ - bRequestWasRemoved = true; - - if (bRequestWasRemoved) -@@ -229,7 +245,10 @@ void RequestQueue::PopFront (void) - { - SSCD_SET_STATUS(maRequestQueue.begin()->mpData->GetPage(),NONE); - -- mpRequestQueue->erase(mpRequestQueue->begin()); -+ Container::const_iterator aIter(mpRequestQueue->begin()); -+ SdrPage *pPage = const_cast(aIter->maKey); -+ pPage->RemovePageUser(*this); -+ mpRequestQueue->erase(aIter); - - // Reset the priority counter if possible. - if (mpRequestQueue->empty()) -@@ -256,6 +275,12 @@ void RequestQueue::Clear (void) - { - ::osl::MutexGuard aGuard (maMutex); - -+ for (Container::iterator aI = mpRequestQueue->begin(), aEnd = mpRequestQueue->end(); aI != aEnd; ++aI) -+ { -+ SdrPage *pPage = const_cast(aI->maKey); -+ pPage->RemovePageUser(*this); -+ } -+ - mpRequestQueue->clear(); - mnMinimumPriority = 0; - mnMaximumPriority = 1; -diff --git a/sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx b/sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx -index 78a4627..088a135 100644 ---- a/sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx -+++ b/sd/source/ui/slidesorter/cache/SlsRequestQueue.hxx -@@ -24,7 +24,8 @@ - #include "cache/SlsCacheContext.hxx" - #include "taskpane/SlideSorterCacheDisplay.hxx" - #include --#include "osl/mutex.hxx" -+#include -+#include - - - namespace sd { namespace slidesorter { namespace cache { -@@ -34,11 +35,11 @@ class RequestData; - /** The request queue stores requests that are described by the RequestData - sorted according to priority class and then priority. - */ --class RequestQueue -+class RequestQueue : public sdr::PageUser - { - public: - RequestQueue (const SharedCacheContext& rpCacheContext); -- ~RequestQueue (void); -+ virtual ~RequestQueue(); - - /** Insert a request with highest or lowest priority in its priority - class. When the request is already present then it is first -@@ -99,6 +100,11 @@ public: - */ - ::osl::Mutex& GetMutex (void); - -+ /** Ensure we don't hand out a page deleted before anyone got a -+ chance to process it -+ */ -+ virtual void PageInDestruction(const SdrPage& rPage); -+ - private: - ::osl::Mutex maMutex; - class Container; --- -1.8.4.2 - diff --git a/SOURCES/0007-Fix-ignoring-large-twips-values-like-MSO-does-cp-100.patch b/SOURCES/0007-Fix-ignoring-large-twips-values-like-MSO-does-cp-100.patch new file mode 100644 index 0000000..5481949 --- /dev/null +++ b/SOURCES/0007-Fix-ignoring-large-twips-values-like-MSO-does-cp-100.patch @@ -0,0 +1,61 @@ +From 088eef7c97dc4d496826a3f3ae4fdec7f36b6ada Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Mat=C3=BA=C5=A1=20Kukan?= +Date: Wed, 9 Jul 2014 14:25:04 +0200 +Subject: [PATCH 007/137] Fix ignoring large twips values like MSO does + (cp#1000087) +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +which was introduced in 10b4da63e3143108ba75891e9e98fdaa2f7953ab. + +Since 1e47614cdb84b018a22a334dad0cdd9f0f53892c, only +convertTwipToMM100Unsigned() ignores large values, which presumably +was not the intention. At least commit message suggests so. + +So, move the check back to convertTwipToMM100(). + +(cherry picked from commit 4d1621136c464b462a598571ecdcfe2ae119d8c7) + +Conflicts: + writerfilter/source/dmapper/ConversionHelper.cxx + +Change-Id: I17040f1987e24789b9de39a837d9f7ecaed520fb +Reviewed-on: https://gerrit.libreoffice.org/10193 +Reviewed-by: Caolán McNamara +Tested-by: Caolán McNamara +--- + writerfilter/source/dmapper/ConversionHelper.cxx | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/writerfilter/source/dmapper/ConversionHelper.cxx b/writerfilter/source/dmapper/ConversionHelper.cxx +index 7c0c2a1..40a1a29 100644 +--- a/writerfilter/source/dmapper/ConversionHelper.cxx ++++ b/writerfilter/source/dmapper/ConversionHelper.cxx +@@ -230,6 +230,10 @@ OUString ConvertMSFormatStringToSO( + + sal_Int32 convertTwipToMM100(sal_Int32 _t) + { ++ // It appears that MSO handles large twip values specially, probably legacy 16bit handling, ++ // anything that's bigger than 32767 appears to be simply ignored. ++ if( _t >= 0x8000 ) ++ return 0; + return TWIP_TO_MM100( _t ); + } + +@@ -237,11 +241,7 @@ sal_uInt32 convertTwipToMM100Unsigned(sal_Int32 _t) + { + if( _t < 0 ) + return 0; +- // It appears that MSO handles large twip values specially, probably legacy 16bit handling, +- // anything that's bigger than 32767 appears to be simply ignored. +- if( _t >= 0x8000 ) +- return 0; +- return TWIP_TO_MM100( _t ); ++ return convertTwipToMM100( _t ); + } + + sal_Int32 convertEMUToMM100(sal_Int32 _t) +-- +1.9.3 + diff --git a/SOURCES/0007-cairo-canvas-Line-dashing-size-depends-on-the-line-w.patch b/SOURCES/0007-cairo-canvas-Line-dashing-size-depends-on-the-line-w.patch deleted file mode 100644 index 5554a16..0000000 --- a/SOURCES/0007-cairo-canvas-Line-dashing-size-depends-on-the-line-w.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 35e44c9d756f3815b00be9aabbb19bd36c430b37 Mon Sep 17 00:00:00 2001 -From: Jan Holesovsky -Date: Wed, 27 Nov 2013 13:11:04 +0100 -Subject: [PATCH 007/109] cairo canvas: Line dashing size depends on the line - width. - -Change-Id: I6a3f563b6effd37b448ec3e8463a87879e0566d4 -Reviewed-on: https://gerrit.libreoffice.org/6833 -Reviewed-by: Andras Timar -Tested-by: Andras Timar ---- - canvas/source/cairo/cairo_canvashelper.cxx | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/canvas/source/cairo/cairo_canvashelper.cxx b/canvas/source/cairo/cairo_canvashelper.cxx -index ca75d35..5953495 100644 ---- a/canvas/source/cairo/cairo_canvashelper.cxx -+++ b/canvas/source/cairo/cairo_canvashelper.cxx -@@ -1230,7 +1230,7 @@ namespace cairocanvas - { - double* pDashArray = new double[ strokeAttributes.DashArray.getLength() ]; - for( sal_Int32 i=0; i -Date: Mon, 6 Jan 2014 16:40:59 +0100 -Subject: [PATCH 7/9] fdo#37167 create statement before - execute/wasNull/getBoolean - -This populates "object" member variable. - -The "createStatement" calls were removed in: - - commit b9392a36645d8632b97ad79240f483b3a1683b61 - Author: Ivo Hinkelmann - Date: Thu Apr 23 10:42:05 2009 +0000 - - CWS-TOOLING: integrate CWS dbaperf1 - -This was most probably in error since the call is not removed from the -other modified member functions in this commit and/or failed to -aaccount for the scenario of no parameter (and thus no setXXX call -before execute). - -Change-Id: Ic0e7b7b64ea496791f32c1416aa7d4416f909616 -Reviewed-on: https://gerrit.libreoffice.org/7280 -Reviewed-by: David Tardon -Tested-by: David Tardon ---- - connectivity/source/drivers/jdbc/CallableStatement.cxx | 4 ++++ - connectivity/source/drivers/jdbc/PreparedStatement.cxx | 5 +++++ - 2 files changed, 9 insertions(+) - -diff --git a/connectivity/source/drivers/jdbc/CallableStatement.cxx b/connectivity/source/drivers/jdbc/CallableStatement.cxx -index 7ab349f..50cce64 100644 ---- a/connectivity/source/drivers/jdbc/CallableStatement.cxx -+++ b/connectivity/source/drivers/jdbc/CallableStatement.cxx -@@ -69,12 +69,16 @@ Any SAL_CALL java_sql_CallableStatement::queryInterface( const Type & rType ) th - // ------------------------------------------------------------------------- - sal_Bool SAL_CALL java_sql_CallableStatement::wasNull( ) throw(starsdbc::SQLException, RuntimeException) - { -+ SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!"); -+ createStatement(t.pEnv); - static jmethodID mID(NULL); - return callBooleanMethod( "wasNull", mID ); - } - - sal_Bool SAL_CALL java_sql_CallableStatement::getBoolean( sal_Int32 columnIndex ) throw(starsdbc::SQLException, RuntimeException) - { -+ SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!"); -+ createStatement(t.pEnv); - static jmethodID mID(NULL); - return callBooleanMethodWithIntArg( "getBoolean", mID,columnIndex ); - } -diff --git a/connectivity/source/drivers/jdbc/PreparedStatement.cxx b/connectivity/source/drivers/jdbc/PreparedStatement.cxx -index 0458ad7..5f9dafe 100644 ---- a/connectivity/source/drivers/jdbc/PreparedStatement.cxx -+++ b/connectivity/source/drivers/jdbc/PreparedStatement.cxx -@@ -96,6 +96,8 @@ sal_Bool SAL_CALL java_sql_PreparedStatement::execute( ) throw(::com::sun::star - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed); - -+ SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!"); -+ createStatement(t.pEnv); - static jmethodID mID(NULL); - return callBooleanMethod( "execute", mID ); - } -@@ -106,6 +108,9 @@ sal_Int32 SAL_CALL java_sql_PreparedStatement::executeUpdate( ) throw(::com::su - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(java_sql_Statement_BASE::rBHelper.bDisposed); - m_aLogger.log( LogLevel::FINE, STR_LOG_EXECUTING_PREPARED_UPDATE ); -+ -+ SDBThreadAttach t; OSL_ENSURE(t.pEnv,"Java Enviroment geloescht worden!"); -+ createStatement(t.pEnv); - static jmethodID mID(NULL); - return callIntMethod("executeUpdate",mID); - } --- -1.8.4.2 - diff --git a/SOURCES/0008-fdo-72219-Fix-for-corruption-of-symbols-in-docx.patch b/SOURCES/0008-fdo-72219-Fix-for-corruption-of-symbols-in-docx.patch deleted file mode 100644 index 90876aa..0000000 --- a/SOURCES/0008-fdo-72219-Fix-for-corruption-of-symbols-in-docx.patch +++ /dev/null @@ -1,91 +0,0 @@ -From 2421317990d00e14325298f34db3c60735527697 Mon Sep 17 00:00:00 2001 -From: Rohit Deshmukh -Date: Fri, 6 Dec 2013 15:42:53 +0530 -Subject: [PATCH 8/9] fdo#72219: Fix for corruption of symbols in docx - -Issue: -OUString uses UTF-16, so for a Unicode surrogate character there are 2 -values stored, not just 1. -So we are getting assert failure in "rtl_uString_iterateCodePoints" method. - -erAck: Underlying cause was that the dictionary breakiterator misused -UTF-16 positions as Unicode code point positions. - -Change-Id: I923485f56c2d879b63687adaea2b489a3479991c -Reviewed-on: https://gerrit.libreoffice.org/6955 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke -(cherry picked from commit d8fd15875901d584a4bbcc07c927fa20332e4841) -Reviewed-on: https://gerrit.libreoffice.org/7322 -(cherry picked from commit 994d0c9e7aa8d1a7602e61b770991da980c1cde5) -Reviewed-on: https://gerrit.libreoffice.org/7324 ---- - i18npool/qa/cppunit/test_breakiterator.cxx | 19 ++++++++++++++++++- - i18npool/source/breakiterator/xdictionary.cxx | 6 ++++-- - 2 files changed, 22 insertions(+), 3 deletions(-) - -diff --git a/i18npool/qa/cppunit/test_breakiterator.cxx b/i18npool/qa/cppunit/test_breakiterator.cxx -index 41e4077..b4174ba 100644 ---- a/i18npool/qa/cppunit/test_breakiterator.cxx -+++ b/i18npool/qa/cppunit/test_breakiterator.cxx -@@ -44,7 +44,7 @@ public: - #endif - void testKhmer(); - void testJapanese(); -- -+ void testChinese(); - CPPUNIT_TEST_SUITE(TestBreakIterator); - CPPUNIT_TEST(testLineBreaking); - CPPUNIT_TEST(testGraphemeIteration); -@@ -60,6 +60,7 @@ public: - CPPUNIT_TEST(testKhmer); - #endif - CPPUNIT_TEST(testJapanese); -+ CPPUNIT_TEST(testChinese); - CPPUNIT_TEST_SUITE_END(); - private: - uno::Reference m_xBreak; -@@ -909,6 +910,22 @@ void TestBreakIterator::testJapanese() - } - } - -+void TestBreakIterator::testChinese() -+{ -+ lang::Locale aLocale; -+ aLocale.Language = "zh"; -+ aLocale.Country = "CN"; -+ i18n::Boundary aBounds; -+ -+ { -+ const sal_Unicode CHINESE[] = { 0x6A35, 0x6A30, 0x69FE, 0x8919, 0xD867, 0xDEDB }; -+ -+ OUString aTest(CHINESE, SAL_N_ELEMENTS(CHINESE)); -+ aBounds = m_xBreak->getWordBoundary(aTest, 4, aLocale, -+ i18n::WordType::DICTIONARY_WORD, true); -+ CPPUNIT_ASSERT(aBounds.startPos == 4 && aBounds.endPos == 6); -+ } -+} - void TestBreakIterator::setUp() - { - BootstrapFixtureBase::setUp(); -diff --git a/i18npool/source/breakiterator/xdictionary.cxx b/i18npool/source/breakiterator/xdictionary.cxx -index 72da09f..3b43fa3 100644 ---- a/i18npool/source/breakiterator/xdictionary.cxx -+++ b/i18npool/source/breakiterator/xdictionary.cxx -@@ -383,9 +383,11 @@ Boundary xdictionary::getWordBoundary(const OUString& rText, sal_Int32 anyPos, s - if (u_isWhitespace(ch)) - i--; - } -+ - boundary.endPos = boundary.startPos; -- rText.iterateCodePoints(&boundary.endPos, aCache.wordboundary[i]); -- rText.iterateCodePoints(&boundary.startPos, aCache.wordboundary[i-1]); -+ boundary.endPos += aCache.wordboundary[i]; -+ boundary.startPos += aCache.wordboundary[i-1]; -+ - } else { - boundary.startPos = anyPos; - if (anyPos < len) rText.iterateCodePoints(&anyPos, 1); --- -1.8.4.2 - diff --git a/SOURCES/0011-resolved-fdo-67572-export-add-in-equivalents-as-inte.patch b/SOURCES/0011-resolved-fdo-67572-export-add-in-equivalents-as-inte.patch deleted file mode 100644 index 8400b15..0000000 --- a/SOURCES/0011-resolved-fdo-67572-export-add-in-equivalents-as-inte.patch +++ /dev/null @@ -1,123 +0,0 @@ -From 80994001d563ffd51f008eae4eb88c6eb2b7d38b Mon Sep 17 00:00:00 2001 -From: Eike Rathke -Date: Sat, 2 Nov 2013 21:03:17 +0100 -Subject: [PATCH 011/109] resolved fdo#67572 export add-in equivalents as - internal to .xlsx - -For OOXML .xlsx export the add-in functions that are equivalents of -known internal functions as those internal functions. - -(cherry picked from commit da7c6092a644dc22f90fb8eef0c4f0df06ec204a) - -Minus the DURATION change that was fixed on master (and 4.2) with -62e1a27dc757637223f5f18b1a340ba138e0cb82 - -Change-Id: Ic41f32b67902effa07c3d4db137be08dc5af7265 -Reviewed-on: https://gerrit.libreoffice.org/6530 -Reviewed-by: Markus Mohrhard -Tested-by: Markus Mohrhard ---- - sc/source/filter/inc/formulabase.hxx | 1 + - sc/source/filter/oox/formulabase.cxx | 27 ++++++++++++++++----------- - 2 files changed, 17 insertions(+), 11 deletions(-) - -diff --git a/sc/source/filter/inc/formulabase.hxx b/sc/source/filter/inc/formulabase.hxx -index cb2785e..50948f7 100644 ---- a/sc/source/filter/inc/formulabase.hxx -+++ b/sc/source/filter/inc/formulabase.hxx -@@ -499,6 +499,7 @@ struct FunctionInfo - bool mbParamPairs; /// True = optional parameters are expected to appear in pairs. - bool mbVolatile; /// True = volatile function. - bool mbExternal; /// True = external function in Calc. -+ bool mbInternal; /// True = internal function in Calc. (Both can be true!) - bool mbMacroFunc; /// True = macro sheet function or command. - bool mbVarParam; /// True = use a tFuncVar token, also if min/max are equal. - }; -diff --git a/sc/source/filter/oox/formulabase.cxx b/sc/source/filter/oox/formulabase.cxx -index d0db2e7..c222e7e 100644 ---- a/sc/source/filter/oox/formulabase.cxx -+++ b/sc/source/filter/oox/formulabase.cxx -@@ -212,6 +212,7 @@ const sal_uInt16 FUNCFLAG_MACROCALL_NEW = FUNCFLAG_MACROCALL | FUNCFLAG_MACR - must exist. */ - const sal_uInt16 FUNCFLAG_BIFFIMPORTONLY = 0x0800; /// Only used in BIFF binary import filter. - const sal_uInt16 FUNCFLAG_BIFFEXPORTONLY = 0x1000; /// Only used in BIFF binary export filter. -+const sal_uInt16 FUNCFLAG_INTERNAL = 0x2000; /// Function is internal in Calc. - - /// Converts a function library index (value of enum FunctionLibraryType) to function flags. - #define FUNCLIB_TO_FUNCFLAGS( funclib_index ) static_cast< sal_uInt16 >( static_cast< sal_uInt8 >( funclib_index ) << 12 ) -@@ -584,8 +585,8 @@ static const FunctionData saFuncTableBiff4[] = - { "QUOTIENT", "QUOTIENT", 417, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL }, - { "DELTA", "DELTA", 418, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL }, - { "GESTEP", "GESTEP", 419, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL }, -- { "ISEVEN", "ISEVEN", 420, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in -- { "ISODD", "ISODD", 421, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in -+ { "ISEVEN", "ISEVEN", 420, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL | FUNCFLAG_INTERNAL }, // Calc: builtin and add-in -+ { "ISODD", "ISODD", 421, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL | FUNCFLAG_INTERNAL }, // Calc: builtin and add-in - { "MROUND", "MROUND", 422, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL }, - { "ERF", "ERF", 423, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL }, - { "ERFC", "ERFC", 424, NOID, 1, 1, V, { RR }, FUNCFLAG_EXTERNAL }, -@@ -609,10 +610,10 @@ static const FunctionData saFuncTableBiff4[] = - { "YIELD", "YIELD", 442, NOID, 6, 7, V, { RR }, FUNCFLAG_EXTERNAL }, - { "DOLLARDE", "DOLLARDE", 443, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL }, - { "DOLLARFR", "DOLLARFR", 444, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL }, -- { "NOMINAL", "NOMINAL", 445, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in -- { "EFFECT", "EFFECT", 446, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in -- { "CUMPRINC", "CUMPRINC", 447, NOID, 6, 6, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in -- { "CUMIPMT", "CUMIPMT", 448, NOID, 6, 6, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in -+ { "NOMINAL", "NOMINAL", 445, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL | FUNCFLAG_INTERNAL }, // Calc: builtin and add-in -+ { "EFFECT", "EFFECT", 446, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL | FUNCFLAG_INTERNAL }, // Calc: builtin and add-in -+ { "CUMPRINC", "CUMPRINC", 447, NOID, 6, 6, V, { RR }, FUNCFLAG_EXTERNAL | FUNCFLAG_INTERNAL }, // Calc: builtin and add-in -+ { "CUMIPMT", "CUMIPMT", 448, NOID, 6, 6, V, { RR }, FUNCFLAG_EXTERNAL | FUNCFLAG_INTERNAL }, // Calc: builtin and add-in - { "EDATE", "EDATE", 449, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL }, - { "EOMONTH", "EOMONTH", 450, NOID, 2, 2, V, { RR }, FUNCFLAG_EXTERNAL }, - { "YEARFRAC", "YEARFRAC", 451, NOID, 2, 3, V, { RR }, FUNCFLAG_EXTERNAL }, -@@ -622,7 +623,7 @@ static const FunctionData saFuncTableBiff4[] = - { "COUPNCD", "COUPNCD", 455, NOID, 3, 4, V, { RR }, FUNCFLAG_EXTERNAL }, - { "COUPNUM", "COUPNUM", 456, NOID, 3, 4, V, { RR }, FUNCFLAG_EXTERNAL }, - { "COUPPCD", "COUPPCD", 457, NOID, 3, 4, V, { RR }, FUNCFLAG_EXTERNAL }, -- { "DURATION", "DURATION", 458, NOID, 5, 6, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in -+ { "DURATION", "DURATION", 458, NOID, 5, 6, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in (but different!) - { "MDURATION", "MDURATION", 459, NOID, 5, 6, V, { RR }, FUNCFLAG_EXTERNAL }, - { "ODDLPRICE", "ODDLPRICE", 460, NOID, 7, 8, V, { RR }, FUNCFLAG_EXTERNAL }, - { "ODDLYIELD", "ODDLYIELD", 461, NOID, 8, 9, V, { RR }, FUNCFLAG_EXTERNAL }, -@@ -632,14 +633,14 @@ static const FunctionData saFuncTableBiff4[] = - { "WEEKNUM", "WEEKNUM", 465, NOID, 1, 2, V, { RR }, FUNCFLAG_EXTERNAL }, - { "AMORDEGRC", "AMORDEGRC", 466, NOID, 6, 7, V, { RR }, FUNCFLAG_EXTERNAL }, - { "AMORLINC", "AMORLINC", 467, NOID, 6, 7, V, { RR }, FUNCFLAG_EXTERNAL }, -- { "CONVERT", "CONVERT", 468, NOID, 3, 3, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in -+ { "CONVERT", "CONVERT", 468, NOID, 3, 3, V, { RR }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in (but different!) - { "ACCRINT", "ACCRINT", 469, NOID, 6, 7, V, { RR }, FUNCFLAG_EXTERNAL }, - { "ACCRINTM", "ACCRINTM", 470, NOID, 4, 5, V, { RR }, FUNCFLAG_EXTERNAL }, - { "WORKDAY", "WORKDAY", 471, NOID, 2, 3, V, { RR, RR, RX, C }, FUNCFLAG_EXTERNAL }, - { "NETWORKDAYS", "NETWORKDAYS", 472, NOID, 2, 3, V, { RR, RR, RX, C }, FUNCFLAG_EXTERNAL }, -- { "GCD", "GCD", 473, NOID, 1, MX, V, { RX }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in -+ { "GCD", "GCD", 473, NOID, 1, MX, V, { RX }, FUNCFLAG_EXTERNAL | FUNCFLAG_INTERNAL }, // Calc: builtin and add-in - { "MULTINOMIAL", "MULTINOMIAL", 474, NOID, 1, MX, V, { RX }, FUNCFLAG_EXTERNAL }, -- { "LCM", "LCM", 475, NOID, 1, MX, V, { RX }, FUNCFLAG_EXTERNAL }, // Calc: builtin and add-in -+ { "LCM", "LCM", 475, NOID, 1, MX, V, { RX }, FUNCFLAG_EXTERNAL | FUNCFLAG_INTERNAL }, // Calc: builtin and add-in - { "FVSCHEDULE", "FVSCHEDULE", 476, NOID, 2, 2, V, { RR, RX }, FUNCFLAG_EXTERNAL }, - - // *** macro sheet commands *** -@@ -999,6 +1000,7 @@ void FunctionProviderImpl::initFunc( const FunctionData& rFuncData, sal_uInt8 nM - xFuncInfo->mbParamPairs = getFlag( rFuncData.mnFlags, FUNCFLAG_PARAMPAIRS ); - xFuncInfo->mbVolatile = getFlag( rFuncData.mnFlags, FUNCFLAG_VOLATILE ); - xFuncInfo->mbExternal = getFlag( rFuncData.mnFlags, FUNCFLAG_EXTERNAL ); -+ xFuncInfo->mbInternal = !xFuncInfo->mbExternal || getFlag( rFuncData.mnFlags, FUNCFLAG_INTERNAL ); - bool bMacroCmd = getFlag( rFuncData.mnFlags, FUNCFLAG_MACROCMD ); - xFuncInfo->mbMacroFunc = bMacroCmd || getFlag( rFuncData.mnFlags, FUNCFLAG_MACROFUNC ); - xFuncInfo->mbVarParam = bMacroCmd || (rFuncData.mnMinParamCount != rFuncData.mnMaxParamCount) || getFlag( rFuncData.mnFlags, FUNCFLAG_ALWAYSVAR ); -@@ -1349,7 +1351,10 @@ bool OpCodeProviderImpl::initFuncOpCodes( const ApiTokenMap& rIntFuncTokenMap, c - { - FunctionInfoRef xFuncInfo = *aIt; - // set API opcode from ODF function name -- bIsValid &= initFuncOpCode( *xFuncInfo, xFuncInfo->mbExternal ? rExtFuncTokenMap : rIntFuncTokenMap ); -+ if (xFuncInfo->mbExternal) -+ bIsValid &= initFuncOpCode( *xFuncInfo, rExtFuncTokenMap ); -+ if (xFuncInfo->mbInternal) -+ bIsValid &= initFuncOpCode( *xFuncInfo, rIntFuncTokenMap ); - // insert the function info into the maps - if( (xFuncInfo->mnApiOpCode != OPCODE_NONAME) && (xFuncInfo->mnApiOpCode != OPCODE_BAD) ) - { --- -1.8.4.2 - diff --git a/SOURCES/0012-resolved-fdo-61946-use-correct-TabDelta-for-UpdateRe.patch b/SOURCES/0012-resolved-fdo-61946-use-correct-TabDelta-for-UpdateRe.patch deleted file mode 100644 index 2ba314f..0000000 --- a/SOURCES/0012-resolved-fdo-61946-use-correct-TabDelta-for-UpdateRe.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 1aa9bae0ffea4b37392175197f58f26001c06c66 Mon Sep 17 00:00:00 2001 -From: Eike Rathke -Date: Sat, 23 Nov 2013 12:16:51 +0100 -Subject: [PATCH 012/109] resolved fdo#61946 use correct TabDelta for - UpdateReference - -The sheet delta was reverted resulting in the references not being -updated when conditional formats were copy-pasted between sheets. Saved -to .ods then was an identical calcext:target-range-address as for the -copied source range. - -(cherry picked from commit ef8e0beba442f58abe3bc77f6f55fc6109025dd4) - -Backported. - -Change-Id: I038b58f20f71ff1393dccafa3021dac02cd69e4b -Reviewed-on: https://gerrit.libreoffice.org/6768 -Tested-by: Markus Mohrhard -Reviewed-by: Markus Mohrhard ---- - sc/source/core/data/table2.cxx | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx -index 220211c..6c530d3 100644 ---- a/sc/source/core/data/table2.cxx -+++ b/sc/source/core/data/table2.cxx -@@ -712,7 +712,7 @@ void ScTable::CopyConditionalFormat( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCRO - ScConditionalFormat* pNewFormat = itr->Clone(pDocument); - - pNewFormat->AddRange(aIntersectedRange); -- pNewFormat->UpdateReference(URM_COPY, aNewRange, nDx, nDy, pTable->nTab - nTab, true); -+ pNewFormat->UpdateReference(URM_COPY, aNewRange, nDx, nDy, nTab - pTable->nTab, true); - - sal_uLong nMax = 0; - for(ScConditionalFormatList::const_iterator itrCond = mpCondFormatList->begin(); --- -1.8.4.2 - diff --git a/SOURCES/0013-resolved-fdo-53103-actually-use-the-external-data-fi.patch b/SOURCES/0013-resolved-fdo-53103-actually-use-the-external-data-fi.patch deleted file mode 100644 index 8a2b912..0000000 --- a/SOURCES/0013-resolved-fdo-53103-actually-use-the-external-data-fi.patch +++ /dev/null @@ -1,104 +0,0 @@ -From ea40b8b14d830f5025a3fe2e9da9163b83a843e5 Mon Sep 17 00:00:00 2001 -From: Eike Rathke -Date: Wed, 27 Nov 2013 00:04:44 +0100 -Subject: [PATCH 013/109] resolved fdo#53103 actually use the external data - filter options - -ScDocShell::ConvertFrom() queries the filter options from the SfxItemSet -at SfxMedium, which is fine when loading the data into the table -selector first, but the final load via ScAreaLink created a bare -SfxMedium without options set. Do so. - -Additionally it may now even work that ScDocShell sets options at -SfxMedium, which the ScAreaLink code prepared for but previously the -SfxMedium did not have an SfxItemSet. - -Change-Id: I45d6a24906dc3ba41654b8c0951dd84939d8af5e -(cherry picked from commit 513eadd422ff6a41cfe9a16f82cf32872d729652) -Reviewed-on: https://gerrit.libreoffice.org/6823 -Reviewed-by: Markus Mohrhard -Tested-by: Markus Mohrhard ---- - sc/inc/tablink.hxx | 8 +++++++- - sc/source/ui/docshell/arealink.cxx | 2 +- - sc/source/ui/docshell/tablink.cxx | 18 ++++++++++++------ - 3 files changed, 20 insertions(+), 8 deletions(-) - -diff --git a/sc/inc/tablink.hxx b/sc/inc/tablink.hxx -index 068d87f..49833af 100644 ---- a/sc/inc/tablink.hxx -+++ b/sc/inc/tablink.hxx -@@ -72,6 +72,7 @@ public: - - class ScDocument; - class SfxMedium; -+class SfxFilter; - - class SC_DLLPUBLIC ScDocumentLoader - { -@@ -96,7 +97,12 @@ public: - - void ReleaseDocRef(); // without calling DoClose - -- static OUString GetOptions( SfxMedium& rMedium ); -+ /** Create SfxMedium for stream read with SfxFilter and filter options set -+ at the medium's SfxItemSet. -+ */ -+ static SfxMedium* CreateMedium( const OUString& rFileName, const SfxFilter* pFilter, const OUString& rOptions ); -+ -+ static OUString GetOptions( SfxMedium& rMedium ); - - /** Returns the filter name and options from a file name. - @param bWithContent -diff --git a/sc/source/ui/docshell/arealink.cxx b/sc/source/ui/docshell/arealink.cxx -index 6409fbd..f80c80a 100644 ---- a/sc/source/ui/docshell/arealink.cxx -+++ b/sc/source/ui/docshell/arealink.cxx -@@ -253,7 +253,7 @@ sal_Bool ScAreaLink::Refresh( const String& rNewFile, const String& rNewFilter, - if ( rNewFilter != aFilterName ) - aOptions.Erase(); - -- SfxMedium* pMed = new SfxMedium(aNewUrl, STREAM_STD_READ, pFilter); -+ SfxMedium* pMed = ScDocumentLoader::CreateMedium( aNewUrl, pFilter, aOptions); - - // aRef->DoClose() will be closed explicitly, but it is still more safe to use SfxObjectShellLock here - ScDocShell* pSrcShell = new ScDocShell(SFX_CREATE_MODE_INTERNAL); -diff --git a/sc/source/ui/docshell/tablink.cxx b/sc/source/ui/docshell/tablink.cxx -index ba1ed72..0164e27 100644 ---- a/sc/source/ui/docshell/tablink.cxx -+++ b/sc/source/ui/docshell/tablink.cxx -@@ -519,6 +519,17 @@ void ScDocumentLoader::RemoveAppPrefix( OUString& rFilterName ) - rFilterName = rFilterName.copy( aAppPrefix.getLength()); - } - -+SfxMedium* ScDocumentLoader::CreateMedium( const OUString& rFileName, const SfxFilter* pFilter, -+ const OUString& rOptions ) -+{ -+ // Always create SfxItemSet so ScDocShell can set options. -+ SfxItemSet* pSet = new SfxAllItemSet( SFX_APP()->GetPool() ); -+ if ( !rOptions.isEmpty() ) -+ pSet->Put( SfxStringItem( SID_FILE_FILTEROPTIONS, rOptions ) ); -+ -+ return new SfxMedium( rFileName, STREAM_STD_READ, pFilter, pSet ); -+} -+ - ScDocumentLoader::ScDocumentLoader( const OUString& rFileName, - OUString& rFilterName, OUString& rOptions, - sal_uInt32 nRekCnt, bool bWithInteraction ) : -@@ -530,12 +541,7 @@ ScDocumentLoader::ScDocumentLoader( const OUString& rFileName, - - const SfxFilter* pFilter = ScDocShell::Factory().GetFilterContainer()->GetFilter4FilterName( rFilterName ); - -- // ItemSet immer anlegen, damit die DocShell die Optionen setzen kann -- SfxItemSet* pSet = new SfxAllItemSet( SFX_APP()->GetPool() ); -- if ( !rOptions.isEmpty() ) -- pSet->Put( SfxStringItem( SID_FILE_FILTEROPTIONS, rOptions ) ); -- -- pMedium = new SfxMedium( rFileName, STREAM_STD_READ, pFilter, pSet ); -+ pMedium = CreateMedium( rFileName, pFilter, rOptions); - if ( pMedium->GetError() != ERRCODE_NONE ) - return ; - --- -1.8.4.2 - diff --git a/SOURCES/0014-resolved-fdo-67536-export-internal-equivalents-as-ad.patch b/SOURCES/0014-resolved-fdo-67536-export-internal-equivalents-as-ad.patch deleted file mode 100644 index 066b5a0..0000000 --- a/SOURCES/0014-resolved-fdo-67536-export-internal-equivalents-as-ad.patch +++ /dev/null @@ -1,166 +0,0 @@ -From db0d51e647e01d852ef95e46e12f1dba2d09be2b Mon Sep 17 00:00:00 2001 -From: Eike Rathke -Date: Sat, 2 Nov 2013 16:25:42 +0100 -Subject: [PATCH 014/109] resolved fdo#67536 export internal equivalents as - add-in to .xls - -For BIFF .xls export the internal functions that are equivalents of -known add-in functions as those add-in functions. - -(cherry picked from commit 06a5b1ecc39bb50dadc0bcb7378455500943ece3) - -Conflicts: - sc/source/filter/inc/xlformula.hxx - -Change-Id: If37f616a34fdabb3fa971fddad01da3dc1f28ee9 -Reviewed-on: https://gerrit.libreoffice.org/6525 -Reviewed-by: Markus Mohrhard -Tested-by: Markus Mohrhard ---- - sc/source/filter/excel/xeformula.cxx | 16 +++++++++++++--- - sc/source/filter/excel/xlformula.cxx | 24 +++++++++++++++++++++++- - sc/source/filter/inc/xlformula.hxx | 13 +++++++++++-- - 3 files changed, 47 insertions(+), 6 deletions(-) - -diff --git a/sc/source/filter/excel/xeformula.cxx b/sc/source/filter/excel/xeformula.cxx -index 5265bd1..d58e0ba 100644 ---- a/sc/source/filter/excel/xeformula.cxx -+++ b/sc/source/filter/excel/xeformula.cxx -@@ -139,6 +139,7 @@ public: - inline sal_uInt16 GetXclFuncIdx() const { return mrFuncInfo.mnXclFunc; } - inline bool IsVolatile() const { return mrFuncInfo.IsVolatile(); } - inline bool IsFixedParamCount() const { return mrFuncInfo.IsFixedParamCount(); } -+ inline bool IsAddInEquivalent() const { return mrFuncInfo.IsAddInEquivalent(); } - inline bool IsMacroFunc() const { return mrFuncInfo.IsMacroFunc(); } - inline sal_uInt8 GetSpaces() const { return mrTokData.mnSpaces; } - inline const XclExpExtFuncData& GetExtFuncData() const { return maExtFuncData; } -@@ -1360,8 +1361,11 @@ void XclExpFmlaCompImpl::ProcessFunction( const XclExpScToken& rTokData ) - mxData->mbOk = pFuncInfo != 0; - if( !mxData->mbOk ) return; - -+ // internal functions equivalent to an existing add-in -+ if( pFuncInfo->IsAddInEquivalent() ) -+ aExtFuncData.Set( pFuncInfo->GetAddInEquivalentFuncName(), true, false ); - // functions simulated by a macro call in file format -- if( pFuncInfo->IsMacroFunc() ) -+ else if( pFuncInfo->IsMacroFunc() ) - aExtFuncData.Set( pFuncInfo->GetMacroFuncName(), false, true ); - - XclExpFuncData aFuncData( rTokData, *pFuncInfo, aExtFuncData ); -@@ -1643,8 +1647,11 @@ void XclExpFmlaCompImpl::AppendDefaultParam( XclExpFuncData& rFuncData ) - break; - default: - { -- OSL_ENSURE( rFuncData.IsMacroFunc(), "XclExpFmlaCompImpl::AppendDefaultParam - unknown opcode" ); -- if( rFuncData.IsMacroFunc() ) -+ if( rFuncData.IsAddInEquivalent() ) -+ { -+ AppendAddInCallToken( rFuncData.GetExtFuncData() ); -+ } -+ else if( rFuncData.IsMacroFunc() ) - { - // Do not write the OOXML element for new _xlfn. - // prefixed functions. -@@ -1654,7 +1661,10 @@ void XclExpFmlaCompImpl::AppendDefaultParam( XclExpFuncData& rFuncData ) - AppendMacroCallToken( rFuncData.GetExtFuncData() ); - } - else -+ { -+ SAL_WARN( "sc.filter", "XclExpFmlaCompImpl::AppendDefaultParam - unknown opcode" ); - AppendMissingToken(); // to keep parameter count valid -+ } - } - } - -diff --git a/sc/source/filter/excel/xlformula.cxx b/sc/source/filter/excel/xlformula.cxx -index d4bdc86..a04a101 100644 ---- a/sc/source/filter/excel/xlformula.cxx -+++ b/sc/source/filter/excel/xlformula.cxx -@@ -40,6 +40,13 @@ String XclFunctionInfo::GetMacroFuncName() const - return EMPTY_STRING; - } - -+String XclFunctionInfo::GetAddInEquivalentFuncName() const -+{ -+ if( IsAddInEquivalent() ) -+ return String( mpcMacroName, strlen(mpcMacroName), RTL_TEXTENCODING_UTF8 ); -+ return EMPTY_STRING; -+} -+ - // abbreviations for function return token class - const sal_uInt8 R = EXC_TOKCLASS_REF; - const sal_uInt8 V = EXC_TOKCLASS_VAL; -@@ -64,6 +71,7 @@ const sal_uInt8 MX = 30; /// Maximum parameter count. - - #define EXC_FUNCNAME( ascii ) "_xlfn." ascii - #define EXC_FUNCNAME_ODF( ascii ) "_xlfnodf." ascii -+#define EXC_FUNCNAME_ADDIN( ascii ) "com.sun.star.sheet.addin." ascii - - /** Functions new in BIFF2. */ - static const XclFunctionInfo saFuncTable_2[] = -@@ -309,7 +317,21 @@ static const XclFunctionInfo saFuncTable_4[] = - { ocPercentrank, 329, 2, 3, V, { RX, VR, VR_E }, 0, 0 }, - { ocModalValue, 330, 1, MX, V, { VA }, 0, 0 }, - { ocTrimMean, 331, 2, 2, V, { RX, VR }, 0, 0 }, -- { ocTInv, 332, 2, 2, V, { VR }, 0, 0 } -+ { ocTInv, 332, 2, 2, V, { VR }, 0, 0 }, -+ // Functions equivalent to add-in functions, use same parameters as -+ // ocExternal but add programmatical function name (here without -+ // "com.sun.star.sheet.addin.") so it can be looked up and stored as -+ // add-in, as older Excel versions only know them as add-in. -+ // These are the functions flagged as AddInMap::bMapDupToInternal=true in -+ // sc/source/core/tool/odffmap.cxx -+ { ocIsEven, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getIseven" ) }, -+ { ocIsOdd, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getIsodd" ) }, -+ { ocGCD, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getGcd" ) }, -+ { ocLCM, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getLcm" ) }, -+ { ocEffektiv, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getEffect" ) }, -+ { ocKumKapZ, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getCumprinc" ) }, -+ { ocKumZinsZ, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getCumipmt" ) }, -+ { ocNominal, 255, 1, MX, R, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY | EXC_FUNCFLAG_ADDINEQUIV, EXC_FUNCNAME_ADDIN( "Analysis.getNominal" ) } - }; - - /** Functions new in BIFF5/BIFF7. Unsupported functions: DATESTRING, NUMBERSTRING. */ -diff --git a/sc/source/filter/inc/xlformula.hxx b/sc/source/filter/inc/xlformula.hxx -index 7768769..78b5405 100644 ---- a/sc/source/filter/inc/xlformula.hxx -+++ b/sc/source/filter/inc/xlformula.hxx -@@ -285,6 +285,7 @@ const sal_uInt8 EXC_FUNCFLAG_VOLATILE = 0x01; /// Result is volatile ( - const sal_uInt8 EXC_FUNCFLAG_IMPORTONLY = 0x02; /// Only used in import filter. - const sal_uInt8 EXC_FUNCFLAG_EXPORTONLY = 0x04; /// Only used in export filter. - const sal_uInt8 EXC_FUNCFLAG_PARAMPAIRS = 0x08; /// Optional parameters are expected to appear in pairs. -+const sal_uInt8 EXC_FUNCFLAG_ADDINEQUIV = 0x10; /// Function is an add-in equivalent - - // selected function IDs - const sal_uInt16 EXC_FUNCID_IF = 1; -@@ -311,7 +312,11 @@ struct XclFunctionInfo - sal_uInt8 mnRetClass; /// Token class of the return value. - XclFuncParamInfo mpParamInfos[ EXC_FUNCINFO_PARAMINFO_COUNT ]; /// Information for all parameters. - sal_uInt8 mnFlags; /// Additional flags (EXC_FUNCFLAG_* constants). -- const sal_Char* mpcMacroName; /// Function name, if simulated by a macro call (UTF-8). -+ const sal_Char* mpcMacroName; /** Function name, if simulated by -+ a macro call (UTF-8) EXC_FUNCFLAG_ADDINEQUIV is 0; -+ or programmatical add-in name -+ if stored as such and -+ EXC_FUNCFLAG_ADDINEQUIV is set. */ - - /** Returns true, if the function is volatile. */ - inline bool IsVolatile() const { return ::get_flag( mnFlags, EXC_FUNCFLAG_VOLATILE ); } -@@ -320,9 +325,13 @@ struct XclFunctionInfo - /** Returns true, if the function parameter count is fixed. */ - inline bool IsFixedParamCount() const { return (mnXclFunc != EXC_FUNCID_EXTERNCALL) && (mnMinParamCount == mnMaxParamCount); } - /** Returns true, if the function is simulated by a macro call. */ -- inline bool IsMacroFunc() const { return mpcMacroName != 0; } -+ inline bool IsMacroFunc() const { return mpcMacroName != 0 && !(mnFlags & EXC_FUNCFLAG_ADDINEQUIV); } -+ /** Returns true, if the function is stored as an add-in call. */ -+ inline bool IsAddInEquivalent() const { return mpcMacroName != 0 && (mnFlags & EXC_FUNCFLAG_ADDINEQUIV); } - /** Returns the name of the external function as string. */ - String GetMacroFuncName() const; -+ /** Returns the programmatical name of the Add-In function as string. */ -+ String GetAddInEquivalentFuncName() const; - }; - - // ---------------------------------------------------------------------------- --- -1.8.4.2 - diff --git a/SOURCES/0016-fix-2D-vs-3D-coordinatesystem-regression-fdo-67300.patch b/SOURCES/0016-fix-2D-vs-3D-coordinatesystem-regression-fdo-67300.patch deleted file mode 100644 index 2a336d3..0000000 --- a/SOURCES/0016-fix-2D-vs-3D-coordinatesystem-regression-fdo-67300.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 578ff4dfd6f0d63670dfb21425b6b81fdc87d852 Mon Sep 17 00:00:00 2001 -From: Markus Mohrhard -Date: Sun, 1 Dec 2013 04:45:36 +0100 -Subject: [PATCH 016/109] fix 2D vs 3D coordinatesystem regression, fdo#67300 - -regression from 088e86b865062dd4cc5ba0c85c6068dea62238db - -Change-Id: Ifc8d5a1da328278175bbc97b4f2aad8e6d200751 -Reviewed-on: https://gerrit.libreoffice.org/6880 -Reviewed-by: Andras Timar -Tested-by: Andras Timar ---- - oox/source/drawingml/chart/typegroupconverter.cxx | 4 ++-- - sc/source/filter/excel/xichart.cxx | 4 ++-- - 2 files changed, 4 insertions(+), 4 deletions(-) - -diff --git a/oox/source/drawingml/chart/typegroupconverter.cxx b/oox/source/drawingml/chart/typegroupconverter.cxx -index 12d086d..589fb62 100644 ---- a/oox/source/drawingml/chart/typegroupconverter.cxx -+++ b/oox/source/drawingml/chart/typegroupconverter.cxx -@@ -248,9 +248,9 @@ Reference< XCoordinateSystem > TypeGroupConverter::createCoordinateSystem() - if( maTypeInfo.mbPolarCoordSystem ) - { - if( mb3dChart ) -- xCoordSystem = css::chart2::PolarCoordinateSystem2d::create(xContext); -- else - xCoordSystem = css::chart2::PolarCoordinateSystem3d::create(xContext); -+ else -+ xCoordSystem = css::chart2::PolarCoordinateSystem2d::create(xContext); - } - else - { -diff --git a/sc/source/filter/excel/xichart.cxx b/sc/source/filter/excel/xichart.cxx -index e07d1d4..10d858a 100644 ---- a/sc/source/filter/excel/xichart.cxx -+++ b/sc/source/filter/excel/xichart.cxx -@@ -2328,9 +2328,9 @@ Reference< XCoordinateSystem > XclImpChType::CreateCoordSystem( bool b3dChart ) - if( maTypeInfo.mbPolarCoordSystem ) - { - if( b3dChart ) -- xCoordSystem = css::chart2::PolarCoordinateSystem2d::create(xContext); -- else - xCoordSystem = css::chart2::PolarCoordinateSystem3d::create(xContext); -+ else -+ xCoordSystem = css::chart2::PolarCoordinateSystem2d::create(xContext); - } - else - { --- -1.8.4.2 - diff --git a/SOURCES/0016-sd-stop-calling-graphics-styles-Image-Styles.patch b/SOURCES/0016-sd-stop-calling-graphics-styles-Image-Styles.patch new file mode 100644 index 0000000..67a1df2 --- /dev/null +++ b/SOURCES/0016-sd-stop-calling-graphics-styles-Image-Styles.patch @@ -0,0 +1,49 @@ +From 76e02dba9769bf1ea8c79c189b924f4d79f97ca4 Mon Sep 17 00:00:00 2001 +From: Michael Stahl +Date: Mon, 14 Jul 2014 18:05:24 +0200 +Subject: [PATCH 016/137] sd: stop calling graphics styles "Image Styles" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +(regression from a71a562a9958fc58a5fb914bcf7f8056a353f618) + +Change-Id: Ie3a44a80c720f59831bc2b1da91792fb8aa24d62 +(cherry picked from commit b55b96589f7fe0b2f426c2472da7174ab95aab87) +Reviewed-on: https://gerrit.libreoffice.org/10307 +Reviewed-by: Caolán McNamara +Tested-by: Caolán McNamara +--- + sd/source/ui/app/res_bmp.src | 2 +- + sd/source/ui/app/strings.src | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/sd/source/ui/app/res_bmp.src b/sd/source/ui/app/res_bmp.src +index cc48996..719bf99 100644 +--- a/sd/source/ui/app/res_bmp.src ++++ b/sd/source/ui/app/res_bmp.src +@@ -240,7 +240,7 @@ Bitmap BMP_GRAPHIC + }; + + #define SfxStyleFamiliesRes1\ +- Text [ en-US ] = "Image Styles" ;\ ++ Text [ en-US ] = "Drawing Object Styles" ;\ + + #define SfxStyleFamiliesRes2\ + Text [ en-US ] = "Presentation Styles" ;\ +diff --git a/sd/source/ui/app/strings.src b/sd/source/ui/app/strings.src +index b7f916c..6ec1d5d 100644 +--- a/sd/source/ui/app/strings.src ++++ b/sd/source/ui/app/strings.src +@@ -1146,7 +1146,7 @@ String STR_TASKPANEL_LAYOUT_MENU_TITLE + }; + String STR_GRAPHICS_STYLE_FAMILY + { +- Text [ en-US ] = "Image Styles"; ++ Text [ en-US ] = "Drawing Object Styles"; + }; + String STR_CELL_STYLE_FAMILY + { +-- +1.9.3 + diff --git a/SOURCES/0017-fdo-81284-Don-t-write-to-zero-length-files.patch b/SOURCES/0017-fdo-81284-Don-t-write-to-zero-length-files.patch new file mode 100644 index 0000000..c4c4e41 --- /dev/null +++ b/SOURCES/0017-fdo-81284-Don-t-write-to-zero-length-files.patch @@ -0,0 +1,55 @@ +From 70c5401aa3b063d0f275042a48a54f42c1f54c03 Mon Sep 17 00:00:00 2001 +From: Maxim Monastirsky +Date: Mon, 14 Jul 2014 23:55:04 +0300 +Subject: [PATCH 017/137] fdo#81284 Don't write to zero length files + +Change-Id: I4eddcda3977f43b39abdaa8d9089ff661092361c +Reviewed-on: https://gerrit.libreoffice.org/10310 +Reviewed-by: David Tardon +Tested-by: David Tardon +--- + sd/source/ui/unoidl/sddetect.cxx | 6 ++++++ + starmath/source/smdetect.cxx | 8 ++++++++ + 2 files changed, 14 insertions(+) + +diff --git a/sd/source/ui/unoidl/sddetect.cxx b/sd/source/ui/unoidl/sddetect.cxx +index e8ee02e..161d11f 100644 +--- a/sd/source/ui/unoidl/sddetect.cxx ++++ b/sd/source/ui/unoidl/sddetect.cxx +@@ -351,6 +351,12 @@ OUString SAL_CALL SdFilterDetect::detect( Sequence< beans::PropertyValue >& lDes + pStm = aMedium.GetInStream(); + if (!pStm) + pFilter = NULL; ++ else ++ { ++ pStm->Seek( STREAM_SEEK_TO_BEGIN ); ++ if (pStm->remainingSize() == 0) ++ pFilter = NULL; ++ } + } + + if (pFilter && pStm) +diff --git a/starmath/source/smdetect.cxx b/starmath/source/smdetect.cxx +index ca9453a..c943bee 100644 +--- a/starmath/source/smdetect.cxx ++++ b/starmath/source/smdetect.cxx +@@ -296,8 +296,16 @@ OUString SAL_CALL SmFilterDetect::detect( Sequence< PropertyValue >& lDescriptor + //this approach, to be fixed at a better level than here + SvStream *pStrm = aMedium.GetInStream(); + aTypeName = OUString(); ++ ++ sal_Size nStreamSize = 0; + if (pStrm && !pStrm->GetError()) + { ++ pStrm->Seek( STREAM_SEEK_TO_BEGIN ); ++ nStreamSize = pStrm->remainingSize(); ++ } ++ ++ if ( nStreamSize > 0 ) ++ { + SotStorageRef aStorage = new SotStorage ( pStrm, sal_False ); + if ( !aStorage->GetError() ) + { +-- +1.9.3 + diff --git a/SOURCES/0017-fix-validation-error-for-OOXML-chart-export-related-.patch b/SOURCES/0017-fix-validation-error-for-OOXML-chart-export-related-.patch deleted file mode 100644 index 87dd819..0000000 --- a/SOURCES/0017-fix-validation-error-for-OOXML-chart-export-related-.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 90674ac8a975b16389d9b32016f3ef605a702079 Mon Sep 17 00:00:00 2001 -From: Markus Mohrhard -Date: Sun, 1 Dec 2013 04:19:09 +0100 -Subject: [PATCH 017/109] fix validation error for OOXML chart export, related - fdo#67300 - -Change-Id: I7d74439bba3b912fe9b81ebeca865298bc32d71e -Reviewed-on: https://gerrit.libreoffice.org/6879 -Reviewed-by: Andras Timar -Tested-by: Andras Timar ---- - oox/source/export/chartexport.cxx | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx -index b654001..e6da04b 100644 ---- a/oox/source/export/chartexport.cxx -+++ b/oox/source/export/chartexport.cxx -@@ -1277,8 +1277,11 @@ void ChartExport::exportPieChart( Reference< chart2::XChartType > xChartType ) - sal_Int32 nAttachedAxis = AXIS_PRIMARY_Y; - exportSeries( xChartType, nAttachedAxis ); - -- // firstSliceAng -- exportFirstSliceAng( ); -+ if( !mbIs3DChart ) -+ { -+ // firstSliceAng -+ exportFirstSliceAng( ); -+ } - - pFS->endElement( FSNS( XML_c, nTypeId ) ); - } --- -1.8.4.2 - diff --git a/SOURCES/0018-Resolves-fdo-52226-swap-in-graphics-on-.docx-and-.rt.patch b/SOURCES/0018-Resolves-fdo-52226-swap-in-graphics-on-.docx-and-.rt.patch new file mode 100644 index 0000000..4bf89ab --- /dev/null +++ b/SOURCES/0018-Resolves-fdo-52226-swap-in-graphics-on-.docx-and-.rt.patch @@ -0,0 +1,157 @@ +From 5b11f8b75b1ee6da439c3cd7892990b601e03d83 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Mon, 14 Jul 2014 11:36:32 +0100 +Subject: [PATCH 018/137] Resolves: fdo#52226 swap in graphics on .docx and + .rtf export + +(cherry picked from commit 9dd5caac62083f7162d83319284df68ee83e3777) + +Conflicts: + sw/source/filter/ww8/docxattributeoutput.cxx + sw/source/filter/ww8/rtfattributeoutput.cxx + sw/source/filter/ww8/wrtww8gr.cxx + +Change-Id: Ie818b382c0b17760c720ff2f2c73a3697989f97e +Reviewed-on: https://gerrit.libreoffice.org/10296 +Reviewed-by: David Tardon +Tested-by: David Tardon +--- + sw/source/filter/ww8/docxattributeoutput.cxx | 18 +++++++++++++++++- + sw/source/filter/ww8/rtfattributeoutput.cxx | 28 +++++++++++++++++++--------- + sw/source/filter/ww8/wrtww8gr.cxx | 2 +- + 3 files changed, 37 insertions(+), 11 deletions(-) + +diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx +index 2056863..22612f5 100644 +--- a/sw/source/filter/ww8/docxattributeoutput.cxx ++++ b/sw/source/filter/ww8/docxattributeoutput.cxx +@@ -2757,13 +2757,29 @@ void DocxAttributeOutput::FlyFrameGraphic( const SwGrfNode* pGrfNode, const Size + // inline, we also have to write the image itself + const Graphic* pGraphic = 0; + if (pGrfNode) +- pGraphic = &const_cast< Graphic& >( pGrfNode->GetGrf() ); ++ pGraphic = &pGrfNode->GetGrf(); + else + pGraphic = pOLENode->GetGraphic(); + + m_rDrawingML.SetFS( m_pSerializer ); // to be sure that we write to the right stream ++ ++ bool bSwapped = pGraphic->IsSwapOut(); ++ if (bSwapped) ++ { ++ if (pGrfNode) ++ { ++ // always swapin via the Node ++ const_cast(pGrfNode)->SwapIn(); ++ } ++ else ++ const_cast(pGraphic)->SwapIn(); ++ } ++ + OUString aImageId = m_rDrawingML.WriteImage( *pGraphic ); + ++ if (bSwapped) ++ const_cast(pGraphic)->SwapOut(); ++ + aRelId = OUStringToOString( aImageId, RTL_TEXTENCODING_UTF8 ); + + nImageType = XML_embed; +diff --git a/sw/source/filter/ww8/rtfattributeoutput.cxx b/sw/source/filter/ww8/rtfattributeoutput.cxx +index f73ab4d..9b3887f 100644 +--- a/sw/source/filter/ww8/rtfattributeoutput.cxx ++++ b/sw/source/filter/ww8/rtfattributeoutput.cxx +@@ -3610,17 +3610,24 @@ void RtfAttributeOutput::FlyFrameGraphic( const SwFlyFrmFmt* pFlyFrmFmt, const S + const sal_uInt8* pGraphicAry = 0; + sal_uInt32 nSize = 0; + +- Graphic aGraphic(pGrfNode->GetGrf()); ++ const Graphic& rGraphic(pGrfNode->GetGrf()); + + // If there is no graphic there is not much point in parsing it +- if(aGraphic.GetType()==GRAPHIC_NONE) ++ if (rGraphic.GetType()==GRAPHIC_NONE) + return; + ++ bool bSwapped = rGraphic.IsSwapOut(); ++ if (bSwapped) ++ { ++ // always swapin via the Node ++ const_cast(pGrfNode)->SwapIn(); ++ } ++ + GfxLink aGraphicLink; + const sal_Char* pBLIPType = 0; +- if (aGraphic.IsLink()) ++ if (rGraphic.IsLink()) + { +- aGraphicLink = aGraphic.GetLink(); ++ aGraphicLink = rGraphic.GetLink(); + nSize = aGraphicLink.GetDataSize(); + pGraphicAry = aGraphicLink.GetData(); + switch (aGraphicLink.GetType()) +@@ -3640,10 +3647,10 @@ void RtfAttributeOutput::FlyFrameGraphic( const SwFlyFrmFmt* pFlyFrmFmt, const S + } + } + +- GraphicType eGraphicType = aGraphic.GetType(); ++ GraphicType eGraphicType = rGraphic.GetType(); + if (!pGraphicAry) + { +- if (ERRCODE_NONE == GraphicConverter::Export(aStream, aGraphic, ++ if (ERRCODE_NONE == GraphicConverter::Export(aStream, rGraphic, + (eGraphicType == GRAPHIC_BITMAP) ? CVT_PNG : CVT_WMF)) + { + pBLIPType = (eGraphicType == GRAPHIC_BITMAP) ? +@@ -3654,7 +3661,7 @@ void RtfAttributeOutput::FlyFrameGraphic( const SwFlyFrmFmt* pFlyFrmFmt, const S + } + } + +- Size aMapped(eGraphicType == GRAPHIC_BITMAP ? aGraphic.GetSizePixel() : aGraphic.GetPrefSize()); ++ Size aMapped(eGraphicType == GRAPHIC_BITMAP ? rGraphic.GetSizePixel() : rGraphic.GetPrefSize()); + + const SwCropGrf &rCr = (const SwCropGrf &)pGrfNode->GetAttr(RES_GRFATR_CROPGRF); + +@@ -3683,7 +3690,7 @@ void RtfAttributeOutput::FlyFrameGraphic( const SwFlyFrmFmt* pFlyFrmFmt, const S + else + { + aStream.Seek(0); +- GraphicConverter::Export(aStream, aGraphic, CVT_WMF); ++ GraphicConverter::Export(aStream, rGraphic, CVT_WMF); + pBLIPType = OOO_STRING_SVTOOLS_RTF_WMETAFILE; + aStream.Seek(STREAM_SEEK_TO_END); + nSize = aStream.Tell(); +@@ -3697,7 +3704,7 @@ void RtfAttributeOutput::FlyFrameGraphic( const SwFlyFrmFmt* pFlyFrmFmt, const S + m_rExport.Strm() << "}" "{" OOO_STRING_SVTOOLS_RTF_NONSHPPICT; + + aStream.Seek(0); +- GraphicConverter::Export(aStream, aGraphic, CVT_WMF); ++ GraphicConverter::Export(aStream, rGraphic, CVT_WMF); + pBLIPType = OOO_STRING_SVTOOLS_RTF_WMETAFILE; + aStream.Seek(STREAM_SEEK_TO_END); + nSize = aStream.Tell(); +@@ -3708,6 +3715,9 @@ void RtfAttributeOutput::FlyFrameGraphic( const SwFlyFrmFmt* pFlyFrmFmt, const S + m_rExport.Strm() << '}'; + } + ++ if (bSwapped) ++ const_cast(rGraphic).SwapOut(); ++ + m_rExport.Strm() << SAL_NEWLINE_STRING; + } + +diff --git a/sw/source/filter/ww8/wrtww8gr.cxx b/sw/source/filter/ww8/wrtww8gr.cxx +index 61a8c17..5075a89 100644 +--- a/sw/source/filter/ww8/wrtww8gr.cxx ++++ b/sw/source/filter/ww8/wrtww8gr.cxx +@@ -724,7 +724,7 @@ void SwWW8WrGrf::WriteGrfFromGrfNode(SvStream& rStrm, const SwGrfNode &rGrfNd, + { + Graphic& rGrf = const_cast(rGrfNd.GetGrf()); + bool bSwapped = rGrf.IsSwapOut() ? true : false; +- // immer ueber den Node einswappen! ++ // always swapin via the Node + const_cast(rGrfNd).SwapIn(); + + GDIMetaFile aMeta; +-- +1.9.3 + diff --git a/SOURCES/0019-Related-fdo-52226-ensure-graphics-are-swapped-in-on-.patch b/SOURCES/0019-Related-fdo-52226-ensure-graphics-are-swapped-in-on-.patch new file mode 100644 index 0000000..6b546a2 --- /dev/null +++ b/SOURCES/0019-Related-fdo-52226-ensure-graphics-are-swapped-in-on-.patch @@ -0,0 +1,83 @@ +From b0282d868b418b4ecdb19cbb633c9399ac84161b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Mon, 14 Jul 2014 12:13:21 +0100 +Subject: [PATCH 019/137] Related: fdo#52226 ensure graphics are swapped in on + DrawingML::WriteImage + +I imagine it would be best that the Graphics were delivered pre-swapped in by +higher levels in case there are second level caches or more complex caching +systemed wrapped around it, so warn about it in debug mode but give it a +last-ditch shot anyway. i.e. while the .docx problem should be fixed there +is a report of a very similar .xlsx problem + +Change-Id: Ie40ee10fe5cba8ff9c321f47b83e33ee2c1425fd +(cherry picked from commit 6e580f3f53ae2de086a08c8ba1958b67874eb9c5) +Reviewed-on: https://gerrit.libreoffice.org/10300 +Reviewed-by: David Tardon +Tested-by: David Tardon +--- + oox/source/export/drawingml.cxx | 34 ++++++++++++++++++++++++++-------- + vcl/source/gdi/cvtgrf.cxx | 2 ++ + 2 files changed, 28 insertions(+), 8 deletions(-) + +diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx +index dd6605b..847d21c 100644 +--- a/oox/source/export/drawingml.cxx ++++ b/oox/source/export/drawingml.cxx +@@ -495,14 +495,32 @@ OUString DrawingML::WriteImage( const Graphic& rGraphic ) + break; + default: { + GraphicType aType = rGraphic.GetType(); +- if ( aType == GRAPHIC_BITMAP ) { +- GraphicConverter::Export( aStream, rGraphic, CVT_PNG ); +- sMediaType = "image/png"; +- pExtension = ".png"; +- } else if ( aType == GRAPHIC_GDIMETAFILE ) { +- GraphicConverter::Export( aStream, rGraphic, CVT_EMF ); +- sMediaType = "image/x-emf"; +- pExtension = ".emf"; ++ if ( aType == GRAPHIC_BITMAP || aType == GRAPHIC_GDIMETAFILE) { ++ bool bSwapped = rGraphic.IsSwapOut(); ++ ++ //Warn rather than just happily swap in because of the comments ++ //in the sw export filters about needing to go through the ++ //hairy SwGrfNode::SwapIn which we would subvert by swapping in ++ //without it knowing about it, so while those ones are fixed we ++ //probably have to assume that we should ideally be presented ++ //here with already swapped in graphics. ++ SAL_WARN_IF(bSwapped, "oox", "attempted to output swapped out graphic"); ++ ++ if (bSwapped) ++ const_cast(rGraphic).SwapIn(); ++ ++ if ( aType == GRAPHIC_BITMAP ) { ++ GraphicConverter::Export( aStream, rGraphic, CVT_PNG ); ++ sMediaType = "image/png"; ++ pExtension = ".png"; ++ } else { ++ GraphicConverter::Export( aStream, rGraphic, CVT_EMF ); ++ sMediaType = "image/x-emf"; ++ pExtension = ".emf"; ++ } ++ ++ if (bSwapped) ++ const_cast(rGraphic).SwapOut(); + } else { + OSL_TRACE( "unhandled graphic type" ); + break; +diff --git a/vcl/source/gdi/cvtgrf.cxx b/vcl/source/gdi/cvtgrf.cxx +index 02ca288..d395670 100644 +--- a/vcl/source/gdi/cvtgrf.cxx ++++ b/vcl/source/gdi/cvtgrf.cxx +@@ -57,6 +57,8 @@ sal_uLong GraphicConverter::Import( SvStream& rIStm, Graphic& rGraphic, sal_uLon + + sal_uLong GraphicConverter::Export( SvStream& rOStm, const Graphic& rGraphic, sal_uLong nFormat ) + { ++ SAL_WARN_IF(rGraphic.IsSwapOut(), "vcl.filter", "exporting a swapped out graphic!"); ++ + GraphicConverter* pCvt = ImplGetSVData()->maGDIData.mpGrfConverter; + sal_uLong nRet = ERRCODE_IO_GENERAL; + +-- +1.9.3 + diff --git a/SOURCES/0020-fdo-72078-make-status-bar-text-localizable.patch b/SOURCES/0020-fdo-72078-make-status-bar-text-localizable.patch deleted file mode 100644 index 35418df..0000000 --- a/SOURCES/0020-fdo-72078-make-status-bar-text-localizable.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 3b6ac4f3416b2542208745033aaecb3c7a520656 Mon Sep 17 00:00:00 2001 -From: Andras Timar -Date: Mon, 2 Dec 2013 12:11:10 +0100 -Subject: [PATCH 020/109] fdo#72078 make status bar text localizable -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -2nd try to get it right on libreoffice-4-1 - -Change-Id: I66ebc292231069cca708eb56ad876f56829e78f5 -Reviewed-on: https://gerrit.libreoffice.org/6894 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - sc/source/filter/oox/workbookhelper.cxx | 7 +++---- - 1 file changed, 3 insertions(+), 4 deletions(-) - -diff --git a/sc/source/filter/oox/workbookhelper.cxx b/sc/source/filter/oox/workbookhelper.cxx -index 09c6947..691887a 100644 ---- a/sc/source/filter/oox/workbookhelper.cxx -+++ b/sc/source/filter/oox/workbookhelper.cxx -@@ -71,6 +71,7 @@ - #include "dbdata.hxx" - #include "datauno.hxx" - #include "globalnames.hxx" -+#include "globstr.hrc" - - #include "formulabuffer.hxx" - #include "vcl/mapmod.hxx" -@@ -572,8 +573,7 @@ void WorkbookGlobals::initialize( bool bWorkbookFile ) - if( xLockable.is() ) - xLockable->addActionLock(); - -- //! TODO: localize progress bar text -- mxProgressBar.reset( new SegmentProgressBar( mrBaseFilter.getStatusIndicator(), "Loading..." ) ); -+ mxProgressBar.reset( new SegmentProgressBar( mrBaseFilter.getStatusIndicator(), ScGlobal::GetRscString(STR_LOAD_DOC) ) ); - mxFmlaParser.reset( new FormulaParser( *this ) ); - - //prevent unnecessary broadcasts and "half way listeners" as -@@ -582,8 +582,7 @@ void WorkbookGlobals::initialize( bool bWorkbookFile ) - } - else if( mrBaseFilter.isExportFilter() ) - { -- //! TODO: localize progress bar text -- mxProgressBar.reset( new SegmentProgressBar( mrBaseFilter.getStatusIndicator(), "Saving..." ) ); -+ mxProgressBar.reset( new SegmentProgressBar( mrBaseFilter.getStatusIndicator(), ScGlobal::GetRscString(STR_SAVE_DOC) ) ); - } - // filter specific - switch( getFilterType() ) --- -1.8.4.2 - diff --git a/SOURCES/0020-fdo-78554-SVG-Text-from-SVG-no-longer-displayed-in-L.patch b/SOURCES/0020-fdo-78554-SVG-Text-from-SVG-no-longer-displayed-in-L.patch new file mode 100644 index 0000000..c6c9168 --- /dev/null +++ b/SOURCES/0020-fdo-78554-SVG-Text-from-SVG-no-longer-displayed-in-L.patch @@ -0,0 +1,42 @@ +From 763e3855caacbfc4818e70464bca348de10fbc3d Mon Sep 17 00:00:00 2001 +From: Joren De Cuyper +Date: Mon, 14 Jul 2014 17:57:06 +0200 +Subject: [PATCH 020/137] fdo#78554 - SVG: Text from SVG no longer displayed in + LibreOffice +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +regression of 3b7472b284131c09d91b69f26d5d26d54648f939 + +Change-Id: I95a30acbf4b2684dda9684f5b51b887356a940e1 +Reviewed-on: https://gerrit.libreoffice.org/10304 +Reviewed-by: Tomaž Vajngerl +Tested-by: Tomaž Vajngerl +--- + svgio/source/svgreader/svgsvgnode.cxx | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/svgio/source/svgreader/svgsvgnode.cxx b/svgio/source/svgreader/svgsvgnode.cxx +index cde5387..f85318b 100644 +--- a/svgio/source/svgreader/svgsvgnode.cxx ++++ b/svgio/source/svgreader/svgsvgnode.cxx +@@ -60,8 +60,13 @@ namespace svgio + + const SvgStyleAttributes* SvgSvgNode::getSvgStyleAttributes() const + { +- checkForCssStyle(OUString("svg"), maSvgStyleAttributes); +- return maSvgStyleAttributes.getCssStyleParent(); ++ const SvgStyleAttributes* aCheckCssStyle = checkForCssStyle(OUString("svg"), maSvgStyleAttributes); ++ const SvgStyleAttributes* aGetCssStyleParent = maSvgStyleAttributes.getCssStyleParent(); ++ ++ if (aGetCssStyleParent == NULL) ++ return aCheckCssStyle; ++ ++ return aGetCssStyleParent; + } + + void SvgSvgNode::parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) +-- +1.9.3 + diff --git a/SOURCES/0021-don-t-use-fixed-size-icon-sets-fdo-62652.patch b/SOURCES/0021-don-t-use-fixed-size-icon-sets-fdo-62652.patch deleted file mode 100644 index 4f9fbf4..0000000 --- a/SOURCES/0021-don-t-use-fixed-size-icon-sets-fdo-62652.patch +++ /dev/null @@ -1,40 +0,0 @@ -From a9d6a9c78cccaa5068a21b9b0e526ab60bbcfabf Mon Sep 17 00:00:00 2001 -From: Markus Mohrhard -Date: Mon, 2 Dec 2013 08:06:44 +0100 -Subject: [PATCH 021/109] don't use fixed size icon sets, fdo#62652 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -actually we should switch to svg as soon as it becomes possible - -Change-Id: Ifbbe5befab94441f04fadb90b779e0bc8c15eda4 -Reviewed-on: https://gerrit.libreoffice.org/6890 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - sc/source/ui/view/output.cxx | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/sc/source/ui/view/output.cxx b/sc/source/ui/view/output.cxx -index 5826efd..9bbfee8 100644 ---- a/sc/source/ui/view/output.cxx -+++ b/sc/source/ui/view/output.cxx -@@ -882,11 +882,12 @@ BitmapEx& getIcon( ScIconSetType eType, sal_Int32 nIndex ) - - void drawIconSets( const ScIconSetInfo* pOldIconSetInfo, OutputDevice* pDev, const Rectangle& rRect ) - { -- long nSize = 16; -+ //long nSize = 16; - ScIconSetType eType = pOldIconSetInfo->eIconSetType; - sal_Int32 nIndex = pOldIconSetInfo->nIconIndex; - BitmapEx& rIcon = getIcon( eType, nIndex ); -- pDev->DrawBitmapEx( Point( rRect.Left() +2, rRect.Top() + 2 ), Size( nSize, nSize ), rIcon ); -+ long aOrigSize = std::max(0,std::min(rRect.GetSize().getWidth() - 4, rRect.GetSize().getHeight() -4)); -+ pDev->DrawBitmapEx( Point( rRect.Left() +2, rRect.Top() + 2 ), Size(aOrigSize, aOrigSize), rIcon ); - } - - void drawCells(const Color* pColor, const SvxBrushItem* pBackground, const Color*& pOldColor, const SvxBrushItem*& pOldBackground, --- -1.8.4.2 - diff --git a/SOURCES/0022-fdo-71076-fdo-71767-Preserve-number-formats-when-cha.patch b/SOURCES/0022-fdo-71076-fdo-71767-Preserve-number-formats-when-cha.patch new file mode 100644 index 0000000..402e8e5 --- /dev/null +++ b/SOURCES/0022-fdo-71076-fdo-71767-Preserve-number-formats-when-cha.patch @@ -0,0 +1,3221 @@ +From 388f2fa9fcabe1b2adaff282fa9509216f3af6de Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Fri, 13 Jun 2014 11:12:50 -0400 +Subject: [PATCH 022/137] fdo#71076, fdo#71767: Preserve number formats when + charts are copied. + +(cherry picked from commit 1d38cb365543924f9c50014e6b2227e77de1d0c9) +Signed-off-by: Andras Timar + +Conflicts: + xmloff/source/chart/SchXMLExport.cxx + sd/source/ui/view/sdview3.cxx + chart2/source/controller/chartapiwrapper/WrappedNumberFormatProperty.cxx + chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx + chart2/source/controller/main/ChartTransferable.cxx + chart2/source/controller/main/ChartTransferable.hxx + chart2/source/model/main/Axis.cxx + chart2/source/model/template/ChartTypeTemplate.cxx + chart2/source/tools/AxisHelper.cxx + chart2/source/view/main/ChartView.cxx + comphelper/source/container/embeddedobjectcontainer.cxx + dbaccess/source/ui/browser/dbexchange.cxx + dbaccess/source/ui/inc/JoinExchange.hxx + dbaccess/source/ui/inc/TableRowExchange.hxx + dbaccess/source/ui/inc/dbexchange.hxx + dbaccess/source/ui/querydesign/JoinExchange.cxx + dbaccess/source/ui/tabledesign/TableRowExchange.cxx + embeddedobj/source/commonembedding/persistence.cxx + embeddedobj/source/inc/commonembobj.hxx + include/comphelper/embeddedobjectcontainer.hxx + include/svtools/embedtransfer.hxx + include/svtools/stringtransfer.hxx + include/svtools/transfer.hxx + include/svx/dbaexchange.hxx + include/svx/dbaobjectex.hxx + include/svx/fmview.hxx + include/svx/galmisc.hxx + include/svx/svdobj.hxx + include/svx/svdoole2.hxx + include/svx/svdxcgv.hxx + include/svx/view3d.hxx + include/svx/xmlexchg.hxx + include/xmloff/xmlexp.hxx + reportdesign/source/ui/dlg/GroupExchange.cxx + reportdesign/source/ui/dlg/GroupExchange.hxx + reportdesign/source/ui/inc/dlgedclip.hxx + reportdesign/source/ui/report/dlgedclip.cxx + sc/inc/column.hxx + sc/source/ui/app/drwtrans.cxx + sc/source/ui/app/lnktrans.cxx + sc/source/ui/app/seltrans.cxx + sc/source/ui/app/transobj.cxx + sc/source/ui/inc/drwtrans.hxx + sc/source/ui/inc/lnktrans.hxx + sc/source/ui/inc/seltrans.hxx + sc/source/ui/inc/transobj.hxx + sc/source/ui/inc/viewfunc.hxx + sc/source/ui/view/viewfun5.cxx + sc/source/ui/view/viewfun7.cxx + sd/source/ui/app/sdxfer.cxx + sd/source/ui/dlg/sdtreelb.cxx + sd/source/ui/inc/TabControl.hxx + sd/source/ui/inc/View.hxx + sd/source/ui/inc/sdtreelb.hxx + sd/source/ui/inc/sdxfer.hxx + sd/source/ui/view/sdview2.cxx + sd/source/ui/view/tabcontr.cxx + sfx2/source/doc/objxtor.cxx + svtools/source/misc/embedtransfer.cxx + svtools/source/misc/stringtransfer.cxx + svtools/source/misc/transfer.cxx + svtools/source/misc/transfer2.cxx + svx/source/engine3d/view3d.cxx + svx/source/fmcomp/dbaexchange.cxx + svx/source/fmcomp/dbaobjectex.cxx + svx/source/fmcomp/xmlexchg.cxx + svx/source/form/fmexch.cxx + svx/source/form/fmview.cxx + svx/source/gallery2/galmisc.cxx + svx/source/inc/fmexch.hxx + svx/source/svdraw/svdoole2.cxx + svx/source/svdraw/svdxcgv.cxx + svx/source/tbxctrls/colrctrl.cxx + sw/source/core/uibase/dochdl/swdtflvr.cxx + sw/source/core/uibase/inc/swdtflvr.hxx + sw/source/core/undo/unins.cxx + +Change-Id: If5ae8852152012483237e7602e56a0c46ea8748a +(cherry picked from commit 4ee53683df4beda260aff26d2c9e56fe643f45bb) +Signed-off-by: Andras Timar +--- + .../controller/chartapiwrapper/AxisWrapper.cxx | 5 +- + .../chartapiwrapper/DataSeriesPointWrapper.cxx | 5 +- + .../WrappedNumberFormatProperty.cxx | 66 ++--------- + .../WrappedNumberFormatProperty.hxx | 9 +- + .../itemsetwrapper/AxisItemConverter.cxx | 9 +- + .../controller/main/ChartDropTargetHelper.cxx | 4 +- + .../source/controller/main/ChartTransferable.cxx | 2 +- + .../source/controller/main/ChartTransferable.hxx | 2 +- + chart2/source/model/filter/XMLFilter.cxx | 5 +- + chart2/source/model/inc/XMLFilter.hxx | 3 + + chart2/source/model/main/Axis.cxx | 17 ++- + chart2/source/model/main/DataPointProperties.cxx | 11 +- + chart2/source/model/main/DataPointProperties.hxx | 1 + + chart2/source/model/template/ChartTypeTemplate.cxx | 10 +- + chart2/source/tools/AxisHelper.cxx | 15 ++- + chart2/source/view/main/ChartView.cxx | 18 ++- + .../source/container/embeddedobjectcontainer.cxx | 23 +++- + dbaccess/source/ui/browser/dbexchange.cxx | 4 +- + dbaccess/source/ui/inc/JoinExchange.hxx | 2 +- + dbaccess/source/ui/inc/TableRowExchange.hxx | 2 +- + dbaccess/source/ui/inc/dbexchange.hxx | 2 +- + dbaccess/source/ui/querydesign/JoinExchange.cxx | 2 +- + .../source/ui/tabledesign/TableRowExchange.cxx | 2 +- + embeddedobj/source/commonembedding/persistence.cxx | 54 +++++++-- + embeddedobj/source/inc/commonembobj.hxx | 12 +- + include/comphelper/embeddedobjectcontainer.hxx | 8 +- + include/sfx2/objsh.hxx | 2 + + include/svtools/embedtransfer.hxx | 6 +- + include/svtools/stringtransfer.hxx | 2 +- + include/svtools/transfer.hxx | 31 +++--- + include/svx/dbaexchange.hxx | 6 +- + include/svx/dbaobjectex.hxx | 2 +- + include/svx/fmview.hxx | 2 - + include/svx/galmisc.hxx | 2 +- + include/svx/svdobj.hxx | 7 +- + include/svx/svdoole2.hxx | 3 + + include/svx/svdxcgv.hxx | 5 +- + include/svx/view3d.hxx | 4 +- + include/svx/xmlexchg.hxx | 2 +- + include/xmloff/SchXMLExportHelper.hxx | 3 + + include/xmloff/xmlexp.hxx | 3 + + offapi/UnoApi_offapi.mk | 1 + + .../com/sun/star/datatransfer/XTransferable2.idl | 41 +++++++ + reportdesign/source/ui/dlg/GroupExchange.cxx | 4 +- + reportdesign/source/ui/dlg/GroupExchange.hxx | 2 +- + reportdesign/source/ui/dlg/GroupsSorting.cxx | 4 +- + reportdesign/source/ui/inc/dlgedclip.hxx | 2 +- + reportdesign/source/ui/report/dlgedclip.cxx | 8 +- + sc/inc/column.hxx | 6 +- + sc/inc/document.hxx | 1 + + sc/inc/table.hxx | 6 +- + sc/source/core/data/column.cxx | 14 ++- + sc/source/core/data/document.cxx | 6 +- + sc/source/core/data/table2.cxx | 5 +- + sc/source/ui/app/drwtrans.cxx | 54 ++++++--- + sc/source/ui/app/lnktrans.cxx | 3 +- + sc/source/ui/app/seltrans.cxx | 5 +- + sc/source/ui/app/transobj.cxx | 2 +- + sc/source/ui/inc/drwtrans.hxx | 7 +- + sc/source/ui/inc/lnktrans.hxx | 2 +- + sc/source/ui/inc/seltrans.hxx | 2 +- + sc/source/ui/inc/transobj.hxx | 2 +- + sc/source/ui/inc/viewfunc.hxx | 4 +- + sc/source/ui/view/gridwin.cxx | 8 +- + sc/source/ui/view/viewfun3.cxx | 11 +- + sc/source/ui/view/viewfun5.cxx | 22 ++-- + sc/source/ui/view/viewfun7.cxx | 6 +- + sd/source/core/drawdoc3.cxx | 2 +- + sd/source/ui/app/sdxfer.cxx | 4 +- + sd/source/ui/dlg/sdtreelb.cxx | 3 +- + sd/source/ui/inc/TabControl.hxx | 2 +- + sd/source/ui/inc/View.hxx | 4 +- + sd/source/ui/inc/sdtreelb.hxx | 2 +- + sd/source/ui/inc/sdxfer.hxx | 2 +- + sd/source/ui/view/sdview2.cxx | 6 +- + sd/source/ui/view/sdview3.cxx | 29 +++-- + sd/source/ui/view/tabcontr.cxx | 2 +- + sfx2/source/doc/objxtor.cxx | 19 +++- + starmath/source/view.cxx | 6 +- + svtools/source/contnr/treelistbox.cxx | 5 +- + svtools/source/dialogs/insdlg.cxx | 2 +- + svtools/source/misc/embedtransfer.cxx | 15 ++- + svtools/source/misc/stringtransfer.cxx | 3 +- + svtools/source/misc/transfer.cxx | 121 ++++++++++++--------- + svtools/source/misc/transfer2.cxx | 4 +- + svx/source/engine3d/view3d.cxx | 6 +- + svx/source/fmcomp/dbaexchange.cxx | 16 ++- + svx/source/fmcomp/dbaobjectex.cxx | 5 +- + svx/source/fmcomp/xmlexchg.cxx | 2 +- + svx/source/form/fmexch.cxx | 11 +- + svx/source/form/fmview.cxx | 7 -- + svx/source/gallery2/galmisc.cxx | 2 +- + svx/source/inc/fmexch.hxx | 4 +- + svx/source/svdraw/svdobj.cxx | 5 + + svx/source/svdraw/svdoole2.cxx | 23 +++- + svx/source/svdraw/svdxcgv.cxx | 6 +- + svx/source/tbxctrls/colrctrl.cxx | 4 +- + sw/source/core/frmedt/fecopy.cxx | 2 +- + sw/source/core/ole/ndole.cxx | 4 +- + sw/source/core/undo/unins.cxx | 2 +- + sw/source/ui/dochdl/swdtflvr.cxx | 17 ++- + sw/source/ui/inc/swdtflvr.hxx | 2 +- + xmloff/source/chart/SchXMLExport.cxx | 50 +++++++++ + xmloff/source/core/xmlexp.cxx | 37 ++++++- + 104 files changed, 687 insertions(+), 350 deletions(-) + create mode 100644 offapi/com/sun/star/datatransfer/XTransferable2.idl + +diff --git a/chart2/source/controller/chartapiwrapper/AxisWrapper.cxx b/chart2/source/controller/chartapiwrapper/AxisWrapper.cxx +index 665ea53..28226dc 100644 +--- a/chart2/source/controller/chartapiwrapper/AxisWrapper.cxx ++++ b/chart2/source/controller/chartapiwrapper/AxisWrapper.cxx +@@ -637,9 +637,8 @@ const std::vector< WrappedProperty* > AxisWrapper::createWrappedProperties() + aWrappedProperties.push_back( new WrappedProperty("Visible","Show") ); + aWrappedProperties.push_back( new WrappedDirectStateProperty("DisplayLabels","DisplayLabels") ); + aWrappedProperties.push_back( new WrappedDirectStateProperty("TextBreak","TextBreak") ); +- WrappedNumberFormatProperty* pWrappedNumberFormatProperty = new WrappedNumberFormatProperty( m_spChart2ModelContact ); +- aWrappedProperties.push_back( pWrappedNumberFormatProperty ); +- aWrappedProperties.push_back( new WrappedLinkNumberFormatProperty(pWrappedNumberFormatProperty) ); ++ aWrappedProperties.push_back( new WrappedNumberFormatProperty(m_spChart2ModelContact) ); ++ aWrappedProperties.push_back( new WrappedLinkNumberFormatProperty(m_spChart2ModelContact) ); + aWrappedProperties.push_back( new WrappedProperty("StackedText","StackCharacters") ); + aWrappedProperties.push_back( new WrappedDirectStateProperty("CrossoverPosition","CrossoverPosition") ); + { +diff --git a/chart2/source/controller/chartapiwrapper/DataSeriesPointWrapper.cxx b/chart2/source/controller/chartapiwrapper/DataSeriesPointWrapper.cxx +index 9b5b622..a507782 100644 +--- a/chart2/source/controller/chartapiwrapper/DataSeriesPointWrapper.cxx ++++ b/chart2/source/controller/chartapiwrapper/DataSeriesPointWrapper.cxx +@@ -698,9 +698,8 @@ const std::vector< WrappedProperty* > DataSeriesPointWrapper::createWrappedPrope + WrappedStatisticProperties::addWrappedPropertiesForSeries( aWrappedProperties, m_spChart2ModelContact ); + aWrappedProperties.push_back( new WrappedAttachedAxisProperty( m_spChart2ModelContact ) ); + +- WrappedNumberFormatProperty* pWrappedNumberFormatProperty = new WrappedNumberFormatProperty( m_spChart2ModelContact ); +- aWrappedProperties.push_back( pWrappedNumberFormatProperty ); +- aWrappedProperties.push_back( new WrappedLinkNumberFormatProperty(pWrappedNumberFormatProperty) ); ++ aWrappedProperties.push_back( new WrappedNumberFormatProperty(m_spChart2ModelContact) ); ++ aWrappedProperties.push_back( new WrappedLinkNumberFormatProperty(m_spChart2ModelContact) ); + } + + WrappedSymbolProperties::addWrappedPropertiesForSeries( aWrappedProperties, m_spChart2ModelContact ); +diff --git a/chart2/source/controller/chartapiwrapper/WrappedNumberFormatProperty.cxx b/chart2/source/controller/chartapiwrapper/WrappedNumberFormatProperty.cxx +index a4010a8..5370d117 100644 +--- a/chart2/source/controller/chartapiwrapper/WrappedNumberFormatProperty.cxx ++++ b/chart2/source/controller/chartapiwrapper/WrappedNumberFormatProperty.cxx +@@ -33,16 +33,10 @@ WrappedNumberFormatProperty::WrappedNumberFormatProperty( ::boost::shared_ptr< C + : WrappedDirectStateProperty( "NumberFormat", "NumberFormat" ) + , m_spChart2ModelContact(spChart2ModelContact) + { +- m_aOuterValue = getPropertyDefault( 0 ); + } + + WrappedNumberFormatProperty::~WrappedNumberFormatProperty() + { +- if( m_pWrappedLinkNumberFormatProperty ) +- { +- if( m_pWrappedLinkNumberFormatProperty->m_pWrappedNumberFormatProperty == this ) +- m_pWrappedLinkNumberFormatProperty->m_pWrappedNumberFormatProperty = 0; +- } + } + + void WrappedNumberFormatProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& xInnerPropertySet ) const +@@ -52,19 +46,8 @@ void WrappedNumberFormatProperty::setPropertyValue( const Any& rOuterValue, cons + if( ! (rOuterValue >>= nFormat) ) + throw lang::IllegalArgumentException( "Property 'NumberFormat' requires value of type sal_Int32", 0, 0 ); + +- m_aOuterValue = rOuterValue; + if(xInnerPropertySet.is()) +- { +- bool bUseSourceFormat = !xInnerPropertySet->getPropertyValue( "NumberFormat" ).hasValue(); +- if( bUseSourceFormat ) +- { +- uno::Reference< chart2::XChartDocument > xChartDoc( m_spChart2ModelContact->getChart2Document() ); +- if( xChartDoc.is() && xChartDoc->hasInternalDataProvider() ) +- bUseSourceFormat = false; +- } +- if( !bUseSourceFormat ) +- xInnerPropertySet->setPropertyValue( m_aInnerName, this->convertOuterToInnerValue( rOuterValue ) ); +- } ++ xInnerPropertySet->setPropertyValue(getInnerName(), this->convertOuterToInnerValue(rOuterValue)); + } + + Any WrappedNumberFormatProperty::getPropertyValue( const Reference< beans::XPropertySet >& xInnerPropertySet ) const +@@ -75,7 +58,7 @@ Any WrappedNumberFormatProperty::getPropertyValue( const Reference< beans::XProp + OSL_FAIL("missing xInnerPropertySet in WrappedNumberFormatProperty::getPropertyValue"); + return Any(); + } +- Any aRet( xInnerPropertySet->getPropertyValue( m_aInnerName )); ++ Any aRet( xInnerPropertySet->getPropertyValue(getInnerName())); + if( !aRet.hasValue() ) + { + sal_Int32 nKey = 0; +@@ -98,23 +81,14 @@ Any WrappedNumberFormatProperty::getPropertyDefault( const Reference< beans::XPr + return uno::makeAny( sal_Int32( 0 ) ); + } + +-WrappedLinkNumberFormatProperty::WrappedLinkNumberFormatProperty( WrappedNumberFormatProperty* pWrappedNumberFormatProperty ) +- : WrappedProperty( "LinkNumberFormatToSource", OUString() ) +- , m_pWrappedNumberFormatProperty( pWrappedNumberFormatProperty ) ++WrappedLinkNumberFormatProperty::WrappedLinkNumberFormatProperty( const boost::shared_ptr& pChart2ModelContact ) : ++ WrappedDirectStateProperty("LinkNumberFormatToSource", "LinkNumberFormatToSource"), ++ m_pChart2ModelContact(pChart2ModelContact) + { +- if( m_pWrappedNumberFormatProperty ) +- { +- m_pWrappedNumberFormatProperty->m_pWrappedLinkNumberFormatProperty = this; +- } + } + + WrappedLinkNumberFormatProperty::~WrappedLinkNumberFormatProperty() + { +- if( m_pWrappedNumberFormatProperty ) +- { +- if( m_pWrappedNumberFormatProperty->m_pWrappedLinkNumberFormatProperty == this ) +- m_pWrappedNumberFormatProperty->m_pWrappedLinkNumberFormatProperty = 0; +- } + } + + void WrappedLinkNumberFormatProperty::setPropertyValue( const Any& rOuterValue, const Reference< beans::XPropertySet >& xInnerPropertySet ) const +@@ -126,31 +100,7 @@ void WrappedLinkNumberFormatProperty::setPropertyValue( const Any& rOuterValue, + return; + } + +- bool bLinkFormat = false; +- if( rOuterValue >>= bLinkFormat ) +- { +- Any aValue; +- if( bLinkFormat ) +- { +- if( m_pWrappedNumberFormatProperty ) +- { +- uno::Reference< chart2::XChartDocument > xChartDoc( m_pWrappedNumberFormatProperty->m_spChart2ModelContact->getChart2Document() ); +- if( xChartDoc.is() && xChartDoc->hasInternalDataProvider() ) +- return; +- } +- } +- else +- { +- if( m_pWrappedNumberFormatProperty ) +- { +- aValue = m_pWrappedNumberFormatProperty->getPropertyValue( xInnerPropertySet ); +- } +- else +- aValue <<= sal_Int32( 0 ); +- } +- +- xInnerPropertySet->setPropertyValue( "NumberFormat", aValue ); +- } ++ xInnerPropertySet->setPropertyValue(getInnerName(), rOuterValue); + } + + Any WrappedLinkNumberFormatProperty::getPropertyValue( const Reference< beans::XPropertySet >& xInnerPropertySet ) const +@@ -161,8 +111,8 @@ Any WrappedLinkNumberFormatProperty::getPropertyValue( const Reference< beans::X + OSL_FAIL("missing xInnerPropertySet in WrappedNumberFormatProperty::getPropertyValue"); + return getPropertyDefault(0); + } +- bool bLink = ! xInnerPropertySet->getPropertyValue( "NumberFormat" ).hasValue(); +- return uno::makeAny( bLink ); ++ ++ return xInnerPropertySet->getPropertyValue(getInnerName()); + } + + Any WrappedLinkNumberFormatProperty::getPropertyDefault( const Reference< beans::XPropertyState >& /*xInnerPropertyState*/ ) const +diff --git a/chart2/source/controller/chartapiwrapper/WrappedNumberFormatProperty.hxx b/chart2/source/controller/chartapiwrapper/WrappedNumberFormatProperty.hxx +index 63a562c..9602080 100644 +--- a/chart2/source/controller/chartapiwrapper/WrappedNumberFormatProperty.hxx ++++ b/chart2/source/controller/chartapiwrapper/WrappedNumberFormatProperty.hxx +@@ -49,14 +49,12 @@ public: + friend class WrappedLinkNumberFormatProperty; + private: + ::boost::shared_ptr< Chart2ModelContact > m_spChart2ModelContact; +- mutable ::com::sun::star::uno::Any m_aOuterValue; +- WrappedLinkNumberFormatProperty* m_pWrappedLinkNumberFormatProperty; + }; + +-class WrappedLinkNumberFormatProperty : public WrappedProperty ++class WrappedLinkNumberFormatProperty : public WrappedDirectStateProperty + { + public: +- WrappedLinkNumberFormatProperty( WrappedNumberFormatProperty* pWrappedNumberFormatProperty ); ++ WrappedLinkNumberFormatProperty( const boost::shared_ptr& pChart2ModelContact ); + virtual ~WrappedLinkNumberFormatProperty(); + + virtual void setPropertyValue( const ::com::sun::star::uno::Any& rOuterValue, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xInnerPropertySet ) const +@@ -68,9 +66,8 @@ public: + virtual ::com::sun::star::uno::Any getPropertyDefault( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyState >& xInnerPropertyState ) const + throw (::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); + +- friend class WrappedNumberFormatProperty; + private: +- WrappedNumberFormatProperty* m_pWrappedNumberFormatProperty; ++ boost::shared_ptr m_pChart2ModelContact; + }; + + } //namespace wrapper +diff --git a/chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx b/chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx +index 328dd8c..7974dc1 100644 +--- a/chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx ++++ b/chart2/source/controller/itemsetwrapper/AxisItemConverter.cxx +@@ -425,8 +425,9 @@ void AxisItemConverter::FillSpecialItem( sal_uInt16 nWhichId, SfxItemSet & rOutI + + case SID_ATTR_NUMBERFORMAT_SOURCE: + { +- bool bNumberFormatIsSet = ( GetPropertySet()->getPropertyValue( "NumberFormat" ).hasValue()); +- rOutItemSet.Put( SfxBoolItem( nWhichId, ! bNumberFormatIsSet )); ++ bool bLinkToSource = true; ++ GetPropertySet()->getPropertyValue("LinkNumberFormatToSource") >>= bLinkToSource; ++ rOutItemSet.Put(SfxBoolItem(nWhichId, bLinkToSource)); + } + break; + +@@ -932,7 +933,9 @@ bool AxisItemConverter::ApplySpecialItem( sal_uInt16 nWhichId, const SfxItemSet + bool bUseSourceFormat = + (static_cast< const SfxBoolItem & >( + rItemSet.Get( nWhichId )).GetValue() ); +- bool bNumberFormatIsSet = ( GetPropertySet()->getPropertyValue( "NumberFormat").hasValue()); ++ GetPropertySet()->setPropertyValue("LinkNumberFormatToSource", uno::makeAny(bUseSourceFormat)); ++ ++ bool bNumberFormatIsSet = GetPropertySet()->getPropertyValue("NumberFormat").hasValue(); + + bChangedOtherwise = (bUseSourceFormat == bNumberFormatIsSet); + if( bChangedOtherwise ) +diff --git a/chart2/source/controller/main/ChartDropTargetHelper.cxx b/chart2/source/controller/main/ChartDropTargetHelper.cxx +index 154db84..0857de3 100644 +--- a/chart2/source/controller/main/ChartDropTargetHelper.cxx ++++ b/chart2/source/controller/main/ChartDropTargetHelper.cxx +@@ -103,8 +103,8 @@ sal_Int8 ChartDropTargetHelper::ExecuteDrop( const ExecuteDropEvent& rEvt ) + TransferableDataHelper aDataHelper( rEvt.maDropEvent.Transferable ); + if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_LINK )) + { +- Sequence< sal_Int8 > aBytes; +- if( aDataHelper.GetSequence( SOT_FORMATSTR_ID_LINK, aBytes )) ++ Sequence aBytes = aDataHelper.GetSequence(SOT_FORMATSTR_ID_LINK, OUString()); ++ if (aBytes.getLength()) + { + ::std::vector< OUString > aStrings( lcl_getStringsFromByteSequence( aBytes )); + if( aStrings.size() >= 3 && aStrings[0] == "soffice" ) +diff --git a/chart2/source/controller/main/ChartTransferable.cxx b/chart2/source/controller/main/ChartTransferable.cxx +index f072b21..e7d7d2b 100644 +--- a/chart2/source/controller/main/ChartTransferable.cxx ++++ b/chart2/source/controller/main/ChartTransferable.cxx +@@ -75,7 +75,7 @@ void ChartTransferable::AddSupportedFormats() + AddFormat( SOT_FORMAT_BITMAP ); + } + +-sal_Bool ChartTransferable::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) ++sal_Bool ChartTransferable::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& /*rDestDoc*/ ) + { + sal_uInt32 nFormat = SotExchange::GetFormat( rFlavor ); + sal_Bool bResult = sal_False; +diff --git a/chart2/source/controller/main/ChartTransferable.hxx b/chart2/source/controller/main/ChartTransferable.hxx +index efbd1b3..9ae5aaf 100644 +--- a/chart2/source/controller/main/ChartTransferable.hxx ++++ b/chart2/source/controller/main/ChartTransferable.hxx +@@ -43,7 +43,7 @@ protected: + + // implementation of TransferableHelper methods + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual sal_Bool WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, + const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); + +diff --git a/chart2/source/model/filter/XMLFilter.cxx b/chart2/source/model/filter/XMLFilter.cxx +index cee36fa..ce44fd7 100644 +--- a/chart2/source/model/filter/XMLFilter.cxx ++++ b/chart2/source/model/filter/XMLFilter.cxx +@@ -548,6 +548,7 @@ sal_Int32 XMLFilter::impl_Export( + const Reference< lang::XComponent > & xDocumentComp, + const Sequence< beans::PropertyValue > & rMediaDescriptor ) + { ++ m_aMediaDescriptor = rMediaDescriptor; + //save + + sal_Int32 nWarning = 0; +@@ -751,9 +752,7 @@ sal_Int32 XMLFilter::impl_ExportStream( + if ( !xFilter.is() ) + return ERRCODE_SFX_GENERAL; + +- uno::Sequence < beans::PropertyValue > aMediaDesc(0); +- //@todo? filter properties? ... url? ... +- xFilter->filter( aMediaDesc ); ++ xFilter->filter(m_aMediaDescriptor); + } + catch (const uno::Exception& rEx) + { +diff --git a/chart2/source/model/inc/XMLFilter.hxx b/chart2/source/model/inc/XMLFilter.hxx +index 648e25f..d8bb956 100644 +--- a/chart2/source/model/inc/XMLFilter.hxx ++++ b/chart2/source/model/inc/XMLFilter.hxx +@@ -152,6 +152,9 @@ private: + ::com::sun::star::lang::XComponent > m_xTargetDoc; + ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XComponent > m_xSourceDoc; ++ ++ css::uno::Sequence m_aMediaDescriptor; ++ + OUString m_sDocumentHandler; // when set it will be set as doc handler + + volatile bool m_bCancelOperation; +diff --git a/chart2/source/model/main/Axis.cxx b/chart2/source/model/main/Axis.cxx +index f8a3b90..c478068 100644 +--- a/chart2/source/model/main/Axis.cxx ++++ b/chart2/source/model/main/Axis.cxx +@@ -65,7 +65,8 @@ enum + PROP_AXIS_CROSSOVER_POSITION, + PROP_AXIS_CROSSOVER_VALUE, + PROP_AXIS_DISPLAY_LABELS, +- PROP_AXIS_NUMBER_FORMAT, ++ PROP_AXIS_NUMBERFORMAT, ++ PROP_AXIS_LINK_NUMBERFORMAT_TO_SOURCE, + PROP_AXIS_LABEL_POSITION, + PROP_AXIS_TEXT_ROTATION, + PROP_AXIS_TEXT_BREAK, +@@ -110,10 +111,17 @@ void lcl_AddPropertiesToVector( + + rOutProperties.push_back( + Property( "NumberFormat", +- PROP_AXIS_NUMBER_FORMAT, +- ::getCppuType( reinterpret_cast< const sal_Int32 * >(0)), ++ PROP_AXIS_NUMBERFORMAT, ++ cppu::UnoType::get(), + beans::PropertyAttribute::BOUND +- | beans::PropertyAttribute::MAYBEVOID )); ++ | beans::PropertyAttribute::MAYBEDEFAULT )); ++ ++ rOutProperties.push_back( ++ Property( "LinkNumberFormatToSource", ++ PROP_AXIS_LINK_NUMBERFORMAT_TO_SOURCE, ++ ::getBooleanCppuType(), ++ beans::PropertyAttribute::BOUND ++ | beans::PropertyAttribute::MAYBEDEFAULT )); + + rOutProperties.push_back( + Property( "LabelPosition", +@@ -199,6 +207,7 @@ private: + ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_AXIS_SHOW, true ); + ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_AXIS_CROSSOVER_POSITION, ::com::sun::star::chart::ChartAxisPosition_ZERO ); + ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_AXIS_DISPLAY_LABELS, true ); ++ ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_AXIS_LINK_NUMBERFORMAT_TO_SOURCE, true ); + ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_AXIS_LABEL_POSITION, ::com::sun::star::chart::ChartAxisLabelPosition_NEAR_AXIS ); + ::chart::PropertyHelper::setPropertyValueDefault< double >( rOutMap, PROP_AXIS_TEXT_ROTATION, 0.0 ); + ::chart::PropertyHelper::setPropertyValueDefault( rOutMap, PROP_AXIS_TEXT_BREAK, false ); +diff --git a/chart2/source/model/main/DataPointProperties.cxx b/chart2/source/model/main/DataPointProperties.cxx +index 443101d..2aa4ca9 100644 +--- a/chart2/source/model/main/DataPointProperties.cxx ++++ b/chart2/source/model/main/DataPointProperties.cxx +@@ -281,7 +281,14 @@ void DataPointProperties::AddPropertiesToVector( + PROP_DATAPOINT_NUMBER_FORMAT, + ::getCppuType( reinterpret_cast< const sal_Int32 * >(0)), + beans::PropertyAttribute::BOUND +- | beans::PropertyAttribute::MAYBEVOID )); ++ | beans::PropertyAttribute::MAYBEDEFAULT )); ++ ++ rOutProperties.push_back( ++ Property( "LinkNumberFormatToSource", ++ PROP_DATAPOINT_LINK_NUMBERFORMAT_TO_SOURCE, ++ ::getBooleanCppuType(), ++ beans::PropertyAttribute::BOUND ++ | beans::PropertyAttribute::MAYBEDEFAULT )); + + //additional 'PercentageNumberFormat' + rOutProperties.push_back( +@@ -409,6 +416,8 @@ void DataPointProperties::AddDefaultsToMap( + PropertyHelper::setPropertyValueDefault< sal_Int16 >( rOutMap, PROP_DATAPOINT_PERCENT_DIAGONAL, 0 ); + + PropertyHelper::setPropertyValueDefault< double >( rOutMap, PROP_DATAPOINT_TEXT_ROTATION, 0.0 ); ++ ++ PropertyHelper::setPropertyValueDefault(rOutMap, PROP_DATAPOINT_LINK_NUMBERFORMAT_TO_SOURCE, true); + } + + } // namespace chart +diff --git a/chart2/source/model/main/DataPointProperties.hxx b/chart2/source/model/main/DataPointProperties.hxx +index 596adf8..2d7258a 100644 +--- a/chart2/source/model/main/DataPointProperties.hxx ++++ b/chart2/source/model/main/DataPointProperties.hxx +@@ -62,6 +62,7 @@ public: + PROP_DATAPOINT_LABEL, + PROP_DATAPOINT_LABEL_SEPARATOR, + PROP_DATAPOINT_NUMBER_FORMAT, ++ PROP_DATAPOINT_LINK_NUMBERFORMAT_TO_SOURCE, + PROP_DATAPOINT_PERCENTAGE_NUMBER_FORMAT, + PROP_DATAPOINT_LABEL_PLACEMENT, + PROP_DATAPOINT_REFERENCE_DIAGRAM_SIZE, +diff --git a/chart2/source/model/template/ChartTypeTemplate.cxx b/chart2/source/model/template/ChartTypeTemplate.cxx +index b1ac7d22..8ff8563 100644 +--- a/chart2/source/model/template/ChartTypeTemplate.cxx ++++ b/chart2/source/model/template/ChartTypeTemplate.cxx +@@ -454,9 +454,8 @@ void SAL_CALL ChartTypeTemplate::resetStyles( const Reference< chart2::XDiagram + if( xAxisProp.is()) + { + // set number format to source format +- uno::Any aValue( xAxisProp->getPropertyValue("NumberFormat")); +- if( aValue.hasValue()) +- xAxisProp->setPropertyValue("NumberFormat", uno::Any()); ++ xAxisProp->setPropertyValue("LinkNumberFormatToSource", uno::makeAny(true)); ++ xAxisProp->setPropertyValue("NumberFormat", uno::Any()); + } + } + } +@@ -754,9 +753,8 @@ void ChartTypeTemplate::adaptAxes( + if( xAxisProp.is()) + { + // set number format to source format +- uno::Any aValue( xAxisProp->getPropertyValue("NumberFormat")); +- if( aValue.hasValue()) +- xAxisProp->setPropertyValue("NumberFormat", uno::Any()); ++ xAxisProp->setPropertyValue("LinkNumberFormatToSource", uno::makeAny(true)); ++ xAxisProp->setPropertyValue("NumberFormat", uno::Any()); + } + } + } +diff --git a/chart2/source/tools/AxisHelper.cxx b/chart2/source/tools/AxisHelper.cxx +index 4b372ca..8291ca6 100644 +--- a/chart2/source/tools/AxisHelper.cxx ++++ b/chart2/source/tools/AxisHelper.cxx +@@ -145,7 +145,16 @@ sal_Int32 AxisHelper::getExplicitNumberFormatKeyForAxis( + Reference< chart2::XChartDocument > xChartDoc( xNumberFormatsSupplier, uno::UNO_QUERY ); + + Reference< beans::XPropertySet > xProp( xAxis, uno::UNO_QUERY ); +- if( xProp.is() && !( xProp->getPropertyValue( "NumberFormat" ) >>= nNumberFormatKey ) ) ++ if (!xProp.is()) ++ return 0; ++ ++ bool bLinkToSource = true; ++ xProp->getPropertyValue("LinkNumberFormatToSource") >>= bLinkToSource; ++ xProp->getPropertyValue("NumberFormat") >>= nNumberFormatKey; ++ ++ sal_Int32 nOldNumberFormat = nNumberFormatKey; ++ ++ if (bLinkToSource) + { + bool bFormatSet = false; + //check whether we have a percent scale -> use percent format +@@ -314,7 +323,11 @@ sal_Int32 AxisHelper::getExplicitNumberFormatKeyForAxis( + } + } + } ++ ++ if (nOldNumberFormat != nNumberFormatKey) ++ xProp->setPropertyValue("NumberFormat", uno::makeAny(nNumberFormatKey)); + } ++ + return nNumberFormatKey; + } + +diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx +index f501aa9..c519aef 100644 +--- a/chart2/source/view/main/ChartView.cxx ++++ b/chart2/source/view/main/ChartView.cxx +@@ -1787,8 +1787,16 @@ sal_Int32 ExplicitValueProvider::getExplicitNumberFormatKeyForDataLabel( + if( !xSeriesOrPointProp.is() ) + return nFormat; + +- OUString aPropName( "NumberFormat" ); +- if( !(xSeriesOrPointProp->getPropertyValue(aPropName) >>= nFormat) ) ++ bool bLinkToSource = true; ++ try ++ { ++ xSeriesOrPointProp->getPropertyValue("LinkNumberFormatToSource") >>= bLinkToSource; ++ } ++ catch ( const beans::UnknownPropertyException& ) {} ++ ++ xSeriesOrPointProp->getPropertyValue("NumberFormat") >>= nFormat; ++ sal_Int32 nOldFormat = nFormat; ++ if (bLinkToSource) + { + uno::Reference< chart2::XChartType > xChartType( DataSeriesHelper::getChartTypeOfSeries( xSeries, xDiagram ) ); + +@@ -1796,7 +1804,7 @@ sal_Int32 ExplicitValueProvider::getExplicitNumberFormatKeyForDataLabel( + if( ChartTypeHelper::shouldLabelNumberFormatKeyBeDetectedFromYAxis( xChartType ) ) + { + uno::Reference< beans::XPropertySet > xAttachedAxisProps( DiagramHelper::getAttachedAxis( xSeries, xDiagram ), uno::UNO_QUERY ); +- if( xAttachedAxisProps.is() && ( xAttachedAxisProps->getPropertyValue( aPropName ) >>= nFormat ) ) ++ if( xAttachedAxisProps.is() && ( xAttachedAxisProps->getPropertyValue("NumberFormat") >>= nFormat ) ) + bFormatFound = true; + } + if( !bFormatFound ) +@@ -1813,7 +1821,11 @@ sal_Int32 ExplicitValueProvider::getExplicitNumberFormatKeyForDataLabel( + nFormat = xValues->getNumberFormatKeyByIndex( nPointIndex ); + } + } ++ ++ if (nFormat >= 0 && nOldFormat != nFormat) ++ xSeriesOrPointProp->setPropertyValue("NumberFormat", uno::makeAny(nFormat)); + } ++ + if(nFormat<0) + nFormat=0; + return nFormat; +diff --git a/comphelper/source/container/embeddedobjectcontainer.cxx b/comphelper/source/container/embeddedobjectcontainer.cxx +index 2d7df99..c3b4338 100644 +--- a/comphelper/source/container/embeddedobjectcontainer.cxx ++++ b/comphelper/source/container/embeddedobjectcontainer.cxx +@@ -493,7 +493,9 @@ void EmbeddedObjectContainer::AddEmbeddedObject( const ::com::sun::star::uno::Re + } + } + +-sal_Bool EmbeddedObjectContainer::StoreEmbeddedObject( const uno::Reference < embed::XEmbeddedObject >& xObj, OUString& rName, sal_Bool bCopy ) ++bool EmbeddedObjectContainer::StoreEmbeddedObject( ++ const uno::Reference < embed::XEmbeddedObject >& xObj, OUString& rName, bool bCopy, ++ const OUString& rSrcShellID, const OUString& rDestShellID ) + { + SAL_INFO( "comphelper.container", "comphelper (mv76033) comphelper::EmbeddedObjectContainer::StoreEmbeddedObject" ); + +@@ -514,7 +516,14 @@ sal_Bool EmbeddedObjectContainer::StoreEmbeddedObject( const uno::Reference < em + { + uno::Sequence < beans::PropertyValue > aSeq; + if ( bCopy ) +- xPersist->storeToEntry( pImpl->mxStorage, rName, aSeq, aSeq ); ++ { ++ uno::Sequence aObjArgs(2); ++ aObjArgs[0].Name = "SourceShellID"; ++ aObjArgs[0].Value <<= rSrcShellID; ++ aObjArgs[1].Name = "DestinationShellID"; ++ aObjArgs[1].Value <<= rDestShellID; ++ xPersist->storeToEntry(pImpl->mxStorage, rName, aSeq, aObjArgs); ++ } + else + { + //TODO/LATER: possible optimisation, don't store immediately +@@ -538,7 +547,7 @@ sal_Bool EmbeddedObjectContainer::InsertEmbeddedObject( const uno::Reference < e + { + SAL_INFO( "comphelper.container", "comphelper (mv76033) comphelper::EmbeddedObjectContainer::InsertEmbeddedObject( Object )" ); + // store it into the container storage +- if ( StoreEmbeddedObject( xObj, rName, sal_False ) ) ++ if (StoreEmbeddedObject(xObj, rName, false, OUString(), OUString())) + { + // remember object + AddEmbeddedObject( xObj, rName ); +@@ -700,7 +709,9 @@ sal_Bool EmbeddedObjectContainer::TryToCopyGraphReplacement( EmbeddedObjectConta + return bResult; + } + +-uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::CopyAndGetEmbeddedObject( EmbeddedObjectContainer& rSrc, const uno::Reference < embed::XEmbeddedObject >& xObj, OUString& rName ) ++uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::CopyAndGetEmbeddedObject( ++ EmbeddedObjectContainer& rSrc, const uno::Reference & xObj, OUString& rName, ++ const OUString& rSrcShellID, const OUString& rDestShellID ) + { + SAL_INFO( "comphelper.container", "comphelper (mv76033) comphelper::EmbeddedObjectContainer::CopyAndGetEmbeddedObject" ); + +@@ -721,8 +732,8 @@ uno::Reference < embed::XEmbeddedObject > EmbeddedObjectContainer::CopyAndGetEmb + if ( rName.isEmpty() ) + rName = CreateUniqueObjectName(); + +- // objects without persistance are not really stored by the method +- if ( xObj.is() && StoreEmbeddedObject( xObj, rName, sal_True ) ) ++ // objects without persistence are not really stored by the method ++ if (xObj.is() && StoreEmbeddedObject(xObj, rName, true, rSrcShellID, rDestShellID)) + { + xResult = Get_Impl( rName, xObj); + if ( !xResult.is() ) +diff --git a/dbaccess/source/ui/browser/dbexchange.cxx b/dbaccess/source/ui/browser/dbexchange.cxx +index 32c05ce..47e4d2f 100644 +--- a/dbaccess/source/ui/browser/dbexchange.cxx ++++ b/dbaccess/source/ui/browser/dbexchange.cxx +@@ -159,7 +159,7 @@ namespace dbaui + ODataAccessObjectTransferable::AddSupportedFormats(); + } + +- sal_Bool ODataClipboard::GetData( const DataFlavor& rFlavor ) ++ sal_Bool ODataClipboard::GetData( const DataFlavor& rFlavor, const OUString& rDestDoc ) + { + const sal_uLong nFormat = SotExchange::GetFormat(rFlavor); + switch (nFormat) +@@ -175,7 +175,7 @@ namespace dbaui + return m_pHtml.is() && SetObject( m_pHtml.get(), SOT_FORMATSTR_ID_HTML, rFlavor ); + } + +- return ODataAccessObjectTransferable::GetData( rFlavor ); ++ return ODataAccessObjectTransferable::GetData(rFlavor, rDestDoc); + } + + void ODataClipboard::ObjectReleased() +diff --git a/dbaccess/source/ui/inc/JoinExchange.hxx b/dbaccess/source/ui/inc/JoinExchange.hxx +index 2bf549a..d705300 100644 +--- a/dbaccess/source/ui/inc/JoinExchange.hxx ++++ b/dbaccess/source/ui/inc/JoinExchange.hxx +@@ -61,7 +61,7 @@ namespace dbaui + + protected: + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual void DragFinished( sal_Int8 nDropAction ); + + static ::com::sun::star::uno::Sequence< sal_Int8 > getUnoTunnelImplementationId(); +diff --git a/dbaccess/source/ui/inc/TableRowExchange.hxx b/dbaccess/source/ui/inc/TableRowExchange.hxx +index 0f03474..a298a5b 100644 +--- a/dbaccess/source/ui/inc/TableRowExchange.hxx ++++ b/dbaccess/source/ui/inc/TableRowExchange.hxx +@@ -34,7 +34,7 @@ namespace dbaui + OTableRowExchange(const ::std::vector< ::boost::shared_ptr >& _rvTableRow); + protected: + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual sal_Bool WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); + virtual void ObjectReleased(); + }; +diff --git a/dbaccess/source/ui/inc/dbexchange.hxx b/dbaccess/source/ui/inc/dbexchange.hxx +index f194213..c8d9852 100644 +--- a/dbaccess/source/ui/inc/dbexchange.hxx ++++ b/dbaccess/source/ui/inc/dbexchange.hxx +@@ -73,7 +73,7 @@ namespace dbaui + + protected: + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual void ObjectReleased(); + virtual sal_Bool WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); + }; +diff --git a/dbaccess/source/ui/querydesign/JoinExchange.cxx b/dbaccess/source/ui/querydesign/JoinExchange.cxx +index 70007d7..8efc796 100644 +--- a/dbaccess/source/ui/querydesign/JoinExchange.cxx ++++ b/dbaccess/source/ui/querydesign/JoinExchange.cxx +@@ -116,7 +116,7 @@ namespace dbaui + AddFormat( SOT_FORMATSTR_ID_SBA_TABID ); + } + +- sal_Bool OJoinExchObj::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) ++ sal_Bool OJoinExchObj::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& /*rDestDoc*/ ) + { + sal_uInt32 nFormat = SotExchange::GetFormat(rFlavor); + if ( SOT_FORMATSTR_ID_SBA_JOIN == nFormat ) +diff --git a/dbaccess/source/ui/tabledesign/TableRowExchange.cxx b/dbaccess/source/ui/tabledesign/TableRowExchange.cxx +index 3a14971..a593b09 100644 +--- a/dbaccess/source/ui/tabledesign/TableRowExchange.cxx ++++ b/dbaccess/source/ui/tabledesign/TableRowExchange.cxx +@@ -52,7 +52,7 @@ namespace dbaui + if ( !m_vTableRow.empty() ) + AddFormat(SOT_FORMATSTR_ID_SBA_TABED); + } +- sal_Bool OTableRowExchange::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) ++ sal_Bool OTableRowExchange::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& /*rDestDoc*/ ) + { + sal_uLong nFormat = SotExchange::GetFormat(rFlavor); + if(nFormat == SOT_FORMATSTR_ID_SBA_TABED) +diff --git a/embeddedobj/source/commonembedding/persistence.cxx b/embeddedobj/source/commonembedding/persistence.cxx +index 36741eb..4891656 100644 +--- a/embeddedobj/source/commonembedding/persistence.cxx ++++ b/embeddedobj/source/commonembedding/persistence.cxx +@@ -723,12 +723,33 @@ void OCommonEmbeddedObject::SwitchDocToStorage_Impl( const uno::Reference< docum + m_xRecoveryStorage.clear(); + } + +-//------------------------------------------------------ +-void OCommonEmbeddedObject::StoreDocToStorage_Impl( const uno::Reference< embed::XStorage >& xStorage, +- sal_Int32 nStorageFormat, +- const OUString& aBaseURL, +- const OUString& aHierarchName, +- sal_Bool bAttachToTheStorage ) ++namespace { ++ ++OUString getStringPropertyValue( const uno::Sequence& rProps, const OUString& rName ) ++{ ++ OUString aStr; ++ ++ for (sal_Int32 i = 0; i < rProps.getLength(); ++i) ++ { ++ if (rProps[i].Name == rName) ++ { ++ rProps[i].Value >>= aStr; ++ break; ++ } ++ } ++ ++ return aStr; ++} ++ ++} ++ ++void OCommonEmbeddedObject::StoreDocToStorage_Impl( ++ const uno::Reference& xStorage, ++ const uno::Sequence& rMediaArgs, ++ const uno::Sequence& rObjArgs, ++ sal_Int32 nStorageFormat, ++ const OUString& aHierarchName, ++ bool bAttachToTheStorage ) + { + SAL_WARN_IF( !xStorage.is(), "embeddedobj.common", "No storage is provided for storing!" ); + +@@ -742,6 +763,8 @@ void OCommonEmbeddedObject::StoreDocToStorage_Impl( const uno::Reference< embed: + xDoc = uno::Reference< document::XStorageBasedDocument >( m_pDocHolder->GetComponent(), uno::UNO_QUERY ); + } + ++ OUString aBaseURL = GetBaseURLFrom_Impl(rMediaArgs, rObjArgs); ++ + if ( xDoc.is() ) + { + OUString aFilterName = GetFilterName( nStorageFormat ); +@@ -750,13 +773,17 @@ void OCommonEmbeddedObject::StoreDocToStorage_Impl( const uno::Reference< embed: + if ( aFilterName.isEmpty() ) + throw io::IOException(); // TODO: + +- uno::Sequence< beans::PropertyValue > aArgs( 3 ); ++ uno::Sequence aArgs(5); + aArgs[0].Name = "FilterName"; + aArgs[0].Value <<= aFilterName; +- aArgs[2].Name = "DocumentBaseURL"; +- aArgs[2].Value <<= aBaseURL; + aArgs[1].Name = "HierarchicalDocumentName"; + aArgs[1].Value <<= aHierarchName; ++ aArgs[2].Name = "DocumentBaseURL"; ++ aArgs[2].Value <<= aBaseURL; ++ aArgs[3].Name = "SourceShellID"; ++ aArgs[3].Value <<= getStringPropertyValue(rObjArgs, "SourceShellID"); ++ aArgs[4].Name = "DestinationShellID"; ++ aArgs[4].Value <<= getStringPropertyValue(rObjArgs, "DestinationShellID"); + + xDoc->storeToStorage( xStorage, aArgs ); + if ( bAttachToTheStorage ) +@@ -1241,7 +1268,8 @@ void SAL_CALL OCommonEmbeddedObject::storeToEntry( const uno::Reference< embed:: + + aGuard.clear(); + // TODO/LATER: support hierarchical name for embedded objects in embedded objects +- StoreDocToStorage_Impl( xSubStorage, nTargetStorageFormat, GetBaseURLFrom_Impl( lArguments, lObjArgs ), sEntName, sal_False ); ++ StoreDocToStorage_Impl( ++ xSubStorage, lArguments, lObjArgs, nTargetStorageFormat, sEntName, false ); + aGuard.reset(); + + if ( bSwitchBackToLoaded ) +@@ -1380,7 +1408,8 @@ void SAL_CALL OCommonEmbeddedObject::storeAsEntry( const uno::Reference< embed:: + { + aGuard.clear(); + // TODO/LATER: support hierarchical name for embedded objects in embedded objects +- StoreDocToStorage_Impl( xSubStorage, nTargetStorageFormat, GetBaseURLFrom_Impl( lArguments, lObjArgs ), sEntName, sal_False ); ++ StoreDocToStorage_Impl( ++ xSubStorage, lArguments, lObjArgs, nTargetStorageFormat, sEntName, false ); + aGuard.reset(); + + if ( bSwitchBackToLoaded ) +@@ -1609,7 +1638,8 @@ void SAL_CALL OCommonEmbeddedObject::storeOwn() + } + + aGuard.clear(); +- StoreDocToStorage_Impl( m_xObjectStorage, nStorageFormat, GetBaseURL_Impl(), m_aEntryName, sal_True ); ++ uno::Sequence aEmpty; ++ StoreDocToStorage_Impl( m_xObjectStorage, aEmpty, aEmpty, nStorageFormat, m_aEntryName, true ); + aGuard.reset(); + } + +diff --git a/embeddedobj/source/inc/commonembobj.hxx b/embeddedobj/source/inc/commonembobj.hxx +index fba8d21..83e4445 100644 +--- a/embeddedobj/source/inc/commonembobj.hxx ++++ b/embeddedobj/source/inc/commonembobj.hxx +@@ -197,11 +197,13 @@ private: + + ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloseable > InitNewDocument_Impl(); + +- void StoreDocToStorage_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage, +- sal_Int32 nStorageVersion, +- const OUString& aBaseURL, +- const OUString& aHierarchName, +- sal_Bool bAttachToStorage ); ++ void StoreDocToStorage_Impl( ++ const css::uno::Reference& xStorage, ++ const css::uno::Sequence& rMediaArgs, ++ const css::uno::Sequence& rObjArgs, ++ sal_Int32 nStorageVersion, ++ const OUString& aHierarchName, ++ bool bAttachToStorage ); + + void SwitchDocToStorage_Impl( + const ::com::sun::star::uno::Reference< ::com::sun::star::document::XStorageBasedDocument >& xDoc, +diff --git a/include/comphelper/embeddedobjectcontainer.hxx b/include/comphelper/embeddedobjectcontainer.hxx +index 7ce0566..616ca0f 100644 +--- a/include/comphelper/embeddedobjectcontainer.hxx ++++ b/include/comphelper/embeddedobjectcontainer.hxx +@@ -58,7 +58,9 @@ class COMPHELPER_DLLPUBLIC EmbeddedObjectContainer + + public: + // add an embedded object to the container storage +- sal_Bool StoreEmbeddedObject( const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >&, OUString&, sal_Bool ); ++ bool StoreEmbeddedObject( ++ const css::uno::Reference& xObj, OUString& rName, bool bCopy, ++ const OUString& rSrcShellID, const OUString& rDestShellID ); + + // add an embedded object that has been imported from the container storage - should only be called by filters! + void AddEmbeddedObject( const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >&, const OUString& ); +@@ -119,7 +121,9 @@ public: + InsertEmbeddedObject( const ::com::sun::star::uno::Reference < ::com::sun::star::io::XInputStream >&, OUString& ); + + // copy an embedded object into the storage, open the new copy and return it +- ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject > CopyAndGetEmbeddedObject( EmbeddedObjectContainer& rSrc, const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >& xObj, /* TODO const OUString& aOrigName,*/ OUString& rName ); ++ css::uno::Reference CopyAndGetEmbeddedObject( ++ EmbeddedObjectContainer& rSrc, const css::uno::Reference & xObj, OUString& rName, ++ const OUString& rSrcShellID, const OUString& rDestShellID ); + + // move an embedded object from one container to another one + sal_Bool MoveEmbeddedObject( EmbeddedObjectContainer& rSrc, const ::com::sun::star::uno::Reference < ::com::sun::star::embed::XEmbeddedObject >&, OUString& ); +diff --git a/include/sfx2/objsh.hxx b/include/sfx2/objsh.hxx +index de041fbf..05aa6a7 100644 +--- a/include/sfx2/objsh.hxx ++++ b/include/sfx2/objsh.hxx +@@ -239,6 +239,8 @@ public: + + using SotObject::GetInterface; + ++ static OUString CreateShellID( const SfxObjectShell* pShell ); ++ + // Document-Shell Iterator + static SfxObjectShell* GetFirst( const TypeId* pType = 0, + sal_Bool bOnlyVisible = sal_True ); +diff --git a/include/svtools/embedtransfer.hxx b/include/svtools/embedtransfer.hxx +index 2649188..186bc0c 100644 +--- a/include/svtools/embedtransfer.hxx ++++ b/include/svtools/embedtransfer.hxx +@@ -33,10 +33,12 @@ private: + Graphic* m_pGraphic; + sal_Int64 m_nAspect; + ++ OUString maParentShellID; ++ + protected: + + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual void ObjectReleased(); + + public: +@@ -46,6 +48,8 @@ public: + sal_Int64 nAspect ); + ~SvEmbedTransferHelper(); + ++ void SetParentShellID( const OUString& rShellID ); ++ + static void FillTransferableObjectDescriptor( TransferableObjectDescriptor& rDesc, + const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XEmbeddedObject >& xObj, + const Graphic* pGraphic, +diff --git a/include/svtools/stringtransfer.hxx b/include/svtools/stringtransfer.hxx +index 12d6fda..60d2ced 100644 +--- a/include/svtools/stringtransfer.hxx ++++ b/include/svtools/stringtransfer.hxx +@@ -42,7 +42,7 @@ namespace svt + protected: + // TransferableHelper overridables + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& _rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& _rFlavor, const OUString& rDestDoc ); + }; + + //==================================================================== +diff --git a/include/svtools/transfer.hxx b/include/svtools/transfer.hxx +index 2a8ce29..76c192f 100644 +--- a/include/svtools/transfer.hxx ++++ b/include/svtools/transfer.hxx +@@ -28,7 +28,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +@@ -127,7 +127,7 @@ struct ExecuteDropEvent + mbDefault( sal_False ) {} + }; + +-class SVT_DLLPUBLIC TransferableHelper : public ::cppu::WeakImplHelper4< ::com::sun::star::datatransfer::XTransferable, ++class SVT_DLLPUBLIC TransferableHelper : public ::cppu::WeakImplHelper4< ::com::sun::star::datatransfer::XTransferable2, + ::com::sun::star::datatransfer::clipboard::XClipboardOwner, + ::com::sun::star::datatransfer::dnd::XDragSourceListener, + ::com::sun::star::lang::XUnoTunnel > +@@ -178,6 +178,11 @@ private: + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::datatransfer::DataFlavor > SAL_CALL getTransferDataFlavors() throw(::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL isDataFlavorSupported( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) throw(::com::sun::star::uno::RuntimeException); + ++ // Transferable2 ++ virtual css::uno::Any SAL_CALL getTransferData2( ++ const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) ++ throw (css::datatransfer::UnsupportedFlavorException, css::io::IOException, css::uno::RuntimeException); ++ + // XEventListener + virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw(::com::sun::star::uno::RuntimeException); + +@@ -236,7 +241,7 @@ protected: + protected: + + virtual void AddSupportedFormats() = 0; +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) = 0; ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) = 0; + virtual sal_Bool WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); + virtual void DragFinished( sal_Int8 nDropAction ); + virtual void ObjectReleased(); +@@ -312,8 +317,8 @@ public: + + public: + +- ::com::sun::star::uno::Any GetAny( SotFormatStringId nFormat ) const; +- ::com::sun::star::uno::Any GetAny( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) const; ++ css::uno::Any GetAny( SotFormatStringId nFormat, const OUString& rDestDoc ) const; ++ css::uno::Any GetAny( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) const; + + sal_Bool GetString( SotFormatStringId nFormat, OUString& rStr ); + sal_Bool GetString( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, OUString& rStr ); +@@ -342,16 +347,16 @@ public: + sal_Bool GetFileList( SotFormatStringId nFormat, FileList& rFileList ); + sal_Bool GetFileList( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, FileList& rFileList ); + +- sal_Bool GetSequence( SotFormatStringId nFormat, ::com::sun::star::uno::Sequence< sal_Int8 >& rSeq ); +- sal_Bool GetSequence( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, ::com::sun::star::uno::Sequence< sal_Int8 >& rSeq ); ++ css::uno::Sequence GetSequence( SotFormatStringId nFormat, const OUString& rDestDoc ); ++ css::uno::Sequence GetSequence( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + +- sal_Bool GetSotStorageStream( SotFormatStringId nFormat, SotStorageStreamRef& rStreamRef ); +- sal_Bool GetSotStorageStream( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, SotStorageStreamRef& rStreamRef ); ++ bool GetSotStorageStream( SotFormatStringId nFormat, SotStorageStreamRef& rStreamRef ); ++ bool GetSotStorageStream( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, SotStorageStreamRef& rStreamRef ); + +- sal_Bool GetInputStream( SotFormatStringId nFormat, ::com::sun::star::uno::Reference < com::sun::star::io::XInputStream >& xStream ); +- sal_Bool GetInputStream( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, ::com::sun::star::uno::Reference < com::sun::star::io::XInputStream >& xStream ); ++ css::uno::Reference GetInputStream( SotFormatStringId nFormat, const OUString& rDestDoc ); ++ css::uno::Reference GetInputStream( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + +- sal_Bool GetInterface( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rIf ); ++ bool GetInterface( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rIf ); + + public: + +@@ -485,7 +490,7 @@ class SVT_DLLPUBLIC TransferDataContainer : public TransferableHelper + protected: + + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual void DragFinished( sal_Int8 nDropAction ); + + public: +diff --git a/include/svx/dbaexchange.hxx b/include/svx/dbaexchange.hxx +index e6fef35..1761df1 100644 +--- a/include/svx/dbaexchange.hxx ++++ b/include/svx/dbaexchange.hxx +@@ -148,7 +148,7 @@ namespace svx + protected: + // TransferableHelper overridables + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + + static sal_uInt32 getDescriptorFormatId(); + +@@ -226,7 +226,7 @@ namespace svx + + protected: + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual void ObjectReleased(); + + protected: +@@ -276,7 +276,7 @@ namespace svx + + protected: + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual void ObjectReleased(); + static sal_uInt32 getDescriptorFormatId(); + }; +diff --git a/include/svx/dbaobjectex.hxx b/include/svx/dbaobjectex.hxx +index 429477e..efd6c0e 100644 +--- a/include/svx/dbaobjectex.hxx ++++ b/include/svx/dbaobjectex.hxx +@@ -64,7 +64,7 @@ namespace svx + protected: + // TransferableHelper overridables + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + + static sal_uInt32 getDescriptorFormatId(sal_Bool _bExtractForm); + }; +diff --git a/include/svx/fmview.hxx b/include/svx/fmview.hxx +index af984ad..6c5c523 100644 +--- a/include/svx/fmview.hxx ++++ b/include/svx/fmview.hxx +@@ -108,8 +108,6 @@ public: + + // for copying complete form structures, not only control models + virtual SdrModel* GetMarkedObjModel() const; +- using E3dView::Paste; +- virtual sal_Bool Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLst=NULL, sal_uInt32 nOptions=0); + + virtual sal_Bool MouseButtonDown( const MouseEvent& _rMEvt, Window* _pWin ); + +diff --git a/include/svx/galmisc.hxx b/include/svx/galmisc.hxx +index 7045a51..af7ae18 100644 +--- a/include/svx/galmisc.hxx ++++ b/include/svx/galmisc.hxx +@@ -174,7 +174,7 @@ protected: + + // TransferableHelper + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual sal_Bool WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); + virtual void DragFinished( sal_Int8 nDropAction ); + virtual void ObjectReleased(); +diff --git a/include/svx/svdobj.hxx b/include/svx/svdobj.hxx +index f1b3dbb..25b83b6 100644 +--- a/include/svx/svdobj.hxx ++++ b/include/svx/svdobj.hxx +@@ -599,9 +599,10 @@ public: + Note that this function uses operator= internally. + */ + virtual SdrObject* Clone() const; +- /** +- Implemented mainly for the purposes of Clone(). +- */ ++ ++ virtual SdrObject* CloneWithShellIDs( const OUString& rSrcShellID, const OUString& rDestShellID ) const; ++ ++ // implemented mainly for the purposes of Clone() + SdrObject& operator=(const SdrObject& rObj); + + // TakeObjName...() ist fuer die Anzeige in der UI, z.B. "3 Rahmen selektiert". +diff --git a/include/svx/svdoole2.hxx b/include/svx/svdoole2.hxx +index 0f1df14..149dc61 100644 +--- a/include/svx/svdoole2.hxx ++++ b/include/svx/svdoole2.hxx +@@ -145,6 +145,9 @@ public: + virtual OUString TakeObjNamePlural() const; + + SdrOle2Obj* Clone() const; ++ virtual SdrOle2Obj* CloneWithShellIDs( const OUString& rSrcShellID, const OUString& rDestShellID ) const; ++ ++ SdrOle2Obj& assignFrom( const SdrOle2Obj& rObj, const OUString& rSrcShellID, const OUString& rDestShellID ); + SdrOle2Obj& operator=(const SdrOle2Obj& rObj); + + virtual void NbcMove(const Size& rSize); +diff --git a/include/svx/svdxcgv.hxx b/include/svx/svdxcgv.hxx +index 010df2e..3043f0f 100644 +--- a/include/svx/svdxcgv.hxx ++++ b/include/svx/svdxcgv.hxx +@@ -103,7 +103,10 @@ public: + // View angezeigt wird. + // Gueltige Werte fuer nOptions sind SDRINSERT_DONTMARK und + // SDRINSERT_ADDMARK (siehe svdedtv.hxx). +- virtual sal_Bool Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLst=NULL, sal_uInt32 nOptions=0); ++ virtual sal_Bool Paste( ++ const SdrModel& rMod, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions, ++ const OUString& rSrcShellID, const OUString& rDestShellID ); ++ + sal_Bool Paste(const OUString& rStr, const Point& rPos, SdrObjList* pLst=NULL, sal_uInt32 nOptions=0); + sal_Bool Paste(SvStream& rInput, const OUString& rBaseURL, sal_uInt16 eFormat, const Point& rPos, SdrObjList* pLst=NULL, sal_uInt32 nOptions=0); + +diff --git a/include/svx/view3d.hxx b/include/svx/view3d.hxx +index 943cdb3..dfda739 100644 +--- a/include/svx/view3d.hxx ++++ b/include/svx/view3d.hxx +@@ -98,7 +98,9 @@ public: + + // On Paste: We need to insert the objects of the Scene, but not the Scene itself + using SdrView::Paste; +- virtual sal_Bool Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLst=NULL, sal_uInt32 nOptions=0); ++ virtual sal_Bool Paste( ++ const SdrModel& rMod, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions, ++ const OUString& rSrcShellID, const OUString& rDestShellID ); + + // #83403# Service routine used from local Clone() and from SdrCreateView::EndCreateObj(...) + bool ImpCloneAll3DObjectsToDestScene(E3dScene* pSrcScene, E3dScene* pDstScene, Point aOffset); +diff --git a/include/svx/xmlexchg.hxx b/include/svx/xmlexchg.hxx +index 64de636..d1ce6d3 100644 +--- a/include/svx/xmlexchg.hxx ++++ b/include/svx/xmlexchg.hxx +@@ -69,7 +69,7 @@ namespace svx + + // TransferableHelper overridables + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + + OXFormsDescriptor m_aDescriptor; + +diff --git a/include/xmloff/SchXMLExportHelper.hxx b/include/xmloff/SchXMLExportHelper.hxx +index d46663f..af866be 100644 +--- a/include/xmloff/SchXMLExportHelper.hxx ++++ b/include/xmloff/SchXMLExportHelper.hxx +@@ -52,6 +52,9 @@ public: + /// returns the string corresponding to the current FileFormat CLSID for Chart + const OUString& getChartCLSID(); + ++ void SetSourceShellID( const OUString& rShellID ); ++ void SetDestinationShellID( const OUString& rShellID ); ++ + private: + SchXMLExportHelper(); // not defined + SchXMLExportHelper(SchXMLExportHelper &); // not defined +diff --git a/include/xmloff/xmlexp.hxx b/include/xmloff/xmlexp.hxx +index 7ef8f3f..3612a7a 100644 +--- a/include/xmloff/xmlexp.hxx ++++ b/include/xmloff/xmlexp.hxx +@@ -212,6 +212,9 @@ protected: + + void SetExtended( sal_Bool bSet=sal_True ) { mbExtended = bSet; } + ++ OUString GetSourceShellID() const; ++ OUString GetDestinationShellID() const; ++ + // save linked sections? (may be false in global documents) + sal_Bool mbSaveLinkedSections; + +diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk +index d42a0e7..3c1d92e 100755 +--- a/offapi/UnoApi_offapi.mk ++++ b/offapi/UnoApi_offapi.mk +@@ -2100,6 +2100,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/datatransfer,\ + XSystemTransferable \ + XTransferDataAccess \ + XTransferable \ ++ XTransferable2 \ + XTransferableEx \ + XTransferableSource \ + XTransferableSupplier \ +diff --git a/offapi/com/sun/star/datatransfer/XTransferable2.idl b/offapi/com/sun/star/datatransfer/XTransferable2.idl +new file mode 100644 +index 0000000..5ff7d58 +--- /dev/null ++++ b/offapi/com/sun/star/datatransfer/XTransferable2.idl +@@ -0,0 +1,41 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ */ ++ ++#ifndef __com_sun_star_datatransfer_XTransferable2_idl__ ++#define __com_sun_star_datatransfer_XTransferable2_idl__ ++ ++#include ++ ++module com { module sun { module star { module datatransfer { ++ ++interface XTransferable2 : com::sun::star::datatransfer::XTransferable ++{ ++ /** This is equivalent of getTransferData of XTransferable, but takes an ++ additional parameter that specifies the destination document type. ++ ++ @param aFlavor requested data format ++ @param aDestShellID destination document shell ID. The ID of each ++ individual shell must be unique. ++ ++ @returns data in specified data format. ++ ++ @throws com::sun::star::io::IOException ++ if the data is no longer available in the requested flavor. ++ ++ @throws com::sun::star::datatransfer::UnsupportedFlavorException ++ if the requested DataFlavor is not supported. ++ */ ++ any getTransferData2( [in] DataFlavor aFlavor, [in] string aDestShellID ) ++ raises ( UnsupportedFlavorException, com::sun::star::io::IOException ); ++}; ++ ++}; }; }; }; ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ ++ +diff --git a/reportdesign/source/ui/dlg/GroupExchange.cxx b/reportdesign/source/ui/dlg/GroupExchange.cxx +index 06753d8..2e13979 100644 +--- a/reportdesign/source/ui/dlg/GroupExchange.cxx ++++ b/reportdesign/source/ui/dlg/GroupExchange.cxx +@@ -48,8 +48,8 @@ namespace rptui + AddFormat(OGroupExchange::getReportGroupId()); + } + } +- // ----------------------------------------------------------------------------- +- sal_Bool OGroupExchange::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) ++ ++ sal_Bool OGroupExchange::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& /*rDestDoc*/ ) + { + sal_uLong nFormat = SotExchange::GetFormat(rFlavor); + if(nFormat == OGroupExchange::getReportGroupId() ) +diff --git a/reportdesign/source/ui/dlg/GroupExchange.hxx b/reportdesign/source/ui/dlg/GroupExchange.hxx +index 01eb437..f45ce99 100644 +--- a/reportdesign/source/ui/dlg/GroupExchange.hxx ++++ b/reportdesign/source/ui/dlg/GroupExchange.hxx +@@ -37,7 +37,7 @@ namespace rptui + static sal_uInt32 getReportGroupId(); + protected: + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual void ObjectReleased(); + }; + } +diff --git a/reportdesign/source/ui/dlg/GroupsSorting.cxx b/reportdesign/source/ui/dlg/GroupsSorting.cxx +index 0bfdd46..09b5e3c 100644 +--- a/reportdesign/source/ui/dlg/GroupsSorting.cxx ++++ b/reportdesign/source/ui/dlg/GroupsSorting.cxx +@@ -278,7 +278,7 @@ sal_Int8 OFieldExpressionControl::ExecuteDrop( const BrowserExecuteDropEvent& rE + SetNoSelection(); + + TransferableDataHelper aDropped( rEvt.maDropEvent.Transferable ); +- uno::Any aDrop = aDropped.GetAny(OGroupExchange::getReportGroupId()); ++ uno::Any aDrop = aDropped.GetAny(OGroupExchange::getReportGroupId(), OUString()); + uno::Sequence< uno::Any > aGroups; + aDrop >>= aGroups; + if ( aGroups.getLength() ) +@@ -881,7 +881,7 @@ void OFieldExpressionControl::InsertRows( long nRow ) + SotExchange::GetFormatDataFlavor(OGroupExchange::getReportGroupId(), aFlavor); + uno::Sequence< uno::Any > aGroups; + +- if( (aTransferData.GetAny(aFlavor) >>= aGroups) && aGroups.getLength() ) ++ if ((aTransferData.GetAny(aFlavor, OUString()) >>= aGroups) && aGroups.getLength()) + { + m_bIgnoreEvent = false; + { +diff --git a/reportdesign/source/ui/inc/dlgedclip.hxx b/reportdesign/source/ui/inc/dlgedclip.hxx +index 52b7f8d..5ea8eb5 100644 +--- a/reportdesign/source/ui/inc/dlgedclip.hxx ++++ b/reportdesign/source/ui/inc/dlgedclip.hxx +@@ -70,7 +70,7 @@ public: + protected: + // TransferableHelper overridables + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + private: + TSectionElements m_aCopyElements; + }; +diff --git a/reportdesign/source/ui/report/dlgedclip.cxx b/reportdesign/source/ui/report/dlgedclip.cxx +index 48b334e..5bcebc9 100644 +--- a/reportdesign/source/ui/report/dlgedclip.cxx ++++ b/reportdesign/source/ui/report/dlgedclip.cxx +@@ -51,15 +51,15 @@ void OReportExchange::AddSupportedFormats() + { + AddFormat(getDescriptorFormatId()); + } +-//-------------------------------------------------------------------- +-sal_Bool OReportExchange::GetData( const datatransfer::DataFlavor& _rFlavor ) ++ ++sal_Bool OReportExchange::GetData( const datatransfer::DataFlavor& _rFlavor, const OUString& /*rDestDoc*/ ) + { + const sal_uInt32 nFormatId = SotExchange::GetFormat(_rFlavor); + return (nFormatId == getDescriptorFormatId()) ? + SetAny( uno::Any(m_aCopyElements), _rFlavor ) + : sal_False; + } +-// ----------------------------------------------------------------------------- ++ + sal_Bool OReportExchange::canExtract(const DataFlavorExVector& _rFlavor) + { + return IsFormatSupported(_rFlavor,getDescriptorFormatId()); +@@ -78,7 +78,7 @@ OReportExchange::TSectionElements OReportExchange::extractCopies(const Transfera + SotExchange::GetFormatDataFlavor(nKnownFormatId, aFlavor); + OSL_ENSURE(bSuccess, "OReportExchange::extractCopies: invalid data format (no flavor)!"); + +- uno::Any aDescriptor = _rData.GetAny(aFlavor); ++ uno::Any aDescriptor = _rData.GetAny(aFlavor, OUString()); + + TSectionElements aCopies; + #if OSL_DEBUG_LEVEL > 0 +diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx +index bfc7a54..1cac044 100644 +--- a/sc/inc/column.hxx ++++ b/sc/inc/column.hxx +@@ -27,6 +27,7 @@ + #include "types.hxx" + #include "mtvelements.hxx" + #include "formula/types.hxx" ++#include + + #include + #include +@@ -226,7 +227,10 @@ public: + SCROW nStartRow, SCROW nEndRow, sal_uInt16 nDelFlag, bool bBroadcast = true ); + void CopyToClip( + sc::CopyToClipContext& rCxt, SCROW nRow1, SCROW nRow2, ScColumn& rColumn ) const; +- void CopyStaticToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol); ++ ++ void CopyStaticToDocument( ++ SCROW nRow1, SCROW nRow2, const SvNumberFormatterMergeMap& rMap, ScColumn& rDestCol ); ++ + void CopyCellToDocument( SCROW nSrcRow, SCROW nDestRow, ScColumn& rDestCol ); + bool InitBlockPosition( sc::ColumnBlockPosition& rBlockPos ); + bool InitBlockPosition( sc::ColumnBlockConstPosition& rBlockPos ) const; +diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx +index 339bbb0..a2aea94 100644 +--- a/sc/inc/document.hxx ++++ b/sc/inc/document.hxx +@@ -39,6 +39,7 @@ + #include "calcmacros.hxx" + #include + #include ++#include + + #include + #include +diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx +index ba7745d..fe8adb6 100644 +--- a/sc/inc/table.hxx ++++ b/sc/inc/table.hxx +@@ -412,7 +412,11 @@ public: + void DeleteArea(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, sal_uInt16 nDelFlag); + void CopyToClip( sc::CopyToClipContext& rCxt, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScTable* pTable ); + void CopyToClip( sc::CopyToClipContext& rCxt, const ScRangeList& rRanges, ScTable* pTable ); +- void CopyStaticToDocument(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScTable* pDestTab); ++ ++ void CopyStaticToDocument( ++ SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, const SvNumberFormatterMergeMap& rMap, ++ ScTable* pDestTab ); ++ + void CopyCellToDocument( SCCOL nSrcCol, SCROW nSrcRow, SCCOL nDestCol, SCROW nDestRow, ScTable& rDestTab ); + + bool InitColumnBlockPosition( sc::ColumnBlockPosition& rBlockPos, SCCOL nCol ); +diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx +index 5e5cf43..2d0a018 100644 +--- a/sc/source/core/data/column.cxx ++++ b/sc/source/core/data/column.cxx +@@ -1061,7 +1061,8 @@ void ScColumn::CopyToClip( + rColumn.CellStorageModified(); + } + +-void ScColumn::CopyStaticToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol) ++void ScColumn::CopyStaticToDocument( ++ SCROW nRow1, SCROW nRow2, const SvNumberFormatterMergeMap& rMap, ScColumn& rDestCol ) + { + if (nRow1 > nRow2) + return; +@@ -1170,6 +1171,17 @@ void ScColumn::CopyStaticToDocument(SCROW nRow1, SCROW nRow2, ScColumn& rDestCol + break; + } + ++ // Dont' forget to copy the number formats over. Charts may reference them. ++ for (SCROW nRow = nRow1; nRow <= nRow2; ++nRow) ++ { ++ sal_uInt32 nNumFmt = GetNumberFormat(nRow); ++ SvNumberFormatterMergeMap::const_iterator itNum = rMap.find(nNumFmt); ++ if (itNum != rMap.end()) ++ nNumFmt = itNum->second; ++ ++ rDestCol.SetNumberFormat(nRow, nNumFmt); ++ } ++ + rDestCol.CellStorageModified(); + } + +diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx +index 2ec7d68..b739df7 100644 +--- a/sc/source/core/data/document.cxx ++++ b/sc/source/core/data/document.cxx +@@ -2148,8 +2148,12 @@ void ScDocument::CopyStaticToDocument(const ScRange& rSrcRange, SCTAB nDestTab, + if (!pSrcTab || !pDestTab) + return; + ++ pDestDoc->GetFormatTable()->MergeFormatter(*GetFormatTable()); ++ SvNumberFormatterMergeMap aMap = pDestDoc->GetFormatTable()->ConvertMergeTableToMap(); ++ + pSrcTab->CopyStaticToDocument( +- rSrcRange.aStart.Col(), rSrcRange.aStart.Row(), rSrcRange.aEnd.Col(), rSrcRange.aEnd.Row(), pDestTab); ++ rSrcRange.aStart.Col(), rSrcRange.aStart.Row(), rSrcRange.aEnd.Col(), rSrcRange.aEnd.Row(), ++ aMap, pDestTab); + } + + void ScDocument::CopyCellToDocument( const ScAddress& rSrcPos, const ScAddress& rDestPos, ScDocument& rDestDoc ) +diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx +index b858a1c..3f0d190 100644 +--- a/sc/source/core/data/table2.cxx ++++ b/sc/source/core/data/table2.cxx +@@ -554,7 +554,8 @@ void ScTable::CopyToClip( + } + } + +-void ScTable::CopyStaticToDocument(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScTable* pDestTab) ++void ScTable::CopyStaticToDocument( ++ SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, const SvNumberFormatterMergeMap& rMap, ScTable* pDestTab ) + { + if (nCol1 > nCol2) + return; +@@ -563,7 +564,7 @@ void ScTable::CopyStaticToDocument(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW + { + ScColumn& rSrcCol = aCol[i]; + ScColumn& rDestCol = pDestTab->aCol[i]; +- rSrcCol.CopyStaticToDocument(nRow1, nRow2, rDestCol); ++ rSrcCol.CopyStaticToDocument(nRow1, nRow2, rMap, rDestCol); + } + } + +diff --git a/sc/source/ui/app/drwtrans.cxx b/sc/source/ui/app/drwtrans.cxx +index 63a81c0..9cb5a22 100644 +--- a/sc/source/ui/app/drwtrans.cxx ++++ b/sc/source/ui/app/drwtrans.cxx +@@ -95,7 +95,8 @@ ScDrawTransferObj::ScDrawTransferObj( SdrModel* pClipModel, ScDocShell* pContain + pDragSourceView( NULL ), + nDragSourceFlags( 0 ), + bDragWasInternal( false ), +- nSourceDocID( 0 ) ++ nSourceDocID( 0 ), ++ maShellID(SfxObjectShell::CreateShellID(pContainerShell)) + { + // + // check what kind of objects are contained +@@ -339,12 +340,8 @@ void ScDrawTransferObj::AddSupportedFormats() + AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ); + AddFormat( SOT_FORMAT_GDIMETAFILE ); + +- if ( !aOleData.GetTransferable().is() ) +- { +- SdrOle2Obj* pObj = GetSingleObject(); +- if ( pObj && pObj->GetObjRef().is() ) +- aOleData = TransferableDataHelper( new SvEmbedTransferHelper( pObj->GetObjRef(), pObj->GetGraphic(), pObj->GetAspect() ) ) ; +- } ++ CreateOLEData(); ++ + if ( aOleData.GetTransferable().is() ) + { + // get format list from object snapshot +@@ -376,19 +373,15 @@ void ScDrawTransferObj::AddSupportedFormats() + // AddFormat( SOT_FORMATSTR_ID_SVIM ); + } + +-sal_Bool ScDrawTransferObj::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) ++sal_Bool ScDrawTransferObj::GetData( ++ const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) + { + sal_Bool bOK = false; + sal_uInt32 nFormat = SotExchange::GetFormat( rFlavor ); + + if ( bOleObj && nFormat != SOT_FORMAT_GDIMETAFILE ) + { +- if ( !aOleData.GetTransferable().is() ) +- { +- SdrOle2Obj* pObj = GetSingleObject(); +- if ( pObj && pObj->GetObjRef().is() ) +- aOleData = TransferableDataHelper( new SvEmbedTransferHelper( pObj->GetObjRef(), pObj->GetGraphic(), pObj->GetAspect() ) ) ; +- } ++ CreateOLEData(); + + if( aOleData.GetTransferable().is() && aOleData.HasFormat( rFlavor ) ) + { +@@ -400,7 +393,7 @@ sal_Bool ScDrawTransferObj::GetData( const ::com::sun::star::datatransfer::DataF + pModel->SetSwapGraphicsMode( SDR_SWAPGRAPHICSMODE_PURGE ); + } + +- bOK = SetAny( aOleData.GetAny( rFlavor ), rFlavor ); ++ bOK = SetAny( aOleData.GetAny(rFlavor, rDestDoc), rFlavor ); + + if( pModel ) + pModel->SetSwapGraphicsMode( nOldSwapMode ); +@@ -701,6 +694,11 @@ void ScDrawTransferObj::SetDragWasInternal() + bDragWasInternal = sal_True; + } + ++OUString ScDrawTransferObj::GetShellID() const ++{ ++ return maShellID; ++} ++ + SdrOle2Obj* ScDrawTransferObj::GetSingleObject() + { + // if single OLE object was copied, get its object +@@ -719,7 +717,26 @@ SdrOle2Obj* ScDrawTransferObj::GetSingleObject() + return NULL; + } + +-// ++void ScDrawTransferObj::CreateOLEData() ++{ ++ if (aOleData.GetTransferable().is()) ++ // Already created. ++ return; ++ ++ SdrOle2Obj* pObj = GetSingleObject(); ++ if (!pObj || !pObj->GetObjRef().is()) ++ // No OLE object present. ++ return; ++ ++ SvEmbedTransferHelper* pEmbedTransfer = ++ new SvEmbedTransferHelper( ++ pObj->GetObjRef(), pObj->GetGraphic(), pObj->GetAspect()); ++ ++ pEmbedTransfer->SetParentShellID(maShellID); ++ ++ aOleData = TransferableDataHelper(pEmbedTransfer); ++} ++ + // initialize aDocShellRef with a live document from the ClipDoc + // + +@@ -740,7 +757,10 @@ void ScDrawTransferObj::InitDocShell() + // SdrExchangeView aDestView( pDestModel ); + SdrView aDestView( pDestModel ); + aDestView.ShowSdrPage(aDestView.GetModel()->GetPage(0)); +- aDestView.Paste( *pModel, Point( aSrcSize.Width()/2, aSrcSize.Height()/2 ) ); ++ aDestView.Paste( ++ *pModel, ++ Point(aSrcSize.Width()/2, aSrcSize.Height()/2), ++ NULL, 0, OUString(), OUString()); + + // put objects to right layer (see ScViewFunc::PasteDataFormat for SOT_FORMATSTR_ID_DRAWING) + +diff --git a/sc/source/ui/app/lnktrans.cxx b/sc/source/ui/app/lnktrans.cxx +index 5733b14..d830e42 100644 +--- a/sc/source/ui/app/lnktrans.cxx ++++ b/sc/source/ui/app/lnktrans.cxx +@@ -55,7 +55,8 @@ void ScLinkTransferObj::AddSupportedFormats() + } + } + +-sal_Bool ScLinkTransferObj::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) ++sal_Bool ScLinkTransferObj::GetData( ++ const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& /*rDestDoc*/ ) + { + sal_Bool bOK = false; + if ( !aLinkURL.isEmpty() ) +diff --git a/sc/source/ui/app/seltrans.cxx b/sc/source/ui/app/seltrans.cxx +index 679a21e..9bedf0c 100644 +--- a/sc/source/ui/app/seltrans.cxx ++++ b/sc/source/ui/app/seltrans.cxx +@@ -385,7 +385,8 @@ ScDrawTransferObj* ScSelectionTransferObj::GetDrawData() + return pDrawData; + } + +-sal_Bool ScSelectionTransferObj::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) ++sal_Bool ScSelectionTransferObj::GetData( ++ const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) + { + sal_Bool bOK = false; + +@@ -412,7 +413,7 @@ sal_Bool ScSelectionTransferObj::GetData( const ::com::sun::star::datatransfer:: + if ( xSource.is() ) + { + TransferableDataHelper aHelper( xSource ); +- uno::Any aAny = aHelper.GetAny( rFlavor ); ++ uno::Any aAny = aHelper.GetAny(rFlavor, rDestDoc); + bOK = SetAny( aAny, rFlavor ); + } + +diff --git a/sc/source/ui/app/transobj.cxx b/sc/source/ui/app/transobj.cxx +index ec6bb4a..ba1aec8 100644 +--- a/sc/source/ui/app/transobj.cxx ++++ b/sc/source/ui/app/transobj.cxx +@@ -246,7 +246,7 @@ void ScTransferObj::AddSupportedFormats() + AddFormat( SOT_FORMATSTR_ID_EDITENGINE ); + } + +-sal_Bool ScTransferObj::GetData( const datatransfer::DataFlavor& rFlavor ) ++sal_Bool ScTransferObj::GetData( const datatransfer::DataFlavor& rFlavor, const OUString& /*rDestDoc*/ ) + { + sal_uInt32 nFormat = SotExchange::GetFormat( rFlavor ); + bool bOK = false; +diff --git a/sc/source/ui/inc/drwtrans.hxx b/sc/source/ui/inc/drwtrans.hxx +index 81b7b90..7f4a2c6 100644 +--- a/sc/source/ui/inc/drwtrans.hxx ++++ b/sc/source/ui/inc/drwtrans.hxx +@@ -63,17 +63,20 @@ private: + + ScRangeListVector m_aProtectedChartRangesVector; + ++ OUString maShellID; + + void InitDocShell(); + SdrOle2Obj* GetSingleObject(); + ++ void CreateOLEData(); ++ + public: + ScDrawTransferObj( SdrModel* pClipModel, ScDocShell* pContainerShell, + const TransferableObjectDescriptor& rDesc ); + virtual ~ScDrawTransferObj(); + + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual sal_Bool WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, + const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); + virtual void ObjectReleased(); +@@ -87,6 +90,8 @@ public: + void SetDragSourceFlags( sal_uInt16 nFlags ); + void SetDragWasInternal(); + ++ OUString GetShellID() const; ++ + SdrView* GetDragSourceView() { return pDragSourceView; } + sal_uInt16 GetDragSourceFlags() const { return nDragSourceFlags; } + +diff --git a/sc/source/ui/inc/lnktrans.hxx b/sc/source/ui/inc/lnktrans.hxx +index d9ccdeb..1f13e8a 100644 +--- a/sc/source/ui/inc/lnktrans.hxx ++++ b/sc/source/ui/inc/lnktrans.hxx +@@ -36,7 +36,7 @@ public: + void SetLinkURL( const OUString& rURL, const OUString& rText ); + + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual void ObjectReleased(); + virtual void DragFinished( sal_Int8 nDropAction ); + }; +diff --git a/sc/source/ui/inc/seltrans.hxx b/sc/source/ui/inc/seltrans.hxx +index ba4e184..ec2b6ac 100644 +--- a/sc/source/ui/inc/seltrans.hxx ++++ b/sc/source/ui/inc/seltrans.hxx +@@ -65,7 +65,7 @@ public: + ScDrawTransferObj* GetDrawData(); + + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual void ObjectReleased(); + }; + +diff --git a/sc/source/ui/inc/transobj.hxx b/sc/source/ui/inc/transobj.hxx +index 9bd0d12..5ae33d0 100644 +--- a/sc/source/ui/inc/transobj.hxx ++++ b/sc/source/ui/inc/transobj.hxx +@@ -72,7 +72,7 @@ public: + virtual ~ScTransferObj(); + + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual sal_Bool WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, + const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); + virtual void ObjectReleased(); +diff --git a/sc/source/ui/inc/viewfunc.hxx b/sc/source/ui/inc/viewfunc.hxx +index 0e28bb5..c598884 100644 +--- a/sc/source/ui/inc/viewfunc.hxx ++++ b/sc/source/ui/inc/viewfunc.hxx +@@ -115,8 +115,8 @@ public: + ::com::sun::star::datatransfer::XTransferable >& rxTransferable ); + + void PasteDraw(); +- void PasteDraw( const Point& rLogicPos, SdrModel* pModel, +- sal_Bool bGroup = false, sal_Bool bSameDocClipboard = false ); ++ void PasteDraw( const Point& rLogicPos, SdrModel* pModel, bool bGroup, ++ const OUString& rSrcShellID, const OUString& rDestShellID ); + + sal_Bool PasteOnDrawObject( const ::com::sun::star::uno::Reference< + ::com::sun::star::datatransfer::XTransferable >& rxTransferable, +diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx +index 1fa83c5..cd38c6d 100644 +--- a/sc/source/ui/view/gridwin.cxx ++++ b/sc/source/ui/view/gridwin.cxx +@@ -4412,7 +4412,8 @@ sal_Int8 ScGridWindow::ExecuteDrop( const ExecuteDropEvent& rEvt ) + + bPasteIsMove = bIsMove; + +- pViewData->GetView()->PasteDraw( aLogicPos, rData.pDrawTransfer->GetModel() ); ++ pViewData->GetView()->PasteDraw( ++ aLogicPos, rData.pDrawTransfer->GetModel(), false, "A", "B"); + + if (bPasteIsMove) + rData.pDrawTransfer->SetDragWasInternal(); +@@ -4517,8 +4518,9 @@ void ScGridWindow::PasteSelection( const Point& rPosPixel ) + + // bSameDocClipboard argument for PasteDraw is needed + // because only DragData is checked directly inside PasteDraw +- pViewData->GetView()->PasteDraw( aLogicPos, pDrawTransfer->GetModel(), false, +- pDrawTransfer->GetSourceDocID() == pViewData->GetDocument()->GetDocumentID() ); ++ pViewData->GetView()->PasteDraw( ++ aLogicPos, pDrawTransfer->GetModel(), false, ++ pDrawTransfer->GetShellID(), SfxObjectShell::CreateShellID(pViewData->GetDocShell())); + } + } + } +diff --git a/sc/source/ui/view/viewfun3.cxx b/sc/source/ui/view/viewfun3.cxx +index f8454d3..5cb568d 100644 +--- a/sc/source/ui/view/viewfun3.cxx ++++ b/sc/source/ui/view/viewfun3.cxx +@@ -449,8 +449,11 @@ void ScViewFunc::PasteDraw() + pViewData->GetActivePart() ) ); + ScDrawTransferObj* pDrawClip = ScDrawTransferObj::GetOwnClipboard( pWin ); + if (pDrawClip) +- PasteDraw( aPos, pDrawClip->GetModel(), false, +- pDrawClip->GetSourceDocID() == pViewData->GetDocument()->GetDocumentID() ); ++ { ++ OUString aSrcShellID = pDrawClip->GetShellID(); ++ OUString aDestShellID = SfxObjectShell::CreateShellID(pViewData->GetDocShell()); ++ PasteDraw(aPos, pDrawClip->GetModel(), false, aSrcShellID, aDestShellID); ++ } + } + + void ScViewFunc::PasteFromSystem() +@@ -586,7 +589,9 @@ void ScViewFunc::PasteFromTransferable( const uno::ReferenceGetCurY(); + Window* pWin = GetActiveWin(); + Point aPos = pWin->PixelToLogic( pViewData->GetScrPos( nPosX, nPosY, pViewData->GetActivePart() ) ); +- PasteDraw( aPos, pDrawClip->GetModel(), false, pDrawClip->GetSourceDocID() == pViewData->GetDocument()->GetDocumentID() ); ++ PasteDraw( ++ aPos, pDrawClip->GetModel(), false, ++ pDrawClip->GetShellID(), SfxObjectShell::CreateShellID(pViewData->GetDocShell())); + } + else + { +diff --git a/sc/source/ui/view/viewfun5.cxx b/sc/source/ui/view/viewfun5.cxx +index 9319bd6..d5c3298 100644 +--- a/sc/source/ui/view/viewfun5.cxx ++++ b/sc/source/ui/view/viewfun5.cxx +@@ -120,8 +120,10 @@ sal_Bool ScViewFunc::PasteDataFormat( sal_uLong nFormatId, + uno::Reference < io::XInputStream > xStm; + TransferableObjectDescriptor aObjDesc; + +- if( aDataHelper.GetTransferableObjectDescriptor( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aObjDesc ) && +- aDataHelper.GetInputStream( nFormatId, xStm ) ) ++ if (aDataHelper.GetTransferableObjectDescriptor(SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aObjDesc)) ++ xStm = aDataHelper.GetInputStream(nFormatId, OUString()); ++ ++ if (xStm.is()) + { + if ( aObjDesc.maClassName == SvGlobalName( SO3_SC_CLASSID_60 ) ) + { +@@ -205,9 +207,11 @@ sal_Bool ScViewFunc::PasteDataFormat( sal_uLong nFormatId, + { + OUString aName; + uno::Reference < embed::XEmbeddedObject > xObj; ++ xStm = aDataHelper.GetInputStream(SOT_FORMATSTR_ID_EMBED_SOURCE_OLE, OUString()); ++ if (!xStm.is()) ++ aDataHelper.GetInputStream(SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE, OUString()); + +- if ( aDataHelper.GetInputStream( SOT_FORMATSTR_ID_EMBED_SOURCE_OLE, xStm ) +- || aDataHelper.GetInputStream( SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE, xStm ) ) ++ if (xStm.is()) + { + xObj = GetViewData()->GetDocShell()->GetEmbeddedObjectContainer().InsertEmbeddedObject( xStm, aName ); + } +@@ -515,7 +519,7 @@ sal_Bool ScViewFunc::PasteDataFormat( sal_uLong nFormatId, + nObjCount += pPage->GetObjCount(); // count group object only once + } + +- PasteDraw( aPos, pModel, (nObjCount > 1) ); // grouped if more than 1 object ++ PasteDraw(aPos, pModel, (nObjCount > 1), "A", "B"); // grouped if more than 1 object + delete pModel; + aDragShellRef->DoClose(); + bRet = sal_True; +@@ -525,8 +529,8 @@ sal_Bool ScViewFunc::PasteDataFormat( sal_uLong nFormatId, + { + // do excel import into a clipboard document + //TODO/MBA: testing +- uno::Reference < io::XInputStream > xStm; +- if( aDataHelper.GetInputStream( nFormatId, xStm ) ) ++ uno::Reference xStm = aDataHelper.GetInputStream(nFormatId, OUString()); ++ if (xStm.is()) + { + ScDocument* pInsDoc = new ScDocument( SCDOCMODE_CLIP ); + SCTAB nSrcTab = 0; // Biff5 in clipboard: always sheet 0 +@@ -626,8 +630,8 @@ bool ScViewFunc::PasteLink( const uno::Reference& r + // get link data from transferable before string data, + // so the source knows it will be used for a link + +- uno::Sequence aSequence; +- if ( !aDataHelper.GetSequence( SOT_FORMATSTR_ID_LINK, aSequence ) ) ++ uno::Sequence aSequence = aDataHelper.GetSequence(SOT_FORMATSTR_ID_LINK, OUString()); ++ if (!aSequence.getLength()) + { + OSL_FAIL("DDE Data not found."); + return false; +diff --git a/sc/source/ui/view/viewfun7.cxx b/sc/source/ui/view/viewfun7.cxx +index 1904bce..7506f02 100644 +--- a/sc/source/ui/view/viewfun7.cxx ++++ b/sc/source/ui/view/viewfun7.cxx +@@ -73,8 +73,10 @@ static void lcl_AdjustInsertPos( ScViewData* pData, Point& rPos, Size& rSize ) + } + + void ScViewFunc::PasteDraw( const Point& rLogicPos, SdrModel* pModel, +- sal_Bool bGroup, sal_Bool bSameDocClipboard ) ++ bool bGroup, const OUString& rSrcShellID, const OUString& rDestShellID ) + { ++ bool bSameDocClipboard = rSrcShellID == rDestShellID; ++ + MakeDrawLayer(); + Point aPos( rLogicPos ); + +@@ -219,7 +221,7 @@ void ScViewFunc::PasteDraw( const Point& rLogicPos, SdrModel* pModel, + if ( !bSameDocClipboard ) + GetViewData()->GetDocument()->SetPastingDrawFromOtherDoc( sal_True ); + +- pScDrawView->Paste( *pModel, aPos, NULL, nOptions ); ++ pScDrawView->Paste(*pModel, aPos, NULL, nOptions, rSrcShellID, rDestShellID); + + if ( !bSameDocClipboard ) + GetViewData()->GetDocument()->SetPastingDrawFromOtherDoc( false ); +diff --git a/sd/source/core/drawdoc3.cxx b/sd/source/core/drawdoc3.cxx +index 2dcf5fa..2a24f4e 100644 +--- a/sd/source/core/drawdoc3.cxx ++++ b/sd/source/core/drawdoc3.cxx +@@ -1049,7 +1049,7 @@ sal_Bool SdDrawDocument::InsertBookmarkAsObject( + pBMView->GetDoc().SetAllocDocSh(true); + + SdDrawDocument* pTmpDoc = (SdDrawDocument*) pBMView->GetMarkedObjModel(); +- bOK = pView->Paste(*pTmpDoc, aObjPos, pPage); ++ bOK = pView->Paste(*pTmpDoc, aObjPos, pPage, 0, OUString(), OUString()); + + if (bOLEObjFound) + pBMView->GetDoc().SetAllocDocSh(false); +diff --git a/sd/source/ui/app/sdxfer.cxx b/sd/source/ui/app/sdxfer.cxx +index d618df4..bd538b0 100644 +--- a/sd/source/ui/app/sdxfer.cxx ++++ b/sd/source/ui/app/sdxfer.cxx +@@ -439,7 +439,7 @@ void SdTransferable::AddSupportedFormats() + } + } + +-sal_Bool SdTransferable::GetData( const DataFlavor& rFlavor ) ++sal_Bool SdTransferable::GetData( const DataFlavor& rFlavor, const OUString& rDestDoc ) + { + if (SD_MOD()==NULL) + return sal_False; +@@ -467,7 +467,7 @@ sal_Bool SdTransferable::GetData( const DataFlavor& rFlavor ) + if( nFormat == FORMAT_GDIMETAFILE && mpGraphic ) + bOK = SetGDIMetaFile( mpGraphic->GetGDIMetaFile(), rFlavor ); + else +- bOK = SetAny( mpOLEDataHelper->GetAny( rFlavor ), rFlavor ); ++ bOK = SetAny( mpOLEDataHelper->GetAny(rFlavor, rDestDoc), rFlavor ); + + if( mpSdDrawDocumentIntern ) + mpSdDrawDocumentIntern->SetSwapGraphicsMode( nOldSwapMode ); +diff --git a/sd/source/ui/dlg/sdtreelb.cxx b/sd/source/ui/dlg/sdtreelb.cxx +index 311d178..641da0a 100644 +--- a/sd/source/ui/dlg/sdtreelb.cxx ++++ b/sd/source/ui/dlg/sdtreelb.cxx +@@ -124,7 +124,8 @@ void SdPageObjsTLB::SdPageObjsTransferable::AddSupportedFormats() + + // ----------------------------------------------------------------------------- + +-sal_Bool SdPageObjsTLB::SdPageObjsTransferable::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) ++sal_Bool SdPageObjsTLB::SdPageObjsTransferable::GetData( ++ const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& /*rDestDoc*/ ) + { + sal_uLong nFormatId = SotExchange::GetFormat( rFlavor ); + switch (nFormatId) +diff --git a/sd/source/ui/inc/TabControl.hxx b/sd/source/ui/inc/TabControl.hxx +index 4f45c09..1fa16bc 100644 +--- a/sd/source/ui/inc/TabControl.hxx ++++ b/sd/source/ui/inc/TabControl.hxx +@@ -93,7 +93,7 @@ private: + virtual ~TabControlTransferable(); + + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual void DragFinished( sal_Int8 nDropAction ); + + }; +diff --git a/sd/source/ui/inc/View.hxx b/sd/source/ui/inc/View.hxx +index 239b8fa..3b2c99a 100644 +--- a/sd/source/ui/inc/View.hxx ++++ b/sd/source/ui/inc/View.hxx +@@ -172,7 +172,9 @@ public: + virtual void onAccessibilityOptionsChanged(); + + virtual SdrModel* GetMarkedObjModel() const; +- virtual sal_Bool Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLst=NULL, sal_uInt32 nOptions=0); ++ virtual sal_Bool Paste( ++ const SdrModel& rMod, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions, ++ const OUString& rSrcShellID, const OUString& rDestShellID ); + using SdrExchangeView::Paste; + + /** returns true if we have an undo manager and there is an open list undo action */ +diff --git a/sd/source/ui/inc/sdtreelb.hxx b/sd/source/ui/inc/sdtreelb.hxx +index 252a403..4b1fb6f 100644 +--- a/sd/source/ui/inc/sdtreelb.hxx ++++ b/sd/source/ui/inc/sdtreelb.hxx +@@ -97,7 +97,7 @@ public: + SAL_DLLPRIVATE virtual ~SdPageObjsTransferable(); + + SAL_DLLPRIVATE virtual void AddSupportedFormats(); +- SAL_DLLPRIVATE virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ SAL_DLLPRIVATE virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + SAL_DLLPRIVATE virtual void DragFinished( sal_Int8 nDropAction ); + + SAL_DLLPRIVATE virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& rId ) throw( ::com::sun::star::uno::RuntimeException ); +diff --git a/sd/source/ui/inc/sdxfer.hxx b/sd/source/ui/inc/sdxfer.hxx +index 40c624e1..299f876 100644 +--- a/sd/source/ui/inc/sdxfer.hxx ++++ b/sd/source/ui/inc/sdxfer.hxx +@@ -109,7 +109,7 @@ public: + protected: + + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual sal_Bool WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); + virtual void ObjectReleased(); + +diff --git a/sd/source/ui/view/sdview2.cxx b/sd/source/ui/view/sdview2.cxx +index 2572576..148fa45 100644 +--- a/sd/source/ui/view/sdview2.cxx ++++ b/sd/source/ui/view/sdview2.cxx +@@ -977,9 +977,11 @@ SdrModel* View::GetMarkedObjModel() const + return FmFormView::GetMarkedObjModel();; + } + +-sal_Bool View::Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLst /* =NULL */, sal_uInt32 nOptions /* =0 */) ++sal_Bool View::Paste( ++ const SdrModel& rMod, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions, ++ const OUString& rSrcShellID, const OUString& rDestShellID ) + { +- return FmFormView::Paste( rMod, rPos, pLst,nOptions );; ++ return FmFormView::Paste(rMod, rPos, pLst, nOptions, rSrcShellID, rDestShellID); + } + + } // end of namespace sd +diff --git a/sd/source/ui/view/sdview3.cxx b/sd/source/ui/view/sdview3.cxx +index 0aecf6a..9987aa5 100644 +--- a/sd/source/ui/view/sdview3.cxx ++++ b/sd/source/ui/view/sdview3.cxx +@@ -602,7 +602,7 @@ sal_Bool View::InsertData( const TransferableDataHelper& rDataHelper, + SdDrawDocument* pSourceDoc = (SdDrawDocument*) pSourceView->GetModel(); + pSourceDoc->CreatingDataObj( pOwnData ); + SdDrawDocument* pModel = (SdDrawDocument*) pSourceView->GetMarkedObjModel(); +- bReturn = Paste( *pModel, maDropPos, pPage, nPasteOptions ); ++ bReturn = Paste(*pModel, maDropPos, pPage, nPasteOptions, OUString(), OUString()); + + if( !pPage ) + pPage = (SdPage*) GetSdrPageView()->GetPage(); +@@ -643,7 +643,7 @@ sal_Bool View::InsertData( const TransferableDataHelper& rDataHelper, + pWorkModel->DeletePage( (sal_uInt16) i ); + } + +- bReturn = Paste( *pWorkModel, maDropPos, pPage, nPasteOptions ); ++ bReturn = Paste(*pWorkModel, maDropPos, pPage, nPasteOptions, OUString(), OUString()); + + if( !pPage ) + pPage = (SdPage*) GetSdrPageView()->GetPage(); +@@ -802,7 +802,7 @@ sal_Bool View::InsertData( const TransferableDataHelper& rDataHelper, + maDropPos.Y() = pOwnData->GetStartPos().Y() + ( aSize.Height() >> 1 ); + } + +- bReturn = Paste( *pModel, maDropPos, pPage, nPasteOptions ); ++ bReturn = Paste(*pModel, maDropPos, pPage, nPasteOptions, OUString(), OUString()); + } + + xShell->DoClose(); +@@ -843,9 +843,15 @@ sal_Bool View::InsertData( const TransferableDataHelper& rDataHelper, + uno::Reference < io::XInputStream > xStm; + TransferableObjectDescriptor aObjDesc; + +- if( aDataHelper.GetTransferableObjectDescriptor( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aObjDesc ) && +- ( aDataHelper.GetInputStream( nFormat ? nFormat : SOT_FORMATSTR_ID_EMBED_SOURCE, xStm ) || +- aDataHelper.GetInputStream( SOT_FORMATSTR_ID_EMBEDDED_OBJ, xStm ) ) ) ++ if (aDataHelper.GetTransferableObjectDescriptor(SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aObjDesc)) ++ { ++ OUString aDocShellID = SfxObjectShell::CreateShellID(mrDoc.GetDocSh()); ++ xStm = aDataHelper.GetInputStream(nFormat ? nFormat : SOT_FORMATSTR_ID_EMBED_SOURCE, aDocShellID); ++ if (!xStm.is()) ++ xStm = aDataHelper.GetInputStream(SOT_FORMATSTR_ID_EMBEDDED_OBJ, aDocShellID); ++ } ++ ++ if (xStm.is()) + { + if( mrDoc.GetDocSh() && ( mrDoc.GetDocSh()->GetClassName() == aObjDesc.maClassName ) ) + { +@@ -879,7 +885,7 @@ sal_Bool View::InsertData( const TransferableDataHelper& rDataHelper, + pModel->DeletePage( (sal_uInt16) i ); + } + +- bReturn = Paste( *pModel, maDropPos, pPage, nPasteOptions ); ++ bReturn = Paste(*pModel, maDropPos, pPage, nPasteOptions, OUString(), OUString()); + + if( !pPage ) + pPage = (SdPage*) GetSdrPageView()->GetPage(); +@@ -1028,8 +1034,11 @@ sal_Bool View::InsertData( const TransferableDataHelper& rDataHelper, + uno::Reference < embed::XEmbeddedObject > xObj; + OUString aName; + +- if ( aDataHelper.GetInputStream( nFormat ? nFormat : SOT_FORMATSTR_ID_EMBED_SOURCE_OLE, xStm ) || +- aDataHelper.GetInputStream( SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE, xStm ) ) ++ xStm = aDataHelper.GetInputStream(nFormat ? nFormat : SOT_FORMATSTR_ID_EMBED_SOURCE_OLE, OUString()); ++ if (!xStm.is()) ++ xStm = aDataHelper.GetInputStream(SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE, OUString()); ++ ++ if (xStm.is()) + { + xObj = mpDocSh->GetEmbeddedObjectContainer().InsertEmbeddedObject( xStm, aName ); + } +@@ -1505,7 +1514,7 @@ bool View::PasteRTFTable( SotStorageStreamRef xStm, SdrPage* pPage, sal_uLong nP + pModel->setUnoModel( Reference< XInterface >::query( xComponent ) ); + + CreateTableFromRTF( *xStm, pModel ); +- bool bRet = Paste( *pModel, maDropPos, pPage, nPasteOptions ); ++ bool bRet = Paste(*pModel, maDropPos, pPage, nPasteOptions, OUString(), OUString()); + + xComponent->dispose(); + xComponent.clear(); +diff --git a/sd/source/ui/view/tabcontr.cxx b/sd/source/ui/view/tabcontr.cxx +index 0dec8d6..f963d33 100644 +--- a/sd/source/ui/view/tabcontr.cxx ++++ b/sd/source/ui/view/tabcontr.cxx +@@ -62,7 +62,7 @@ void TabControl::TabControlTransferable::AddSupportedFormats() + + // ----------------------------------------------------------------------------- + +-sal_Bool TabControl::TabControlTransferable::GetData( const ::com::sun::star::datatransfer::DataFlavor& ) ++sal_Bool TabControl::TabControlTransferable::GetData( const ::com::sun::star::datatransfer::DataFlavor&, const OUString& /*rDestDoc*/ ) + { + return sal_False; + } +diff --git a/sfx2/source/doc/objxtor.cxx b/sfx2/source/doc/objxtor.cxx +index befa7ae..91a20e3 100644 +--- a/sfx2/source/doc/objxtor.cxx ++++ b/sfx2/source/doc/objxtor.cxx +@@ -480,7 +480,24 @@ bool SfxObjectShell::Close() + return true; + } + +-//-------------------------------------------------------------------- ++OUString SfxObjectShell::CreateShellID( const SfxObjectShell* pShell ) ++{ ++ if (!pShell) ++ return OUString(); ++ ++ OUString aShellID; ++ ++ SfxMedium* pMedium = pShell->GetMedium(); ++ if (pMedium) ++ aShellID = pMedium->GetBaseURL(); ++ ++ if (!aShellID.isEmpty()) ++ return aShellID; ++ ++ sal_Int64 nShellID = reinterpret_cast(pShell); ++ aShellID = "0x" + OUString::number(nShellID, 16); ++ return aShellID; ++} + + // returns a pointer the first SfxDocument of specified type + +diff --git a/starmath/source/view.cxx b/starmath/source/view.cxx +index 445b0be..0bc05d1 100644 +--- a/starmath/source/view.cxx ++++ b/starmath/source/view.cxx +@@ -1607,8 +1607,10 @@ void SmViewShell::Execute(SfxRequest& rReq) + if( aData.GetTransferable().is() && + ( aData.HasFormat( nId = SOT_FORMATSTR_ID_EMBEDDED_OBJ ) || + (aData.HasFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) && +- aData.HasFormat( nId = SOT_FORMATSTR_ID_EMBED_SOURCE ))) && +- aData.GetInputStream( nId, xStrm ) && xStrm.is() ) ++ aData.HasFormat( nId = SOT_FORMATSTR_ID_EMBED_SOURCE )))) ++ xStrm = aData.GetInputStream(nId, OUString()); ++ ++ if (xStrm.is()) + { + try + { +diff --git a/svtools/source/contnr/treelistbox.cxx b/svtools/source/contnr/treelistbox.cxx +index ec29608..7729ae2 100644 +--- a/svtools/source/contnr/treelistbox.cxx ++++ b/svtools/source/contnr/treelistbox.cxx +@@ -1301,9 +1301,8 @@ sal_Int8 SvTreeListBox::ExecuteDrop( const ExecuteDropEvent& rEvt, SvTreeListBox + TransferableDataHelper aData( rEvt.maDropEvent.Transferable ); + if( aData.HasFormat( SOT_FORMATSTR_ID_TREELISTBOX )) + { +- ::com::sun::star::uno::Sequence< sal_Int8 > aSeq; +- if( aData.GetSequence( SOT_FORMATSTR_ID_TREELISTBOX, aSeq ) && +- sizeof(SvLBoxDDInfo) == aSeq.getLength() ) ++ css::uno::Sequence aSeq = aData.GetSequence(SOT_FORMATSTR_ID_TREELISTBOX, OUString()); ++ if (sizeof(SvLBoxDDInfo) == aSeq.getLength()) + { + memcpy( &aDDInfo, aSeq.getConstArray(), sizeof(SvLBoxDDInfo) ); + nRet = rEvt.mnAction; +diff --git a/svtools/source/dialogs/insdlg.cxx b/svtools/source/dialogs/insdlg.cxx +index a9e441a..4f33480 100644 +--- a/svtools/source/dialogs/insdlg.cxx ++++ b/svtools/source/dialogs/insdlg.cxx +@@ -294,7 +294,7 @@ sal_Bool SvPasteObjectHelper::GetEmbeddedName(const TransferableDataHelper& rDat + + uno::Any aAny; + if( rData.HasFormat( aFlavor ) && +- ( aAny = rData.GetAny( aFlavor ) ).hasValue() ) ++ ( aAny = rData.GetAny(aFlavor, OUString()) ).hasValue() ) + { + uno::Sequence< sal_Int8 > anySequence; + aAny >>= anySequence; +diff --git a/svtools/source/misc/embedtransfer.cxx b/svtools/source/misc/embedtransfer.cxx +index 7ccbfe5..e7a572e 100644 +--- a/svtools/source/misc/embedtransfer.cxx ++++ b/svtools/source/misc/embedtransfer.cxx +@@ -65,7 +65,10 @@ SvEmbedTransferHelper::~SvEmbedTransferHelper() + } + } + +-// ----------------------------------------------------------------------------- ++void SvEmbedTransferHelper::SetParentShellID( const OUString& rShellID ) ++{ ++ maParentShellID = rShellID; ++} + + void SvEmbedTransferHelper::AddSupportedFormats() + { +@@ -76,7 +79,8 @@ void SvEmbedTransferHelper::AddSupportedFormats() + + // ----------------------------------------------------------------------------- + +-sal_Bool SvEmbedTransferHelper::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) ++sal_Bool SvEmbedTransferHelper::GetData( ++ const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) + { + sal_Bool bRet = sal_False; + +@@ -109,7 +113,12 @@ sal_Bool SvEmbedTransferHelper::GetData( const ::com::sun::star::datatransfer::D + SvStream* pStream = NULL; + sal_Bool bDeleteStream = sal_False; + uno::Sequence < beans::PropertyValue > aEmpty; +- xPers->storeToEntry( xStg, aName, aEmpty, aEmpty ); ++ uno::Sequence aObjArgs(2); ++ aObjArgs[0].Name = "SourceShellID"; ++ aObjArgs[0].Value <<= maParentShellID; ++ aObjArgs[1].Name = "DestinationShellID"; ++ aObjArgs[1].Value <<= rDestDoc; ++ xPers->storeToEntry(xStg, aName, aEmpty, aObjArgs); + if ( xStg->isStreamElement( aName ) ) + { + uno::Reference < io::XStream > xStm = xStg->cloneStreamElement( aName ); +diff --git a/svtools/source/misc/stringtransfer.cxx b/svtools/source/misc/stringtransfer.cxx +index 579a999..687b1a9 100644 +--- a/svtools/source/misc/stringtransfer.cxx ++++ b/svtools/source/misc/stringtransfer.cxx +@@ -43,8 +43,7 @@ namespace svt + AddFormat(SOT_FORMAT_STRING); + } + +- //-------------------------------------------------------------------- +- sal_Bool OStringTransferable::GetData( const DataFlavor& _rFlavor ) ++ sal_Bool OStringTransferable::GetData( const DataFlavor& _rFlavor, const OUString& /*rDestDoc*/ ) + { + sal_uInt32 nFormat = SotExchange::GetFormat( _rFlavor ); + if (SOT_FORMAT_STRING == nFormat) +diff --git a/svtools/source/misc/transfer.cxx b/svtools/source/misc/transfer.cxx +index 73537b6..dd5e54c 100644 +--- a/svtools/source/misc/transfer.cxx ++++ b/svtools/source/misc/transfer.cxx +@@ -45,6 +45,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -338,6 +339,12 @@ TransferableHelper::~TransferableHelper() + + Any SAL_CALL TransferableHelper::getTransferData( const DataFlavor& rFlavor ) throw( UnsupportedFlavorException, IOException, RuntimeException ) + { ++ return getTransferData2(rFlavor, OUString()); ++} ++ ++Any SAL_CALL TransferableHelper::getTransferData2( const DataFlavor& rFlavor, const OUString& rDestDoc ) ++ throw (UnsupportedFlavorException, IOException, RuntimeException) ++{ + if( !maAny.hasValue() || !mpFormats->size() || ( maLastFormat != rFlavor.MimeType ) ) + { + const SolarMutexGuard aGuard; +@@ -358,21 +365,21 @@ Any SAL_CALL TransferableHelper::getTransferData( const DataFlavor& rFlavor ) th + if( SotExchange::GetFormatDataFlavor( FORMAT_STRING, aSubstFlavor ) && + TransferableDataHelper::IsEqual( aSubstFlavor, rFlavor ) ) + { +- GetData( aSubstFlavor ); ++ GetData(aSubstFlavor, rDestDoc); + bDone = maAny.hasValue(); + } + else if(SotExchange::GetFormatDataFlavor(SOT_FORMATSTR_ID_BMP, aSubstFlavor ) + && TransferableDataHelper::IsEqual( aSubstFlavor, rFlavor ) + && SotExchange::GetFormatDataFlavor(FORMAT_BITMAP, aSubstFlavor)) + { +- GetData( aSubstFlavor ); +- bDone = sal_True; ++ GetData(aSubstFlavor, rDestDoc); ++ bDone = true; + } + else if( SotExchange::GetFormatDataFlavor( SOT_FORMATSTR_ID_EMF, aSubstFlavor ) && + TransferableDataHelper::IsEqual( aSubstFlavor, rFlavor ) && + SotExchange::GetFormatDataFlavor( FORMAT_GDIMETAFILE, aSubstFlavor ) ) + { +- GetData( aSubstFlavor ); ++ GetData(aSubstFlavor, rDestDoc); + + if( maAny.hasValue() ) + { +@@ -402,7 +409,7 @@ Any SAL_CALL TransferableHelper::getTransferData( const DataFlavor& rFlavor ) th + TransferableDataHelper::IsEqual( aSubstFlavor, rFlavor ) && + SotExchange::GetFormatDataFlavor( FORMAT_GDIMETAFILE, aSubstFlavor ) ) + { +- GetData( aSubstFlavor ); ++ GetData(aSubstFlavor, rDestDoc); + + if( maAny.hasValue() ) + { +@@ -435,7 +442,7 @@ Any SAL_CALL TransferableHelper::getTransferData( const DataFlavor& rFlavor ) th + + // if any is not yet filled, use standard format + if( !maAny.hasValue() ) +- GetData( rFlavor ); ++ GetData(rFlavor, rDestDoc); + + #ifdef DEBUG + if( maAny.hasValue() && ::com::sun::star::uno::TypeClass_STRING != maAny.getValueType().getTypeClass() ) +@@ -1573,13 +1580,13 @@ Reference< XTransferable > TransferableDataHelper::GetXTransferable() const + + // ----------------------------------------------------------------------------- + +-Any TransferableDataHelper::GetAny( SotFormatStringId nFormat ) const ++Any TransferableDataHelper::GetAny( SotFormatStringId nFormat, const OUString& rDestDoc ) const + { + Any aReturn; + + DataFlavor aFlavor; + if ( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) ) +- aReturn = GetAny( aFlavor ); ++ aReturn = GetAny(aFlavor, rDestDoc); + + return aReturn; + } +@@ -1587,7 +1594,7 @@ Any TransferableDataHelper::GetAny( SotFormatStringId nFormat ) const + + // ----------------------------------------------------------------------------- + +-Any TransferableDataHelper::GetAny( const DataFlavor& rFlavor ) const ++Any TransferableDataHelper::GetAny( const DataFlavor& rFlavor, const OUString& rDestDoc ) const + { + ::osl::MutexGuard aGuard( mpImpl->maMutex ); + Any aRet; +@@ -1598,13 +1605,20 @@ Any TransferableDataHelper::GetAny( const DataFlavor& rFlavor ) const + { + const SotFormatStringId nRequestFormat = SotExchange::GetFormat( rFlavor ); + ++ Reference xTransfer2(mxTransfer, UNO_QUERY); ++ + if( nRequestFormat ) + { + // try to get alien format first + for (DataFlavorExVector::const_iterator aIter( mpFormats->begin() ), aEnd( mpFormats->end() ); aIter != aEnd ; ++aIter) + { + if( ( nRequestFormat == (*aIter).mnSotId ) && !rFlavor.MimeType.equalsIgnoreAsciiCase( (*aIter).MimeType ) ) +- aRet = mxTransfer->getTransferData( *aIter ); ++ { ++ if (xTransfer2.is()) ++ aRet = xTransfer2->getTransferData2(*aIter, rDestDoc); ++ else ++ aRet = mxTransfer->getTransferData(*aIter); ++ } + + if( aRet.hasValue() ) + break; +@@ -1612,7 +1626,12 @@ Any TransferableDataHelper::GetAny( const DataFlavor& rFlavor ) const + } + + if( !aRet.hasValue() ) +- aRet = mxTransfer->getTransferData( rFlavor ); ++ { ++ if (xTransfer2.is()) ++ aRet = xTransfer2->getTransferData2(rFlavor, rDestDoc); ++ else ++ aRet = mxTransfer->getTransferData(rFlavor); ++ } + } + } + catch( const ::com::sun::star::uno::Exception& ) +@@ -1634,8 +1653,8 @@ sal_Bool TransferableDataHelper::GetString( SotFormatStringId nFormat, OUString& + + sal_Bool TransferableDataHelper::GetString( const DataFlavor& rFlavor, OUString& rStr ) + { +- Any aAny( GetAny( rFlavor ) ); +- sal_Bool bRet = sal_False; ++ Any aAny = GetAny(rFlavor, OUString()); ++ bool bRet = false; + + if( aAny.hasValue() ) + { +@@ -2003,9 +2022,9 @@ sal_Bool TransferableDataHelper::GetINetBookmark( const ::com::sun::star::datatr + + case( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ): + { +- Sequence< sal_Int8 > aSeq; ++ Sequence aSeq = GetSequence(rFlavor, OUString()); + +- if( GetSequence( rFlavor, aSeq ) && ( 2048 == aSeq.getLength() ) ) ++ if (2048 == aSeq.getLength()) + { + const sal_Char* p1 = reinterpret_cast< const sal_Char* >( aSeq.getConstArray() ); + const sal_Char* p2 = reinterpret_cast< const sal_Char* >( aSeq.getConstArray() ) + 1024; +@@ -2019,9 +2038,9 @@ sal_Bool TransferableDataHelper::GetINetBookmark( const ::com::sun::star::datatr + #ifdef WNT + case SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR: + { +- Sequence< sal_Int8 > aSeq; ++ Sequence aSeq = GetSequence(rFlavor, OUString()); + +- if( GetSequence( rFlavor, aSeq ) && aSeq.getLength() ) ++ if (aSeq.getLength()) + { + FILEGROUPDESCRIPTOR* pFDesc = (FILEGROUPDESCRIPTOR*) aSeq.getConstArray(); + +@@ -2041,14 +2060,14 @@ sal_Bool TransferableDataHelper::GetINetBookmark( const ::com::sun::star::datatr + + aSeq.realloc( 0 ); + delete pStream; ++ pStream = NULL; + +- if( SotExchange::GetFormatDataFlavor( SOT_FORMATSTR_ID_FILECONTENT, aFileContentFlavor ) && +- GetSequence( aFileContentFlavor, aSeq ) && aSeq.getLength() ) ++ if (SotExchange::GetFormatDataFlavor(SOT_FORMATSTR_ID_FILECONTENT, aFileContentFlavor)) + { +- pStream = new SvMemoryStream( (sal_Char*) aSeq.getConstArray(), aSeq.getLength(), STREAM_STD_READ ); ++ aSeq = GetSequence(aFileContentFlavor, OUString()); ++ if (aSeq.getLength()) ++ pStream = new SvMemoryStream( (sal_Char*) aSeq.getConstArray(), aSeq.getLength(), STREAM_STD_READ ); + } +- else +- pStream = NULL; + } + + if( pStream ) +@@ -2153,70 +2172,70 @@ sal_Bool TransferableDataHelper::GetFileList( + + // ----------------------------------------------------------------------------- + +-sal_Bool TransferableDataHelper::GetSequence( SotFormatStringId nFormat, Sequence< sal_Int8 >& rSeq ) ++ ++Sequence TransferableDataHelper::GetSequence( SotFormatStringId nFormat, const OUString& rDestDoc ) + { + DataFlavor aFlavor; +- return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetSequence( aFlavor, rSeq ) ); +-} ++ if (!SotExchange::GetFormatDataFlavor(nFormat, aFlavor)) ++ return Sequence(); + +-// ----------------------------------------------------------------------------- ++ return GetSequence(aFlavor, rDestDoc); ++} + +-sal_Bool TransferableDataHelper::GetSequence( const DataFlavor& rFlavor, Sequence< sal_Int8 >& rSeq ) ++Sequence TransferableDataHelper::GetSequence( const DataFlavor& rFlavor, const OUString& rDestDoc ) + { + #ifdef DEBUG + fprintf( stderr, "TransferableDataHelper requests sequence of data\n" ); + #endif + +- const Any aAny( GetAny( rFlavor ) ); +- return( aAny.hasValue() && ( aAny >>= rSeq ) ); +-} ++ const Any aAny = GetAny(rFlavor, rDestDoc); ++ Sequence aSeq; ++ if (aAny.hasValue()) ++ aAny >>= aSeq; + +-// ----------------------------------------------------------------------------- ++ return aSeq; ++} + +-sal_Bool TransferableDataHelper::GetSotStorageStream( SotFormatStringId nFormat, SotStorageStreamRef& rxStream ) ++bool TransferableDataHelper::GetSotStorageStream( SotFormatStringId nFormat, SotStorageStreamRef& rxStream ) + { + DataFlavor aFlavor; + return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetSotStorageStream( aFlavor, rxStream ) ); + } + +-// ----------------------------------------------------------------------------- +- +-sal_Bool TransferableDataHelper::GetSotStorageStream( const DataFlavor& rFlavor, SotStorageStreamRef& rxStream ) ++bool TransferableDataHelper::GetSotStorageStream( const DataFlavor& rFlavor, SotStorageStreamRef& rxStream ) + { +- Sequence< sal_Int8 > aSeq; +- sal_Bool bRet = GetSequence( rFlavor, aSeq ); ++ Sequence aSeq = GetSequence(rFlavor, OUString()); + +- if( bRet ) ++ if (aSeq.getLength()) + { + rxStream = new SotStorageStream( "" ); + rxStream->Write( aSeq.getConstArray(), aSeq.getLength() ); + rxStream->Seek( 0 ); + } + +- return bRet; ++ return aSeq.getLength(); + } + +-sal_Bool TransferableDataHelper::GetInputStream( SotFormatStringId nFormat, Reference < XInputStream >& rxStream ) ++Reference TransferableDataHelper::GetInputStream( SotFormatStringId nFormat, const OUString& rDestDoc ) + { + DataFlavor aFlavor; +- return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetInputStream( aFlavor, rxStream ) ); +-} ++ if (!SotExchange::GetFormatDataFlavor(nFormat, aFlavor)) ++ return Reference(); + +-// ----------------------------------------------------------------------------- ++ return GetInputStream(aFlavor, rDestDoc); ++} + +-sal_Bool TransferableDataHelper::GetInputStream( const DataFlavor& rFlavor, Reference < XInputStream >& rxStream ) ++Reference TransferableDataHelper::GetInputStream( const DataFlavor& rFlavor, const OUString& rDestDoc ) + { +- Sequence< sal_Int8 > aSeq; +- sal_Bool bRet = GetSequence( rFlavor, aSeq ); ++ Sequence aSeq = GetSequence(rFlavor, rDestDoc); + +- if( bRet ) +- rxStream = new ::comphelper::SequenceInputStream( aSeq ); ++ if (!aSeq.getLength()) ++ return Reference(); + +- return bRet; ++ Reference xStream(new comphelper::SequenceInputStream(aSeq)); ++ return xStream; + } + +-// ----------------------------------------------------------------------------- +- + void TransferableDataHelper::Rebind( const Reference< XTransferable >& _rxNewContent ) + { + mxTransfer = _rxNewContent; +diff --git a/svtools/source/misc/transfer2.cxx b/svtools/source/misc/transfer2.cxx +index eb282c1..9c4cc68 100644 +--- a/svtools/source/misc/transfer2.cxx ++++ b/svtools/source/misc/transfer2.cxx +@@ -415,8 +415,8 @@ void TransferDataContainer::AddSupportedFormats() + + // ----------------------------------------------------------------------------- + +-sal_Bool TransferDataContainer::GetData( const +- ::com::sun::star::datatransfer::DataFlavor& rFlavor ) ++sal_Bool TransferDataContainer::GetData( ++ const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& /*rDestDoc*/ ) + { + TDataCntnrEntryList::iterator aIter( pImpl->aFmtList.begin() ), + aEnd( pImpl->aFmtList.end() ); +diff --git a/svx/source/engine3d/view3d.cxx b/svx/source/engine3d/view3d.cxx +index 3aee208..f0bbd32 100644 +--- a/svx/source/engine3d/view3d.cxx ++++ b/svx/source/engine3d/view3d.cxx +@@ -441,7 +441,9 @@ SdrModel* E3dView::GetMarkedObjModel() const + // When pasting objects have to integrated if a scene is inserted, but + // not the scene itself + +-sal_Bool E3dView::Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions) ++sal_Bool E3dView::Paste( ++ const SdrModel& rMod, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions, ++ const OUString& rSrcShellID, const OUString& rDestShellID ) + { + sal_Bool bRetval = sal_False; + +@@ -486,7 +488,7 @@ sal_Bool E3dView::Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLs + else + { + // call parent +- bRetval = SdrView::Paste(rMod, rPos, pLst, nOptions); ++ bRetval = SdrView::Paste(rMod, rPos, pLst, nOptions, rSrcShellID, rDestShellID); + } + + return bRetval; +diff --git a/svx/source/fmcomp/dbaexchange.cxx b/svx/source/fmcomp/dbaexchange.cxx +index ff0e74f..01a7845 100644 +--- a/svx/source/fmcomp/dbaexchange.cxx ++++ b/svx/source/fmcomp/dbaexchange.cxx +@@ -223,8 +223,7 @@ namespace svx + AddFormat(getDescriptorFormatId()); + } + +- //-------------------------------------------------------------------- +- sal_Bool OColumnTransferable::GetData( const DataFlavor& _rFlavor ) ++ sal_Bool OColumnTransferable::GetData( const DataFlavor& _rFlavor, const OUString& /*rDestDoc*/ ) + { + const sal_uInt32 nFormatId = SotExchange::GetFormat(_rFlavor); + switch (nFormatId) +@@ -276,7 +275,7 @@ namespace svx + SotExchange::GetFormatDataFlavor(getDescriptorFormatId(), aFlavor); + OSL_ENSURE(bSuccess, "OColumnTransferable::extractColumnDescriptor: invalid data format (no flavor)!"); + +- Any aDescriptor = _rData.GetAny(aFlavor); ++ Any aDescriptor = _rData.GetAny(aFlavor, OUString()); + + // extract the property value sequence + Sequence< PropertyValue > aDescriptorProps; +@@ -468,8 +467,7 @@ namespace svx + AddFormat(SOT_FORMATSTR_ID_SBA_DATAEXCHANGE); + } + +- // ----------------------------------------------------------------------------- +- sal_Bool ODataAccessObjectTransferable::GetData( const DataFlavor& rFlavor ) ++ sal_Bool ODataAccessObjectTransferable::GetData( const DataFlavor& rFlavor, const OUString& /*rDestDoc*/ ) + { + sal_uIntPtr nFormat = SotExchange::GetFormat(rFlavor); + switch (nFormat) +@@ -524,7 +522,7 @@ namespace svx + SotExchange::GetFormatDataFlavor(nKnownFormatId, aFlavor); + OSL_ENSURE(bSuccess, "OColumnTransferable::extractColumnDescriptor: invalid data format (no flavor)!"); + +- Any aDescriptor = _rData.GetAny(aFlavor); ++ Any aDescriptor = _rData.GetAny(aFlavor, OUString()); + + // extract the property value sequence + Sequence< PropertyValue > aDescriptorProps; +@@ -643,8 +641,8 @@ namespace svx + { + AddFormat(getDescriptorFormatId()); + } +- //-------------------------------------------------------------------- +- sal_Bool OMultiColumnTransferable::GetData( const DataFlavor& _rFlavor ) ++ ++ sal_Bool OMultiColumnTransferable::GetData( const DataFlavor& _rFlavor, const OUString& /*rDestDoc*/ ) + { + const sal_uInt32 nFormatId = SotExchange::GetFormat(_rFlavor); + if (nFormatId == getDescriptorFormatId()) +@@ -682,7 +680,7 @@ namespace svx + SotExchange::GetFormatDataFlavor(getDescriptorFormatId(), aFlavor); + OSL_ENSURE(bSuccess, "OColumnTransferable::extractColumnDescriptor: invalid data format (no flavor)!"); + +- _rData.GetAny(aFlavor) >>= aList; ++ _rData.GetAny(aFlavor, OUString()) >>= aList; + } // if (_rData.HasFormat(getDescriptorFormatId())) + return aList; + } +diff --git a/svx/source/fmcomp/dbaobjectex.cxx b/svx/source/fmcomp/dbaobjectex.cxx +index 2d5be88..3534659 100644 +--- a/svx/source/fmcomp/dbaobjectex.cxx ++++ b/svx/source/fmcomp/dbaobjectex.cxx +@@ -89,8 +89,7 @@ namespace svx + AddFormat(getDescriptorFormatId(bForm)); + } + +- //-------------------------------------------------------------------- +- sal_Bool OComponentTransferable::GetData( const DataFlavor& _rFlavor ) ++ sal_Bool OComponentTransferable::GetData( const DataFlavor& _rFlavor, const OUString& /*rDestDoc*/ ) + { + const sal_uInt32 nFormatId = SotExchange::GetFormat(_rFlavor); + if ( nFormatId == getDescriptorFormatId(sal_True) || nFormatId == getDescriptorFormatId(sal_False) ) +@@ -131,7 +130,7 @@ namespace svx + SotExchange::GetFormatDataFlavor(getDescriptorFormatId(bForm), aFlavor); + OSL_ENSURE(bSuccess, "OComponentTransferable::extractColumnDescriptor: invalid data format (no flavor)!"); + +- Any aDescriptor = _rData.GetAny(aFlavor); ++ Any aDescriptor = _rData.GetAny(aFlavor, OUString()); + + // extract the property value sequence + Sequence< PropertyValue > aDescriptorProps; +diff --git a/svx/source/fmcomp/xmlexchg.cxx b/svx/source/fmcomp/xmlexchg.cxx +index fecc0e6..fe94b02 100644 +--- a/svx/source/fmcomp/xmlexchg.cxx ++++ b/svx/source/fmcomp/xmlexchg.cxx +@@ -43,7 +43,7 @@ namespace svx + AddFormat( SOT_FORMATSTR_ID_XFORMS ); + } + //-------------------------------------------------------------------- +- sal_Bool OXFormsTransferable::GetData( const DataFlavor& _rFlavor ) ++ sal_Bool OXFormsTransferable::GetData( const DataFlavor& _rFlavor, const OUString& /*rDestDoc*/ ) + { + const sal_uInt32 nFormatId = SotExchange::GetFormat( _rFlavor ); + if ( SOT_FORMATSTR_ID_XFORMS == nFormatId ) +diff --git a/svx/source/form/fmexch.cxx b/svx/source/form/fmexch.cxx +index c137183..6a074a4 100644 +--- a/svx/source/form/fmexch.cxx ++++ b/svx/source/form/fmexch.cxx +@@ -115,7 +115,7 @@ namespace svxform + } + + //-------------------------------------------------------------------- +- sal_Bool OLocalExchange::GetData( const ::com::sun::star::datatransfer::DataFlavor& /*_rFlavor*/ ) ++ sal_Bool OLocalExchange::GetData( const ::com::sun::star::datatransfer::DataFlavor& /*_rFlavor*/, const OUString& /*rDestDoc*/ ) + { + return sal_False; // do not have any formats by default + } +@@ -139,7 +139,7 @@ namespace svxform + if ( OControlExchange::hasControlPathFormat( aExchangedData.GetDataFlavorExVector() ) ) + { // paths to the controls, relative to a root + Sequence< Any > aControlPathData; +- if ( aExchangedData.GetAny( OControlExchange::getControlPathFormatId() ) >>= aControlPathData ) ++ if ( aExchangedData.GetAny(OControlExchange::getControlPathFormatId(), OUString()) >>= aControlPathData ) + { + DBG_ASSERT( aControlPathData.getLength() >= 2, "OControlTransferData::OControlTransferData: invalid data for the control path format!" ); + if ( aControlPathData.getLength() >= 2 ) +@@ -155,7 +155,7 @@ namespace svxform + } + if ( OControlExchange::hasHiddenControlModelsFormat( aExchangedData.GetDataFlavorExVector() ) ) + { // sequence of models of hidden controls +- aExchangedData.GetAny( OControlExchange::getHiddenControlModelsFormatId() ) >>= m_aHiddenControlModels; ++ aExchangedData.GetAny(OControlExchange::getHiddenControlModelsFormatId(), OUString()) >>= m_aHiddenControlModels; + } + + updateFormats( ); +@@ -289,8 +289,7 @@ namespace svxform + { + } + +- //-------------------------------------------------------------------- +- sal_Bool OControlExchange::GetData( const DataFlavor& _rFlavor ) ++ sal_Bool OControlExchange::GetData( const DataFlavor& _rFlavor, const OUString& rDestDoc ) + { + const sal_uInt32 nFormatId = SotExchange::GetFormat( _rFlavor ); + +@@ -310,7 +309,7 @@ namespace svxform + SetAny( makeAny( m_aHiddenControlModels ), _rFlavor ); + } + else +- return OLocalExchange::GetData( _rFlavor ); ++ return OLocalExchange::GetData(_rFlavor, rDestDoc); + + return sal_True; + } +diff --git a/svx/source/form/fmview.cxx b/svx/source/form/fmview.cxx +index 83c6709..3f5b8f1 100644 +--- a/svx/source/form/fmview.cxx ++++ b/svx/source/form/fmview.cxx +@@ -379,13 +379,6 @@ SdrModel* FmFormView::GetMarkedObjModel() const + return E3dView::GetMarkedObjModel(); + } + +-//------------------------------------------------------------------------ +-sal_Bool FmFormView::Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions) +-{ +- return E3dView::Paste(rMod, rPos, pLst, nOptions); +-} +- +-//------------------------------------------------------------------------ + void FmFormView::ActivateControls(SdrPageView* pPageView) + { + if (!pPageView) +diff --git a/svx/source/gallery2/galmisc.cxx b/svx/source/gallery2/galmisc.cxx +index fca950f..8adad0d 100644 +--- a/svx/source/gallery2/galmisc.cxx ++++ b/svx/source/gallery2/galmisc.cxx +@@ -512,7 +512,7 @@ void GalleryTransferable::AddSupportedFormats() + } + } + +-sal_Bool GalleryTransferable::GetData( const datatransfer::DataFlavor& rFlavor ) ++sal_Bool GalleryTransferable::GetData( const datatransfer::DataFlavor& rFlavor, const OUString& /*rDestDoc*/ ) + { + sal_uInt32 nFormat = SotExchange::GetFormat( rFlavor ); + sal_Bool bRet = sal_False; +diff --git a/svx/source/inc/fmexch.hxx b/svx/source/inc/fmexch.hxx +index e2c9a84..6c59ffb 100644 +--- a/svx/source/inc/fmexch.hxx ++++ b/svx/source/inc/fmexch.hxx +@@ -79,7 +79,7 @@ namespace svxform + + // TransferableHelper + virtual void DragFinished( sal_Int8 nDropAction ); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + + private: + void StartDrag( Window* pWindow, sal_Int8 nDragSourceActions, sal_Int32 nDragPointer = DND_POINTER_NONE, sal_Int32 nDragImage = DND_IMAGE_NONE ) +@@ -222,7 +222,7 @@ namespace svxform + inline static sal_Bool hasHiddenControlModelsFormat( const DataFlavorExVector& _rFormats ); + + protected: +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual void AddSupportedFormats(); + }; + +diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx +index b495c5b..d821757 100644 +--- a/svx/source/svdraw/svdobj.cxx ++++ b/svx/source/svdraw/svdobj.cxx +@@ -1064,6 +1064,11 @@ SdrObject* SdrObject::Clone() const + return CloneHelper< SdrObject >(); + } + ++SdrObject* SdrObject::CloneWithShellIDs( const OUString& /*rSrcShellID*/, const OUString& /*rDestShellID*/ ) const ++{ ++ return Clone(); ++} ++ + SdrObject& SdrObject::operator=(const SdrObject& rObj) + { + if( this == &rObj ) +diff --git a/svx/source/svdraw/svdoole2.cxx b/svx/source/svdraw/svdoole2.cxx +index 1102de8..f68f5d7 100644 +--- a/svx/source/svdraw/svdoole2.cxx ++++ b/svx/source/svdraw/svdoole2.cxx +@@ -1621,7 +1621,20 @@ SdrOle2Obj* SdrOle2Obj::Clone() const + return CloneHelper< SdrOle2Obj >(); + } + +-SdrOle2Obj& SdrOle2Obj::operator=(const SdrOle2Obj& rObj) ++SdrOle2Obj* SdrOle2Obj::CloneWithShellIDs( const OUString& rSrcShellID, const OUString& rDestShellID ) const ++{ ++ SdrOle2Obj* pObj = ++ dynamic_cast( ++ SdrObjFactory::MakeNewObject(GetObjInventor(), GetObjIdentifier(), NULL)); ++ ++ if (pObj) ++ pObj->assignFrom(*this, rSrcShellID, rDestShellID); ++ ++ return pObj; ++} ++ ++SdrOle2Obj& SdrOle2Obj::assignFrom( ++ const SdrOle2Obj& rObj, const OUString& rSrcShellID, const OUString& rDestShellID ) + { + //TODO/LATER: who takes over control of my old object?! + if( &rObj != this ) +@@ -1668,7 +1681,8 @@ SdrOle2Obj& SdrOle2Obj::operator=(const SdrOle2Obj& rObj) + if ( xObj.is() ) + { + OUString aTmp; +- xObjRef.Assign( pDestPers->getEmbeddedObjectContainer().CopyAndGetEmbeddedObject( rContainer, xObj, aTmp ), rOle2Obj.GetAspect() ); ++ xObjRef.Assign( pDestPers->getEmbeddedObjectContainer().CopyAndGetEmbeddedObject( ++ rContainer, xObj, aTmp, rSrcShellID, rDestShellID), rOle2Obj.GetAspect()); + m_bTypeAsked = false; + mpImpl->aPersistName = aTmp; + CheckFileLink_Impl(); +@@ -1681,7 +1695,10 @@ SdrOle2Obj& SdrOle2Obj::operator=(const SdrOle2Obj& rObj) + return *this; + } + +-// ----------------------------------------------------------------------------- ++SdrOle2Obj& SdrOle2Obj::operator=(const SdrOle2Obj& rObj) ++{ ++ return assignFrom(rObj, OUString(), OUString()); ++} + + void SdrOle2Obj::ImpSetVisAreaSize() + { +diff --git a/svx/source/svdraw/svdxcgv.cxx b/svx/source/svdraw/svdxcgv.cxx +index 374f9a9..fe62e91 100644 +--- a/svx/source/svdraw/svdxcgv.cxx ++++ b/svx/source/svdraw/svdxcgv.cxx +@@ -223,7 +223,9 @@ sal_Bool SdrExchangeView::Paste(SvStream& rInput, const OUString& rBaseURL, sal_ + return sal_True; + } + +-sal_Bool SdrExchangeView::Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions) ++sal_Bool SdrExchangeView::Paste( ++ const SdrModel& rMod, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions, ++ const OUString& rSrcShellID, const OUString& rDestShellID ) + { + const SdrModel* pSrcMod=&rMod; + if (pSrcMod==pMod) +@@ -298,7 +300,7 @@ sal_Bool SdrExchangeView::Paste(const SdrModel& rMod, const Point& rPos, SdrObjL + { + const SdrObject* pSrcOb=pSrcPg->GetObj(nOb); + +- SdrObject* pNeuObj = pSrcOb->Clone(); ++ SdrObject* pNeuObj = pSrcOb->CloneWithShellIDs(rSrcShellID, rDestShellID); + + if (pNeuObj!=NULL) + { +diff --git a/svx/source/tbxctrls/colrctrl.cxx b/svx/source/tbxctrls/colrctrl.cxx +index 9591235..61e5bf1 100644 +--- a/svx/source/tbxctrls/colrctrl.cxx ++++ b/svx/source/tbxctrls/colrctrl.cxx +@@ -49,7 +49,7 @@ private: + protected: + + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual sal_Bool WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, const ::com::sun::star::datatransfer::DataFlavor& rFlavor ); + + public: +@@ -67,7 +67,7 @@ void SvxColorValueSetData::AddSupportedFormats() + + // ----------------------------------------------------------------------------- + +-sal_Bool SvxColorValueSetData::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) ++sal_Bool SvxColorValueSetData::GetData( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, const OUString& /*rDestDoc*/ ) + { + sal_Bool bRet = sal_False; + +diff --git a/sw/source/core/frmedt/fecopy.cxx b/sw/source/core/frmedt/fecopy.cxx +index 2474312..8c5b6b9 100644 +--- a/sw/source/core/frmedt/fecopy.cxx ++++ b/sw/source/core/frmedt/fecopy.cxx +@@ -1509,7 +1509,7 @@ void SwFEShell::Paste( SvStream& rStrm, sal_uInt16 nAction, const Point* pPt ) + // #i50824# + // method replaced by + lcl_ConvertSdrOle2ObjsToSdrGrafObjs( pModel ); +- pView->Paste( *pModel, aPos ); ++ pView->Paste(*pModel, aPos, NULL, 0, OUString(), OUString()); + + sal_uLong nCnt = pView->GetMarkedObjectList().GetMarkCount(); + if( nCnt ) +diff --git a/sw/source/core/ole/ndole.cxx b/sw/source/core/ole/ndole.cxx +index 0941fdb..e905585 100644 +--- a/sw/source/core/ole/ndole.cxx ++++ b/sw/source/core/ole/ndole.cxx +@@ -458,7 +458,9 @@ SwCntntNode* SwOLENode::MakeCopy( SwDoc* pDoc, const SwNodeIndex& rIdx ) const + pPersistShell->GetEmbeddedObjectContainer().CopyAndGetEmbeddedObject( + pSrc->GetEmbeddedObjectContainer(), + pSrc->GetEmbeddedObjectContainer().GetEmbeddedObject( aOLEObj.aName ), +- aNewName ); ++ aNewName, ++ OUString(), ++ OUString()); + + SwOLENode* pOLENd = pDoc->GetNodes().MakeOLENode( rIdx, aNewName, GetAspect(), + (SwGrfFmtColl*)pDoc->GetDfltGrfFmtColl(), +diff --git a/sw/source/core/undo/unins.cxx b/sw/source/core/undo/unins.cxx +index f71d3f5..b1a460b 100644 +--- a/sw/source/core/undo/unins.cxx ++++ b/sw/source/core/undo/unins.cxx +@@ -460,7 +460,7 @@ void SwUndoInsert::RepeatImpl(::sw::RepeatContext & rContext) + // TODO/LATER: Copying through the container would copy the replacement image as well + comphelper::EmbeddedObjectContainer aCnt; + OUString aName = aCnt.CreateUniqueObjectName(); +- if ( aCnt.StoreEmbeddedObject( rSwOLE.GetOleRef(), aName, sal_True ) ) ++ if (aCnt.StoreEmbeddedObject(rSwOLE.GetOleRef(), aName, true, OUString(), OUString())) + { + uno::Reference < embed::XEmbeddedObject > aNew = aCnt.GetEmbeddedObject( aName ); + rDoc.Insert( rContext.GetRepeatPaM(), +diff --git a/sw/source/ui/dochdl/swdtflvr.cxx b/sw/source/ui/dochdl/swdtflvr.cxx +index 028e7ba..2b7ee20 100644 +--- a/sw/source/ui/dochdl/swdtflvr.cxx ++++ b/sw/source/ui/dochdl/swdtflvr.cxx +@@ -392,7 +392,7 @@ namespace + } + } + +-sal_Bool SwTransferable::GetData( const DataFlavor& rFlavor ) ++sal_Bool SwTransferable::GetData( const DataFlavor& rFlavor, const OUString& rDestDoc ) + { + sal_uInt32 nFormat = SotExchange::GetFormat( rFlavor ); + +@@ -488,7 +488,7 @@ sal_Bool SwTransferable::GetData( const DataFlavor& rFlavor ) + if( xObj.is() ) + { + TransferableDataHelper aD( new SvEmbedTransferHelper( xObj, pOLEGraph, nAspect ) ); +- uno::Any aAny( aD.GetAny( rFlavor )); ++ uno::Any aAny = aD.GetAny(rFlavor, rDestDoc); + if( aAny.hasValue() ) + bOK = SetAny( aAny, rFlavor ); + } +@@ -1713,7 +1713,13 @@ int SwTransferable::_PasteOLE( TransferableDataHelper& rData, SwWrtShell& rSh, + else + nId = 0; + +- if( nId && rData.GetInputStream( nId, xStrm ) && xStrm.is() ) ++ if (nId) ++ { ++ SwDocShell* pDocSh = rSh.GetDoc()->GetDocShell(); ++ xStrm = rData.GetInputStream(nId, SfxObjectShell::CreateShellID(pDocSh)); ++ } ++ ++ if (xStrm.is()) + { + // if there is an embedded object, first try if it's a writer object + // this will be inserted into the document by using a Reader +@@ -1780,8 +1786,9 @@ int SwTransferable::_PasteOLE( TransferableDataHelper& rData, SwWrtShell& rSh, + { + if( rData.HasFormat( nFmt = SOT_FORMATSTR_ID_OBJECTDESCRIPTOR_OLE ) && rData.GetTransferableObjectDescriptor( nFmt, aObjDesc ) ) + { +- if ( !rData.GetInputStream( SOT_FORMATSTR_ID_EMBED_SOURCE_OLE, xStrm ) ) +- rData.GetInputStream( SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE, xStrm ); ++ xStrm = rData.GetInputStream(SOT_FORMATSTR_ID_EMBED_SOURCE_OLE, OUString()); ++ if (!xStrm.is()) ++ xStrm = rData.GetInputStream(SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE, OUString()); + + if ( !xStrm.is() ) + { +diff --git a/sw/source/ui/inc/swdtflvr.hxx b/sw/source/ui/inc/swdtflvr.hxx +index 0b30053..e03625e 100644 +--- a/sw/source/ui/inc/swdtflvr.hxx ++++ b/sw/source/ui/inc/swdtflvr.hxx +@@ -138,7 +138,7 @@ class SW_DLLPUBLIC SwTransferable : public TransferableHelper + + protected: + virtual void AddSupportedFormats(); +- virtual sal_Bool GetData( const css::datatransfer::DataFlavor& rFlavor ); ++ virtual sal_Bool GetData( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ); + virtual sal_Bool WriteObject( SotStorageStreamRef& rxOStm, + void* pUserObject, + sal_uInt32 nUserObjectId, +diff --git a/xmloff/source/chart/SchXMLExport.cxx b/xmloff/source/chart/SchXMLExport.cxx +index 1647e33..1ffd3c6 100644 +--- a/xmloff/source/chart/SchXMLExport.cxx ++++ b/xmloff/source/chart/SchXMLExport.cxx +@@ -268,6 +268,9 @@ public: + + OUString msCLSID; + ++ OUString maSrcShellID; ++ OUString maDestShellID; ++ + ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShapes > mxAdditionalShapes; + + tDataSequenceCont m_aDataSequencesToExport; +@@ -1009,6 +1012,16 @@ const OUString& SchXMLExportHelper::getChartCLSID() + return m_pImpl->msCLSID; + } + ++void SchXMLExportHelper::SetSourceShellID( const OUString& rShellID ) ++{ ++ m_pImpl->maSrcShellID = rShellID; ++} ++ ++void SchXMLExportHelper::SetDestinationShellID( const OUString& rShellID ) ++{ ++ m_pImpl->maDestShellID = rShellID; ++} ++ + UniReference< XMLPropertySetMapper > SchXMLExportHelper_Impl::GetPropertySetMapper() const + { + return mxPropertySetMapper; +@@ -2297,6 +2310,32 @@ bool lcl_exportAxisType( const Reference< chart2::XAxis > xChart2Axis, SvXMLExpo + return bExportDateScale; + } + ++void disableLinkedNumberFormat( ++ std::vector& rPropStates, const UniReference& rMapper ) ++{ ++ for (size_t i = 0; i < rPropStates.size(); ++i) ++ { ++ XMLPropertyState& rState = rPropStates[i]; ++ if (rState.mnIndex < 0 || rMapper->GetEntryCount() <= rState.mnIndex) ++ continue; ++ ++ OUString aXMLName = rMapper->GetEntryXMLName(rState.mnIndex); ++ ++ if (aXMLName != "link-data-style-to-source") ++ continue; ++ ++ // Entry found. Set the value to false and bail out. ++ rState.maValue <<= false; ++ return; ++ } ++ ++ // Entry not found. Insert a new entry for this. ++ sal_Int32 nIndex = rMapper->GetEntryIndex(XML_NAMESPACE_CHART, "link-data-style-to-source", 0); ++ XMLPropertyState aState(nIndex); ++ aState.maValue <<= false; ++ rPropStates.push_back(aState); ++} ++ + } + + void SchXMLExportHelper_Impl::exportAxis( +@@ -2317,6 +2356,14 @@ void SchXMLExportHelper_Impl::exportAxis( + { + lcl_exportNumberFormat( sNumFormat, xAxisProps, mrExport ); + aPropertyStates = mxExpPropMapper->Filter( xAxisProps ); ++ ++ if (!maSrcShellID.isEmpty() && !maDestShellID.isEmpty() && maSrcShellID != maDestShellID) ++ { ++ // Disable link to source number format property when pasting to ++ // a different doc shell. These shell ID's should be both empty ++ // during real ODF export. ++ disableLinkedNumberFormat(aPropertyStates, mxExpPropMapper->getPropertySetMapper()); ++ } + } + + bool bExportDateScale = false; +@@ -3556,6 +3603,9 @@ SchXMLExport::~SchXMLExport() + + sal_uInt32 SchXMLExport::exportDoc( enum ::xmloff::token::XMLTokenEnum eClass ) + { ++ maExportHelper.SetSourceShellID(GetSourceShellID()); ++ maExportHelper.SetDestinationShellID(GetDestinationShellID()); ++ + Reference< chart2::XChartDocument > xChartDoc( GetModel(), uno::UNO_QUERY ); + maExportHelper.m_pImpl->InitRangeSegmentationProperties( xChartDoc ); + return SvXMLExport::exportDoc( eClass ); +diff --git a/xmloff/source/core/xmlexp.cxx b/xmloff/source/core/xmlexp.cxx +index 3459747..f91d921 100644 +--- a/xmloff/source/core/xmlexp.cxx ++++ b/xmloff/source/core/xmlexp.cxx +@@ -257,6 +257,9 @@ public: + /// name of stream in package, e.g., "content.xml" + OUString mStreamName; + ++ OUString maSrcShellID; ++ OUString maDestShellID; ++ + /// stack of backed up namespace maps + /// long: depth at which namespace map has been backed up into the stack + ::std::stack< ::std::pair< SvXMLNamespaceMap *, long > > mNamespaceMaps; +@@ -794,15 +797,16 @@ sal_Bool SAL_CALL SvXMLExport::filter( const uno::Sequence< beans::PropertyValue + + try + { ++ const sal_Int32 nPropCount = aDescriptor.getLength(); ++ + const sal_uInt32 nTest = + EXPORT_META|EXPORT_STYLES|EXPORT_CONTENT|EXPORT_SETTINGS; + if( (mnExportFlags & nTest) == nTest && msOrigFileName.isEmpty() ) + { + // evaluate descriptor only for flat files and if a base URI + // has not been provided already +- const sal_Int32 nPropCount = aDescriptor.getLength(); +- const beans::PropertyValue* pProps = aDescriptor.getConstArray(); + ++ const beans::PropertyValue* pProps = aDescriptor.getConstArray(); + for( sal_Int32 nIndex = 0; nIndex < nPropCount; nIndex++, pProps++ ) + { + const OUString& rPropName = pProps->Name; +@@ -821,6 +825,25 @@ sal_Bool SAL_CALL SvXMLExport::filter( const uno::Sequence< beans::PropertyValue + } + } + ++ const beans::PropertyValue* pProps = aDescriptor.getConstArray(); ++ for (sal_Int32 nIndex = 0; nIndex < nPropCount; ++nIndex, ++pProps) ++ { ++ const OUString& rPropName = pProps->Name; ++ const Any& rValue = pProps->Value; ++ ++ if (rPropName == "SourceShellID") ++ { ++ if (!(rValue >>= mpImpl->maSrcShellID)) ++ return false; ++ } ++ else if (rPropName == "DestinationShellID") ++ { ++ if (!(rValue >>= mpImpl->maDestShellID)) ++ return false; ++ } ++ } ++ ++ + exportDoc( meClass ); + } + catch(const uno::Exception& e) +@@ -1510,6 +1533,16 @@ void SvXMLExport::ResetNamespaceMap() + delete mpNamespaceMap; mpNamespaceMap = new SvXMLNamespaceMap; + } + ++OUString SvXMLExport::GetSourceShellID() const ++{ ++ return mpImpl->maSrcShellID; ++} ++ ++OUString SvXMLExport::GetDestinationShellID() const ++{ ++ return mpImpl->maDestShellID; ++} ++ + void SvXMLExport::_ExportMeta() + { + OUString generator( ::utl::DocInfoHelper::GetGeneratorString() ); +-- +1.9.3 + diff --git a/SOURCES/0023-fdo-79676-Initialize-with-a-default-chart-only-from-.patch b/SOURCES/0023-fdo-79676-Initialize-with-a-default-chart-only-from-.patch new file mode 100644 index 0000000..8ec2d6d --- /dev/null +++ b/SOURCES/0023-fdo-79676-Initialize-with-a-default-chart-only-from-.patch @@ -0,0 +1,201 @@ +From 0e3826d08d7a7d54dd532319fb584008eb0e24c8 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Mon, 9 Jun 2014 14:32:53 -0400 +Subject: [PATCH 023/137] fdo#79676: Initialize with a default chart only from + the UI. + +When creating an embedded chart object during import, we don't want to +create a default chart which would only mess up the chart data. + +With this change, ChartModel::initNew() is a no-op. + +(cherry picked from commit c5539bb585370f095cb6c09e38a7dd005d237295) +Signed-off-by: Andras Timar + +Conflicts: + chart2/source/model/main/ChartModel_Persistence.cxx + sc/source/ui/drawfunc/fuins2.cxx + sw/source/uibase/table/tablemgr.cxx + +Change-Id: Id29659c3885ec1e06bed26d2c851123fb63072cc +(cherry picked from commit 1eccdc5c39587d4019cb4c88f8483b1fe14d5dda) +Signed-off-by: Andras Timar +--- + chart2/inc/ChartModel.hxx | 4 ++++ + chart2/source/model/main/ChartModel.cxx | 6 ++++++ + chart2/source/model/main/ChartModel_Persistence.cxx | 16 ++++++++++------ + offapi/com/sun/star/chart2/XChartDocument.idl | 4 ++++ + sc/source/ui/drawfunc/fuins2.cxx | 5 +++++ + sd/source/ui/func/fuinsert.cxx | 10 ++++++++++ + sw/source/ui/table/tablemgr.cxx | 8 ++++++++ + 7 files changed, 47 insertions(+), 6 deletions(-) + +diff --git a/chart2/inc/ChartModel.hxx b/chart2/inc/ChartModel.hxx +index c8f992a..028ce0e 100644 +--- a/chart2/inc/ChartModel.hxx ++++ b/chart2/inc/ChartModel.hxx +@@ -221,6 +221,8 @@ private: + void impl_adjustAdditionalShapesPositionAndSize( + const ::com::sun::star::awt::Size& aVisualAreaSize ); + ++ void insertDefaultChart(); ++ + public: + //no default constructor + ChartModel(::com::sun::star::uno::Reference< +@@ -432,6 +434,8 @@ public: + getPageBackground() + throw (::com::sun::star::uno::RuntimeException); + ++ virtual void SAL_CALL createDefaultChart() throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; ++ + // ____ XDataReceiver (public API) ____ + virtual void SAL_CALL + attachDataProvider( const ::com::sun::star::uno::Reference< +diff --git a/chart2/source/model/main/ChartModel.cxx b/chart2/source/model/main/ChartModel.cxx +index c29a10e..170019f 100644 +--- a/chart2/source/model/main/ChartModel.cxx ++++ b/chart2/source/model/main/ChartModel.cxx +@@ -947,6 +947,12 @@ uno::Reference< beans::XPropertySet > SAL_CALL ChartModel::getPageBackground() + return m_xPageBackground; + } + ++void SAL_CALL ChartModel::createDefaultChart() ++ throw (css::uno::RuntimeException, std::exception) ++{ ++ insertDefaultChart(); ++} ++ + // ____ XTitled ____ + uno::Reference< chart2::XTitle > SAL_CALL ChartModel::getTitleObject() + throw (uno::RuntimeException) +diff --git a/chart2/source/model/main/ChartModel_Persistence.cxx b/chart2/source/model/main/ChartModel_Persistence.cxx +index d964ced..5284ad2 100644 +--- a/chart2/source/model/main/ChartModel_Persistence.cxx ++++ b/chart2/source/model/main/ChartModel_Persistence.cxx +@@ -380,12 +380,7 @@ void ChartModel::impl_store( + } + } + +-// frame::XLoadable +-void SAL_CALL ChartModel::initNew() +- throw (frame::DoubleInitializationException, +- io::IOException, +- uno::Exception, +- uno::RuntimeException) ++void ChartModel::insertDefaultChart() + { + lockControllers(); + createInternalDataProvider( sal_False ); +@@ -486,6 +481,15 @@ void SAL_CALL ChartModel::initNew() + #endif + } + ++// frame::XLoadable ++void SAL_CALL ChartModel::initNew() ++ throw (frame::DoubleInitializationException, ++ io::IOException, ++ uno::Exception, ++ uno::RuntimeException) ++{ ++} ++ + void SAL_CALL ChartModel::load( + const Sequence< beans::PropertyValue >& rMediaDescriptor ) + throw (frame::DoubleInitializationException, +diff --git a/offapi/com/sun/star/chart2/XChartDocument.idl b/offapi/com/sun/star/chart2/XChartDocument.idl +index 217d7fa..0055cbb 100644 +--- a/offapi/com/sun/star/chart2/XChartDocument.idl ++++ b/offapi/com/sun/star/chart2/XChartDocument.idl +@@ -123,6 +123,10 @@ interface XChartDocument : ::com::sun::star::frame::XModel + XDiagram::getWall().

+ */ + com::sun::star::beans::XPropertySet getPageBackground(); ++ ++ /** Creates a default chart type for a brand-new chart object. ++ */ ++ void createDefaultChart(); + }; + + } ; // chart2 +diff --git a/sc/source/ui/drawfunc/fuins2.cxx b/sc/source/ui/drawfunc/fuins2.cxx +index 9db9ac9..787b58b 100644 +--- a/sc/source/ui/drawfunc/fuins2.cxx ++++ b/sc/source/ui/drawfunc/fuins2.cxx +@@ -55,6 +55,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -502,6 +503,10 @@ FuInsertChart::FuInsertChart(ScTabViewShell* pViewSh, Window* pWin, ScDrawView* + if( xCompSupp.is()) + xReceiver.set( xCompSupp->getComponent(), uno::UNO_QUERY ); + ++ uno::Reference xChartDoc(xReceiver, uno::UNO_QUERY); ++ if (xChartDoc.is()) ++ xChartDoc->createDefaultChart(); ++ + // lock the model to suppress any internal updates + uno::Reference< frame::XModel > xChartModel( xReceiver, uno::UNO_QUERY ); + if( xChartModel.is() ) +diff --git a/sd/source/ui/func/fuinsert.cxx b/sd/source/ui/func/fuinsert.cxx +index 886be34..1606c33 100644 +--- a/sd/source/ui/func/fuinsert.cxx ++++ b/sd/source/ui/func/fuinsert.cxx +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -274,6 +275,15 @@ void FuInsertOLE::DoExecute( SfxRequest& rReq ) + GetEmbeddedObjectContainer().CreateEmbeddedObject( aName.GetByteSequence(), aObjName ); + if ( xObj.is() ) + { ++ uno::Reference xCompSupp(xObj, uno::UNO_QUERY); ++ if (xCompSupp.is()) ++ { ++ // Create default chart type. ++ uno::Reference xChartDoc(xCompSupp->getComponent(), uno::UNO_QUERY); ++ if (xChartDoc.is()) ++ xChartDoc->createDefaultChart(); ++ } ++ + sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT; + + MapUnit aUnit = VCLUnoHelper::UnoEmbed2VCLMapUnit( xObj->getMapUnit( nAspect ) ); +diff --git a/sw/source/ui/table/tablemgr.cxx b/sw/source/ui/table/tablemgr.cxx +index 947e3dd..26871ee 100644 +--- a/sw/source/ui/table/tablemgr.cxx ++++ b/sw/source/ui/table/tablemgr.cxx +@@ -21,6 +21,7 @@ + #include + #include + #include ++#include + #include + + #include +@@ -243,7 +244,14 @@ uno::Reference< frame::XModel > SwTableFUNC::InsertChart( + { + xChartModel.set( xCompSupp->getComponent(), uno::UNO_QUERY ); + if( xChartModel.is() ) ++ { ++ // Create a default chart type. ++ uno::Reference xChartDoc(xChartModel, uno::UNO_QUERY); ++ if (xChartDoc.is()) ++ xChartDoc->createDefaultChart(); ++ + xChartModel->lockControllers(); //#i79578# don't request a new replacement image for charts to often - block change notifications ++ } + } + + // set the table name at the OLE-node +-- +1.9.3 + diff --git a/SOURCES/0025-fdo-71056-add-sup-to-list-of-inline-help-XML-tags.patch b/SOURCES/0025-fdo-71056-add-sup-to-list-of-inline-help-XML-tags.patch deleted file mode 100644 index 17743fc..0000000 --- a/SOURCES/0025-fdo-71056-add-sup-to-list-of-inline-help-XML-tags.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 2c0d52812310b1ee07cf5c9e6932c3a02fde0862 Mon Sep 17 00:00:00 2001 -From: Andras Timar -Date: Mon, 2 Dec 2013 13:03:59 +0100 -Subject: [PATCH 025/109] fdo#71056 add to list of inline help XML tags -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Conflicts: - l10ntools/source/xmlparse.cxx - -Change-Id: If0937bd571658e0f76a51e44dd3fa008f701f02e -Reviewed-on: https://gerrit.libreoffice.org/6895 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - l10ntools/source/xmlparse.cxx | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/l10ntools/source/xmlparse.cxx b/l10ntools/source/xmlparse.cxx -index 55bf4bc..2959bba 100644 ---- a/l10ntools/source/xmlparse.cxx -+++ b/l10ntools/source/xmlparse.cxx -@@ -1215,11 +1215,11 @@ static icu::UnicodeString lcl_QuotRange( - - static bool lcl_isTag( const icu::UnicodeString& rString ) - { -- const int nSize = 12; -+ static const int nSize = 13; - static const icu::UnicodeString vTags[nSize] = { - "ahelp", "link", "item", "emph", "defaultinline", - "switchinline", "caseinline", "variable", -- "bookmark_value", "image", "embedvar", "alt" }; -+ "bookmark_value", "image", "embedvar", "alt", "sup" }; - - for( int nIndex = 0; nIndex < nSize; ++nIndex ) - { --- -1.8.4.2 - diff --git a/SOURCES/0025-fdo-81445-Display-correct-label-for-empty-cell.patch b/SOURCES/0025-fdo-81445-Display-correct-label-for-empty-cell.patch new file mode 100644 index 0000000..c41bff7 --- /dev/null +++ b/SOURCES/0025-fdo-81445-Display-correct-label-for-empty-cell.patch @@ -0,0 +1,34 @@ +From 61aabb7d814b634e29003d8b555938f40b6f6fb4 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Wed, 16 Jul 2014 19:00:51 -0400 +Subject: [PATCH 025/137] fdo#81445: Display correct label for empty cell. + +Change-Id: I4f3e99b2231f7cd87daa27ef2dc47d3bf37cea57 +(cherry picked from commit 2202bda95c76127dffcc9c7460e462a877344b9c) +Reviewed-on: https://gerrit.libreoffice.org/10361 +Reviewed-by: Markus Mohrhard +Tested-by: Markus Mohrhard +--- + sc/source/core/tool/chgtrack.cxx | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/sc/source/core/tool/chgtrack.cxx b/sc/source/core/tool/chgtrack.cxx +index 87d0cdb..1ebb30d 100644 +--- a/sc/source/core/tool/chgtrack.cxx ++++ b/sc/source/core/tool/chgtrack.cxx +@@ -1806,10 +1806,9 @@ void ScChangeActionContent::GetValueString( + case CELLTYPE_FORMULA : + GetFormulaString(rStr, rCell.mpFormula); + break; ++ case CELLTYPE_NONE: + default: +- { +- // added to avoid warnings +- } ++ rStr = OUString(); + } + } + +-- +1.9.3 + diff --git a/SOURCES/0026-bnc-862510-Improve-handling-of-OOXML-gradients.patch b/SOURCES/0026-bnc-862510-Improve-handling-of-OOXML-gradients.patch new file mode 100644 index 0000000..ece265d --- /dev/null +++ b/SOURCES/0026-bnc-862510-Improve-handling-of-OOXML-gradients.patch @@ -0,0 +1,793 @@ +From 7a34e0815d541709e96fcb7162895e90a8d08f30 Mon Sep 17 00:00:00 2001 +From: Tor Lillqvist +Date: Mon, 14 Jul 2014 20:23:22 +0300 +Subject: [PATCH 026/137] bnc#862510: Improve handling of OOXML gradients + +OOXML gradients can have an arbitrary number of "stops". LibreOffice gradients +have just a start and end colour, plus an optional uniformly coloured border +(on the "start" side). In addition, LibreOffice has the "axial" gradient mode, +which means the gradient is reflected in the middle. + +It is thus obviously impossible in general to losslessly map OOXML gradients +to LibreOffice ones. But let's try a bit harder than earlier to get visually +more similar result, in at least some simple sample cases. + +We look for the widest gradient segment and use that for the start and end +colours of the LibreOffice gradient. + +Also, map an OOXML gradient to an axial LibreOffice gradient only if it is +symmetrical. Also, use the border property when suitable. In general, look for +the widest OOXML gradient segment (once a segment corresponding to the +LibreOffice gradient border, if any, has been accounted for) and use that as +the LibreOffice gradient. + +Possibly some perceptionally better heuristic should be used... Like, if we +have a three-segment gradient, with a wide gradient segment between two +visually very similar colours (for example, two shades of red), and a narrower +segment ending with a visually very different colour (for example, yellow), it +probably would be best to represent that in LibreOffice as a gradient from the +first red shade to yellow, instead of as a gradient between the two shades of +red. Or even, if a first or last gradient segment is between very similar +colours, equalize those start and end colours, thus using a border colour in +LibreOffice instead. The possibilities for bikeshedding are endless. + +I am sure there are instances where the old code (by accident?) produced +visually more pleasing results... But hopefully this works more pleasingly and +consistently in a larger number of cases. + +Change-Id: If153e986ad943454307e3ba718479d5ac4cdc7ab +Reviewed-on: https://gerrit.libreoffice.org/10359 +Reviewed-by: Andras Timar +Tested-by: Andras Timar +--- + include/sal/log-areas.dox | 1 + + oox/Library_oox.mk | 6 +- + oox/source/drawingml/fillproperties.cxx | 212 ++++++++++++++++++++++++++++---- + sd/qa/unit/data/xml/n819614_0.xml | 102 +++++++-------- + 4 files changed, 244 insertions(+), 77 deletions(-) + +diff --git a/include/sal/log-areas.dox b/include/sal/log-areas.dox +index 7d8d70f..46656e2 100644 +--- a/include/sal/log-areas.dox ++++ b/include/sal/log-areas.dox +@@ -140,6 +140,7 @@ certain functionality. + @li @c filter.xslt - xslt import/export + @li @c oox.cscode - see oox/source/drawingml/customshapes/README + @li @c oox.drawingml - DrawingML ++@li @c oox.drawingml.gradient + @li @c oox.ppt - pptx filter + @li @c oox.storage - ZipStorage class + @li @c oox.xmlstream - XmlStream class +diff --git a/oox/Library_oox.mk b/oox/Library_oox.mk +index d933b56..a8b2161 100644 +--- a/oox/Library_oox.mk ++++ b/oox/Library_oox.mk +@@ -59,16 +59,18 @@ $(eval $(call gb_Library_use_libraries,oox,\ + $(gb_UWINAPI) \ + )) + +-ifeq ($(TLS),OPENSSL) + $(eval $(call gb_Library_use_externals,oox,\ + boost_headers \ ++)) ++ ++ifeq ($(TLS),OPENSSL) ++$(eval $(call gb_Library_use_externals,oox,\ + openssl \ + openssl_headers \ + )) + else + ifeq ($(TLS),NSS) + $(eval $(call gb_Library_use_externals,oox,\ +- boost_headers \ + plc4 \ + nss3 \ + )) +diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx +index 99026a9..a5eb026 100644 +--- a/oox/source/drawingml/fillproperties.cxx ++++ b/oox/source/drawingml/fillproperties.cxx +@@ -17,6 +17,9 @@ + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + ++#include ++#include ++ + #include "oox/drawingml/fillproperties.hxx" + + #include +@@ -340,8 +343,8 @@ void FillProperties::pushToPropMap( ShapePropertyMap& rPropMap, + aGradient.StartIntensity = 100; + aGradient.EndIntensity = 100; + +- size_t nColorCount = maGradientProps.maGradientStops.size(); +- if( nColorCount > 1 ) ++ // Old code, values in aGradient overwritten in many cases by newer code below ++ if( maGradientProps.maGradientStops.size() > 1 ) + { + aGradient.StartColor = maGradientProps.maGradientStops.begin()->second.getColor( rGraphicHelper, nPhClr ); + aGradient.EndColor = maGradientProps.maGradientStops.rbegin()->second.getColor( rGraphicHelper, nPhClr ); +@@ -377,33 +380,194 @@ void FillProperties::pushToPropMap( ShapePropertyMap& rPropMap, + } + else + { +- /* Try to detect a VML axial gradient. This type of +- gradient is simulated by a 3-point linear gradient. +- Even if it's a multi-color linear gradient, its probably better to assume +- axial gradient, when there are 3 or more points. +- */ +- bool bAxial = (nColorCount >= 3); +- aGradient.Style = bAxial ? awt::GradientStyle_AXIAL : awt::GradientStyle_LINEAR; +- nDmlAngle = maGradientProps.moShadeAngle.get( 0 ) - nShapeRotation; +- // convert DrawingML angle (in 1/60000 degrees) to API angle (in 1/10 degrees) +- aGradient.Angle = static_cast< sal_Int16 >( (4500 - (nDmlAngle / (PER_DEGREE / 10))) % 3600 ); +- if( bAxial ) ++ // A copy of the gradient stops for local modification ++ GradientFillProperties::GradientStopMap aGradientStops(maGradientProps.maGradientStops); ++ ++ // Add a fake gradient stop at 0% and 100% if necessary, so that the gradient always starts ++ // at 0% and ends at 100%, to make following logic clearer (?). ++ if( aGradientStops.find(0.0) == aGradientStops.end() ) ++ { ++ // temp variable required ++ Color aFirstColor(aGradientStops.begin()->second); ++ aGradientStops[0.0] = aFirstColor; ++ } ++ ++ if( aGradientStops.find(1.0) == aGradientStops.end() ) ++ { ++ // ditto ++ Color aLastColor(aGradientStops.rbegin()->second); ++ aGradientStops[1.0] = aLastColor; ++ } ++ ++ // Check if the gradient is symmetric, which we will emulate with an "axial" gradient. ++ bool bSymmetric(true); ++ { ++ GradientFillProperties::GradientStopMap::const_iterator aItA( aGradientStops.begin() ); ++ GradientFillProperties::GradientStopMap::const_iterator aItZ( boost::prior( aGradientStops.end() ) ); ++ while( bSymmetric && aItA->first < aItZ->first ) ++ { ++ if( aItA->second.getColor( rGraphicHelper, nPhClr ) != aItZ->second.getColor( rGraphicHelper, nPhClr ) || ++ aItA->second.getTransparency() != aItZ->second.getTransparency() ) ++ bSymmetric = false; ++ else ++ { ++ aItA++; ++ aItZ = boost::prior(aItZ); ++ } ++ } ++ // Don't be fooled if the middlemost stop isn't at 0.5. ++ if( bSymmetric && aItA == aItZ && aItA->first != 0.5 ) ++ bSymmetric = false; ++ ++ // If symmetric, do the rest of the logic for just a half. ++ if( bSymmetric ) ++ { ++ // aItZ already points to the colour for the middle, but insert a fake stop at the ++ // exact middle if necessary. ++ if( aItA->first != aItZ->first ) ++ { ++ Color aMiddleColor = aItZ->second; ++ aGradientStops[0.5] = aMiddleColor; ++ } ++ // Drop the rest of the stops ++ while( aGradientStops.rbegin()->first > 0.5 ) ++ aGradientStops.erase( aGradientStops.rbegin()->first ); ++ } ++ } ++ ++ SAL_INFO("oox.drawingml.gradient", "symmetric: " << (bSymmetric ? "YES" : "NO") << ++ ", number of stops: " << aGradientStops.size()); ++ for (GradientFillProperties::GradientStopMap::iterator p(aGradientStops.begin()); ++ p != aGradientStops.end(); ++ p++) ++ SAL_INFO("oox.drawingml.gradient", " " << std::distance(aGradientStops.begin(), p) << ": " << ++ p->first << ": " << ++ std::hex << p->second.getColor( rGraphicHelper, nPhClr ) << std::dec << ++ "@" << (100-p->second.getTransparency()) << "%"); ++ ++ // Now estimate the simple LO style gradient (only two stops, at n% and 100%, where n == ++ // the "border") that best emulates the gradient between begin() and prior(end()). ++ ++ // First look for the largest segment in the gradient. ++ GradientFillProperties::GradientStopMap::iterator aIt(aGradientStops.begin()); ++ double nWidestWidth = -1; ++ GradientFillProperties::GradientStopMap::iterator aWidestSegmentStart; ++ aIt++; ++ while( aIt != aGradientStops.end() ) ++ { ++ if( aIt->first - boost::prior(aIt)->first > nWidestWidth ) ++ { ++ nWidestWidth = aIt->first - boost::prior(aIt)->first; ++ aWidestSegmentStart = boost::prior(aIt); ++ } ++ aIt++; ++ } ++ assert( nWidestWidth > 0 ); ++ ++ double nBorder = 0; ++ bool bSwap(false); ++ ++ // Do we have just two segments, and either one is of uniform colour, or three or more ++ // segments, and the widest one is the first or last one, and is it of uniform colour? If ++ // so, deduce the border from it, and drop that segment. ++ if( aGradientStops.size() == 3 && ++ aGradientStops.begin()->second.getColor( rGraphicHelper, nPhClr ) == boost::next(aGradientStops.begin())->second.getColor( rGraphicHelper, nPhClr ) && ++ aGradientStops.begin()->second.getTransparency() == boost::next(aGradientStops.begin())->second.getTransparency( ) ) ++ { ++ // Two segments, first is uniformly coloured ++ SAL_INFO("oox.drawingml.gradient", "two segments, first is uniformly coloured"); ++ nBorder = boost::next(aGradientStops.begin())->first - aGradientStops.begin()->first; ++ aGradientStops.erase(aGradientStops.begin()); ++ aWidestSegmentStart = aGradientStops.begin(); ++ } ++ else if( !bSymmetric && ++ aGradientStops.size() == 3 && ++ boost::next(aGradientStops.begin())->second.getColor( rGraphicHelper, nPhClr ) == boost::prior(aGradientStops.end())->second.getColor( rGraphicHelper, nPhClr ) && ++ boost::next(aGradientStops.begin())->second.getTransparency() == boost::prior(aGradientStops.end())->second.getTransparency( ) ) + { +- GradientFillProperties::GradientStopMap::const_iterator aIt = maGradientProps.maGradientStops.begin(); +- // Try to find the axial median +- for(size_t i=0;isecond.hasColor() kind would be better than Color != API_RGB_WHITE +- if( aGradient.StartColor == aGradient.EndColor && +- ( !aIt->second.hasTransparency() || aIt->second.getColor( rGraphicHelper, nPhClr ) != API_RGB_WHITE ) ) ++ // Two segments, second is uniformly coloured ++ SAL_INFO("oox.drawingml.gradient", "two segments, second is uniformly coloured"); ++ nBorder = boost::prior(aGradientStops.end())->first - boost::next(aGradientStops.begin())->first; ++ aGradientStops.erase(boost::next(aGradientStops.begin())); ++ aWidestSegmentStart = aGradientStops.begin(); ++ bSwap = true; ++ nShapeRotation = 180*60000 - nShapeRotation; ++ } ++ else if( !bSymmetric && ++ aGradientStops.size() >= 4 && ++ aWidestSegmentStart->second.getColor( rGraphicHelper, nPhClr ) == boost::next(aWidestSegmentStart)->second.getColor( rGraphicHelper, nPhClr ) && ++ aWidestSegmentStart->second.getTransparency() == boost::next(aWidestSegmentStart)->second.getTransparency() && ++ ( aWidestSegmentStart == aGradientStops.begin() || ++ boost::next(aWidestSegmentStart) == boost::prior( aGradientStops.end() ) ) ) ++ { ++ // Not symmetric, three or more segments, the widest is first or last and is uniformly coloured ++ SAL_INFO("oox.drawingml.gradient", "first or last segment is widest and is uniformly coloured"); ++ nBorder = boost::next(aWidestSegmentStart)->first - aWidestSegmentStart->first; ++ ++ // If it's the last segment that is uniformly coloured, rotate the gradient 180 ++ // degrees and swap start and end colours ++ if( boost::next(aWidestSegmentStart) == boost::prior( aGradientStops.end() ) ) + { +- aGradient.StartColor = aIt->second.getColor( rGraphicHelper, nPhClr ); ++ bSwap = true; ++ nShapeRotation = 180*60000 - nShapeRotation; + } + +- if( nStartTrans == nEndTrans && aIt->second.hasTransparency() ) +- nStartTrans = aIt->second.getTransparency()*255/100; ++ aGradientStops.erase( aWidestSegmentStart ); ++ ++ // Look for which is widest now ++ aIt = boost::next(aGradientStops.begin()); ++ nWidestWidth = -1; ++ while( aIt != aGradientStops.end() ) ++ { ++ if( aIt->first - boost::prior(aIt)->first > nWidestWidth ) ++ { ++ nWidestWidth = aIt->first - boost::prior(aIt)->first; ++ aWidestSegmentStart = boost::prior(aIt); ++ } ++ aIt++; ++ } ++ } ++ SAL_INFO("oox.drawingml.gradient", "widest segment start: " << aWidestSegmentStart->first << ", border: " << nBorder); ++ assert( (!bSymmetric && !bSwap) || !(bSymmetric && bSwap) ); ++ ++ // Now we have a potential border and a largest segment. Use those. ++ ++ aGradient.Style = bSymmetric ? awt::GradientStyle_AXIAL : awt::GradientStyle_LINEAR; ++ nDmlAngle = maGradientProps.moShadeAngle.get( 0 ) - nShapeRotation; ++ // convert DrawingML angle (in 1/60000 degrees) to API angle (in 1/10 degrees) ++ aGradient.Angle = static_cast< sal_Int16 >( (4500 - (nDmlAngle / (PER_DEGREE / 10))) % 3600 ); ++ Color aStartColor, aEndColor; ++ if( bSymmetric ) ++ { ++ aStartColor = boost::next(aWidestSegmentStart)->second; ++ aEndColor = aWidestSegmentStart->second; ++ nBorder *= 2; ++ } ++ else if( bSwap ) ++ { ++ aStartColor = boost::next(aWidestSegmentStart)->second; ++ aEndColor = aWidestSegmentStart->second; + } ++ else ++ { ++ aStartColor = aWidestSegmentStart->second; ++ aEndColor = boost::next(aWidestSegmentStart)->second; ++ } ++ ++ SAL_INFO("oox.drawingml.gradient", "start color: " << std::hex << aStartColor.getColor( rGraphicHelper, nPhClr ) << std::dec << ++ "@" << (100-aStartColor.getTransparency()) << "%" << ++ ", end color: " << std::hex << aEndColor.getColor( rGraphicHelper, nPhClr ) << std::dec << ++ "@" << (100-aEndColor.getTransparency()) << "%"); ++ ++ aGradient.StartColor = aStartColor.getColor( rGraphicHelper, nPhClr ); ++ aGradient.EndColor = aEndColor.getColor( rGraphicHelper, nPhClr ); ++ ++ if( aStartColor.hasTransparency() ) ++ nStartTrans = aStartColor.getTransparency()*255/100; ++ if( aEndColor.hasTransparency() ) ++ nEndTrans = aEndColor.getTransparency()*255/100; ++ ++ aGradient.Border = 100*nBorder; + } + + // push gradient or named gradient to property map +diff --git a/sd/qa/unit/data/xml/n819614_0.xml b/sd/qa/unit/data/xml/n819614_0.xml +index 3c0b5b1..e9e724c 100644 +--- a/sd/qa/unit/data/xml/n819614_0.xml ++++ b/sd/qa/unit/data/xml/n819614_0.xml +@@ -3346,7 +3346,7 @@ + + + +- ++ + + + +@@ -3411,7 +3411,7 @@ + + + +- ++ + + + +@@ -3476,7 +3476,7 @@ + + + +- ++ + + + +@@ -3606,7 +3606,7 @@ + + + +- ++ + + + +@@ -3671,7 +3671,7 @@ + + + +- ++ + + + +@@ -3736,7 +3736,7 @@ + + + +- ++ + + + +@@ -3801,7 +3801,7 @@ + + + +- ++ + + + +@@ -3866,7 +3866,7 @@ + + + +- ++ + + + +@@ -3931,7 +3931,7 @@ + + + +- ++ + + + +@@ -3996,7 +3996,7 @@ + + + +- ++ + + + +@@ -4061,7 +4061,7 @@ + + + +- ++ + + + +@@ -4126,7 +4126,7 @@ + + + +- ++ + + + +@@ -4191,7 +4191,7 @@ + + + +- ++ + + + +@@ -4256,7 +4256,7 @@ + + + +- ++ + + + +@@ -4321,7 +4321,7 @@ + + + +- ++ + + + +@@ -4386,7 +4386,7 @@ + + + +- ++ + + + +@@ -4451,7 +4451,7 @@ + + + +- ++ + + + +@@ -4516,7 +4516,7 @@ + + + +- ++ + + + +@@ -4581,7 +4581,7 @@ + + + +- ++ + + + +@@ -4646,7 +4646,7 @@ + + + +- ++ + + + +@@ -4711,7 +4711,7 @@ + + + +- ++ + + + +@@ -4776,7 +4776,7 @@ + + + +- ++ + + + +@@ -4841,7 +4841,7 @@ + + + +- ++ + + + +@@ -4906,7 +4906,7 @@ + + + +- ++ + + + +@@ -4971,7 +4971,7 @@ + + + +- ++ + + + +@@ -5036,7 +5036,7 @@ + + + +- ++ + + + +@@ -5101,7 +5101,7 @@ + + + +- ++ + + + +@@ -5166,7 +5166,7 @@ + + + +- ++ + + + +@@ -5231,7 +5231,7 @@ + + + +- ++ + + + +@@ -5296,7 +5296,7 @@ + + + +- ++ + + + +@@ -5361,7 +5361,7 @@ + + + +- ++ + + + +@@ -5426,7 +5426,7 @@ + + + +- ++ + + + +@@ -5491,7 +5491,7 @@ + + + +- ++ + + + +@@ -5621,7 +5621,7 @@ + + + +- ++ + + + +@@ -5751,7 +5751,7 @@ + + + +- ++ + + + +@@ -5816,7 +5816,7 @@ + + + +- ++ + + + +@@ -5881,7 +5881,7 @@ + + + +- ++ + + + +@@ -5946,7 +5946,7 @@ + + + +- ++ + + + +@@ -6011,7 +6011,7 @@ + + + +- ++ + + + +@@ -6076,7 +6076,7 @@ + + + +- ++ + + + +@@ -6141,7 +6141,7 @@ + + + +- ++ + + + +@@ -6206,7 +6206,7 @@ + + + +- ++ + + + +@@ -6271,7 +6271,7 @@ + + + +- ++ + + + +@@ -6336,7 +6336,7 @@ + + + +- ++ + + + +@@ -6401,7 +6401,7 @@ + + + +- ++ + + + +@@ -6466,7 +6466,7 @@ + + + +- ++ + + + +@@ -6596,7 +6596,7 @@ + + + +- ++ + + + +@@ -6661,7 +6661,7 @@ + + + +- ++ + + + +@@ -6726,7 +6726,7 @@ + + + +- ++ + + + +@@ -6791,7 +6791,7 @@ + + + +- ++ + + + +@@ -6856,7 +6856,7 @@ + + + +- ++ + + + +-- +1.9.3 + diff --git a/SOURCES/0027-Do-not-prefer-bandRow-over-firstCol-lastCol-nor-the-.patch b/SOURCES/0027-Do-not-prefer-bandRow-over-firstCol-lastCol-nor-the-.patch new file mode 100644 index 0000000..2e13d51 --- /dev/null +++ b/SOURCES/0027-Do-not-prefer-bandRow-over-firstCol-lastCol-nor-the-.patch @@ -0,0 +1,44 @@ +From 087eb8031b444d62a10d744e7b5983f97c59883c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Mat=C3=BA=C5=A1=20Kukan?= +Date: Tue, 15 Jul 2014 11:28:30 +0200 +Subject: [PATCH 027/137] Do not prefer bandRow over firstCol/lastCol, nor the + same with bandCol. + +Change-Id: I0c573d721212c870e9ecc99ba5e8494073e09aaf +(cherry picked from commit 5d2f12a44d2af3e42e0c3a17ff556f5ada27b1b8) +Reviewed-on: https://gerrit.libreoffice.org/10330 +Reviewed-by: Andras Timar +Tested-by: Andras Timar +--- + oox/source/drawingml/table/tablecell.cxx | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/oox/source/drawingml/table/tablecell.cxx b/oox/source/drawingml/table/tablecell.cxx +index c3c4f49..1bb6241 100644 +--- a/oox/source/drawingml/table/tablecell.cxx ++++ b/oox/source/drawingml/table/tablecell.cxx +@@ -228,7 +228,9 @@ void TableCell::pushToXCell( const ::oox::core::XmlFilterBase& rFilterBase, ::oo + if ( rProperties.isBandRow() ) + { + if ( ( !rProperties.isFirstRow() || ( nRow != 0 ) ) && +- ( !rProperties.isLastRow() || ( nRow != nMaxRow ) ) ) ++ ( !rProperties.isLastRow() || ( nRow != nMaxRow ) ) && ++ ( !rProperties.isFirstCol() || ( nColumn != 0 ) ) && ++ ( !rProperties.isLastCol() || ( nColumn != nMaxColumn ) ) ) + { + sal_Int32 nBand = nRow; + if ( rProperties.isFirstRow() ) +@@ -303,7 +305,9 @@ void TableCell::pushToXCell( const ::oox::core::XmlFilterBase& rFilterBase, ::oo + } + if ( rProperties.isBandCol() ) + { +- if ( ( !rProperties.isFirstCol() || ( nColumn != 0 ) ) && ++ if ( ( !rProperties.isFirstRow() || ( nRow != 0 ) ) && ++ ( !rProperties.isLastRow() || ( nRow != nMaxRow ) ) && ++ ( !rProperties.isFirstCol() || ( nColumn != 0 ) ) && + ( !rProperties.isLastCol() || ( nColumn != nMaxColumn ) ) ) + { + sal_Int32 nBand = nColumn; +-- +1.9.3 + diff --git a/SOURCES/0028-bnc-887225-OOXML-import-Correctly-apply-table-style-.patch b/SOURCES/0028-bnc-887225-OOXML-import-Correctly-apply-table-style-.patch new file mode 100644 index 0000000..8b60d6b --- /dev/null +++ b/SOURCES/0028-bnc-887225-OOXML-import-Correctly-apply-table-style-.patch @@ -0,0 +1,33 @@ +From ed4cbd4f6726dcae80bf8b42bee97e5bcf465502 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Mat=C3=BA=C5=A1=20Kukan?= +Date: Tue, 15 Jul 2014 10:58:51 +0200 +Subject: [PATCH 028/137] bnc#887225: OOXML import: Correctly apply table style + for lastRow. + +nMaxColumn and nMaxRow are indexes, so use size() - 1. + +Change-Id: I20055e55cf2464710fe553fb8067bad13a339084 +(cherry picked from commit 47645734c350f244b4a5642a709132ca1b7dc75d) +Reviewed-on: https://gerrit.libreoffice.org/10329 +Reviewed-by: Andras Timar +Tested-by: Andras Timar +--- + oox/source/drawingml/table/tableproperties.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/oox/source/drawingml/table/tableproperties.cxx b/oox/source/drawingml/table/tableproperties.cxx +index 74b0b91..43e4b1f 100644 +--- a/oox/source/drawingml/table/tableproperties.cxx ++++ b/oox/source/drawingml/table/tableproperties.cxx +@@ -288,7 +288,7 @@ void TableProperties::pushToPropSet( const ::oox::core::XmlFilterBase& rFilterBa + + Reference< XCellRange > xCellRange( xTable, UNO_QUERY_THROW ); + rTableCell.pushToXCell( rFilterBase, pMasterTextListStyle, xCellRange->getCellByPosition( nColumn, nRow ), *this, rTableStyle, +- nColumn, aTableRowIter->getTableCells().size(), nRow, mvTableRows.size() ); ++ nColumn, aTableRowIter->getTableCells().size()-1, nRow, mvTableRows.size()-1 ); + } + } + } +-- +1.9.3 + diff --git a/SOURCES/0029-fdo-71434-don-t-show-master-text-if-PlaceHolder-type.patch b/SOURCES/0029-fdo-71434-don-t-show-master-text-if-PlaceHolder-type.patch deleted file mode 100644 index 2fe0d3f..0000000 --- a/SOURCES/0029-fdo-71434-don-t-show-master-text-if-PlaceHolder-type.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 0f4a452be3342d0206d6724faf170fa2786a7777 Mon Sep 17 00:00:00 2001 -From: Korrawit Pruegsanusak -Date: Tue, 26 Nov 2013 22:31:51 +0700 -Subject: [PATCH 029/109] fdo#71434: don't show master text if PlaceHolder - types defined - -I've added all of valid PlaceHolder types from -http://www.schemacentral.com/sc/ooxml/t-p_ST_PlaceholderType.html - -(cherry picked from commit bb1213a740b3b3b2b1967639939dd7a72c6d4237) - -Change-Id: I038fe43ff83699f92ff5eb9945bce12540058478 -Reviewed-on: https://gerrit.libreoffice.org/6821 -Reviewed-by: Muthu Subramanian K -Tested-by: Muthu Subramanian K -Reviewed-by: Thorsten Behrens -Tested-by: Thorsten Behrens ---- - oox/source/ppt/pptgraphicshapecontext.cxx | 23 ++++++++++++++++++++--- - 1 file changed, 20 insertions(+), 3 deletions(-) - -diff --git a/oox/source/ppt/pptgraphicshapecontext.cxx b/oox/source/ppt/pptgraphicshapecontext.cxx -index e21b9a1..fec7785 100644 ---- a/oox/source/ppt/pptgraphicshapecontext.cxx -+++ b/oox/source/ppt/pptgraphicshapecontext.cxx -@@ -149,9 +149,26 @@ Reference< XFastContextHandler > PPTGraphicShapeContext::createFastChildContext( - if ( pPlaceholder.get() ) - { - bool bUseText = true; -- // TODO: Check if pPlaceholder->getSubType is none (i.e. none explicitly specified) -- if( pPlaceholder->getSubType() == XML_obj ) -- bUseText = false; -+ switch( pPlaceholder->getSubType() ) -+ { -+ case XML_title : -+ case XML_body : -+ case XML_ctrTitle : -+ case XML_subTitle : -+ case XML_dt : -+ case XML_sldNum : -+ case XML_ftr : -+ case XML_hdr : -+ case XML_obj : -+ case XML_chart : -+ case XML_tbl : -+ case XML_clipArt : -+ case XML_dgm : -+ case XML_media : -+ case XML_sldImg : -+ case XML_pic : -+ bUseText = false; -+ } - mpShapePtr->applyShapeReference( *pPlaceholder.get(), bUseText ); - PPTShape* pPPTShape = dynamic_cast< PPTShape* >( pPlaceholder.get() ); - if ( pPPTShape ) --- -1.8.4.2 - diff --git a/SOURCES/0029-fdo-81470-Fix-a-crasher-during-xlsx-export-with-revi.patch b/SOURCES/0029-fdo-81470-Fix-a-crasher-during-xlsx-export-with-revi.patch new file mode 100644 index 0000000..c38e1d6 --- /dev/null +++ b/SOURCES/0029-fdo-81470-Fix-a-crasher-during-xlsx-export-with-revi.patch @@ -0,0 +1,40 @@ +From c7727b1c1682a1373668c898a2de1b1627a09d8c Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Thu, 17 Jul 2014 15:52:52 -0400 +Subject: [PATCH 029/137] fdo#81470: Fix a crasher during xlsx export with + revisions. + +Calling Undo() here removes revision entries which also removes formula +cell instances stored in the entries. The problem is that the +XclExpChTrCellContent instances store pointers to these formula instances +for later use, and removing the entries at this location causes deleted +formula instances to get accessed which in turn causes segfault. + +Since all revision entries get deleted when the temp change track instance +gets deleted at the end of the revision export, not deleting the entries +here will not cause memory leaks. + +Change-Id: I85f8064945a841b684e4fc4a97c3f9bb6a2de353 +(cherry picked from commit 3bce16799c34d0b28704c43eae77501c0f6aec1e) +Reviewed-on: https://gerrit.libreoffice.org/10371 +Reviewed-by: Markus Mohrhard +Tested-by: Markus Mohrhard +--- + sc/source/filter/xcl97/XclExpChangeTrack.cxx | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/sc/source/filter/xcl97/XclExpChangeTrack.cxx b/sc/source/filter/xcl97/XclExpChangeTrack.cxx +index 7033b3e..4589aea 100644 +--- a/sc/source/filter/xcl97/XclExpChangeTrack.cxx ++++ b/sc/source/filter/xcl97/XclExpChangeTrack.cxx +@@ -1443,7 +1443,6 @@ XclExpChangeTrack::XclExpChangeTrack( const XclExpRoot& rRoot ) : + { + PushActionRecord( *pScAction ); + const ScChangeAction* pPrevAction = pScAction->GetPrev(); +- pTempChangeTrack->Undo( pScAction->GetActionNumber(), pScAction->GetActionNumber() ); + pScAction = pPrevAction; + } + +-- +1.9.3 + diff --git a/SOURCES/0031-use-rtl-math-round-here-to-get-the-same-number-on-32.patch b/SOURCES/0031-use-rtl-math-round-here-to-get-the-same-number-on-32.patch new file mode 100644 index 0000000..3dfd8f2 --- /dev/null +++ b/SOURCES/0031-use-rtl-math-round-here-to-get-the-same-number-on-32.patch @@ -0,0 +1,41 @@ +From 008f5ba99fd89cd6a6e4db90e8db16e02fe0b027 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Mat=C3=BA=C5=A1=20Kukan?= +Date: Fri, 18 Jul 2014 10:04:09 +0200 +Subject: [PATCH 031/137] use rtl::math::round here to get the same number on + 32/64bit platforms + +This fixes sd_import_tests where 100*0.35 was 34 on 32bit platform. + +Change-Id: I45705326e91892beb814bd94e074b0a652709768 +(cherry picked from commit ba6da9545764f2545313ba085ed4a096165180fd) +Reviewed-on: https://gerrit.libreoffice.org/10382 +Reviewed-by: Markus Mohrhard +Tested-by: Markus Mohrhard +--- + oox/source/drawingml/fillproperties.cxx | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx +index a5eb026..a81a5d2 100644 +--- a/oox/source/drawingml/fillproperties.cxx ++++ b/oox/source/drawingml/fillproperties.cxx +@@ -37,6 +37,7 @@ + #include "oox/drawingml/drawingmltypes.hxx" + #include "oox/drawingml/shapepropertymap.hxx" + #include "oox/token/tokens.hxx" ++#include + + using namespace ::com::sun::star; + using namespace ::com::sun::star::drawing; +@@ -567,7 +568,7 @@ void FillProperties::pushToPropMap( ShapePropertyMap& rPropMap, + if( aEndColor.hasTransparency() ) + nEndTrans = aEndColor.getTransparency()*255/100; + +- aGradient.Border = 100*nBorder; ++ aGradient.Border = rtl::math::round(100*nBorder); + } + + // push gradient or named gradient to property map +-- +1.9.3 + diff --git a/SOURCES/0032-write-valid-dxf-record-related-fdo-71971.patch b/SOURCES/0032-write-valid-dxf-record-related-fdo-71971.patch deleted file mode 100644 index 054c7f2..0000000 --- a/SOURCES/0032-write-valid-dxf-record-related-fdo-71971.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 99643319b62c3673b57f31d61a4619625747a444 Mon Sep 17 00:00:00 2001 -From: Markus Mohrhard -Date: Sat, 30 Nov 2013 06:50:50 +0100 -Subject: [PATCH 032/109] write valid dxf record, related fdo#71971 - -Change-Id: I99f4dfca78cc0fd5d9b947000a99f8414c2a899b -(cherry picked from commit 7415fc31f5cdf7ff3f78dd304b9576b931a82aeb) -Reviewed-on: https://gerrit.libreoffice.org/6878 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - sc/source/filter/excel/xestyle.cxx | 12 ++++++------ - 1 file changed, 6 insertions(+), 6 deletions(-) - -diff --git a/sc/source/filter/excel/xestyle.cxx b/sc/source/filter/excel/xestyle.cxx -index 3186cda..486481a 100644 ---- a/sc/source/filter/excel/xestyle.cxx -+++ b/sc/source/filter/excel/xestyle.cxx -@@ -3021,18 +3021,18 @@ void XclExpDxf::SaveXml( XclExpXmlStream& rStrm ) - sax_fastparser::FSHelperPtr& rStyleSheet = rStrm.GetCurrentStream(); - rStyleSheet->startElement( XML_dxf, FSEND ); - -- if (mpAlign) -- mpAlign->SaveXml(rStrm); -- if (mpBorder) -- mpBorder->SaveXml(rStrm); - if (mpFont) - mpFont->SaveXml(rStrm); - if (mpNumberFmt) - mpNumberFmt->SaveXml(rStrm); -- if (mpProt) -- mpProt->SaveXml(rStrm); - if (mpColor) - mpColor->SaveXml(rStrm); -+ if (mpAlign) -+ mpAlign->SaveXml(rStrm); -+ if (mpBorder) -+ mpBorder->SaveXml(rStrm); -+ if (mpProt) -+ mpProt->SaveXml(rStrm); - rStyleSheet->endElement( XML_dxf ); - } - --- -1.8.4.2 - diff --git a/SOURCES/0033-bnc-887230-always-use-theme-color-for-hyperlinks-in-.patch b/SOURCES/0033-bnc-887230-always-use-theme-color-for-hyperlinks-in-.patch new file mode 100644 index 0000000..931d5ce --- /dev/null +++ b/SOURCES/0033-bnc-887230-always-use-theme-color-for-hyperlinks-in-.patch @@ -0,0 +1,32 @@ +From 6786bb6571c2d84cdfb2c09ff739c512459e4367 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Mat=C3=BA=C5=A1=20Kukan?= +Date: Fri, 18 Jul 2014 09:23:17 +0200 +Subject: [PATCH 033/137] bnc#887230: always use theme color for hyperlinks in + Impress + +Change-Id: I888f107c61037162439ad2d1ba99ad8185532f71 +(cherry picked from commit 92f74f6ccb5a55807724db85815f7ea0c49370e0) +Reviewed-on: https://gerrit.libreoffice.org/10383 +Reviewed-by: Andras Timar +Tested-by: Andras Timar +--- + oox/source/drawingml/textrun.cxx | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/oox/source/drawingml/textrun.cxx b/oox/source/drawingml/textrun.cxx +index c4648c2..6c5259e 100644 +--- a/oox/source/drawingml/textrun.cxx ++++ b/oox/source/drawingml/textrun.cxx +@@ -140,8 +140,7 @@ sal_Int32 TextRun::insertAt( + + xTextFieldCursor->gotoEnd( sal_True ); + +- if ( !maTextCharacterProperties.maCharColor.isUsed() ) +- aTextCharacterProps.maCharColor.setSchemeClr( XML_hlink ); ++ aTextCharacterProps.maCharColor.setSchemeClr( XML_hlink ); + if ( !maTextCharacterProperties.moUnderline.has() ) + aTextCharacterProps.moUnderline.set( XML_sng ); + +-- +1.9.3 + diff --git a/SOURCES/0035-related-fdo-78502-writerfilter-RTF-import-fix-invali.patch b/SOURCES/0035-related-fdo-78502-writerfilter-RTF-import-fix-invali.patch new file mode 100644 index 0000000..6efeee7 --- /dev/null +++ b/SOURCES/0035-related-fdo-78502-writerfilter-RTF-import-fix-invali.patch @@ -0,0 +1,36 @@ +From e7bd0484228beb4529e84742faf56f813dca495a Mon Sep 17 00:00:00 2001 +From: Michael Stahl +Date: Fri, 18 Jul 2014 22:07:02 +0200 +Subject: [PATCH 035/137] (related: fdo#78502) writerfilter: RTF import: fix + invalid string copy +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +... in leveltext destination. + +Change-Id: I74de6d14170130bf33923854a0c9851dc7cc390f +(cherry picked from commit b94bd40b915ab32d18d43fc60dfda932e4e00ca8) +Reviewed-on: https://gerrit.libreoffice.org/10397 +Reviewed-by: Caolán McNamara +Tested-by: Caolán McNamara +--- + writerfilter/source/rtftok/rtfdocumentimpl.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx +index 66abe80..73eb3f2 100644 +--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx ++++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx +@@ -4278,7 +4278,7 @@ int RTFDocumentImpl::popState() + // The first character is the length of the string (the rest should be ignored). + sal_Int32 nLength(aStr.toChar()); + OUString aValue; +- if (nLength <= aStr.getLength()) ++ if (nLength < aStr.getLength()) + aValue = aStr.copy(1, nLength); + else + aValue = aStr; +-- +1.9.3 + diff --git a/SOURCES/0036-EMF-Do-not-ignore-source-rectangle-of-the-image-to-b.patch b/SOURCES/0036-EMF-Do-not-ignore-source-rectangle-of-the-image-to-b.patch deleted file mode 100644 index bf7f7a3..0000000 --- a/SOURCES/0036-EMF-Do-not-ignore-source-rectangle-of-the-image-to-b.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 6bd555fd034582352dca98266f600340ade1895e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Mat=C3=BA=C5=A1=20Kukan?= -Date: Wed, 4 Dec 2013 16:57:34 +0100 -Subject: [PATCH 036/109] EMF+: Do not ignore source rectangle of the image to - be rendered. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Change-Id: I4f861c7653c89d8f1ca73696e885f33f7bfc3b06 -Reviewed-on: https://gerrit.libreoffice.org/6932 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - cppcanvas/source/mtfrenderer/emfplus.cxx | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx -index bf9720b..2387934 100644 ---- a/cppcanvas/source/mtfrenderer/emfplus.cxx -+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx -@@ -1862,6 +1862,7 @@ namespace cppcanvas - sal_Int32 aCount; - - ReadRectangle (rMF, sx, sy, sw, sh); -+ Rectangle aSource(Point(sx, sy), Size(sw, sh)); - - SAL_INFO("cppcanvas.emf", "EMF+ " << (type == EmfPlusRecordTypeDrawImagePoints ? "DrawImagePoints" : "DrawImage") << " source rectangle: " << sx << "," << sy << " " << sw << "x" << sh); - -@@ -1902,6 +1903,7 @@ namespace cppcanvas - - if (bValid) { - BitmapEx aBmp( image.graphic.GetBitmapEx () ); -+ aBmp.Crop( aSource ); - - Size aSize( aBmp.GetSizePixel() ); - SAL_INFO("cppcanvas.emf", "EMF+ bitmap size: " << aSize.Width() << "x" << aSize.Height()); --- -1.8.4.2 - diff --git a/SOURCES/0036-fdo-79676-Fix-the-Java-UNO-API-test-with-regard-to-c.patch b/SOURCES/0036-fdo-79676-Fix-the-Java-UNO-API-test-with-regard-to-c.patch new file mode 100644 index 0000000..e760e22 --- /dev/null +++ b/SOURCES/0036-fdo-79676-Fix-the-Java-UNO-API-test-with-regard-to-c.patch @@ -0,0 +1,65 @@ +From d19c216f191ca13b7895b69cd5790d526aec2bb5 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Tue, 10 Jun 2014 09:36:54 -0400 +Subject: [PATCH 036/137] fdo#79676: Fix the Java UNO API test with regard to + chart tests. + +The Java tests rely on the "undocumented" behavior that, when loading an empty +chart document, the chart automaticallly created a "default chart" which is a +column chart with many of its properties filled. Unfortunately this behavior +caused ugly side effects when loading documents with charts via flat ODF +filter. + +I believe fixing the test this way is the right fix. + +Change-Id: If3e6c8979da9d0731346ebeedc23c0d3363e83fd +(cherry picked from commit d44b58beed743871df03909e7d9545e488f3d7c8) +Signed-off-by: Michael Stahl +--- + qadevOOo/runner/util/SOfficeFactory.java | 9 +++++++-- + sfx2/qa/complex/sfx2/undo/ChartDocumentTest.java | 4 ++++ + 2 files changed, 11 insertions(+), 2 deletions(-) + +diff --git a/qadevOOo/runner/util/SOfficeFactory.java b/qadevOOo/runner/util/SOfficeFactory.java +index 2a0f0ed..f464ea8 100644 +--- a/qadevOOo/runner/util/SOfficeFactory.java ++++ b/qadevOOo/runner/util/SOfficeFactory.java +@@ -225,7 +225,12 @@ public class SOfficeFactory { + + if (oDoc != null) { + DesktopTools.bringWindowToFront(oDoc); +- return UnoRuntime.queryInterface(XChartDocument.class, oDoc); ++ XChartDocument xChartDoc = UnoRuntime.queryInterface(XChartDocument.class, oDoc); ++ // Create a default chart which many chart tests rely on. ++ com.sun.star.chart2.XChartDocument xCD2 = ++ UnoRuntime.queryInterface(com.sun.star.chart2.XChartDocument.class, oDoc); ++ xCD2.createDefaultChart(); ++ return xChartDoc; + } else { + return null; + } +@@ -616,4 +621,4 @@ public class SOfficeFactory { + } + return null; + } // finish queryXServiceInfo +-} +\ No newline at end of file ++} +diff --git a/sfx2/qa/complex/sfx2/undo/ChartDocumentTest.java b/sfx2/qa/complex/sfx2/undo/ChartDocumentTest.java +index 3eb7d4e..75981d7 100644 +--- a/sfx2/qa/complex/sfx2/undo/ChartDocumentTest.java ++++ b/sfx2/qa/complex/sfx2/undo/ChartDocumentTest.java +@@ -74,6 +74,10 @@ public class ChartDocumentTest implements DocumentTest + + // retrieve the chart model + XChartDocument chartDoc = UnoRuntime.queryInterface( XChartDocument.class, shapeProps.getPropertyValue( "Model" ) ); ++ // insert default chart for the test to use. ++ com.sun.star.chart2.XChartDocument xCD2 = ++ UnoRuntime.queryInterface(com.sun.star.chart2.XChartDocument.class, chartDoc); ++ xCD2.createDefaultChart(); + m_chartDocument = new OfficeDocument( i_orb, chartDoc ); + + // actually activate the object +-- +1.9.3 + diff --git a/SOURCES/0038-EMF-force-canvas-if-EMF-comments-are-used.patch b/SOURCES/0038-EMF-force-canvas-if-EMF-comments-are-used.patch deleted file mode 100644 index 8d92365..0000000 --- a/SOURCES/0038-EMF-force-canvas-if-EMF-comments-are-used.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 2f641a7d37fd7fb80286be5a37778c41ac834d93 Mon Sep 17 00:00:00 2001 -From: "Andrzej J.R. Hunt" -Date: Thu, 5 Dec 2013 11:36:53 +0000 -Subject: [PATCH 038/109] EMF+: force canvas if EMF+ comments are used. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Without this the drawinglayer renderer is used, whereas -only the canvas renderer supports EMF+. - -Change-Id: Id8a10e400e08c1913e7d6864a51f7b73fc9be437 -(cherry picked from commit be7d87bea2611eb316b9b379aebc031179d4f794) -Reviewed-on: https://gerrit.libreoffice.org/6940 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - vcl/source/gdi/gdimtf.cxx | 7 +++++++ - 1 file changed, 7 insertions(+) - -diff --git a/vcl/source/gdi/gdimtf.cxx b/vcl/source/gdi/gdimtf.cxx -index f5666a6..1240500 100644 ---- a/vcl/source/gdi/gdimtf.cxx -+++ b/vcl/source/gdi/gdimtf.cxx -@@ -2765,6 +2765,13 @@ SvStream& operator>>( SvStream& rIStm, GDIMetaFile& rGDIMetaFile ) - { - pAction = MetaAction::ReadMetaAction( rIStm, &aReadData ); - -+ if (pAction->GetType() == META_COMMENT_ACTION) -+ { -+ MetaCommentAction* pCommentAct = static_cast(pAction); -+ if ( pCommentAct->GetComment() == "EMF_PLUS" ) -+ rGDIMetaFile.UseCanvas( sal_True ); -+ } -+ - if( pAction ) - rGDIMetaFile.AddAction( pAction ); - } --- -1.8.4.2 - diff --git a/SOURCES/0038-bool-improvements.patch b/SOURCES/0038-bool-improvements.patch new file mode 100644 index 0000000..4262f1e --- /dev/null +++ b/SOURCES/0038-bool-improvements.patch @@ -0,0 +1,197 @@ +From eb758877fb799111673b909e73065cb6d966881a Mon Sep 17 00:00:00 2001 +From: Stephan Bergmann +Date: Tue, 28 Jan 2014 20:00:40 +0100 +Subject: [PATCH 038/137] bool improvements + +Change-Id: I7ae2b02e435d21390843c6c56877a8ce3a73f9f2 +(cherry picked from commit bd4053f895167978978023309925c85c3826b31a) +Signed-off-by: Michael Stahl +--- + sal/osl/all/debugbase.cxx | 2 +- + sal/qa/osl/file/osl_File.cxx | 4 ++-- + sal/qa/osl/module/osl_Module.cxx | 8 ++++---- + sal/qa/osl/mutex/osl_Mutex.cxx | 2 +- + sal/qa/osl/process/osl_Thread.cxx | 2 +- + sal/qa/osl/security/osl_Security.cxx | 2 +- + sal/rtl/alloc_global.cxx | 6 +++--- + sal/rtl/hash.cxx | 4 ++-- + sal/rtl/uri.cxx | 2 +- + 9 files changed, 16 insertions(+), 16 deletions(-) + +diff --git a/sal/osl/all/debugbase.cxx b/sal/osl/all/debugbase.cxx +index 8bc0c46..57238ce 100644 +--- a/sal/osl/all/debugbase.cxx ++++ b/sal/osl/all/debugbase.cxx +@@ -32,7 +32,7 @@ + { \ + if (!(c) && _OSL_GLOBAL osl_assertFailedLine(f, l, m)) \ + _OSL_GLOBAL osl_breakDebug(); \ +- } while (0) ++ } while (false) + #define DEBUGBASE_ENSURE(c, m) DEBUGBASE_ENSURE_(c, OSL_THIS_FILE, __LINE__, m) + + namespace { +diff --git a/sal/qa/osl/file/osl_File.cxx b/sal/qa/osl/file/osl_File.cxx +index 43f255c..54055fe 100644 +--- a/sal/qa/osl/file/osl_File.cxx ++++ b/sal/qa/osl/file/osl_File.cxx +@@ -2587,7 +2587,7 @@ namespace osl_FileStatus + ::osl::FileBase::RC nError1 = testDirectory.open(); + ::rtl::OUString aFileName ("link.file"); + sal_Bool bOk = sal_False; +- while (1) { ++ while (true) { + nError1 = testDirectory.getNextItem( rItem_link, 4 ); + if (::osl::FileBase::E_None == nError1) { + sal_uInt32 mask_link = osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_LinkTargetURL; +@@ -5639,7 +5639,7 @@ namespace osl_Directory + CPPUNIT_ASSERT( ::osl::FileBase::E_None == nError1 ); + ::rtl::OUString aFileName ("link.file"); + +- while (1) { ++ while (true) { + nError1 = testDirectory.getNextItem( rItem, 4 ); + if (::osl::FileBase::E_None == nError1) { + ::osl::FileStatus rFileStatus( osl_FileStatus_Mask_FileName | osl_FileStatus_Mask_Type ); +diff --git a/sal/qa/osl/module/osl_Module.cxx b/sal/qa/osl/module/osl_Module.cxx +index d6358d4..ee547fb 100644 +--- a/sal/qa/osl/module/osl_Module.cxx ++++ b/sal/qa/osl/module/osl_Module.cxx +@@ -189,7 +189,7 @@ namespace osl_Module + + if ( !( bRes ) ) + { +- CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.", sal_False ); ++ CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.", false ); + } + + ::osl::Module aMod( aFileURL ); +@@ -221,7 +221,7 @@ namespace osl_Module + bRes = osl::Module::getUrlFromAddress( ( void* ) &::osl_Module::testClass::myFunc, aFileURL ) ; + if ( !( bRes ) ) + { +- CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.", sal_False ); ++ CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.", false ); + } + + CPPUNIT_ASSERT_MESSAGE( "#test comment#: test get Module URL from address.", +@@ -239,7 +239,7 @@ namespace osl_Module + bRes = osl::Module::getUrlFromAddress( ( void* )pFunc, aFileURL ); + if ( !( bRes ) ) + { +- CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.", sal_False ); ++ CPPUNIT_ASSERT_MESSAGE("Cannot locate current module.", false ); + } + aMod.unload( ); + +@@ -325,7 +325,7 @@ namespace osl_Module + bRes = osl::Module::getUrlFromAddress( ( void* ) &::osl_Module::testClass::myFunc, aFileURL ); + if ( !( bRes ) ) + { +- CPPUNIT_ASSERT_MESSAGE("Cannot locate current module - using executable instead", sal_False ); ++ CPPUNIT_ASSERT_MESSAGE("Cannot locate current module - using executable instead", false ); + } + + ::osl::Module aMod; +diff --git a/sal/qa/osl/mutex/osl_Mutex.cxx b/sal/qa/osl/mutex/osl_Mutex.cxx +index 0e9ce85..3f86f9c 100644 +--- a/sal/qa/osl/mutex/osl_Mutex.cxx ++++ b/sal/qa/osl/mutex/osl_Mutex.cxx +@@ -732,7 +732,7 @@ namespace osl_ClearableGuard + // wait 1 second to assure the child thread has begun + ThreadHelper::thread_sleep(1); + +- while (1) ++ while (true) + { + if (aMutex.tryToAcquire() == sal_True) + { +diff --git a/sal/qa/osl/process/osl_Thread.cxx b/sal/qa/osl/process/osl_Thread.cxx +index 3e394aa..aeab4e9 100644 +--- a/sal/qa/osl/process/osl_Thread.cxx ++++ b/sal/qa/osl/process/osl_Thread.cxx +@@ -626,7 +626,7 @@ namespace osl_Thread + void suspendCountThread(OCountThread* _pCountThread) + { + sal_Int32 nValue = 0; +- while (1) ++ while (true) + { + nValue = _pCountThread->getValue(); + if (nValue >= 3) +diff --git a/sal/qa/osl/security/osl_Security.cxx b/sal/qa/osl/security/osl_Security.cxx +index e9ad1a7..3ad78b0 100644 +--- a/sal/qa/osl/security/osl_Security.cxx ++++ b/sal/qa/osl/security/osl_Security.cxx +@@ -280,7 +280,7 @@ namespace osl_Security + { + ::osl::Security aSec; + osl_unloadUserProfile(aSec.getHandle()); +- CPPUNIT_ASSERT_MESSAGE( "empty function.", sal_True ); ++ CPPUNIT_ASSERT_MESSAGE( "empty function.", true ); + } + + CPPUNIT_TEST_SUITE( UserProfile ); +diff --git a/sal/rtl/alloc_global.cxx b/sal/rtl/alloc_global.cxx +index 8194b13..07cded3 100644 +--- a/sal/rtl/alloc_global.cxx ++++ b/sal/rtl/alloc_global.cxx +@@ -291,7 +291,7 @@ void* SAL_CALL rtl_allocateMemory (sal_Size n) SAL_THROW_EXTERN_C() + n >= SAL_MAX_INT32, "sal.rtl", + "suspicious massive alloc " << n); + #if !defined(FORCE_SYSALLOC) +- while (1) ++ while (true) + { + if (alloc_mode == AMode_CUSTOM) + { +@@ -314,7 +314,7 @@ void* SAL_CALL rtl_reallocateMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C() + n >= SAL_MAX_INT32, "sal.rtl", + "suspicious massive alloc " << n); + #if !defined(FORCE_SYSALLOC) +- while (1) ++ while (true) + { + if (alloc_mode == AMode_CUSTOM) + { +@@ -334,7 +334,7 @@ void* SAL_CALL rtl_reallocateMemory (void * p, sal_Size n) SAL_THROW_EXTERN_C() + void SAL_CALL rtl_freeMemory (void * p) SAL_THROW_EXTERN_C() + { + #if !defined(FORCE_SYSALLOC) +- while (1) ++ while (true) + { + if (alloc_mode == AMode_CUSTOM) + { +diff --git a/sal/rtl/hash.cxx b/sal/rtl/hash.cxx +index 823e56a..47e8681 100644 +--- a/sal/rtl/hash.cxx ++++ b/sal/rtl/hash.cxx +@@ -139,9 +139,9 @@ static int + compareEqual (rtl_uString *pStringA, rtl_uString *pStringB) + { + if (pStringA == pStringB) +- return 1; ++ return true; + if (pStringA->length != pStringB->length) +- return 0; ++ return false; + return !rtl_ustr_compare_WithLength( pStringA->buffer, pStringA->length, + pStringB->buffer, pStringB->length); + } +diff --git a/sal/rtl/uri.cxx b/sal/rtl/uri.cxx +index 7e4402f..513fb51 100644 +--- a/sal/rtl/uri.cxx ++++ b/sal/rtl/uri.cxx +@@ -142,7 +142,7 @@ sal_uInt32 readUcs4(sal_Unicode const ** pBegin, sal_Unicode const * pEnd, + || nWeight1 > 11 + || (nWeight2 = getHexWeight(p[2])) < 0) + { +- bUTF8 = sal_False; ++ bUTF8 = false; + break; + } + p += 3; +-- +1.9.3 + diff --git a/SOURCES/0039-Adapt-to-sal-log.hxx.patch b/SOURCES/0039-Adapt-to-sal-log.hxx.patch new file mode 100644 index 0000000..a86f94b --- /dev/null +++ b/SOURCES/0039-Adapt-to-sal-log.hxx.patch @@ -0,0 +1,84 @@ +From e5285e0186a1e45e3c12f6775f8ef24bccb9a871 Mon Sep 17 00:00:00 2001 +From: Stephan Bergmann +Date: Tue, 25 Mar 2014 12:18:05 +0100 +Subject: [PATCH 039/137] Adapt to sal/log.hxx + +(cherry picked from commit 3c5d30c03b4b2d2c4d38d602afc839e7a922bca3) +Signed-off-by: Michael Stahl + +Note: this avoids an abort() in smoketest due to leaking +SvxUnoTextRangeBase + +Change-Id: I9c59495977e111d94077470f07591c91fa3c1665 +--- + sal/osl/all/debugbase.cxx | 30 +++++++----------------------- + 1 file changed, 7 insertions(+), 23 deletions(-) + +diff --git a/sal/osl/all/debugbase.cxx b/sal/osl/all/debugbase.cxx +index 57238ce..75cd846 100644 +--- a/sal/osl/all/debugbase.cxx ++++ b/sal/osl/all/debugbase.cxx +@@ -23,18 +23,10 @@ + #include "rtl/ustring.hxx" + #include "osl/process.h" + #include "osl/diagnose.hxx" ++#include "sal/log.hxx" + #include "boost/bind.hpp" + #include + +-// define own ones, independent of OSL_DEBUG_LEVEL: +-#define DEBUGBASE_ENSURE_(c, f, l, m) \ +- do \ +- { \ +- if (!(c) && _OSL_GLOBAL osl_assertFailedLine(f, l, m)) \ +- _OSL_GLOBAL osl_breakDebug(); \ +- } while (false) +-#define DEBUGBASE_ENSURE(c, m) DEBUGBASE_ENSURE_(c, OSL_THIS_FILE, __LINE__, m) +- + namespace { + + typedef std::vector > OStringVec; +@@ -118,16 +110,10 @@ bool SAL_CALL osl_detail_ObjectRegistry_checkObjectCount( + nSize = static_cast(rData.m_nCount); + + bool const bRet = (nSize == nExpected); +- if (! bRet) { +- rtl::OStringBuffer buf; +- buf.append( "unexpected number of " ); +- buf.append( rData.m_pName ); +- buf.append( ": " ); +- buf.append( static_cast(nSize) ); +- buf.append("; Expected: "); +- buf.append( static_cast(nExpected) ); +- DEBUGBASE_ENSURE( false, buf.makeStringAndClear().getStr() ); +- } ++ SAL_WARN_IF( ++ !bRet, "sal.osl", ++ "unexpected number of " << rData.m_pName << ": " << nSize ++ << "; Expected: " << nExpected); + return bRet; + } + +@@ -139,8 +125,7 @@ void SAL_CALL osl_detail_ObjectRegistry_registerObject( + osl::MutexGuard const guard( osl_detail_ObjectRegistry_getMutex() ); + std::pair const insertion( + rData.m_addresses.insert(pObj) ); +- DEBUGBASE_ENSURE( insertion.second, "### insertion failed!?" ); +- static_cast(insertion); ++ SAL_WARN_IF(!insertion.second, "sal.osl", "insertion failed!?"); + } + else { + osl_atomic_increment(&rData.m_nCount); +@@ -154,8 +139,7 @@ void SAL_CALL osl_detail_ObjectRegistry_revokeObject( + if (rData.m_bStoreAddresses) { + osl::MutexGuard const guard( osl_detail_ObjectRegistry_getMutex() ); + std::size_t const n = rData.m_addresses.erase(pObj); +- DEBUGBASE_ENSURE( n == 1, "erased more than 1 entry!?" ); +- static_cast(n); ++ SAL_WARN_IF(n != 1, "sal.osl", "erased more than 1 entry!?"); + } + else { + osl_atomic_decrement(&rData.m_nCount); +-- +1.9.3 + diff --git a/SOURCES/0039-Relater-rhbz-903281-NULL-follow-frames-on-drag-drop.patch b/SOURCES/0039-Relater-rhbz-903281-NULL-follow-frames-on-drag-drop.patch deleted file mode 100644 index 99789be..0000000 --- a/SOURCES/0039-Relater-rhbz-903281-NULL-follow-frames-on-drag-drop.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 1405c123157406e601adbea2c5f13e62c70f0ede Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= -Date: Wed, 4 Dec 2013 13:10:16 +0000 -Subject: [PATCH 039/109] Relater: rhbz#903281 NULL follow frames on drag/drop - -Change-Id: I50319fb218518edd23ff8c859c355265595050d6 -(cherry picked from commit f141505929c95c97ae4765d7c7221f07e41ef8e7) -Reviewed-on: https://gerrit.libreoffice.org/6926 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - sw/source/core/access/accmap.cxx | 14 ++++++++++---- - 1 file changed, 10 insertions(+), 4 deletions(-) - -diff --git a/sw/source/core/access/accmap.cxx b/sw/source/core/access/accmap.cxx -index 5435961..5b81a26 100644 ---- a/sw/source/core/access/accmap.cxx -+++ b/sw/source/core/access/accmap.cxx -@@ -747,12 +747,18 @@ static bool AreInSameTable( const uno::Reference< XAccessible >& rAcc, - if( pAccImpl->GetFrm()->IsCellFrm() ) - { - const SwTabFrm *pTabFrm1 = pAccImpl->GetFrm()->FindTabFrm(); -- while( pTabFrm1->GetFollow() ) -- pTabFrm1 = pTabFrm1->GetFollow(); -+ if (pTabFrm1) -+ { -+ while (pTabFrm1->GetFollow()) -+ pTabFrm1 = pTabFrm1->GetFollow(); -+ } - - const SwTabFrm *pTabFrm2 = pFrm->FindTabFrm(); -- while( pTabFrm2->GetFollow() ) -- pTabFrm2 = pTabFrm2->GetFollow(); -+ if (pTabFrm2) -+ { -+ while (pTabFrm2->GetFollow()) -+ pTabFrm2 = pTabFrm2->GetFollow(); -+ } - - bRet = (pTabFrm1 == pTabFrm2); - } --- -1.8.4.2 - diff --git a/SOURCES/0040-bnc-885548-Initial-work-on-importing-revisions-from-.patch b/SOURCES/0040-bnc-885548-Initial-work-on-importing-revisions-from-.patch new file mode 100644 index 0000000..3c45595 --- /dev/null +++ b/SOURCES/0040-bnc-885548-Initial-work-on-importing-revisions-from-.patch @@ -0,0 +1,637 @@ +From 9f15c9ec6fa129bf17da4cb86209a1ff2c013af7 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Wed, 16 Jul 2014 19:59:35 -0400 +Subject: [PATCH 040/137] bnc#885548: Initial work on importing revisions from + xlsx. + +Change-Id: Ie0528490d024093cbabf38541fe70be96a9caa2e +(cherry picked from commit b92fdaa1a40bd54d279b4ac2faf19bf15468cc2f) +(cherry picked from commit 6c24bf4cab7e2a9514cf99160a31728835198741) +Signed-off-by: Andras Timar +--- + sc/Library_scfilt.mk | 1 + + sc/inc/chgtrack.hxx | 2 +- + sc/source/filter/inc/revisionfragment.hxx | 79 +++++ + sc/source/filter/oox/revisionfragment.cxx | 462 ++++++++++++++++++++++++++++++ + sc/source/filter/oox/workbookfragment.cxx | 11 +- + 5 files changed, 553 insertions(+), 2 deletions(-) + create mode 100644 sc/source/filter/inc/revisionfragment.hxx + create mode 100644 sc/source/filter/oox/revisionfragment.cxx + +diff --git a/sc/Library_scfilt.mk b/sc/Library_scfilt.mk +index eb0d5d2..c034e61 100644 +--- a/sc/Library_scfilt.mk ++++ b/sc/Library_scfilt.mk +@@ -198,6 +198,7 @@ $(eval $(call gb_Library_add_exception_objects,scfilt,\ + sc/source/filter/oox/pivottablefragment \ + sc/source/filter/oox/querytablebuffer \ + sc/source/filter/oox/querytablefragment \ ++ sc/source/filter/oox/revisionfragment \ + sc/source/filter/oox/richstringcontext \ + sc/source/filter/oox/richstring \ + sc/source/filter/oox/scenariobuffer \ +diff --git a/sc/inc/chgtrack.hxx b/sc/inc/chgtrack.hxx +index 5fdb50b..1f6ddcd 100644 +--- a/sc/inc/chgtrack.hxx ++++ b/sc/inc/chgtrack.hxx +@@ -1101,7 +1101,7 @@ public: + sal_uLong nOldFormat, ScDocument* pRefDoc = NULL ); + // after new value was set in the document, + // old value from pOldCell, format from Doc +- void AppendContent( const ScAddress& rPos, const ScCellValue& rOldCell ); ++ SC_DLLPUBLIC void AppendContent( const ScAddress& rPos, const ScCellValue& rOldCell ); + // after new values were set in the document, + // old values from RefDoc/UndoDoc. + // All contents with a cell in RefDoc +diff --git a/sc/source/filter/inc/revisionfragment.hxx b/sc/source/filter/inc/revisionfragment.hxx +new file mode 100644 +index 0000000..473549e +--- /dev/null ++++ b/sc/source/filter/inc/revisionfragment.hxx +@@ -0,0 +1,79 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ */ ++ ++#ifndef INCLUDED_SC_OOX_XLS_REVISIONFRAGMENT_HXX ++#define INCLUDED_SC_OOX_XLS_REVISIONFRAGMENT_HXX ++ ++#include ++ ++class ScChangeTrack; ++ ++namespace oox { namespace xls { ++ ++class RevisionHeadersFragment : public WorkbookFragmentBase ++{ ++ struct Impl; ++ Impl* mpImpl; ++ ++public: ++ explicit RevisionHeadersFragment( ++ const WorkbookHelper& rHelper, const OUString& rFragmentPath ); ++ ++ virtual ~RevisionHeadersFragment(); ++ ++protected: ++ virtual oox::core::ContextHandlerRef onCreateContext( ++ sal_Int32 nElement, const AttributeList& rAttribs ) SAL_OVERRIDE; ++ ++ virtual void onStartElement( const AttributeList& rAttribs ) SAL_OVERRIDE; ++ virtual void onCharacters( const OUString& rChars ) SAL_OVERRIDE; ++ virtual void onEndElement() SAL_OVERRIDE; ++ ++ virtual void finalizeImport() SAL_OVERRIDE; ++ ++private: ++ void importHeaders( const AttributeList& rAttribs ); ++ void importHeader( const AttributeList& rAttribs ); ++}; ++ ++class RevisionLogFragment : public WorkbookFragmentBase ++{ ++ struct Impl; ++ Impl* mpImpl; ++ ++public: ++ explicit RevisionLogFragment( ++ const WorkbookHelper& rHelper, const OUString& rFragmentPath, ScChangeTrack& rChangeTrack ); ++ ++ virtual ~RevisionLogFragment(); ++ ++protected: ++ virtual oox::core::ContextHandlerRef onCreateContext( ++ sal_Int32 nElement, const AttributeList& rAttribs ) SAL_OVERRIDE; ++ ++ virtual void onStartElement( const AttributeList& rAttribs ) SAL_OVERRIDE; ++ virtual void onCharacters( const OUString& rChars ) SAL_OVERRIDE; ++ virtual void onEndElement() SAL_OVERRIDE; ++ ++ virtual void finalizeImport() SAL_OVERRIDE; ++ ++private: ++ void importCommon( const AttributeList& rAttribs ); ++ void importRcc( const AttributeList& rAttribs ); ++ void importRrc( const AttributeList& rAttribs ); ++ ++ void pushRevision(); ++}; ++ ++}} ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ ++ +diff --git a/sc/source/filter/oox/revisionfragment.cxx b/sc/source/filter/oox/revisionfragment.cxx +new file mode 100644 +index 0000000..dd8cc4b +--- /dev/null ++++ b/sc/source/filter/oox/revisionfragment.cxx +@@ -0,0 +1,462 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++ ++using namespace com::sun::star; ++ ++namespace oox { namespace xls { ++ ++namespace { ++ ++enum RevisionType ++{ ++ REV_UNKNOWN = 0, ++ REV_CELLCHANGE, ++ REV_INSERTROW, ++ REV_DELETEROW, ++ REV_INSERTCOL, ++ REV_DELETECOL ++}; ++ ++/** ++ * For nc (new cell) or oc (old cell) elements under rcc (cell content ++ * revision). ++ */ ++class RCCCellValueContext : public WorkbookContextBase ++{ ++ sal_Int32 mnSheetIndex; ++ ScAddress& mrPos; ++ ScCellValue& mrCellValue; ++ sal_Int32 mnType; ++ ++ RichStringRef mxRichString; ++ ++public: ++ RCCCellValueContext( ++ RevisionLogFragment& rParent, sal_Int32 nSheetIndex, ScAddress& rPos, ScCellValue& rCellValue ) : ++ WorkbookContextBase(rParent), ++ mnSheetIndex(nSheetIndex), ++ mrPos(rPos), ++ mrCellValue(rCellValue), ++ mnType(-1) {} ++ ++protected: ++ virtual oox::core::ContextHandlerRef onCreateContext( ++ sal_Int32 nElement, const AttributeList& /*rAttribs*/ ) SAL_OVERRIDE ++ { ++ if (nElement == XLS_TOKEN(is)) ++ { ++ mxRichString.reset(new RichString(*this)); ++ return new RichStringContext(*this, mxRichString); ++ } ++ ++ return this; ++ } ++ ++ virtual void onStartElement( const AttributeList& rAttribs ) SAL_OVERRIDE ++ { ++ switch (getCurrentElement()) ++ { ++ case XLS_TOKEN(nc): ++ case XLS_TOKEN(oc): ++ importCell(rAttribs); ++ break; ++ default: ++ ; ++ } ++ } ++ ++ virtual void onCharacters( const OUString& rChars ) SAL_OVERRIDE ++ { ++ switch (getCurrentElement()) ++ { ++ case XLS_TOKEN(v): ++ { ++ if (mnType == XML_n || mnType == XML_b) ++ mrCellValue.set(rChars.toDouble()); ++ } ++ break; ++ case XLS_TOKEN(t): ++ { ++ if (mnType == XML_inlineStr) ++ { ++ ScDocument& rDoc = getScDocument(); ++ svl::SharedStringPool& rPool = rDoc.GetSharedStringPool(); ++ mrCellValue.set(rPool.intern(rChars)); ++ } ++ } ++ break; ++ case XLS_TOKEN(f): ++ { ++ // formula string ++ ScDocument& rDoc = getScDocument(); ++ ScCompiler aComp(&rDoc, mrPos); ++ aComp.SetGrammar(formula::FormulaGrammar::GRAM_OOXML); ++ ScTokenArray* pArray = aComp.CompileString(rChars); ++ if (!pArray) ++ break; ++ ++ mrCellValue.set(new ScFormulaCell(&rDoc, mrPos, pArray)); ++ } ++ break; ++ default: ++ ; ++ } ++ } ++ ++ virtual void onEndElement() SAL_OVERRIDE ++ { ++ switch (getCurrentElement()) ++ { ++ case XLS_TOKEN(nc): ++ case XLS_TOKEN(oc): ++ { ++ if (mrCellValue.isEmpty() && mxRichString) ++ { ++ // The value is a rich text string. ++ ScDocument& rDoc = getScDocument(); ++ EditTextObject* pTextObj = mxRichString->convert(rDoc.GetEditEngine(), NULL); ++ if (pTextObj) ++ { ++ svl::SharedStringPool& rPool = rDoc.GetSharedStringPool(); ++ pTextObj->NormalizeString(rPool); ++ mrCellValue.set(pTextObj); ++ } ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ } ++ ++private: ++ void importCell( const AttributeList& rAttribs ) ++ { ++ mnType = rAttribs.getToken(XML_t, XML_n); ++ OUString aRefStr = rAttribs.getString(XML_r, OUString()); ++ if (!aRefStr.isEmpty()) ++ { ++ mrPos.Parse(aRefStr, NULL, formula::FormulaGrammar::CONV_XL_OOX); ++ if (mnSheetIndex != -1) ++ mrPos.SetTab(mnSheetIndex-1); ++ } ++ } ++}; ++ ++struct RevisionMetadata ++{ ++ OUString maUserName; ++ DateTime maDateTime; ++ ++ RevisionMetadata() : maDateTime(DateTime::EMPTY) {} ++ RevisionMetadata( const RevisionMetadata& r ) : ++ maUserName(r.maUserName), maDateTime(r.maDateTime) {} ++}; ++ ++} ++ ++typedef std::map RevDataType; ++ ++struct RevisionHeadersFragment::Impl ++{ ++ RevDataType maRevData; ++ ++ Impl() {} ++}; ++ ++RevisionHeadersFragment::RevisionHeadersFragment( ++ const WorkbookHelper& rHelper, const OUString& rFragmentPath ) : ++ WorkbookFragmentBase(rHelper, rFragmentPath), ++ mpImpl(new Impl) {} ++ ++RevisionHeadersFragment::~RevisionHeadersFragment() ++{ ++ delete mpImpl; ++} ++ ++oox::core::ContextHandlerRef RevisionHeadersFragment::onCreateContext( ++ sal_Int32 /*nElement*/, const AttributeList& /*rAttribs*/ ) ++{ ++ return this; ++} ++ ++void RevisionHeadersFragment::onStartElement( const AttributeList& rAttribs ) ++{ ++ switch (getCurrentElement()) ++ { ++ case XLS_TOKEN(headers): ++ importHeaders(rAttribs); ++ break; ++ case XLS_TOKEN(header): ++ importHeader(rAttribs); ++ break; ++ case XLS_TOKEN(sheetIdMap): ++ break; ++ case XLS_TOKEN(sheetId): ++ break; ++ default: ++ ; ++ } ++} ++ ++void RevisionHeadersFragment::onCharacters( const OUString& /*rChars*/ ) {} ++ ++void RevisionHeadersFragment::onEndElement() ++{ ++ switch (getCurrentElement()) ++ { ++ case XLS_TOKEN(headers): ++ break; ++ case XLS_TOKEN(header): ++ break; ++ case XLS_TOKEN(sheetIdMap): ++ break; ++ case XLS_TOKEN(sheetId): ++ break; ++ default: ++ ; ++ } ++} ++ ++void RevisionHeadersFragment::finalizeImport() ++{ ++ ScDocument& rDoc = getScDocument(); ++ o3tl::heap_ptr pCT(new ScChangeTrack(&rDoc)); ++ pCT->SetUseFixDateTime(true); ++ ++ const oox::core::Relations& rRels = getRelations(); ++ RevDataType::const_iterator it = mpImpl->maRevData.begin(), itEnd = mpImpl->maRevData.end(); ++ for (; it != itEnd; ++it) ++ { ++ OUString aPath = rRels.getFragmentPathFromRelId(it->first); ++ if (aPath.isEmpty()) ++ continue; ++ ++ // Parse each reivison log fragment. ++ const RevisionMetadata& rData = it->second; ++ pCT->SetUser(rData.maUserName); ++ pCT->SetFixDateTimeLocal(rData.maDateTime); ++ boost::scoped_ptr xParser(getOoxFilter().createParser()); ++ rtl::Reference xFragment(new RevisionLogFragment(*this, aPath, *pCT)); ++ importOoxFragment(xFragment, *xParser); ++ } ++ ++ rDoc.SetChangeTrack(pCT.release()); ++ ++ // Turn on visibility of tracked changes. ++ ScChangeViewSettings aSettings; ++ aSettings.SetShowChanges(true); ++ rDoc.SetChangeViewSettings(aSettings); ++} ++ ++void RevisionHeadersFragment::importHeaders( const AttributeList& /*rAttribs*/ ) ++{ ++ // Nothing for now. ++} ++ ++void RevisionHeadersFragment::importHeader( const AttributeList& rAttribs ) ++{ ++ OUString aRId = rAttribs.getString(R_TOKEN(id), OUString()); ++ if (aRId.isEmpty()) ++ // All bets are off if we don't have a relation ID. ++ return; ++ ++ RevisionMetadata aMetadata; ++ OUString aDateTimeStr = rAttribs.getString(XML_dateTime, OUString()); ++ if (!aDateTimeStr.isEmpty()) ++ { ++ util::DateTime aDateTime; ++ sax::Converter::parseDateTime(aDateTime, 0, aDateTimeStr); ++ Date aDate(aDateTime.Day, aDateTime.Month, aDateTime.Year); ++ Time aTime(aDateTime.Hours, aDateTime.Minutes, aDateTime.Seconds, aDateTime.NanoSeconds); ++ aMetadata.maDateTime.SetDate(aDate.GetDate()); ++ aMetadata.maDateTime.SetTime(aTime.GetTime()); ++ } ++ ++ aMetadata.maUserName = rAttribs.getString(XML_userName, OUString()); ++ ++ mpImpl->maRevData.insert(RevDataType::value_type(aRId, aMetadata)); ++} ++ ++struct RevisionLogFragment::Impl ++{ ++ ScChangeTrack& mrChangeTrack; ++ ++ sal_Int32 mnRevIndex; ++ sal_Int32 mnSheetIndex; ++ ++ RevisionType meType; ++ ++ // rcc ++ ScAddress maOldCellPos; ++ ScAddress maNewCellPos; ++ ScCellValue maOldCellValue; ++ ScCellValue maNewCellValue; ++ ++ // rrc ++ ScRange maRange; ++ ++ bool mbEndOfList; ++ ++ Impl( ScChangeTrack& rChangeTrack ) : ++ mrChangeTrack(rChangeTrack), ++ mnRevIndex(-1), ++ mnSheetIndex(-1), ++ meType(REV_UNKNOWN), ++ mbEndOfList(false) {} ++}; ++ ++RevisionLogFragment::RevisionLogFragment( ++ const WorkbookHelper& rHelper, const OUString& rFragmentPath, ScChangeTrack& rChangeTrack ) : ++ WorkbookFragmentBase(rHelper, rFragmentPath), ++ mpImpl(new Impl(rChangeTrack)) {} ++ ++RevisionLogFragment::~RevisionLogFragment() ++{ ++ delete mpImpl; ++} ++ ++oox::core::ContextHandlerRef RevisionLogFragment::onCreateContext( ++ sal_Int32 nElement, const AttributeList& /*rAttribs*/ ) ++{ ++ switch (nElement) ++ { ++ case XLS_TOKEN(nc): ++ return new RCCCellValueContext(*this, mpImpl->mnSheetIndex, mpImpl->maNewCellPos, mpImpl->maNewCellValue); ++ case XLS_TOKEN(oc): ++ return new RCCCellValueContext(*this, mpImpl->mnSheetIndex, mpImpl->maOldCellPos, mpImpl->maOldCellValue); ++ default: ++ ; ++ } ++ return this; ++} ++ ++void RevisionLogFragment::onStartElement( const AttributeList& rAttribs ) ++{ ++ switch (getCurrentElement()) ++ { ++ case XLS_TOKEN(rcc): ++ mpImpl->maNewCellPos.SetInvalid(); ++ mpImpl->maOldCellPos.SetInvalid(); ++ mpImpl->maNewCellValue.clear(); ++ mpImpl->maOldCellValue.clear(); ++ importRcc(rAttribs); ++ break; ++ case XLS_TOKEN(rrc): ++ importRrc(rAttribs); ++ break; ++ default: ++ ; ++ } ++} ++ ++void RevisionLogFragment::onCharacters( const OUString& /*rChars*/ ) {} ++ ++void RevisionLogFragment::onEndElement() ++{ ++ switch (getCurrentElement()) ++ { ++ case XLS_TOKEN(rcc): ++ case XLS_TOKEN(rrc): ++ pushRevision(); ++ break; ++ default: ++ ; ++ } ++} ++ ++void RevisionLogFragment::finalizeImport() {} ++ ++void RevisionLogFragment::importCommon( const AttributeList& rAttribs ) ++{ ++ mpImpl->mnRevIndex = rAttribs.getInteger(XML_rId, -1); ++ mpImpl->mnSheetIndex = rAttribs.getInteger(XML_sId, -1); ++} ++ ++void RevisionLogFragment::importRcc( const AttributeList& rAttribs ) ++{ ++ importCommon(rAttribs); ++ ++ mpImpl->meType = REV_CELLCHANGE; ++} ++ ++void RevisionLogFragment::importRrc( const AttributeList& rAttribs ) ++{ ++ importCommon(rAttribs); ++ ++ if (mpImpl->mnSheetIndex == -1) ++ // invalid sheet index, or sheet index not given. ++ return; ++ ++ mpImpl->meType = REV_UNKNOWN; ++ sal_Int32 nAction = rAttribs.getToken(XML_action, -1); ++ if (nAction == -1) ++ return; ++ ++ OUString aRefStr = rAttribs.getString(XML_ref, OUString()); ++ mpImpl->maRange.Parse(aRefStr, &getScDocument(), formula::FormulaGrammar::CONV_XL_OOX); ++ if (!mpImpl->maRange.IsValid()) ++ return; ++ ++ switch (nAction) ++ { ++ case XML_insertRow: ++ mpImpl->meType = REV_INSERTROW; ++ mpImpl->maRange.aEnd.SetCol(MAXCOL); ++ mpImpl->maRange.aStart.SetTab(mpImpl->mnSheetIndex-1); ++ mpImpl->maRange.aEnd.SetTab(mpImpl->mnSheetIndex-1); ++ break; ++ default: ++ // Unknown action type. Ignore it. ++ return; ++ } ++ ++ mpImpl->mbEndOfList = rAttribs.getBool(XML_eol, false); ++} ++ ++void RevisionLogFragment::pushRevision() ++{ ++ switch (mpImpl->meType) ++ { ++ case REV_CELLCHANGE: ++ mpImpl->mrChangeTrack.AppendContentOnTheFly( ++ mpImpl->maNewCellPos, mpImpl->maOldCellValue, mpImpl->maNewCellValue); ++ break; ++ case REV_INSERTROW: ++ mpImpl->mrChangeTrack.AppendInsert(mpImpl->maRange, mpImpl->mbEndOfList); ++ break; ++ default: ++ ; ++ } ++} ++ ++}} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/source/filter/oox/workbookfragment.cxx b/sc/source/filter/oox/workbookfragment.cxx +index bf42f46..283aa74 100644 +--- a/sc/source/filter/oox/workbookfragment.cxx ++++ b/sc/source/filter/oox/workbookfragment.cxx +@@ -36,6 +36,7 @@ + #include "pivotcachebuffer.hxx" + #include "sharedstringsbuffer.hxx" + #include "sharedstringsfragment.hxx" ++#include "revisionfragment.hxx" + #include "stylesfragment.hxx" + #include "tablebuffer.hxx" + #include "themebuffer.hxx" +@@ -300,7 +301,7 @@ public: + } + }; + +-static void importSheetFragments( WorkbookFragment& rWorkbookHandler, SheetFragmentVector& rSheets ) ++void importSheetFragments( WorkbookFragment& rWorkbookHandler, SheetFragmentVector& rSheets ) + { + sal_Int32 nThreads = std::min( rSheets.size(), (size_t) 4 /* FIXME: ncpus/2 */ ); + +@@ -499,6 +500,14 @@ void WorkbookFragment::finalizeImport() + + // final conversions, e.g. calculation settings and view settings + finalizeWorkbookImport(); ++ ++ OUString aRevHeadersPath = getFragmentPathFromFirstType(CREATE_OFFICEDOC_RELATION_TYPE("revisionHeaders")); ++ if (!aRevHeadersPath.isEmpty()) ++ { ++ boost::scoped_ptr xParser(getOoxFilter().createParser()); ++ rtl::Reference xFragment(new RevisionHeadersFragment(*this, aRevHeadersPath)); ++ importOoxFragment(xFragment, *xParser); ++ } + } + + // private -------------------------------------------------------------------- +-- +1.9.3 + diff --git a/SOURCES/0040-fdo-69984-Handle-duplicate-field-names-correctly.patch b/SOURCES/0040-fdo-69984-Handle-duplicate-field-names-correctly.patch deleted file mode 100644 index ccc4308..0000000 --- a/SOURCES/0040-fdo-69984-Handle-duplicate-field-names-correctly.patch +++ /dev/null @@ -1,314 +0,0 @@ -From 2ea5c1b6dd1d8fda41c1c1fdc3cf994c4f9e5895 Mon Sep 17 00:00:00 2001 -From: Kohei Yoshida -Date: Thu, 5 Dec 2013 15:37:10 -0500 -Subject: [PATCH 040/109] fdo#69984: Handle duplicate field names correctly. - -Duplicate field names are represented in two ways: 1) 'Name' vs 'Name*' in -the UNO part of the pivot engine, and 2) Name,0 vs Name,1 which are a pair -of textural name and a numeric duplicate index in the non-UNO part of the -engine. But some parts lost this duplicate index information and/or confused -the 2 ways of representation. Hopefully this change will sort things out. - -(cherry picked from commit 7e491281d2ba71490fa22cce1e43ba91f60395e3) - -Conflicts: - sc/inc/pivot.hxx - -Change-Id: I03ae7b6c011c31ace454679837542d6d0909ecaa -Reviewed-on: https://gerrit.libreoffice.org/6944 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - sc/inc/dputil.hxx | 8 +++++++- - sc/inc/pivot.hxx | 26 ++++++++++++++------------ - sc/source/core/data/dpobject.cxx | 6 ++++++ - sc/source/core/data/dputil.cxx | 21 +++++++++++++++++++++ - sc/source/core/data/pivot2.cxx | 7 ++++--- - sc/source/ui/dbgui/pvfundlg.cxx | 34 +++++++++++++++++++++++----------- - sc/source/ui/dbgui/pvlaydlg.cxx | 7 +++++-- - sc/source/ui/inc/pvfundlg.hxx | 4 ++-- - 8 files changed, 82 insertions(+), 31 deletions(-) - -diff --git a/sc/inc/dputil.hxx b/sc/inc/dputil.hxx -index 294ca97..e4ed831 100644 ---- a/sc/inc/dputil.hxx -+++ b/sc/inc/dputil.hxx -@@ -26,7 +26,13 @@ public: - - SC_DLLPUBLIC static OUString getSourceDimensionName(const OUString& rName); - -- static OUString createDuplicateDimensionName(const OUString& rOriginal, size_t nDupCount); -+ /** -+ * Get a duplicate index in case the dimension is a duplicate. It returns -+ * 0 in case it's an original dimension. -+ */ -+ sal_uInt8 static getDuplicateIndex(const OUString& rName); -+ -+ SC_DLLPUBLIC static OUString createDuplicateDimensionName(const OUString& rOriginal, size_t nDupCount); - - static OUString getDateGroupName( - sal_Int32 nDatePart, sal_Int32 nValue, SvNumberFormatter* pFormatter, -diff --git a/sc/inc/pivot.hxx b/sc/inc/pivot.hxx -index 85e19e0..a1e063f 100644 ---- a/sc/inc/pivot.hxx -+++ b/sc/inc/pivot.hxx -@@ -52,13 +52,14 @@ - #include - #include - -- --struct ScDPName -+struct SC_DLLPUBLIC ScDPName - { -- OUString maName; /// Original name of the dimension. -- OUString maLayoutName; /// Layout name (display name) -+ OUString maName; ///< Original name of the dimension. -+ OUString maLayoutName; ///< Layout name (display name) -+ sal_uInt8 mnDupCount; - -- explicit ScDPName(const OUString& rName, const OUString& rLayoutName); -+ ScDPName(); -+ explicit ScDPName(const OUString& rName, const OUString& rLayoutName, sal_uInt8 nDupCount); - }; - - // ============================================================================ -@@ -68,13 +69,14 @@ struct ScDPLabelData - OUString maName; /// Original name of the dimension. - OUString maLayoutName; /// Layout name (display name) - OUString maSubtotalName; -- SCCOL mnCol; /// 0-based field index (not the source column index) -- long mnOriginalDim; /// original dimension index (>= 0 for duplicated dimension) -- sal_uInt16 mnFuncMask; /// Page/Column/Row subtotal function. -- sal_Int32 mnUsedHier; /// Used hierarchy. -- sal_Int32 mnFlags; /// Flags from the DataPilotSource dimension -- bool mbShowAll:1; /// true = Show all (also empty) results. -- bool mbIsValue:1; /// true = Sum or count in data field. -+ SCCOL mnCol; ///< 0-based field index (not the source column index) -+ long mnOriginalDim; ///< original dimension index (>= 0 for duplicated dimension) -+ sal_uInt16 mnFuncMask; ///< Page/Column/Row subtotal function. -+ sal_Int32 mnUsedHier; ///< Used hierarchy. -+ sal_Int32 mnFlags; ///< Flags from the DataPilotSource dimension -+ sal_uInt8 mnDupCount; -+ bool mbShowAll:1; ///< true = Show all (also empty) results. -+ bool mbIsValue:1; ///< true = Sum or count in data field. - bool mbDataLayout:1; - - struct Member -diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx -index fba73d6..3a45a34 100644 ---- a/sc/source/core/data/dpobject.cxx -+++ b/sc/source/core/data/dpobject.cxx -@@ -2278,10 +2278,16 @@ bool ScDPObject::FillLabelDataForDimension( - xDimProp, OUString(SC_UNO_DP_FIELD_SUBTOTALNAME), OUString()); - - bool bIsValue = true; //! check -+ -+ // Name from the UNO dimension object may have trailing '*'s in which -+ // case it's a duplicate dimension. Convert that to a duplicate index. -+ -+ sal_uInt8 nDupCount = ScDPUtil::getDuplicateIndex(aFieldName); - aFieldName = ScDPUtil::getSourceDimensionName(aFieldName); - - rLabelData.maName = aFieldName; - rLabelData.mnCol = static_cast(nDim); -+ rLabelData.mnDupCount = nDupCount; - rLabelData.mbDataLayout = bData; - rLabelData.mbIsValue = bIsValue; - -diff --git a/sc/source/core/data/dputil.cxx b/sc/source/core/data/dputil.cxx -index d1fc655..e34bc79 100644 ---- a/sc/source/core/data/dputil.cxx -+++ b/sc/source/core/data/dputil.cxx -@@ -68,6 +68,27 @@ OUString ScDPUtil::getSourceDimensionName(const OUString& rName) - return comphelper::string::stripEnd(rName, '*'); - } - -+sal_uInt8 ScDPUtil::getDuplicateIndex(const OUString& rName) -+{ -+ // Count all trailing '*'s. -+ -+ sal_Int32 n = rName.getLength(); -+ if (!n) -+ return 0; -+ -+ sal_uInt8 nDupCount = 0; -+ const sal_Unicode* p = rName.getStr(); -+ const sal_Unicode* pStart = p; -+ p += n-1; // Set it to the last char. -+ for (; p != pStart; --p, ++nDupCount) -+ { -+ if (*p != '*') -+ break; -+ } -+ -+ return nDupCount; -+} -+ - OUString ScDPUtil::createDuplicateDimensionName(const OUString& rOriginal, size_t nDupCount) - { - if (!nDupCount) -diff --git a/sc/source/core/data/pivot2.cxx b/sc/source/core/data/pivot2.cxx -index e8aed77..9460632 100644 ---- a/sc/source/core/data/pivot2.cxx -+++ b/sc/source/core/data/pivot2.cxx -@@ -58,10 +58,10 @@ bool equals(const DataPilotFieldReference& left, const DataPilotFieldReference& - - } - --// ============================================================================ -+ScDPName::ScDPName() : mnDupCount(0) {} - --ScDPName::ScDPName(const OUString& rName, const OUString& rLayoutName) : -- maName(rName), maLayoutName(rLayoutName) {} -+ScDPName::ScDPName(const OUString& rName, const OUString& rLayoutName, sal_uInt8 nDupCount) : -+ maName(rName), maLayoutName(rLayoutName), mnDupCount(nDupCount) {} - - // ============================================================================ - -@@ -85,6 +85,7 @@ ScDPLabelData::ScDPLabelData() : - mnFuncMask(PIVOT_FUNC_NONE), - mnUsedHier(0), - mnFlags(0), -+ mnDupCount(0), - mbShowAll(false), - mbIsValue(false), - mbDataLayout(false) -diff --git a/sc/source/ui/dbgui/pvfundlg.cxx b/sc/source/ui/dbgui/pvfundlg.cxx -index f9e468b..af369f4 100644 ---- a/sc/source/ui/dbgui/pvfundlg.cxx -+++ b/sc/source/ui/dbgui/pvfundlg.cxx -@@ -35,6 +35,7 @@ - #include "dpsave.hxx" - #include "pvfundlg.hrc" - #include "globstr.hrc" -+#include "dputil.hxx" - - #include - -@@ -574,8 +575,13 @@ void ScDPSubtotalOptDlg::FillLabelData( ScDPLabelData& rLabelData ) const - else - rLabelData.maSortInfo.Mode = DataPilotFieldSortMode::DATA; - -- rLabelData.maSortInfo.Field = GetFieldName(maLbSortBy.GetSelectEntry()); -- rLabelData.maSortInfo.IsAscending = maRbSortAsc.IsChecked(); -+ ScDPName aFieldName = GetFieldName(maLbSortBy.GetSelectEntry()); -+ if (!aFieldName.maName.isEmpty()) -+ { -+ rLabelData.maSortInfo.Field = -+ ScDPUtil::createDuplicateDimensionName(aFieldName.maName, aFieldName.mnDupCount); -+ rLabelData.maSortInfo.IsAscending = maRbSortAsc.IsChecked(); -+ } - - // *** LAYOUT MODE *** - -@@ -584,10 +590,15 @@ void ScDPSubtotalOptDlg::FillLabelData( ScDPLabelData& rLabelData ) const - - // *** AUTO SHOW *** - -- rLabelData.maShowInfo.IsEnabled = maCbShow.IsChecked(); -- rLabelData.maShowInfo.ShowItemsMode = maLbShowFromWrp.GetControlValue(); -- rLabelData.maShowInfo.ItemCount = sal::static_int_cast( maNfShow.GetValue() ); -- rLabelData.maShowInfo.DataField = GetFieldName(maLbShowUsing.GetSelectEntry()); -+ aFieldName = GetFieldName(maLbShowUsing.GetSelectEntry()); -+ if (!aFieldName.maName.isEmpty()) -+ { -+ rLabelData.maShowInfo.IsEnabled = maCbShow.IsChecked(); -+ rLabelData.maShowInfo.ShowItemsMode = maLbShowFromWrp.GetControlValue(); -+ rLabelData.maShowInfo.ItemCount = sal::static_int_cast( maNfShow.GetValue() ); -+ rLabelData.maShowInfo.DataField = -+ ScDPUtil::createDuplicateDimensionName(aFieldName.maName, aFieldName.mnDupCount); -+ } - - // *** HIDDEN ITEMS *** - -@@ -613,7 +624,7 @@ void ScDPSubtotalOptDlg::Init( const ScDPNameVec& rDataFields, bool bEnableLayou - for( ScDPNameVec::const_iterator aIt = rDataFields.begin(), aEnd = rDataFields.end(); aIt != aEnd; ++aIt ) - { - // Cache names for later lookup. -- maDataFieldNameMap.insert(NameMapType::value_type(aIt->maLayoutName, aIt->maName)); -+ maDataFieldNameMap.insert(NameMapType::value_type(aIt->maLayoutName, *aIt)); - - maLbSortBy.InsertEntry( aIt->maLayoutName ); - maLbShowUsing.InsertEntry( aIt->maLayoutName ); // for AutoShow -@@ -714,10 +725,10 @@ void ScDPSubtotalOptDlg::InitHideListBox() - maLbHide.Enable( bEnable ); - } - --const OUString& ScDPSubtotalOptDlg::GetFieldName(const OUString& rLayoutName) const -+ScDPName ScDPSubtotalOptDlg::GetFieldName(const OUString& rLayoutName) const - { - NameMapType::const_iterator itr = maDataFieldNameMap.find(rLayoutName); -- return itr == maDataFieldNameMap.end() ? rLayoutName : itr->second; -+ return itr == maDataFieldNameMap.end() ? ScDPName() : itr->second; - } - - sal_uInt16 ScDPSubtotalOptDlg::FindListBoxEntry( -@@ -728,8 +739,9 @@ sal_uInt16 ScDPSubtotalOptDlg::FindListBoxEntry( - while (nPos < rLBox.GetEntryCount()) - { - // translate the displayed field name back to its original field name. -- const OUString& rName = GetFieldName(rLBox.GetEntry(nPos)); -- if (rName.equals(rEntry)) -+ ScDPName aName = GetFieldName(rLBox.GetEntry(nPos)); -+ OUString aUnoName = ScDPUtil::createDuplicateDimensionName(aName.maName, aName.mnDupCount); -+ if (aUnoName.equals(rEntry)) - { - bFound = true; - break; -diff --git a/sc/source/ui/dbgui/pvlaydlg.cxx b/sc/source/ui/dbgui/pvlaydlg.cxx -index 79178c9..b682845 100644 ---- a/sc/source/ui/dbgui/pvlaydlg.cxx -+++ b/sc/source/ui/dbgui/pvlaydlg.cxx -@@ -60,6 +60,7 @@ - #include "dpsave.hxx" - #include "dpshttab.hxx" - #include "scmod.hxx" -+#include "dputil.hxx" - - #include "sc.hrc" - #include "scabstdlg.hxx" -@@ -783,7 +784,7 @@ void ScPivotLayoutDlg::NotifyDoubleClick( ScPivotFieldType eType, size_t nFieldI - OUString aFuncStr = GetFuncString(nMask); - aLayoutName = aFuncStr + pDFData->maName; - } -- aDataFieldNames.push_back(ScDPName(pDFData->maName, aLayoutName)); -+ aDataFieldNames.push_back(ScDPName(pDFData->maName, aLayoutName, pDFData->mnDupCount)); - } - - bool bLayout = (eType == PIVOTFIELDTYPE_ROW) && -@@ -1588,7 +1589,9 @@ IMPL_LINK_NOARG(ScPivotLayoutDlg, OkHdl) - - for( ScDPLabelDataVector::const_iterator aIt = maLabelData.begin(), aEnd = maLabelData.end(); aIt != aEnd; ++aIt ) - { -- ScDPSaveDimension* pDim = aSaveData.GetExistingDimensionByName(aIt->maName); -+ // "UNO" name may have trailing '*'s which signifies duplicate index. -+ OUString aUnoName = ScDPUtil::createDuplicateDimensionName(aIt->maName, aIt->mnDupCount); -+ ScDPSaveDimension* pDim = aSaveData.GetExistingDimensionByName(aUnoName); - - if (!pDim) - continue; -diff --git a/sc/source/ui/inc/pvfundlg.hxx b/sc/source/ui/inc/pvfundlg.hxx -index c02cb5c..6ad269d 100644 ---- a/sc/source/ui/inc/pvfundlg.hxx -+++ b/sc/source/ui/inc/pvfundlg.hxx -@@ -162,7 +162,7 @@ private: - void Init( const ScDPNameVec& rDataFields, bool bEnableLayout ); - void InitHideListBox(); - -- const OUString& GetFieldName(const OUString& rLayoutName) const; -+ ScDPName GetFieldName(const OUString& rLayoutName) const; - - /** Searches for a listbox entry, starts search at specified position. */ - sal_uInt16 FindListBoxEntry( const ListBox& rLBox, const String& rEntry, sal_uInt16 nStartPos ) const; -@@ -203,7 +203,7 @@ private: - ScDPObject& mrDPObj; /// The DataPilot object (for member names). - ScDPLabelData maLabelData; /// Cache for members data. - -- typedef ::boost::unordered_map< OUString, OUString, OUStringHash > NameMapType; -+ typedef ::boost::unordered_map NameMapType; - NameMapType maDataFieldNameMap; /// Cache for displayed name to field name mapping. - }; - --- -1.8.4.2 - diff --git a/SOURCES/0041-bnc-885548-Adjust-xlsx-export-of-revisions-to-get-it.patch b/SOURCES/0041-bnc-885548-Adjust-xlsx-export-of-revisions-to-get-it.patch new file mode 100644 index 0000000..554c2bf --- /dev/null +++ b/SOURCES/0041-bnc-885548-Adjust-xlsx-export-of-revisions-to-get-it.patch @@ -0,0 +1,716 @@ +From 766d54154f5225c9dc91ed8e4863d3fca1bd2b90 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Thu, 17 Jul 2014 20:20:16 -0400 +Subject: [PATCH 041/137] bnc#885548: Adjust xlsx export of revisions to get it + to work in Excel. + +(cherry picked from commit fa44673e154ed4fb0b518b8850e2f6e4b9069531) +Signed-off-by: Andras Timar + +Conflicts: + sc/source/filter/inc/XclExpChangeTrack.hxx + sc/source/filter/xcl97/XclExpChangeTrack.cxx + sc/inc/cellvalue.hxx + sc/source/core/data/cellvalue.cxx + +Change-Id: I0058d9ddfea545390e615a3030171a366e333c85 +(cherry picked from commit ca20a53315eaea218c693e0de2026eb6f957331f) +Signed-off-by: Andras Timar +--- + sc/inc/cellvalue.hxx | 1 + + sc/source/core/data/cellvalue.cxx | 7 + + sc/source/filter/excel/xestream.cxx | 7 + + sc/source/filter/inc/XclExpChangeTrack.hxx | 84 ++++--- + sc/source/filter/inc/xestream.hxx | 10 + + sc/source/filter/xcl97/XclExpChangeTrack.cxx | 346 +++++++++++++++++---------- + 6 files changed, 299 insertions(+), 156 deletions(-) + +diff --git a/sc/inc/cellvalue.hxx b/sc/inc/cellvalue.hxx +index c2606b5..8e2e64a 100644 +--- a/sc/inc/cellvalue.hxx ++++ b/sc/inc/cellvalue.hxx +@@ -53,6 +53,7 @@ struct SC_DLLPUBLIC ScCellValue + void set( double fValue ); + void set( const svl::SharedString& rStr ); + void set( const EditTextObject& rEditText ); ++ void set( EditTextObject* pEditText ); + void set( const ScFormulaCell& rFormula ); + void set( ScFormulaCell* pFormula ); + +diff --git a/sc/source/core/data/cellvalue.cxx b/sc/source/core/data/cellvalue.cxx +index 12ef302..92298cf 100644 +--- a/sc/source/core/data/cellvalue.cxx ++++ b/sc/source/core/data/cellvalue.cxx +@@ -248,6 +248,13 @@ void ScCellValue::set( const EditTextObject& rEditText ) + mpEditText = rEditText.Clone(); + } + ++void ScCellValue::set( EditTextObject* pEditText ) ++{ ++ clear(); ++ meType = CELLTYPE_EDIT; ++ mpEditText = pEditText; ++} ++ + void ScCellValue::set( const ScFormulaCell& rFormula ) + { + clear(); +diff --git a/sc/source/filter/excel/xestream.cxx b/sc/source/filter/excel/xestream.cxx +index df08d2c..47dba9e 100644 +--- a/sc/source/filter/excel/xestream.cxx ++++ b/sc/source/filter/excel/xestream.cxx +@@ -842,6 +842,13 @@ const char* XclXmlUtils::ToPsz( bool b ) + return b ? "true" : "false"; + } + ++const char* XclXmlUtils::ToPsz10( bool b ) ++{ ++ // xlsx seems to use "1" or "0" for boolean values. I wonder it ever uses ++ // the "true" "false" variant. ++ return b ? "1" : "0"; ++} ++ + sax_fastparser::FSHelperPtr XclXmlUtils::WriteElement( sax_fastparser::FSHelperPtr pStream, sal_Int32 nElement, sal_Int32 nValue ) + { + pStream->startElement( nElement, FSEND ); +diff --git a/sc/source/filter/inc/XclExpChangeTrack.hxx b/sc/source/filter/inc/XclExpChangeTrack.hxx +index 6651a75..72b7066 100644 +--- a/sc/source/filter/inc/XclExpChangeTrack.hxx ++++ b/sc/source/filter/inc/XclExpChangeTrack.hxx +@@ -29,7 +29,16 @@ + #include "ftools.hxx" + #include "excrecds.hxx" + +-//___________________________________________________________________ ++#include ++ ++class ExcXmlRecord : public ExcRecord ++{ ++public: ++ virtual sal_Size GetLen() const SAL_OVERRIDE; ++ virtual sal_uInt16 GetNum() const SAL_OVERRIDE; ++ virtual void Save( XclExpStream& rStrm ) SAL_OVERRIDE; ++}; ++ + // XclExpUserBView - one UserBView record for each user + + class XclExpUserBView : public ExcRecord +@@ -238,42 +247,61 @@ public: + virtual void SaveXml( XclExpXmlStream& rStrm ); + }; + +-//___________________________________________________________________ ++class XclExpXmlChTrHeaders : public ExcXmlRecord ++{ ++ sal_uInt8 maGUID[16]; ++public: ++ void SetGUID( const sal_uInt8* pGUID ); ++ ++ virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE; ++}; ++ ++class XclExpChTrTabIdBuffer; ++class XclExpChTrAction; ++ ++class XclExpXmlChTrHeader : public ExcXmlRecord ++{ ++ OUString maUserName; ++ DateTime maDateTime; ++ sal_uInt8 maGUID[16]; ++ sal_Int32 mnLogNumber; ++ sal_uInt32 mnMinAction; ++ sal_uInt32 mnMaxAction; ++ ++ std::vector maTabBuffer; ++ std::vector maActions; ++ ++public: ++ XclExpXmlChTrHeader( ++ const OUString& rUserName, const DateTime& rDateTime, const sal_uInt8* pGUID, ++ sal_Int32 nLogNumber, const XclExpChTrTabIdBuffer& rBuf ); ++ ++ virtual void SaveXml( XclExpXmlStream& rStrm ) SAL_OVERRIDE; ++ ++ void AppendAction( XclExpChTrAction* pAction ); ++}; ++ + // XclExpChTrInfo - header of action group of a user + + class XclExpChTrInfo : public ExcRecord + { + private: + XclExpString sUsername; +- sal_Int32 mnLogNumber; + DateTime aDateTime; + sal_uInt8 aGUID[ 16 ]; + + virtual void SaveCont( XclExpStream& rStrm ); + + public: +- inline XclExpChTrInfo( +- const OUString& rUsername, +- const DateTime& rDateTime, +- const sal_uInt8* pGUID, +- sal_Int32 nLogNumber ); ++ XclExpChTrInfo( const OUString& rUsername, const DateTime& rDateTime, ++ const sal_uInt8* pGUID ); ++ + virtual ~XclExpChTrInfo(); + + virtual sal_uInt16 GetNum() const; + virtual sal_Size GetLen() const; +- +- virtual void SaveXml( XclExpXmlStream& rStrm ); + }; + +-inline XclExpChTrInfo::XclExpChTrInfo( const OUString& rUsername, const DateTime& rDateTime, const sal_uInt8* pGUID, sal_Int32 nLogNumber ) : +- sUsername( rUsername ), +- mnLogNumber( nLogNumber ), +- aDateTime( rDateTime ) +-{ +- memcpy( aGUID, pGUID, 16 ); +-} +- +-//___________________________________________________________________ + // XclExpChTrTabIdBuffer - buffer for tab id's + + class XclExpChTrTabIdBuffer +@@ -309,7 +337,6 @@ class XclExpChTrTabId : public ExcRecord + private: + sal_uInt16* pBuffer; + sal_uInt16 nTabCount; +- bool mbInRevisionHeaders; + + inline void Clear() { if( pBuffer ) delete[] pBuffer; pBuffer = NULL; } + +@@ -317,16 +344,14 @@ private: + + public: + inline XclExpChTrTabId( sal_uInt16 nCount ) : +- pBuffer( NULL ), nTabCount( nCount ), mbInRevisionHeaders( false ) {} +- XclExpChTrTabId( const XclExpChTrTabIdBuffer& rBuffer, bool bInRevisionHeaders = false ); ++ pBuffer( NULL ), nTabCount( nCount ) {} ++ XclExpChTrTabId( const XclExpChTrTabIdBuffer& rBuffer ); + virtual ~XclExpChTrTabId(); + + void Copy( const XclExpChTrTabIdBuffer& rBuffer ); + + virtual sal_uInt16 GetNum() const; + virtual sal_Size GetLen() const; +- +- virtual void SaveXml( XclExpXmlStream& rStrm ); + }; + + //___________________________________________________________________ +@@ -375,8 +400,7 @@ protected: + // do something after writing the record + virtual void CompleteSaveAction( XclExpStream& rStrm ) const; + +- inline sal_uInt32 GetActionNumber() const { return nIndex; } +- inline sal_Bool GetAccepted() const { return bAccepted; } ++ inline bool GetAccepted() const { return bAccepted; } + + public: + XclExpChTrAction( +@@ -399,6 +423,7 @@ public: + virtual sal_Size GetLen() const; + + inline XclExpChTrAction* GetAddAction() { return pAddAction; } ++ inline sal_uInt32 GetActionNumber() const { return nIndex; } + }; + + inline void XclExpChTrAction::Write2DAddress( XclExpStream& rStrm, const ScAddress& rAddress ) const +@@ -589,11 +614,12 @@ public: + + class XclExpChangeTrack : protected XclExpRoot + { +-private: +- std::vector aRecList; // list of "Revision Log" stream records ++ typedef boost::ptr_vector RecListType; ++ typedef boost::ptr_vector TabIdBufferType; ++ RecListType maRecList; // list of "Revision Log" stream records + std::stack aActionStack; + XclExpChTrTabIdBuffer* pTabIdBuffer; +- std::vector maBuffers; ++ TabIdBufferType maBuffers; + + ScDocument* pTempDoc; // empty document + +diff --git a/sc/source/filter/inc/xestream.hxx b/sc/source/filter/inc/xestream.hxx +index e29ed1a..f33f0c0 100644 +--- a/sc/source/filter/inc/xestream.hxx ++++ b/sc/source/filter/inc/xestream.hxx +@@ -286,8 +286,18 @@ public: + static OUString ToOUString( const ScfUInt16Vec& rBuffer, sal_Int32 nStart = 0, sal_Int32 nLength = -1 ); + static OUString ToOUString( ScDocument& rDocument, const ScAddress& rAddress, const ScTokenArray* pTokenArray ); + static OUString ToOUString( const XclExpString& s ); ++ ++ /** ++ * @return const char* literal "true" for true value, or literal "false" ++ * for false value. ++ */ + static const char* ToPsz( bool b ); + ++ /** ++ * @return literal "1" for true value, or literal "0" for false value. ++ */ ++ static const char* ToPsz10( bool b ); ++ + static sax_fastparser::FSHelperPtr WriteElement( sax_fastparser::FSHelperPtr pStream, sal_Int32 nElement, sal_Int32 nValue ); + static sax_fastparser::FSHelperPtr WriteElement( sax_fastparser::FSHelperPtr pStream, sal_Int32 nElement, sal_Int64 nValue ); + static sax_fastparser::FSHelperPtr WriteElement( sax_fastparser::FSHelperPtr pStream, sal_Int32 nElement, const char* sValue ); +diff --git a/sc/source/filter/xcl97/XclExpChangeTrack.cxx b/sc/source/filter/xcl97/XclExpChangeTrack.cxx +index 4589aea..aed0322 100644 +--- a/sc/source/filter/xcl97/XclExpChangeTrack.cxx ++++ b/sc/source/filter/xcl97/XclExpChangeTrack.cxx +@@ -40,7 +40,7 @@ static OString lcl_GuidToOString( sal_uInt8 aGuid[ 16 ] ) + { + char sBuf[ 40 ]; + snprintf( sBuf, sizeof( sBuf ), +- "{%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x}", ++ "{%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + aGuid[ 0 ], aGuid[ 1 ], aGuid[ 2 ], aGuid[ 3 ], aGuid[ 4 ], aGuid[ 5 ], aGuid[ 6 ], aGuid[ 7 ], + aGuid[ 8 ], aGuid[ 9 ], aGuid[ 10 ], aGuid[ 11 ], aGuid[ 12 ], aGuid[ 13 ], aGuid[ 14 ], aGuid[ 15 ] ); + return OString( sBuf ); +@@ -394,7 +394,149 @@ void XclExpChTrHeader::SaveXml( XclExpXmlStream& rRevisionHeadersStrm ) + pHeaders->write( ">" ); + } + +-//___________________________________________________________________ ++void XclExpXmlChTrHeaders::SetGUID( const sal_uInt8* pGUID ) ++{ ++ memcpy(maGUID, pGUID, 16); ++} ++ ++void XclExpXmlChTrHeaders::SaveXml( XclExpXmlStream& rStrm ) ++{ ++ sax_fastparser::FSHelperPtr pHeaders = rStrm.GetCurrentStream(); ++ ++ pHeaders->write("<")->writeId(XML_headers); ++ ++ rStrm.WriteAttributes( ++ XML_xmlns, "http://schemas.openxmlformats.org/spreadsheetml/2006/main", ++ FSNS(XML_xmlns, XML_r), "http://schemas.openxmlformats.org/officeDocument/2006/relationships", ++ XML_guid, lcl_GuidToOString(maGUID).getStr(), ++ XML_lastGuid, NULL, // OOXTODO ++ XML_shared, NULL, // OOXTODO ++ XML_diskRevisions, NULL, // OOXTODO ++ XML_history, NULL, // OOXTODO ++ XML_trackRevisions, NULL, // OOXTODO ++ XML_exclusive, NULL, // OOXTODO ++ XML_revisionId, NULL, // OOXTODO ++ XML_version, NULL, // OOXTODO ++ XML_keepChangeHistory, NULL, // OOXTODO ++ XML_protected, NULL, // OOXTODO ++ XML_preserveHistory, NULL, // OOXTODO ++ FSEND); ++ ++ pHeaders->write(">"); ++} ++ ++XclExpXmlChTrHeader::XclExpXmlChTrHeader( ++ const OUString& rUserName, const DateTime& rDateTime, const sal_uInt8* pGUID, ++ sal_Int32 nLogNumber, const XclExpChTrTabIdBuffer& rBuf ) : ++ maUserName(rUserName), maDateTime(rDateTime), mnLogNumber(nLogNumber), ++ mnMinAction(0), mnMaxAction(0) ++{ ++ memcpy(maGUID, pGUID, 16); ++ if (rBuf.GetBufferCount()) ++ { ++ maTabBuffer.resize(rBuf.GetBufferCount()); ++ rBuf.GetBufferCopy(&maTabBuffer[0]); ++ } ++} ++ ++void XclExpXmlChTrHeader::SaveXml( XclExpXmlStream& rStrm ) ++{ ++ sax_fastparser::FSHelperPtr pHeader = rStrm.GetCurrentStream(); ++ ++ pHeader->write("<")->writeId(XML_header); ++ ++ OUString aRelId; ++ sax_fastparser::FSHelperPtr pRevLogStrm = rStrm.CreateOutputStream( ++ XclXmlUtils::GetStreamName("xl/revisions/", "revisionLog", mnLogNumber), ++ XclXmlUtils::GetStreamName(NULL, "revisionLog", mnLogNumber), ++ rStrm.GetCurrentStream()->getOutputStream(), ++ "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml", ++ CREATE_OFFICEDOC_RELATION_TYPE("revisionLog"), ++ &aRelId); ++ ++ rStrm.WriteAttributes( ++ XML_guid, lcl_GuidToOString(maGUID).getStr(), ++ XML_dateTime, lcl_DateTimeToOString(maDateTime).getStr(), ++ XML_userName, XclXmlUtils::ToOString(maUserName).getStr(), ++ FSNS(XML_r, XML_id), XclXmlUtils::ToOString(aRelId).getStr(), ++ FSEND); ++ ++ if (mnMinAction) ++ rStrm.WriteAttributes(XML_minRId, OString::number(mnMinAction).getStr(), FSEND); ++ ++ if (mnMaxAction) ++ rStrm.WriteAttributes(XML_maxRId, OString::number(mnMaxAction).getStr(), FSEND); ++ ++ if (!maTabBuffer.empty()) ++ // next available sheet index. ++ rStrm.WriteAttributes(XML_maxSheetId, OString::number(maTabBuffer.back()+1).getStr(), FSEND); ++ ++ pHeader->write(">"); ++ ++ if (!maTabBuffer.empty()) ++ { ++ // Write sheet index map. ++ size_t n = maTabBuffer.size(); ++ pHeader->startElement( ++ XML_sheetIdMap, ++ XML_count, OString::number(n).getStr(), ++ FSEND); ++ ++ for (size_t i = 0; i < n; ++i) ++ { ++ pHeader->singleElement( ++ XML_sheetId, ++ XML_val, OString::number(maTabBuffer[i]).getStr(), ++ FSEND); ++ } ++ pHeader->endElement(XML_sheetIdMap); ++ } ++ ++ // Write all revision logs in a separate stream. ++ ++ rStrm.PushStream(pRevLogStrm); ++ ++ pRevLogStrm->write("<")->writeId(XML_revisions); ++ ++ rStrm.WriteAttributes( ++ XML_xmlns, "http://schemas.openxmlformats.org/spreadsheetml/2006/main", ++ FSNS(XML_xmlns, XML_r), "http://schemas.openxmlformats.org/officeDocument/2006/relationships", ++ FSEND); ++ ++ pRevLogStrm->write(">"); ++ ++ std::vector::iterator it = maActions.begin(), itEnd = maActions.end(); ++ for (; it != itEnd; ++it) ++ { ++ XclExpChTrAction* p = *it; ++ p->SaveXml(rStrm); ++ } ++ ++ pRevLogStrm->write("writeId(XML_revisions)->write(">"); ++ ++ rStrm.PopStream(); ++ ++ pHeader->write("writeId(XML_header)->write(">"); ++} ++ ++void XclExpXmlChTrHeader::AppendAction( XclExpChTrAction* pAction ) ++{ ++ sal_uInt32 nActionNum = pAction->GetActionNumber(); ++ if (!mnMinAction || mnMinAction > nActionNum) ++ mnMinAction = nActionNum; ++ ++ if (!mnMaxAction || mnMaxAction < nActionNum) ++ mnMaxAction = nActionNum; ++ ++ maActions.push_back(pAction); ++} ++ ++XclExpChTrInfo::XclExpChTrInfo( const OUString& rUsername, const DateTime& rDateTime, const sal_uInt8* pGUID ) : ++ sUsername( rUsername ), ++ aDateTime( rDateTime ) ++{ ++ memcpy( aGUID, pGUID, 16 ); ++} + + XclExpChTrInfo::~XclExpChTrInfo() + { +@@ -424,35 +566,6 @@ sal_Size XclExpChTrInfo::GetLen() const + return 158; + } + +-void XclExpChTrInfo::SaveXml( XclExpXmlStream& rRevisionHeadersStrm ) +-{ +- sax_fastparser::FSHelperPtr pHeader = rRevisionHeadersStrm.GetCurrentStream(); +- +- OUString sRelationshipId; +- sax_fastparser::FSHelperPtr pRevisionLog = rRevisionHeadersStrm.CreateOutputStream( +- XclXmlUtils::GetStreamName( "xl/revisions/", "revisionLog", mnLogNumber ), +- XclXmlUtils::GetStreamName( NULL, "revisionLog", mnLogNumber ), +- rRevisionHeadersStrm.GetCurrentStream()->getOutputStream(), +- "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml", +- "http://schemas.openxmlformats.org/officeDocument/2006/relationships/revisionLog", +- &sRelationshipId ); +- +- rRevisionHeadersStrm.WriteAttributes( +- XML_guid, lcl_GuidToOString( aGUID ).getStr(), +- XML_dateTime, lcl_DateTimeToOString( aDateTime ).getStr(), +- XML_maxSheetId, NULL, // OOXTODO +- XML_userName, XclXmlUtils::ToOString( sUsername ).getStr(), +- FSNS( XML_r, XML_id ), XclXmlUtils::ToOString( sRelationshipId ).getStr(), +- XML_minRId, NULL, // OOXTODO +- XML_maxRId, NULL, // OOXTODO +- FSEND ); +- pHeader->write( ">" ); +- +- rRevisionHeadersStrm.PushStream( pRevisionLog ); +-} +- +-//___________________________________________________________________ +- + XclExpChTrTabIdBuffer::XclExpChTrTabIdBuffer( sal_uInt16 nCount ) : + nBufSize( nCount ), + nLastId( nCount ) +@@ -523,11 +636,8 @@ void XclExpChTrTabIdBuffer::Remove() + nLastId--; + } + +-//___________________________________________________________________ +- +-XclExpChTrTabId::XclExpChTrTabId( const XclExpChTrTabIdBuffer& rBuffer, bool bInRevisionHeaders ) ++XclExpChTrTabId::XclExpChTrTabId( const XclExpChTrTabIdBuffer& rBuffer ) + : nTabCount( rBuffer.GetBufferCount() ) +- , mbInRevisionHeaders( bInRevisionHeaders ) + { + pBuffer = new sal_uInt16[ nTabCount ]; + rBuffer.GetBufferCopy( pBuffer ); +@@ -567,31 +677,6 @@ sal_Size XclExpChTrTabId::GetLen() const + return nTabCount << 1; + } + +-void XclExpChTrTabId::SaveXml( XclExpXmlStream& rRevisionLogStrm ) +-{ +- if( !mbInRevisionHeaders ) +- return; +- +- sax_fastparser::FSHelperPtr pRevisionLog = rRevisionLogStrm.GetCurrentStream(); +- rRevisionLogStrm.PopStream(); +- +- sax_fastparser::FSHelperPtr pHeader = rRevisionLogStrm.GetCurrentStream(); +- pHeader->startElement( XML_sheetIdMap, +- XML_count, OString::number( nTabCount ).getStr(), +- FSEND ); +- for( int i = 0; i < nTabCount; ++i ) +- { +- pHeader->singleElement( XML_sheetId, +- XML_val, OString::number( pBuffer[ i ] ).getStr(), +- FSEND ); +- } +- pHeader->endElement( XML_sheetIdMap ); +- +- rRevisionLogStrm.PushStream( pRevisionLog ); +-} +- +-//___________________________________________________________________ +- + // ! does not copy additional actions + XclExpChTrAction::XclExpChTrAction( const XclExpChTrAction& rCopy ) : + ExcRecord( rCopy ), +@@ -1126,11 +1211,12 @@ void XclExpChTrInsert::SaveXml( XclExpXmlStream& rRevisionLogStrm ) + XML_ua, XclXmlUtils::ToPsz( GetAccepted () ), // OOXTODO? bAccepted == ua or ra; not sure. + XML_ra, NULL, // OOXTODO: RRD.fUndoAction? Or RRD.fAccepted? + XML_sId, OString::number( GetTabId( aRange.aStart.Tab() ) ).getStr(), +- XML_eol, NULL, // OOXTODO: not supported? ++ XML_eol, XclXmlUtils::ToPsz10(mbEndOfList), + XML_ref, XclXmlUtils::ToOString( aRange ).getStr(), + XML_action, lcl_GetAction( nOpCode ), + XML_edge, NULL, // OOXTODO: ??? + FSEND ); ++ + // OOXTODO: does this handle XML_rfmt, XML_undo? + XclExpChTrAction* pAction = GetAddAction(); + while( pAction != NULL ) +@@ -1318,17 +1404,6 @@ void XclExpChTr0x014A::SaveXml( XclExpXmlStream& rStrm ) + pStream->endElement( XML_rfmt ); + } + +-//___________________________________________________________________ +- +-class ExcXmlRecord : public ExcRecord +-{ +-public: +- virtual sal_Size GetLen() const; +- virtual sal_uInt16 GetNum() const; +- virtual void Save( XclExpStream& rStrm ); +- virtual void SaveXml( XclExpXmlStream& rStrm ) = 0; +-}; +- + sal_Size ExcXmlRecord::GetLen() const + { + return 0; +@@ -1447,66 +1522,83 @@ XclExpChangeTrack::XclExpChangeTrack( const XclExpRoot& rRoot ) : + } + + // build record list +- pHeader = new XclExpChTrHeader; +- aRecList.push_back( new StartXmlElement( XML_headers, StartXmlElement::WRITE_NAMESPACES ) ); +- aRecList.push_back( pHeader ); +- aRecList.push_back( new XclExpChTr0x0195 ); +- aRecList.push_back( new XclExpChTr0x0194( *pTempChangeTrack ) ); +- +- OUString sLastUsername; +- DateTime aLastDateTime( DateTime::EMPTY ); +- sal_uInt32 nIndex = 1; +- sal_Int32 nLogNumber = 1; +- while( !aActionStack.empty() ) ++ if (GetOutput() == EXC_OUTPUT_BINARY) + { +- XclExpChTrAction* pAction = aActionStack.top(); +- aActionStack.pop(); +- +- if( (nIndex == 1) || pAction->ForceInfoRecord() || +- (pAction->GetUsername() != sLastUsername) || +- (pAction->GetDateTime() != aLastDateTime) ) ++ pHeader = new XclExpChTrHeader; ++ maRecList.push_back( pHeader ); ++ maRecList.push_back( new XclExpChTr0x0195 ); ++ maRecList.push_back( new XclExpChTr0x0194( *pTempChangeTrack ) ); ++ ++ OUString sLastUsername; ++ DateTime aLastDateTime( DateTime::EMPTY ); ++ sal_uInt32 nIndex = 1; ++ sal_Int32 nLogNumber = 1; ++ while( !aActionStack.empty() ) + { +- if( nIndex != 1 ) ++ XclExpChTrAction* pAction = aActionStack.top(); ++ aActionStack.pop(); ++ ++ if( (nIndex == 1) || pAction->ForceInfoRecord() || ++ (pAction->GetUsername() != sLastUsername) || ++ (pAction->GetDateTime() != aLastDateTime) ) + { +- aRecList.push_back( new EndXmlElement( XML_revisions ) ); +- aRecList.push_back( new EndHeaderElement() ); ++ lcl_GenerateGUID( aGUID, bValidGUID ); ++ sLastUsername = pAction->GetUsername(); ++ aLastDateTime = pAction->GetDateTime(); ++ ++ nLogNumber++; ++ maRecList.push_back( new XclExpChTrInfo(sLastUsername, aLastDateTime, aGUID) ); ++ maRecList.push_back( new XclExpChTrTabId(pAction->GetTabIdBuffer()) ); ++ pHeader->SetGUID( aGUID ); + } ++ pAction->SetIndex( nIndex ); ++ maRecList.push_back( pAction ); ++ } + +- lcl_GenerateGUID( aGUID, bValidGUID ); +- sLastUsername = pAction->GetUsername(); +- aLastDateTime = pAction->GetDateTime(); ++ pHeader->SetGUID( aGUID ); ++ pHeader->SetCount( nIndex - 1 ); ++ maRecList.push_back( new ExcEof ); ++ } ++ else ++ { ++ XclExpXmlChTrHeaders* pHeaders = new XclExpXmlChTrHeaders; ++ maRecList.push_back(pHeaders); ++ ++ OUString sLastUsername; ++ DateTime aLastDateTime(DateTime::EMPTY); ++ sal_uInt32 nIndex = 1; ++ sal_Int32 nLogNumber = 1; ++ XclExpXmlChTrHeader* pCurHeader = NULL; ++ ++ while (!aActionStack.empty()) ++ { ++ XclExpChTrAction* pAction = aActionStack.top(); ++ aActionStack.pop(); + +- aRecList.push_back( new StartXmlElement( XML_header, 0 ) ); +- aRecList.push_back( new XclExpChTrInfo( sLastUsername, aLastDateTime, aGUID, nLogNumber++ ) ); +- aRecList.push_back( new XclExpChTrTabId( pAction->GetTabIdBuffer(), true ) ); +- aRecList.push_back( new StartXmlElement( XML_revisions, StartXmlElement::WRITE_NAMESPACES | StartXmlElement::CLOSE_ELEMENT ) ); +- pHeader->SetGUID( aGUID ); ++ if( (nIndex == 1) || pAction->ForceInfoRecord() || ++ (pAction->GetUsername() != sLastUsername) || ++ (pAction->GetDateTime() != aLastDateTime) ) ++ { ++ lcl_GenerateGUID( aGUID, bValidGUID ); ++ sLastUsername = pAction->GetUsername(); ++ aLastDateTime = pAction->GetDateTime(); ++ ++ pCurHeader = new XclExpXmlChTrHeader(sLastUsername, aLastDateTime, aGUID, nLogNumber, pAction->GetTabIdBuffer()); ++ maRecList.push_back(pCurHeader); ++ nLogNumber++; ++ pHeaders->SetGUID(aGUID); ++ } ++ pAction->SetIndex(nIndex); ++ pCurHeader->AppendAction(pAction); + } +- pAction->SetIndex( nIndex ); +- aRecList.push_back( pAction ); +- } + +- pHeader->SetGUID( aGUID ); +- pHeader->SetCount( nIndex - 1 ); +- if( nLogNumber > 1 ) +- { +- aRecList.push_back( new EndXmlElement( XML_revisions ) ); +- aRecList.push_back( new EndHeaderElement() ); ++ pHeaders->SetGUID(aGUID); ++ maRecList.push_back(new EndXmlElement(XML_headers)); + } +- aRecList.push_back( new EndXmlElement( XML_headers ) ); +- aRecList.push_back( new ExcEof ); + } + + XclExpChangeTrack::~XclExpChangeTrack() + { +- std::vector::iterator prIter; +- for ( prIter = aRecList.begin(); prIter != aRecList.end(); ++prIter ) +- delete *prIter; +- +- std::vector::iterator pIter; +- for ( pIter = maBuffers.begin(); pIter != maBuffers.end(); ++pIter ) +- delete *pIter; +- + while( !aActionStack.empty() ) + { + delete aActionStack.top(); +@@ -1602,7 +1694,7 @@ sal_Bool XclExpChangeTrack::WriteUserNamesStream() + + void XclExpChangeTrack::Write() + { +- if( aRecList.empty() ) ++ if (maRecList.empty()) + return; + + if( WriteUserNamesStream() ) +@@ -1613,9 +1705,9 @@ void XclExpChangeTrack::Write() + { + XclExpStream aXclStrm( *xSvStrm, GetRoot(), EXC_MAXRECSIZE_BIFF8 + 8 ); + +- std::vector::iterator pIter; +- for ( pIter = aRecList.begin(); pIter != aRecList.end(); ++pIter ) +- (*pIter)->Save(aXclStrm); ++ RecListType::iterator pIter; ++ for (pIter = maRecList.begin(); pIter != maRecList.end(); ++pIter) ++ pIter->Save(aXclStrm); + + xSvStrm->Commit(); + } +@@ -1643,7 +1735,7 @@ static void lcl_WriteUserNamesXml( XclExpXmlStream& rWorkbookStrm ) + + void XclExpChangeTrack::WriteXml( XclExpXmlStream& rWorkbookStrm ) + { +- if( aRecList.empty() ) ++ if (maRecList.empty()) + return; + + lcl_WriteUserNamesXml( rWorkbookStrm ); +@@ -1659,9 +1751,9 @@ void XclExpChangeTrack::WriteXml( XclExpXmlStream& rWorkbookStrm ) + // contents of XclExpChangeTrack::WriteUserNamesStream()). + rWorkbookStrm.PushStream( pRevisionHeaders ); + +- std::vector::iterator pIter; +- for ( pIter = aRecList.begin(); pIter != aRecList.end(); ++pIter ) +- (*pIter)->SaveXml(rWorkbookStrm); ++ RecListType::iterator pIter; ++ for (pIter = maRecList.begin(); pIter != maRecList.end(); ++pIter) ++ pIter->SaveXml(rWorkbookStrm); + + rWorkbookStrm.PopStream(); + } +-- +1.9.3 + diff --git a/SOURCES/0042-Preserve-the-end-of-list-flag-for-xls-round-tripping.patch b/SOURCES/0042-Preserve-the-end-of-list-flag-for-xls-round-tripping.patch new file mode 100644 index 0000000..33aa91c --- /dev/null +++ b/SOURCES/0042-Preserve-the-end-of-list-flag-for-xls-round-tripping.patch @@ -0,0 +1,298 @@ +From b7bd1b66287d9d337234ac1b9b50a1fafba7dd1e Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Mon, 14 Jul 2014 15:24:19 -0400 +Subject: [PATCH 042/137] Preserve the "end of list" flag for xls + round-tripping. + +This "end of list" flag determines whether the row insertion was an +automatic insertion at the bottom. Calc doesn't use this at the moment +but Excel uses it to differentiate a normal row insertion from an +automatic one. + +(cherry picked from commit adf0d7b1fb8eed88f4fcd6d31662ae6f59d00812) +Signed-off-by: Andras Timar + +Conflicts: + sc/inc/chgtrack.hxx + sc/source/filter/xcl97/XclExpChangeTrack.cxx + +Change-Id: I6b28669d816c54d1dc1e4c106918ba688415788d +(cherry picked from commit 8fd0951429bfa00a054ebbc195a480f89af9f912) +Signed-off-by: Andras Timar +--- + sc/inc/chgtrack.hxx | 26 ++++++++++------ + sc/source/core/tool/chgtrack.cxx | 46 +++++++++++++++++----------- + sc/source/filter/inc/XclExpChangeTrack.hxx | 5 +-- + sc/source/filter/inc/XclImpChangeTrack.hxx | 2 +- + sc/source/filter/xcl97/XclExpChangeTrack.cxx | 17 ++++++++-- + sc/source/filter/xcl97/XclImpChangeTrack.cxx | 11 ++++--- + 6 files changed, 68 insertions(+), 39 deletions(-) + +diff --git a/sc/inc/chgtrack.hxx b/sc/inc/chgtrack.hxx +index 1f6ddcd..2e57437 100644 +--- a/sc/inc/chgtrack.hxx ++++ b/sc/inc/chgtrack.hxx +@@ -402,7 +402,9 @@ class ScChangeActionIns : public ScChangeAction + { + friend class ScChangeTrack; + +- ScChangeActionIns( const ScRange& rRange ); ++ bool mbEndOfList; /// whether or not a row was auto-inserted at the bottom. ++ ++ ScChangeActionIns( const ScRange& rRange, bool bEndOfList = false ); + virtual ~ScChangeActionIns(); + + virtual void AddContent( ScChangeActionContent* ) {} +@@ -413,17 +415,21 @@ class ScChangeActionIns : public ScChangeAction + virtual const ScChangeTrack* GetChangeTrack() const { return 0; } + + public: +- ScChangeActionIns(const sal_uLong nActionNumber, +- const ScChangeActionState eState, +- const sal_uLong nRejectingNumber, +- const ScBigRange& aBigRange, +- const OUString& aUser, +- const DateTime& aDateTime, +- const OUString &sComment, +- const ScChangeActionType eType); // only to use in the XML import ++ ScChangeActionIns( ++ const sal_uLong nActionNumber, ++ const ScChangeActionState eState, ++ const sal_uLong nRejectingNumber, ++ const ScBigRange& aBigRange, ++ const OUString& aUser, ++ const DateTime& aDateTime, ++ const OUString &sComment, ++ const ScChangeActionType eType, ++ bool bEndOfList = false ); + + virtual void GetDescription( + OUString& rStr, ScDocument* pDoc, bool bSplitRange = false, bool bWarning = true) const; ++ ++ SC_DLLPUBLIC bool IsEndOfList() const; + }; + + // ScChangeActionDel +@@ -1123,7 +1129,7 @@ public: + // Only use the following two if there is no different solution! (Assign + // string for NewValue or creation of a formula respectively) + +- SC_DLLPUBLIC void AppendInsert( const ScRange& ); ++ SC_DLLPUBLIC void AppendInsert( const ScRange& rRange, bool bEndOfList = false ); + + // pRefDoc may be NULL => no lookup of contents + // => no generation of deleted contents +diff --git a/sc/source/core/tool/chgtrack.cxx b/sc/source/core/tool/chgtrack.cxx +index 1ebb30d..ff261ca 100644 +--- a/sc/source/core/tool/chgtrack.cxx ++++ b/sc/source/core/tool/chgtrack.cxx +@@ -660,8 +660,9 @@ void ScChangeAction::AddDependent( sal_uLong nActionNumber, + } + + // ScChangeActionIns +-ScChangeActionIns::ScChangeActionIns( const ScRange& rRange ) +- : ScChangeAction( SC_CAT_NONE, rRange ) ++ScChangeActionIns::ScChangeActionIns( const ScRange& rRange, bool bEndOfList ) : ++ ScChangeAction(SC_CAT_NONE, rRange), ++ mbEndOfList(bEndOfList) + { + if ( rRange.aStart.Col() == 0 && rRange.aEnd.Col() == MAXCOL ) + { +@@ -692,8 +693,10 @@ ScChangeActionIns::ScChangeActionIns( + const sal_uLong nActionNumber, const ScChangeActionState eStateP, + const sal_uLong nRejectingNumber, const ScBigRange& aBigRangeP, + const OUString& aUserP, const DateTime& aDateTimeP, +- const OUString& sComment, const ScChangeActionType eTypeP) : +- ScChangeAction(eTypeP, aBigRangeP, nActionNumber, nRejectingNumber, eStateP, aDateTimeP, aUserP, sComment) ++ const OUString& sComment, const ScChangeActionType eTypeP, ++ bool bEndOfList ) : ++ ScChangeAction(eTypeP, aBigRangeP, nActionNumber, nRejectingNumber, eStateP, aDateTimeP, aUserP, sComment), ++ mbEndOfList(bEndOfList) + { + } + +@@ -736,6 +739,11 @@ void ScChangeActionIns::GetDescription( + } + } + ++bool ScChangeActionIns::IsEndOfList() const ++{ ++ return mbEndOfList; ++} ++ + bool ScChangeActionIns::Reject( ScDocument* pDoc ) + { + if ( !aBigRange.IsValid( pDoc ) ) +@@ -2826,9 +2834,9 @@ ScChangeActionContent* ScChangeTrack::AppendContentOnTheFly( + return pAct; + } + +-void ScChangeTrack::AppendInsert( const ScRange& rRange ) ++void ScChangeTrack::AppendInsert( const ScRange& rRange, bool bEndOfList ) + { +- ScChangeActionIns* pAct = new ScChangeActionIns( rRange ); ++ ScChangeActionIns* pAct = new ScChangeActionIns(rRange, bEndOfList); + Append( pAct ); + } + +@@ -4458,18 +4466,20 @@ ScChangeTrack* ScChangeTrack::Clone( ScDocument* pDocument ) const + case SC_CAT_INSERT_COLS: + case SC_CAT_INSERT_ROWS: + case SC_CAT_INSERT_TABS: +- { +- pClonedAction = new ScChangeActionIns( +- pAction->GetActionNumber(), +- pAction->GetState(), +- pAction->GetRejectAction(), +- pAction->GetBigRange(), +- pAction->GetUser(), +- pAction->GetDateTimeUTC(), +- pAction->GetComment(), +- pAction->GetType() ); +- } +- break; ++ { ++ bool bEndOfList = static_cast(pAction)->IsEndOfList(); ++ pClonedAction = new ScChangeActionIns( ++ pAction->GetActionNumber(), ++ pAction->GetState(), ++ pAction->GetRejectAction(), ++ pAction->GetBigRange(), ++ pAction->GetUser(), ++ pAction->GetDateTimeUTC(), ++ pAction->GetComment(), ++ pAction->GetType(), ++ bEndOfList ); ++ } ++ break; + case SC_CAT_DELETE_COLS: + case SC_CAT_DELETE_ROWS: + case SC_CAT_DELETE_TABS: +diff --git a/sc/source/filter/inc/XclExpChangeTrack.hxx b/sc/source/filter/inc/XclExpChangeTrack.hxx +index 72b7066..c7ee389 100644 +--- a/sc/source/filter/inc/XclExpChangeTrack.hxx ++++ b/sc/source/filter/inc/XclExpChangeTrack.hxx +@@ -516,11 +516,12 @@ public: + + class XclExpChTrInsert : public XclExpChTrAction + { ++ bool mbEndOfList; ++ + protected: + ScRange aRange; + +- XclExpChTrInsert( const XclExpChTrInsert& rCopy ) : +- XclExpChTrAction( rCopy ), aRange( rCopy.aRange ) {} ++ XclExpChTrInsert( const XclExpChTrInsert& rCopy ); + + virtual void SaveActionData( XclExpStream& rStrm ) const; + virtual void PrepareSaveAction( XclExpStream& rStrm ) const; +diff --git a/sc/source/filter/inc/XclImpChangeTrack.hxx b/sc/source/filter/inc/XclImpChangeTrack.hxx +index ffce967..c1b06d6 100644 +--- a/sc/source/filter/inc/XclImpChangeTrack.hxx ++++ b/sc/source/filter/inc/XclImpChangeTrack.hxx +@@ -73,7 +73,7 @@ private: + void DoAcceptRejectAction( ScChangeAction* pAction ); + void DoAcceptRejectAction( sal_uInt32 nFirst, sal_uInt32 nLast ); + +- void DoInsertRange( const ScRange& rRange ); ++ void DoInsertRange( const ScRange& rRange, bool bEndOfList ); + void DoDeleteRange( const ScRange& rRange ); + + inline sal_uInt8 LookAtuInt8(); +diff --git a/sc/source/filter/xcl97/XclExpChangeTrack.cxx b/sc/source/filter/xcl97/XclExpChangeTrack.cxx +index aed0322..fe27e92 100644 +--- a/sc/source/filter/xcl97/XclExpChangeTrack.cxx ++++ b/sc/source/filter/xcl97/XclExpChangeTrack.cxx +@@ -1118,7 +1118,10 @@ void XclExpChTrCellContent::SaveXml( XclExpXmlStream& rRevisionLogStrm ) + pStream->endElement( XML_rcc ); + } + +-//___________________________________________________________________ ++XclExpChTrInsert::XclExpChTrInsert( const XclExpChTrInsert& rCopy ) : ++ XclExpChTrAction(rCopy), ++ mbEndOfList(rCopy.mbEndOfList), ++ aRange(rCopy.aRange) {} + + XclExpChTrInsert::XclExpChTrInsert( + const ScChangeAction& rAction, +@@ -1126,13 +1129,20 @@ XclExpChTrInsert::XclExpChTrInsert( + const XclExpChTrTabIdBuffer& rTabIdBuffer, + ScChangeTrack& rChangeTrack ) : + XclExpChTrAction( rAction, rRoot, rTabIdBuffer ), ++ mbEndOfList(false), + aRange( rAction.GetBigRange().MakeRange() ) + { + nLength = 0x00000030; + switch( rAction.GetType() ) + { + case SC_CAT_INSERT_COLS: nOpCode = EXC_CHTR_OP_INSCOL; break; +- case SC_CAT_INSERT_ROWS: nOpCode = EXC_CHTR_OP_INSROW; break; ++ case SC_CAT_INSERT_ROWS: ++ { ++ const ScChangeActionIns& rIns = static_cast(rAction); ++ mbEndOfList = rIns.IsEndOfList(); ++ nOpCode = EXC_CHTR_OP_INSROW; ++ } ++ break; + case SC_CAT_DELETE_COLS: nOpCode = EXC_CHTR_OP_DELCOL; break; + case SC_CAT_DELETE_ROWS: nOpCode = EXC_CHTR_OP_DELROW; break; + default: +@@ -1164,7 +1174,8 @@ XclExpChTrInsert::~XclExpChTrInsert() + void XclExpChTrInsert::SaveActionData( XclExpStream& rStrm ) const + { + WriteTabId( rStrm, aRange.aStart.Tab() ); +- rStrm << (sal_uInt16) 0x0000; ++ sal_uInt16 nFlagVal = mbEndOfList ? 0x0001 : 0x0000; ++ rStrm << nFlagVal; + Write2DRange( rStrm, aRange ); + rStrm << (sal_uInt32) 0x00000000; + } +diff --git a/sc/source/filter/xcl97/XclImpChangeTrack.cxx b/sc/source/filter/xcl97/XclImpChangeTrack.cxx +index 58c2540..cf1babc 100644 +--- a/sc/source/filter/xcl97/XclImpChangeTrack.cxx ++++ b/sc/source/filter/xcl97/XclImpChangeTrack.cxx +@@ -95,10 +95,10 @@ void XclImpChangeTrack::DoAcceptRejectAction( sal_uInt32 nFirst, sal_uInt32 nLas + DoAcceptRejectAction( pChangeTrack->GetAction( nIndex ) ); + } + +-void XclImpChangeTrack::DoInsertRange( const ScRange& rRange ) ++void XclImpChangeTrack::DoInsertRange( const ScRange& rRange, bool bEndOfList ) + { + sal_uInt32 nFirst = pChangeTrack->GetActionMax() + 1; +- pChangeTrack->AppendInsert( rRange ); ++ pChangeTrack->AppendInsert(rRange, bEndOfList); + sal_uInt32 nLast = pChangeTrack->GetActionMax(); + DoAcceptRejectAction( nFirst, nLast ); + } +@@ -299,7 +299,8 @@ void XclImpChangeTrack::ReadChTrInsert() + ScRange aRange; + aRange.aStart.SetTab( ReadTabNum() ); + aRange.aEnd.SetTab( aRange.aStart.Tab() ); +- pStrm->Ignore( 2 ); ++ sal_uInt16 nFlags = pStrm->ReaduInt16(); ++ bool bEndOfList = (nFlags & 0x0001); // row auto-inserted at the bottom. + Read2DRange( aRange ); + + if( aRecHeader.nOpCode & EXC_CHTR_OP_COLFLAG ) +@@ -316,7 +317,7 @@ void XclImpChangeTrack::ReadChTrInsert() + if( aRecHeader.nOpCode & EXC_CHTR_OP_DELFLAG ) + DoDeleteRange( aRange ); + else +- DoInsertRange( aRange ); ++ DoInsertRange(aRange, bEndOfList); + } + } + } +@@ -428,7 +429,7 @@ void XclImpChangeTrack::ReadChTrInsertTab() + if( pStrm->IsValid() ) + { + nTabIdCount++; +- DoInsertRange( ScRange( 0, 0, nTab, MAXCOL, MAXROW, nTab ) ); ++ DoInsertRange(ScRange(0, 0, nTab, MAXCOL, MAXROW, nTab), false); + } + } + } +-- +1.9.3 + diff --git a/SOURCES/0042-fdo-71892-sw-fix-crash-when-pasting-table-in-footnot.patch b/SOURCES/0042-fdo-71892-sw-fix-crash-when-pasting-table-in-footnot.patch deleted file mode 100644 index 8552c5e..0000000 --- a/SOURCES/0042-fdo-71892-sw-fix-crash-when-pasting-table-in-footnot.patch +++ /dev/null @@ -1,74 +0,0 @@ -From 640e8abbff03f7f242c0c0b9d73ffd2eda3c4e35 Mon Sep 17 00:00:00 2001 -From: Michael Stahl -Date: Thu, 5 Dec 2013 21:58:11 +0100 -Subject: [PATCH 042/109] fdo#71892: sw: fix crash when pasting table in - footnote -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The code that updates RSIDs assumes that the number of nodes copied is -the same as the number of nodes inserted, which is not true when pasting -a table into a footnote because Writer can't do that, hence all table -nodes are missing. Count inserted nodes instead. - -(regression from 062eaeffe7cb986255063bb9b0a5f3fb3fc8e34c) - -(cherry picked from commit 4580094d2d9d5b952c4526ee23204f75a5bb2f1b) - -Conflicts: - sw/source/core/frmedt/fecopy.cxx - -(cherry picked from commit 2171fff4c1a57ede8f9693d7c0d95c1171a49a70) - -Change-Id: I77b5b7751d1036a6401f708532537d874969502e -Reviewed-on: https://gerrit.libreoffice.org/6951 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - sw/source/core/frmedt/fecopy.cxx | 23 ++++++++++------------- - 1 file changed, 10 insertions(+), 13 deletions(-) - -diff --git a/sw/source/core/frmedt/fecopy.cxx b/sw/source/core/frmedt/fecopy.cxx -index 3fa4a73..6c503dc 100644 ---- a/sw/source/core/frmedt/fecopy.cxx -+++ b/sw/source/core/frmedt/fecopy.cxx -@@ -1039,25 +1039,22 @@ sal_Bool SwFEShell::Paste( SwDoc* pClpDoc, sal_Bool bIncludingPageFrames ) - aIndexBefore--; - - pClpDoc->CopyRange( aCpyPam, rInsPos, false ); -+ // Note: aCpyPam is invalid now - -- { -- ++aIndexBefore; -- SwPaM aPaM(SwPosition(aIndexBefore), -- SwPosition(rInsPos.nNode)); -+ ++aIndexBefore; -+ SwPaM aPaM(SwPosition(aIndexBefore), -+ SwPosition(rInsPos.nNode)); - -- aPaM.GetDoc()->MakeUniqueNumRules(aPaM); -- } -- } -+ aPaM.GetDoc()->MakeUniqueNumRules(aPaM); - -- // Update the rsid of each pasted text node. -- { -- xub_StrLen nNodesCnt = aCpyPam.End()->nNode.GetIndex() - aCpyPam.Start()->nNode.GetIndex(); -+ // Update the rsid of each pasted text node. - SwNodes &rDestNodes = GetDoc()->GetNodes(); -- xub_StrLen nDestStart = PCURCRSR->GetPoint()->nNode.GetIndex() - nNodesCnt; -+ sal_uLong const nEndIdx = aPaM.End()->nNode.GetIndex(); - -- for ( sal_uInt64 nIdx = 0; nIdx <= nNodesCnt; nIdx++ ) -+ for (sal_uLong nIdx = aPaM.Start()->nNode.GetIndex(); -+ nIdx <= nEndIdx; ++nIdx) - { -- SwTxtNode *pTxtNode = rDestNodes[ nDestStart + nIdx ]->GetTxtNode(); -+ SwTxtNode *const pTxtNode = rDestNodes[nIdx]->GetTxtNode(); - if ( pTxtNode ) - { - GetDoc()->UpdateParRsid( pTxtNode ); --- -1.8.4.2 - diff --git a/SOURCES/0043-bnc-883684-Better-fix-for-this.patch b/SOURCES/0043-bnc-883684-Better-fix-for-this.patch new file mode 100644 index 0000000..19fa5ad --- /dev/null +++ b/SOURCES/0043-bnc-883684-Better-fix-for-this.patch @@ -0,0 +1,237 @@ +From 9ba9d810d9e17a7e3a3e0885235924f4c480c3b0 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Fri, 11 Jul 2014 10:50:29 -0400 +Subject: [PATCH 043/137] bnc#883684: Better fix for this. + +Instead of making all chart objects exempt from unloading, check each OLE +object on whether or not it already has its persistent storage created. +If not, don't unload it else it would have nothing to load back from once +unloaded. + +(cherry picked from commit a0bd5587a5ac62974bdb10731d3fd21584521a72) + +Conflicts: + svx/source/svdraw/svdetc.cxx + embeddedobj/source/commonembedding/miscobj.cxx + embeddedobj/source/commonembedding/persistence.cxx + include/svx/svdoole2.hxx + svx/source/svdraw/svdoole2.cxx + +Change-Id: I2312e86c9376d3699ef4aa1e0cf2f4c04f706c1e +--- + embeddedobj/source/commonembedding/miscobj.cxx | 8 +++++- + embeddedobj/source/commonembedding/persistence.cxx | 10 +++++++- + embeddedobj/source/inc/commonembobj.hxx | 8 ++++-- + include/svx/svdoole2.hxx | 7 ----- + offapi/UnoApi_offapi.mk | 1 + + offapi/com/sun/star/embed/XEmbedPersist2.idl | 30 ++++++++++++++++++++++ + svx/source/svdraw/svdetc.cxx | 4 --- + svx/source/svdraw/svdoole2.cxx | 16 +++++++----- + 8 files changed, 62 insertions(+), 22 deletions(-) + create mode 100644 offapi/com/sun/star/embed/XEmbedPersist2.idl + +diff --git a/embeddedobj/source/commonembedding/miscobj.cxx b/embeddedobj/source/commonembedding/miscobj.cxx +index 70b8696..8ce2f84 100644 +--- a/embeddedobj/source/commonembedding/miscobj.cxx ++++ b/embeddedobj/source/commonembedding/miscobj.cxx +@@ -363,6 +363,11 @@ uno::Any SAL_CALL OCommonEmbeddedObject::queryInterface( const uno::Type& rType + void * p = static_cast< embed::XEmbeddedObject * >( this ); + return uno::Any( &p, rType ); + } ++ else if (rType == ::getCppuType( (uno::Reference const *)0 )) ++ { ++ void* p = static_cast(this); ++ return uno::Any(&p, rType); ++ } + else + aReturn <<= ::cppu::queryInterface( + rType, +@@ -431,7 +436,8 @@ uno::Sequence< uno::Type > SAL_CALL OCommonEmbeddedObject::getTypes() + ::getCppuType( (const uno::Reference< embed::XInplaceObject >*)NULL ), + ::getCppuType( (const uno::Reference< embed::XCommonEmbedPersist >*)NULL ), + ::getCppuType( (const uno::Reference< container::XChild >*)NULL ), +- ::getCppuType( (const uno::Reference< embed::XEmbedPersist >*)NULL ) ); ++ ::getCppuType( (const uno::Reference< embed::XEmbedPersist >*)NULL ), ++ ::getCppuType( (const uno::Reference< embed::XEmbedPersist2 >*)NULL ) ); + + pTypeCollection = &aTypeCollection ; + } +diff --git a/embeddedobj/source/commonembedding/persistence.cxx b/embeddedobj/source/commonembedding/persistence.cxx +index 4891656..44b4e30 100644 +--- a/embeddedobj/source/commonembedding/persistence.cxx ++++ b/embeddedobj/source/commonembedding/persistence.cxx +@@ -1799,7 +1799,15 @@ void SAL_CALL OCommonEmbeddedObject::reload( + } + } + +-//------------------------------------------------------ ++sal_Bool SAL_CALL OCommonEmbeddedObject::isStored() throw (css::uno::RuntimeException, std::exception) ++{ ++ uno::Reference xNA(m_xObjectStorage, uno::UNO_QUERY); ++ if (!xNA.is()) ++ return false; ++ ++ return xNA->getElementNames().getLength() > 0; ++} ++ + void SAL_CALL OCommonEmbeddedObject::breakLink( const uno::Reference< embed::XStorage >& xStorage, + const OUString& sEntName ) + throw ( lang::IllegalArgumentException, +diff --git a/embeddedobj/source/inc/commonembobj.hxx b/embeddedobj/source/inc/commonembobj.hxx +index 83e4445..4c23325 100644 +--- a/embeddedobj/source/inc/commonembobj.hxx ++++ b/embeddedobj/source/inc/commonembobj.hxx +@@ -27,7 +27,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include +@@ -72,7 +72,7 @@ namespace comphelper { + class Interceptor; + + class OCommonEmbeddedObject : public ::com::sun::star::embed::XEmbeddedObject +- , public ::com::sun::star::embed::XEmbedPersist ++ , public ::com::sun::star::embed::XEmbedPersist2 + , public ::com::sun::star::embed::XLinkageSupport + , public ::com::sun::star::embed::XInplaceObject + , public ::com::sun::star::container::XChild +@@ -431,6 +431,10 @@ public: + ::com::sun::star::uno::Exception, + ::com::sun::star::uno::RuntimeException ); + ++// XEmbedPersist2 ++ ++ virtual sal_Bool SAL_CALL isStored() ++ throw (css::uno::RuntimeException, std::exception) SAL_OVERRIDE; + + // XInplaceObject + +diff --git a/include/svx/svdoole2.hxx b/include/svx/svdoole2.hxx +index 149dc61..c2cad4b 100644 +--- a/include/svx/svdoole2.hxx ++++ b/include/svx/svdoole2.hxx +@@ -170,13 +170,6 @@ public: + sal_Bool IsChart() const; + sal_Bool IsCalc() const; + +- /** +- * Unloadable OLE objects are subject to automatic unloading per memory +- * setting. The "Number of objects" setting in the Memory option controls +- * how many OLE objects can be loaded at any given moment. +- */ +- bool IsUnloadable() const; +- + sal_Bool UpdateLinkURL_Impl(); + void BreakFileLink_Impl(); + void DisconnectFileLink_Impl(); +diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk +index 3c1d92e..22d84d2 100755 +--- a/offapi/UnoApi_offapi.mk ++++ b/offapi/UnoApi_offapi.mk +@@ -2411,6 +2411,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/embed,\ + XEmbeddedObjectCreator \ + XEmbedObjectFactory \ + XEmbedPersist \ ++ XEmbedPersist2 \ + XEmbeddedClient \ + XEmbeddedObject \ + XEncryptionProtectedSource \ +diff --git a/offapi/com/sun/star/embed/XEmbedPersist2.idl b/offapi/com/sun/star/embed/XEmbedPersist2.idl +new file mode 100644 +index 0000000..205b902 +--- /dev/null ++++ b/offapi/com/sun/star/embed/XEmbedPersist2.idl +@@ -0,0 +1,30 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ */ ++ ++#ifndef __com_sun_star_XEmbedPersist2_idl__ ++#define __com_sun_star_XEmbedPersist2_idl__ ++ ++#include ++ ++module com { module sun { module star { module embed { ++ ++interface XEmbedPersist2 : XEmbedPersist ++{ ++ /** ++ * Checks whether or not the object has created its persistent ++ * representation counterpart of its in-memory model. ++ */ ++ boolean isStored(); ++}; ++ ++}; }; }; }; ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/svx/source/svdraw/svdetc.cxx b/svx/source/svdraw/svdetc.cxx +index afcc792..4caca94 100644 +--- a/svx/source/svdraw/svdetc.cxx ++++ b/svx/source/svdraw/svdetc.cxx +@@ -165,10 +165,6 @@ void OLEObjCache::UnloadOnDemand() + + void OLEObjCache::InsertObj(SdrOle2Obj* pObj) + { +- if (!pObj->IsUnloadable()) +- // This OLE object is exempt from automatic unloading. +- return; +- + if ( !empty() ) + { + SdrOle2Obj* pExistingObj = front(); +diff --git a/svx/source/svdraw/svdoole2.cxx b/svx/source/svdraw/svdoole2.cxx +index f68f5d7..f1f27a83 100644 +--- a/svx/source/svdraw/svdoole2.cxx ++++ b/svx/source/svdraw/svdoole2.cxx +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1926,6 +1927,14 @@ void SdrOle2Obj::NbcMove(const Size& rSize) + + sal_Bool SdrOle2Obj::CanUnloadRunningObj( const uno::Reference< embed::XEmbeddedObject >& xObj, sal_Int64 nAspect ) + { ++ uno::Reference xPersist(xObj, uno::UNO_QUERY); ++ if (xPersist.is()) ++ { ++ if (!xPersist->isStored()) ++ // It doesn't have persistent storage. We can't unload this. ++ return false; ++ } ++ + sal_Bool bResult = sal_False; + + sal_Int32 nState = xObj->getCurrentState(); +@@ -2159,13 +2168,6 @@ sal_Bool SdrOle2Obj::IsCalc() const + return sal_False; + } + +-bool SdrOle2Obj::IsUnloadable() const +-{ +- // Right now, chart OLE objects are the only ones exempt from automatic +- // unloading. +- return !IsChart(); +-} +- + uno::Reference< frame::XModel > SdrOle2Obj::GetParentXModel() const + { + uno::Reference< frame::XModel > xDoc; +-- +1.9.3 + diff --git a/SOURCES/0043-fdo-69518-Correctly-handle-the-old-constraint-syntax.patch b/SOURCES/0043-fdo-69518-Correctly-handle-the-old-constraint-syntax.patch deleted file mode 100644 index 44845d5..0000000 --- a/SOURCES/0043-fdo-69518-Correctly-handle-the-old-constraint-syntax.patch +++ /dev/null @@ -1,482 +0,0 @@ -From cfc9cef1e26e98153eb93229a9c18a674a3ebf11 Mon Sep 17 00:00:00 2001 -From: Kohei Yoshida -Date: Fri, 6 Dec 2013 10:43:38 -0500 -Subject: [PATCH 043/109] fdo#69518: Correctly handle the old constraint - syntax. - -We apparently support this syntax for ODF-backward compatibility. - -To fix this, I resurrected ScDPObject::ParseFilters() which was removed as -unused, adjusted it for the String->OUString change, and changed the filter -data structure to the UNO one rather than using the old one we no longer use -elsewhere. - -(cherry picked from commit 1d85c8df2fb9cb25fc524485339ae9f11e8da676) - -Conflicts: - sc/inc/dpobject.hxx - sc/source/core/data/dpobject.cxx - sc/source/core/tool/interpr2.cxx - -Change-Id: If52b38aaa1e8b208fb0ef9d92a6e853decdf43e3 -Reviewed-on: https://gerrit.libreoffice.org/6962 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - sc/inc/dpobject.hxx | 8 +- - sc/inc/dpoutput.hxx | 21 ----- - sc/source/core/data/dpobject.cxx | 163 ++++++++++++++++++++------------------- - sc/source/core/tool/interpr2.cxx | 15 ++++ - 4 files changed, 103 insertions(+), 104 deletions(-) - -diff --git a/sc/inc/dpobject.hxx b/sc/inc/dpobject.hxx -index 735b033..8505a53 100644 ---- a/sc/inc/dpobject.hxx -+++ b/sc/inc/dpobject.hxx -@@ -183,9 +183,11 @@ public: - const OUString& rDataFieldName, - std::vector& rFilters); - -- bool ParseFilters( ScDPGetPivotDataField& rTarget, -- std::vector< ScDPGetPivotDataField >& rFilters, -- const OUString& rFilterList ); -+ bool ParseFilters( -+ OUString& rDataFieldName, -+ std::vector& rFilters, -+ std::vector& rFilterFuncs, -+ const OUString& rFilterList ); - - void GetMemberResultNames(ScDPUniqueStringSet& rNames, long nDimension); - -diff --git a/sc/inc/dpoutput.hxx b/sc/inc/dpoutput.hxx -index 293d937..7b38c7e 100644 ---- a/sc/inc/dpoutput.hxx -+++ b/sc/inc/dpoutput.hxx -@@ -41,29 +41,8 @@ namespace com { namespace sun { namespace star { namespace sheet { - - class Rectangle; - class ScDocument; -- - struct ScDPOutLevelData; - -- --struct ScDPGetPivotDataField --{ -- OUString maFieldName; -- com::sun::star::sheet::GeneralFunction meFunction; -- -- bool mbValIsStr; -- OUString maValStr; -- double mnValNum; -- -- ScDPGetPivotDataField() : -- meFunction( com::sun::star::sheet::GeneralFunction_NONE ), -- mbValIsStr( false ), -- mnValNum( 0.0 ) -- { -- } --}; -- -- -- - class ScDPOutput - { - private: -diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx -index 3a45a34..677ccd5 100644 ---- a/sc/source/core/data/dpobject.cxx -+++ b/sc/source/core/data/dpobject.cxx -@@ -1400,25 +1400,27 @@ void ScDPObject::GetMemberResultNames(ScDPUniqueStringSet& rNames, long nDimensi - pOutput->GetMemberResultNames(rNames, nDimension); // used only with table data -> level not needed - } - --static bool lcl_Dequote( const String& rSource, xub_StrLen nStartPos, xub_StrLen& rEndPos, String& rResult ) -+namespace { -+ -+bool dequote( const OUString& rSource, sal_Int32 nStartPos, sal_Int32& rEndPos, OUString& rResult ) - { - // nStartPos has to point to opening quote - - bool bRet = false; - const sal_Unicode cQuote = '\''; - -- if ( rSource.GetChar(nStartPos) == cQuote ) -+ if (rSource[nStartPos] == cQuote) - { - OUStringBuffer aBuffer; -- xub_StrLen nPos = nStartPos + 1; -- const xub_StrLen nLen = rSource.Len(); -+ sal_Int32 nPos = nStartPos + 1; -+ const sal_Int32 nLen = rSource.getLength(); - - while ( nPos < nLen ) - { -- const sal_Unicode cNext = rSource.GetChar(nPos); -+ const sal_Unicode cNext = rSource[nPos]; - if ( cNext == cQuote ) - { -- if ( nPos+1 < nLen && rSource.GetChar(nPos+1) == cQuote ) -+ if (nPos+1 < nLen && rSource[nPos+1] == cQuote) - { - // double quote is used for an embedded quote - aBuffer.append( cNext ); // append one quote -@@ -1449,7 +1451,7 @@ struct ScGetPivotDataFunctionEntry - sheet::GeneralFunction eFunc; - }; - --static bool lcl_ParseFunction( const String& rList, xub_StrLen nStartPos, xub_StrLen& rEndPos, sheet::GeneralFunction& rFunc ) -+bool parseFunction( const OUString& rList, sal_Int32 nStartPos, sal_Int32& rEndPos, sheet::GeneralFunction& rFunc ) - { - static const ScGetPivotDataFunctionEntry aFunctions[] = - { -@@ -1471,22 +1473,22 @@ static bool lcl_ParseFunction( const String& rList, xub_StrLen nStartPos, xub_St - { "StdDevp", sheet::GeneralFunction_STDEVP } - }; - -- const xub_StrLen nListLen = rList.Len(); -- while ( nStartPos < nListLen && rList.GetChar(nStartPos) == ' ' ) -+ const sal_Int32 nListLen = rList.getLength(); -+ while (nStartPos < nListLen && rList[nStartPos] == ' ') - ++nStartPos; - - bool bParsed = false; - bool bFound = false; -- String aFuncStr; -- xub_StrLen nFuncEnd = 0; -- if ( nStartPos < nListLen && rList.GetChar(nStartPos) == '\'' ) -- bParsed = lcl_Dequote( rList, nStartPos, nFuncEnd, aFuncStr ); -+ OUString aFuncStr; -+ sal_Int32 nFuncEnd = 0; -+ if (nStartPos < nListLen && rList[nStartPos] == '\'') -+ bParsed = dequote( rList, nStartPos, nFuncEnd, aFuncStr ); - else - { -- nFuncEnd = rList.Search( static_cast(']'), nStartPos ); -- if ( nFuncEnd != STRING_NOTFOUND ) -+ nFuncEnd = rList.indexOf(']', nStartPos); -+ if (nFuncEnd >= 0) - { -- aFuncStr = rList.Copy( nStartPos, nFuncEnd - nStartPos ); -+ aFuncStr = rList.copy(nStartPos, nFuncEnd - nStartPos); - bParsed = true; - } - } -@@ -1498,12 +1500,12 @@ static bool lcl_ParseFunction( const String& rList, xub_StrLen nStartPos, xub_St - const sal_Int32 nFuncCount = sizeof(aFunctions) / sizeof(aFunctions[0]); - for ( sal_Int32 nFunc=0; nFunc(']'), nStartPos ); -- if ( nClosePos != STRING_NOTFOUND ) -+ sal_Int32 nClosePos = rList.indexOf(']', nStartPos); -+ if (nClosePos >= 0) - { -- xub_StrLen nNameEnd = nClosePos; -- xub_StrLen nSemiPos = rList.Search( static_cast(';'), nStartPos ); -- if ( nSemiPos != STRING_NOTFOUND && nSemiPos < nClosePos && pFunc ) -+ sal_Int32 nNameEnd = nClosePos; -+ sal_Int32 nSemiPos = rList.indexOf(';', nStartPos); -+ if (nSemiPos >= 0 && nSemiPos < nClosePos && pFunc) - { -- xub_StrLen nFuncEnd = 0; -- if ( lcl_ParseFunction( rList, nSemiPos + 1, nFuncEnd, *pFunc ) ) -+ sal_Int32 nFuncEnd = 0; -+ if (parseFunction(rList, nSemiPos+1, nFuncEnd, *pFunc)) - nNameEnd = nSemiPos; - } - -- aDequoted = rList.Copy( nStartPos, nNameEnd - nStartPos ); -+ aDequoted = rList.copy(nStartPos, nNameEnd - nStartPos); - // spaces before the closing bracket or semicolon - aDequoted = comphelper::string::stripEnd(aDequoted, ' '); - nQuoteEnd = nClosePos + 1; -@@ -1589,26 +1592,26 @@ static bool lcl_IsAtStart( const String& rList, const String& rSearch, sal_Int32 - if ( bParsed && ScGlobal::GetpTransliteration()->isEqual( aDequoted, rSearch ) ) - { - nMatchList = nQuoteEnd; // match count in the list string, including quotes -- nMatchSearch = rSearch.Len(); -+ nMatchSearch = rSearch.getLength(); - } - } - else - { - // otherwise look for search string at the start of rList -- ScGlobal::GetpTransliteration()->equals( rList, 0, rList.Len(), nMatchList, -- rSearch, 0, rSearch.Len(), nMatchSearch ); -+ ScGlobal::GetpTransliteration()->equals( -+ rList, 0, rList.getLength(), nMatchList, rSearch, 0, rSearch.getLength(), nMatchSearch); - } - -- if ( nMatchSearch == rSearch.Len() ) -+ if (nMatchSearch == rSearch.getLength()) - { - // search string is at start of rList - look for following space or end of string - - bool bValid = false; -- if ( sal::static_int_cast(nMatchList) >= rList.Len() ) -+ if ( sal::static_int_cast(nMatchList) >= rList.getLength() ) - bValid = true; - else - { -- sal_Unicode cNext = rList.GetChar(sal::static_int_cast(nMatchList)); -+ sal_Unicode cNext = rList[nMatchList]; - if ( cNext == ' ' || ( bAllowBracket && cNext == '[' ) ) - bValid = true; - } -@@ -1623,17 +1626,20 @@ static bool lcl_IsAtStart( const String& rList, const String& rSearch, sal_Int32 - return false; - } - --bool ScDPObject::ParseFilters( ScDPGetPivotDataField& rTarget, -- std::vector< ScDPGetPivotDataField >& rFilters, -- const OUString& rFilterList ) -+} // anonymous namespace -+ -+bool ScDPObject::ParseFilters( -+ OUString& rDataFieldName, -+ std::vector& rFilters, -+ std::vector& rFilterFuncs, const OUString& rFilterList ) - { - // parse the string rFilterList into parameters for GetPivotData - - CreateObjects(); // create xSource if not already done - -- std::vector aDataNames; // data fields (source name) -- std::vector aGivenNames; // data fields (compound name) -- std::vector aFieldNames; // column/row/data fields -+ std::vector aDataNames; // data fields (source name) -+ std::vector aGivenNames; // data fields (compound name) -+ std::vector aFieldNames; // column/row/data fields - std::vector< uno::Sequence > aFieldValues; - - // -@@ -1691,7 +1697,7 @@ bool ScDPObject::ParseFilters( ScDPGetPivotDataField& rTarget, - { - uno::Reference xMembers = xLevSupp->getMembers(); - -- String aFieldName( xLevNam->getName() ); -+ OUString aFieldName( xLevNam->getName() ); - uno::Sequence aMemberNames( xMembers->getElementNames() ); - - aFieldNames.push_back( aFieldName ); -@@ -1713,8 +1719,8 @@ bool ScDPObject::ParseFilters( ScDPGetPivotDataField& rTarget, - - bool bError = false; - bool bHasData = false; -- String aRemaining(comphelper::string::strip(rFilterList, ' ')); -- while ( aRemaining.Len() && !bError ) -+ OUString aRemaining(comphelper::string::strip(rFilterList, ' ')); -+ while (!aRemaining.isEmpty() && !bError) - { - bool bUsed = false; - -@@ -1722,17 +1728,17 @@ bool ScDPObject::ParseFilters( ScDPGetPivotDataField& rTarget, - - for ( SCSIZE nDataPos=0; nDataPos(nMatched) ); -+ rDataFieldName = aFound; -+ aRemaining = aRemaining.copy(nMatched); - bHasData = true; - bUsed = true; - } -@@ -1740,21 +1746,21 @@ bool ScDPObject::ParseFilters( ScDPGetPivotDataField& rTarget, - - // look for field name - -- String aSpecField; -+ OUString aSpecField; - bool bHasFieldName = false; - if ( !bUsed ) - { - sal_Int32 nMatched = 0; - for ( SCSIZE nField=0; nField(nMatched) ); -+ aRemaining = aRemaining.copy(nMatched); - aRemaining = comphelper::string::stripStart(aRemaining, ' '); - - // field name has to be followed by item name in brackets -- if ( aRemaining.GetChar(0) == '[' ) -+ if (!aRemaining.isEmpty() && aRemaining[0] == '[') - { - bHasFieldName = true; - // bUsed remains false - still need the item -@@ -1774,8 +1780,8 @@ bool ScDPObject::ParseFilters( ScDPGetPivotDataField& rTarget, - { - bool bItemFound = false; - sal_Int32 nMatched = 0; -- String aFoundName; -- String aFoundValue; -+ OUString aFoundName; -+ OUString aFoundValue; - sheet::GeneralFunction eFunc = sheet::GeneralFunction_NONE; - sheet::GeneralFunction eFoundFunc = sheet::GeneralFunction_NONE; - -@@ -1790,7 +1796,7 @@ bool ScDPObject::ParseFilters( ScDPGetPivotDataField& rTarget, - const OUString* pItemArr = rItems.getConstArray(); - for ( sal_Int32 nItem=0; nItem(nMatched) ); -+ sheet::DataPilotFieldFilter aField; -+ aField.FieldName = aFoundName; -+ aField.MatchValue = aFoundValue; -+ rFilters.push_back(aField); -+ rFilterFuncs.push_back(eFoundFunc); -+ aRemaining = aRemaining.copy(nMatched); - } - } - -@@ -1831,7 +1834,7 @@ bool ScDPObject::ParseFilters( ScDPGetPivotDataField& rTarget, - if ( !bError && !bHasData && aDataNames.size() == 1 ) - { - // if there's only one data field, its name need not be specified -- rTarget.maFieldName = aDataNames[0]; -+ rDataFieldName = aDataNames[0]; - bHasData = true; - } - -diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx -index 7cc59de..a0f270d 100644 ---- a/sc/source/core/tool/interpr2.cxx -+++ b/sc/source/core/tool/interpr2.cxx -@@ -3005,6 +3005,21 @@ void ScInterpreter::ScGetPivotData() - return; - } - -+ if (bOldSyntax) -+ { -+ OUString aFilterStr = aDataFieldName; -+ std::vector aFilterFuncs; -+ if (!pDPObj->ParseFilters(aDataFieldName, aFilters, aFilterFuncs, aFilterStr)) -+ { -+ PushError(errNoRef); -+ return; -+ } -+ -+ // TODO : For now, we ignore filter functions since we couldn't find a -+ // live example of how they are supposed to be used. We'll support -+ // this again once we come across a real-world example. -+ } -+ - double fVal = pDPObj->GetPivotData(aDataFieldName, aFilters); - if (rtl::math::isNan(fVal)) - { --- -1.8.4.2 - diff --git a/SOURCES/0044-Do-not-create-paths-starting-when-root-is-just.patch b/SOURCES/0044-Do-not-create-paths-starting-when-root-is-just.patch deleted file mode 100644 index 17f0c7a..0000000 --- a/SOURCES/0044-Do-not-create-paths-starting-when-root-is-just.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 2e01c8727ac2652563dd4f0c45be4aa957136be8 Mon Sep 17 00:00:00 2001 -From: Stephan Bergmann -Date: Fri, 6 Dec 2013 16:52:27 +0100 -Subject: [PATCH 044/109] Do not create paths starting "//" when root is just - "/" - -(cherry picked from commit bd8b3be0c7535e74ca8b63969be5c2bece0d3a3b) -Conflicts: - configmgr/source/access.cxx - -Change-Id: If0b413a4fdd93465074548c7ea5451288c1d12aa -Reviewed-on: https://gerrit.libreoffice.org/6961 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - configmgr/source/access.cxx | 9 +++++---- - 1 file changed, 5 insertions(+), 4 deletions(-) - -diff --git a/configmgr/source/access.cxx b/configmgr/source/access.cxx -index 9f18e8f..aa04a94 100644 ---- a/configmgr/source/access.cxx -+++ b/configmgr/source/access.cxx -@@ -565,14 +565,15 @@ OUString Access::getHierarchicalName() throw (css::uno::RuntimeException) { - checkLocalizedPropertyAccess(); - // For backwards compatibility, return an absolute path representation where - // available: -- OUStringBuffer path; -+ OUString rootPath; - rtl::Reference< RootAccess > root(getRootAccess()); - if (root.is()) { -- path.append(root->getAbsolutePathRepresentation()); -+ rootPath = root->getAbsolutePathRepresentation(); - } - OUString rel(getRelativePathRepresentation()); -- if (path.getLength() != 0 && !rel.isEmpty()) { -- path.append(sal_Unicode('/')); -+ OUStringBuffer path(rootPath); -+ if (!rootPath.isEmpty() && rootPath != "/" && !rel.isEmpty()) { -+ path.append('/'); - } - path.append(rel); - return path.makeStringAndClear(); --- -1.8.4.2 - diff --git a/SOURCES/0044-fdo-81309-Adjust-references-during-sort.patch b/SOURCES/0044-fdo-81309-Adjust-references-during-sort.patch new file mode 100644 index 0000000..176622f --- /dev/null +++ b/SOURCES/0044-fdo-81309-Adjust-references-during-sort.patch @@ -0,0 +1,2225 @@ +From d4aed409279d3b9b8b95d84418fb7f279367cc30 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Mon, 2 Jun 2014 18:29:27 -0400 +Subject: [PATCH 044/137] fdo#81309: Adjust references during sort. + +(cherry picked from commit 5c6ee09126631342939ae8766fe36083d8c011e3) +Signed-off-by: Andras Timar + +Conflicts: + sc/inc/sortparam.hxx + sc/source/ui/docshell/dbdocfun.cxx + sc/source/ui/undo/undodat.cxx + sc/inc/formulacell.hxx + sc/qa/unit/filters-test.cxx + sc/qa/unit/ucalc.cxx + sc/source/core/data/documen3.cxx + sc/source/ui/docshell/dbdocfun.cxx + +Change-Id: I2b98610f6b774400ecfaffe2905201c27fcab33f +(cherry picked from commit e31300e8749ac7de07bbcb91c6ae28559238e60c) +Signed-off-by: Andras Timar +--- + include/svl/listener.hxx | 12 + + sc/Library_sc.mk | 2 + + sc/inc/document.hxx | 35 +- + sc/inc/formulacell.hxx | 2 + + sc/inc/listenerquery.hxx | 50 +++ + sc/inc/listenerqueryids.hxx | 17 + + sc/inc/refhint.hxx | 30 +- + sc/inc/sharedformula.hxx | 9 + + sc/inc/sortparam.hxx | 27 ++ + sc/inc/table.hxx | 16 +- + sc/inc/tokenarray.hxx | 8 +- + sc/inc/types.hxx | 2 +- + sc/inc/undosort.hxx | 37 ++ + sc/qa/unit/filters-test.cxx | 4 + + sc/qa/unit/ucalc.cxx | 11 +- + sc/source/core/data/documen3.cxx | 27 +- + sc/source/core/data/document10.cxx | 18 + + sc/source/core/data/formulacell.cxx | 38 +- + sc/source/core/data/sortparam.cxx | 51 +++ + sc/source/core/data/table3.cxx | 467 +++++++++++++++++------ + sc/source/core/data/table7.cxx | 17 + + sc/source/core/tool/listenerquery.cxx | 72 ++++ + sc/source/core/tool/refhint.cxx | 29 +- + sc/source/core/tool/sharedformula.cxx | 29 ++ + sc/source/core/tool/token.cxx | 71 +++- + sc/source/filter/xml/XMLExportDatabaseRanges.cxx | 1 + + sc/source/filter/xml/xmldrani.cxx | 1 + + sc/source/ui/docshell/dbdocfun.cxx | 163 +------- + sc/source/ui/undo/undobase.cxx | 1 + + sc/source/ui/undo/undosort.cxx | 55 +++ + sc/source/ui/unoobj/cellsuno.cxx | 1 + + sc/source/ui/unoobj/datauno.cxx | 1 + + svl/source/notify/listener.cxx | 24 +- + 33 files changed, 1018 insertions(+), 310 deletions(-) + create mode 100644 sc/inc/listenerquery.hxx + create mode 100644 sc/inc/listenerqueryids.hxx + create mode 100644 sc/inc/undosort.hxx + create mode 100644 sc/source/core/tool/listenerquery.cxx + create mode 100644 sc/source/ui/undo/undosort.cxx + +diff --git a/include/svl/listener.hxx b/include/svl/listener.hxx +index 1c98458..8b47fda 100644 +--- a/include/svl/listener.hxx ++++ b/include/svl/listener.hxx +@@ -34,6 +34,16 @@ class SVL_DLLPUBLIC SvtListener + const SvtListener& operator=(const SvtListener &); // n.i., ist verboten + + public: ++ class SVL_DLLPUBLIC QueryBase ++ { ++ sal_uInt16 mnId; ++ public: ++ QueryBase( sal_uInt16 nId ); ++ virtual ~QueryBase(); ++ ++ sal_uInt16 getId() const; ++ }; ++ + SvtListener(); + SvtListener( const SvtListener &r ); + virtual ~SvtListener(); +@@ -43,9 +53,11 @@ public: + void EndListeningAll(); + bool IsListening( SvtBroadcaster& rBroadcaster ) const; + ++ void CopyAllBroadcasters( const SvtListener& r ); + bool HasBroadcaster() const; + + virtual void Notify( const SfxHint& rHint ); ++ virtual void Query( QueryBase& rQuery ) const; + }; + + +diff --git a/sc/Library_sc.mk b/sc/Library_sc.mk +index b7041b8..33c6652 100644 +--- a/sc/Library_sc.mk ++++ b/sc/Library_sc.mk +@@ -234,6 +234,7 @@ $(eval $(call gb_Library_add_exception_objects,sc,\ + sc/source/core/tool/interpr6 \ + sc/source/core/tool/interpr7 \ + sc/source/core/tool/jumpmatrix \ ++ sc/source/core/tool/listenerquery \ + sc/source/core/tool/lookupcache \ + sc/source/core/tool/navicfg \ + sc/source/core/tool/odffmap \ +@@ -515,6 +516,7 @@ $(eval $(call gb_Library_add_exception_objects,sc,\ + sc/source/ui/undo/undodraw \ + sc/source/ui/undo/undoolk \ + sc/source/ui/undo/undorangename \ ++ sc/source/ui/undo/undosort \ + sc/source/ui/undo/undostyl \ + sc/source/ui/undo/undotab \ + sc/source/ui/undo/undoutil \ +diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx +index a2aea94..c901af5 100644 +--- a/sc/inc/document.hxx ++++ b/sc/inc/document.hxx +@@ -29,7 +29,6 @@ + #include "rangenam.hxx" + #include "brdcst.hxx" + #include "tabopparams.hxx" +-#include "sortparam.hxx" + #include "types.hxx" + #include "formula/grammar.hxx" + #include "formula/types.hxx" +@@ -76,6 +75,8 @@ class DocumentStreamAccess; + class DocumentLinkManager; + struct SetFormulaDirtyContext; + class RefMovedHint; ++struct SortUndoParam; ++struct ReorderParam; + + } + +@@ -178,6 +179,8 @@ class EditTextObject; + struct ScRefCellValue; + class ScDocumentImport; + class ScPostIt; ++struct ScSubTotalParam; ++struct ScQueryParam; + + namespace com { namespace sun { namespace star { + namespace lang { +@@ -1664,7 +1667,9 @@ public: + SC_DLLPUBLIC SvNumberFormatter* GetFormatTable() const; + SC_DLLPUBLIC SvNumberFormatter* CreateFormatTable() const; + +- void Sort( SCTAB nTab, const ScSortParam& rSortParam, bool bKeepQuery, ScProgress* pProgress ); ++ void Sort( SCTAB nTab, const ScSortParam& rSortParam, bool bKeepQuery, ScProgress* pProgress, sc::ReorderParam* pUndo ); ++ void Reorder( const sc::ReorderParam& rParam, ScProgress* pProgress ); ++ + SCSIZE Query( SCTAB nTab, const ScQueryParam& rQueryParam, bool bKeepSub ); + SC_DLLPUBLIC bool CreateQueryParam( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, + SCTAB nTab, ScQueryParam& rQueryParam ); +@@ -2022,8 +2027,8 @@ public: + + void InvalidateStyleSheetUsage() + { bStyleSheetUsageInvalid = true; } +- void GetSortParam( ScSortParam& rParam, SCTAB nTab ); +- void SetSortParam( ScSortParam& rParam, SCTAB nTab ); ++ void SC_DLLPUBLIC GetSortParam( ScSortParam& rParam, SCTAB nTab ); ++ void SC_DLLPUBLIC SetSortParam( ScSortParam& rParam, SCTAB nTab ); + + inline void SetVbaEventProcessor( const com::sun::star::uno::Reference< com::sun::star::script::vba::XVBAEventProcessor >& rxVbaEvents ) + { mxVbaEvents = rxVbaEvents; } +@@ -2052,6 +2057,19 @@ public: + + size_t GetFormulaHash( const ScAddress& rPos ) const; + ++ /** ++ * Make specified formula cells non-grouped. ++ * ++ * @param nTab sheet index ++ * @param nCol column index ++ * @param rRows list of row indices at which formula cells are to be ++ * unshared. This call sorts the passed row indices and ++ * removes duplicates, which is why the caller must pass it ++ * as reference. ++ */ ++ void UnshareFormulaCells( SCTAB nTab, SCCOL nCol, std::vector& rRows ); ++ void RegroupFormulaCells( SCTAB nTab, SCCOL nCol ); ++ + ScFormulaVectorState GetFormulaVectorState( const ScAddress& rPos ) const; + + formula::FormulaTokenRef ResolveStaticReference( const ScAddress& rPos ); +@@ -2130,15 +2148,6 @@ private: // CLOOK-Impl-methods + + void SharePooledResources( ScDocument* pSrcDoc ); + }; +-inline void ScDocument::GetSortParam( ScSortParam& rParam, SCTAB nTab ) +-{ +- rParam = mSheetSortParams[ nTab ]; +-} +- +-inline void ScDocument::SetSortParam( ScSortParam& rParam, SCTAB nTab ) +-{ +- mSheetSortParams[ nTab ] = rParam; +-} + + #endif + +diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx +index 2d25c9b..9c7cd10 100644 +--- a/sc/inc/formulacell.hxx ++++ b/sc/inc/formulacell.hxx +@@ -322,6 +322,8 @@ public: + void SetNextTrack( ScFormulaCell* pF ); + + virtual void Notify( const SfxHint& rHint ); ++ virtual void Query( SvtListener::QueryBase& rQuery ) const; ++ + void SetCompile( bool bVal ); + ScDocument* GetDocument() const; + void SetMatColsRows( SCCOL nCols, SCROW nRows, bool bDirtyFlag=true ); +diff --git a/sc/inc/listenerquery.hxx b/sc/inc/listenerquery.hxx +new file mode 100644 +index 0000000..2cbc957 +--- /dev/null ++++ b/sc/inc/listenerquery.hxx +@@ -0,0 +1,50 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ */ ++ ++#ifndef SC_LISTENERQUERY_HXX ++#define SC_LISTENERQUERY_HXX ++ ++#include ++#include ++ ++namespace sc { ++ ++/** ++ * Used to collect positions of formula cells that belong to a formula ++ * group. ++ */ ++class RefQueryFormulaGroup : public SvtListener::QueryBase ++{ ++public: ++ typedef std::vector ColType; ++ typedef boost::unordered_map ColsType; ++ typedef boost::unordered_map TabsType; ++ ++ RefQueryFormulaGroup(); ++ virtual ~RefQueryFormulaGroup(); ++ ++ void setSkipRange( const ScRange& rRange ); ++ void add( const ScAddress& rPos ); ++ ++ /** ++ * Row positions in each column may contain duplicates. Caller must ++ * remove duplicates if necessary. ++ */ ++ const TabsType& getAllPositions() const; ++ ++private: ++ ScRange maSkipRange; ++ TabsType maTabs; ++}; ++ ++} ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/inc/listenerqueryids.hxx b/sc/inc/listenerqueryids.hxx +new file mode 100644 +index 0000000..48f240b +--- /dev/null ++++ b/sc/inc/listenerqueryids.hxx +@@ -0,0 +1,17 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ */ ++ ++#ifndef SC_LISTENERQUERYIDS_HXX ++#define SC_LISTENERQUERYIDS_HXX ++ ++#define SC_LISTENER_QUERY_FORMULA_GROUP_POS 0 ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/inc/refhint.hxx b/sc/inc/refhint.hxx +index 3ffe861..6ccda8b 100644 +--- a/sc/inc/refhint.hxx ++++ b/sc/inc/refhint.hxx +@@ -18,7 +18,11 @@ namespace sc { + class RefHint : public SfxSimpleHint + { + public: +- enum Type { Moved, ColumnReordered }; ++ enum Type { ++ Moved, ++ ColumnReordered, ++ RowReordered ++ }; + + private: + Type meType; +@@ -57,22 +61,40 @@ public: + + class RefColReorderHint : public RefHint + { +- const sc::ColReorderMapType& mrColMap; ++ const sc::ColRowReorderMapType& mrColMap; + SCTAB mnTab; + SCROW mnRow1; + SCROW mnRow2; + + public: +- RefColReorderHint( const sc::ColReorderMapType& rColMap, SCTAB nTab, SCROW nRow1, SCROW nRow2 ); ++ RefColReorderHint( const sc::ColRowReorderMapType& rColMap, SCTAB nTab, SCROW nRow1, SCROW nRow2 ); + virtual ~RefColReorderHint(); + +- const sc::ColReorderMapType& getColMap() const; ++ const sc::ColRowReorderMapType& getColMap() const; + + SCTAB getTab() const; + SCROW getStartRow() const; + SCROW getEndRow() const; + }; + ++class RefRowReorderHint : public RefHint ++{ ++ const sc::ColRowReorderMapType& mrRowMap; ++ SCTAB mnTab; ++ SCCOL mnCol1; ++ SCCOL mnCol2; ++ ++public: ++ RefRowReorderHint( const sc::ColRowReorderMapType& rRowMap, SCTAB nTab, SCCOL nCol1, SCCOL nCol2 ); ++ virtual ~RefRowReorderHint(); ++ ++ const sc::ColRowReorderMapType& getRowMap() const; ++ ++ SCTAB getTab() const; ++ SCCOL getStartColumn() const; ++ SCCOL getEndColumn() const; ++}; ++ + } + + #endif +diff --git a/sc/inc/sharedformula.hxx b/sc/inc/sharedformula.hxx +index 571d73c..453b14f 100644 +--- a/sc/inc/sharedformula.hxx ++++ b/sc/inc/sharedformula.hxx +@@ -100,6 +100,15 @@ public: + * @param rCell formula cell instance + */ + static void unshareFormulaCell(const CellStoreType::position_type& aPos, ScFormulaCell& rCell); ++ ++ /** ++ * Make specified formula cells non-shared ones, and split them off from ++ * their respective adjacent formula cell groups. ++ * ++ * @param rCells cell storage container ++ * @param rRows row positions at which to unshare formula cells. ++ */ ++ static void unshareFormulaCells(CellStoreType& rCells, std::vector& rRows); + }; + + } +diff --git a/sc/inc/sortparam.hxx b/sc/inc/sortparam.hxx +index b6f1427..4c3ef1b 100644 +--- a/sc/inc/sortparam.hxx ++++ b/sc/inc/sortparam.hxx +@@ -80,6 +80,33 @@ struct SC_DLLPUBLIC ScSortParam + inline sal_uInt16 GetSortKeyCount() const { return maKeyState.size(); } + }; + ++namespace sc { ++ ++struct SC_DLLPUBLIC ReorderParam ++{ ++ /** ++ * This sort range already takes into account the presence or absence of ++ * header row / column i.e. if a header row / column is present, it ++ * excludes that row / column. ++ */ ++ ScRange maSortRange; ++ ++ /** ++ * List of original column / row positions after reordering. ++ */ ++ std::vector maOrderIndices; ++ bool mbByRow; ++ bool mbPattern; ++ bool mbHiddenFiltered; ++ ++ /** ++ * Reorder the position indices such that it can be used to undo the ++ * original reordering. ++ */ ++ void reverse(); ++}; ++ ++} + + #endif // SC_SORTPARAM_HXX + +diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx +index fe8adb6..97ee720 100644 +--- a/sc/inc/table.hxx ++++ b/sc/inc/table.hxx +@@ -71,6 +71,7 @@ class DocumentStreamAccess; + class CompileFormulaContext; + struct SetFormulaDirtyContext; + class RefMovedHint; ++struct ReorderParam; + + } + +@@ -828,7 +829,10 @@ public: + void StripHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2 ); + void ExtendHidden( SCCOL& rX1, SCROW& rY1, SCCOL& rX2, SCROW& rY2 ); + +- void Sort(const ScSortParam& rSortParam, bool bKeepQuery, ScProgress* pProgress); ++ void Sort( ++ const ScSortParam& rSortParam, bool bKeepQuery, ScProgress* pProgress, sc::ReorderParam* pUndo ); ++ void Reorder( const sc::ReorderParam& rParam, ScProgress* pProgress ); ++ + bool ValidQuery( + SCROW nRow, const ScQueryParam& rQueryParam, ScRefCellValue* pCell = NULL, + bool* pbTestEqualCondition = NULL); +@@ -884,6 +888,9 @@ public: + formula::FormulaTokenRef ResolveStaticReference( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ); + formula::VectorRefArray FetchVectorRefArray( SCCOL nCol, SCROW nRow1, SCROW nRow2 ); + ++ void UnshareFormulaCells( SCCOL nCol, std::vector& rRows ); ++ void RegroupFormulaCells( SCCOL nCol ); ++ + ScRefCellValue GetRefCellValue( SCCOL nCol, SCROW nRow ); + + SvtBroadcaster* GetBroadcaster( SCCOL nCol, SCROW nRow ); +@@ -998,10 +1005,11 @@ private: + ScRefCellValue& rCell2, SCCOL nCell2Col, SCROW nCell2Row ) const; + short Compare(SCCOLROW nIndex1, SCCOLROW nIndex2) const; + short Compare( ScSortInfoArray*, SCCOLROW nIndex1, SCCOLROW nIndex2) const; +- ScSortInfoArray* CreateSortInfoArray( SCCOLROW nInd1, SCCOLROW nInd2, bool bKeepQuery ); ++ ScSortInfoArray* CreateSortInfoArray( const sc::ReorderParam& rParam ); ++ ScSortInfoArray* CreateSortInfoArray( const ScSortParam& rSortParam, SCCOLROW nInd1, SCCOLROW nInd2, bool bKeepQuery ); + void QuickSort( ScSortInfoArray*, SCsCOLROW nLo, SCsCOLROW nHi); +- void SortReorder( ScSortInfoArray* pArray, ScProgress* pProgress ); +- void SortReorderByRow( ScSortInfoArray* pArray, ScProgress* pProgress ); ++ void SortReorderByColumn( ScSortInfoArray* pArray, SCROW nRow1, SCROW nRow2, bool bPattern, ScProgress* pProgress ); ++ void SortReorderByRow( ScSortInfoArray* pArray, SCCOL nCol1, SCCOL nCol2, ScProgress* pProgress ); + + bool CreateExcelQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScQueryParam& rQueryParam); + bool CreateStarQuery(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ScQueryParam& rQueryParam); +diff --git a/sc/inc/tokenarray.hxx b/sc/inc/tokenarray.hxx +index 8715e9c..fbb613c 100644 +--- a/sc/inc/tokenarray.hxx ++++ b/sc/inc/tokenarray.hxx +@@ -167,7 +167,13 @@ public: + * @param nRow2 bottom row of reordered range. + * @param rColMap old-to-new column mapping. + */ +- void MoveReference( const ScAddress& rPos, SCTAB nTab, SCROW nRow1, SCROW nRow2, const sc::ColReorderMapType& rColMap ); ++ void MoveReferenceColReorder( ++ const ScAddress& rPos, SCTAB nTab, SCROW nRow1, SCROW nRow2, ++ const sc::ColRowReorderMapType& rColMap ); ++ ++ void MoveReferenceRowReorder( ++ const ScAddress& rPos, SCTAB nTab, SCCOL nCol1, SCCOL nCol2, ++ const sc::ColRowReorderMapType& rRowMap ); + + /** + * Adjust all references in named expression. In named expression, we only +diff --git a/sc/inc/types.hxx b/sc/inc/types.hxx +index e0163aa..732ff19 100644 +--- a/sc/inc/types.hxx ++++ b/sc/inc/types.hxx +@@ -98,7 +98,7 @@ struct RangeMatrix + bool isRangeValid() const; + }; + +-typedef boost::unordered_map ColReorderMapType; ++typedef boost::unordered_map ColRowReorderMapType; + + } + +diff --git a/sc/inc/undosort.hxx b/sc/inc/undosort.hxx +new file mode 100644 +index 0000000..388fcfa +--- /dev/null ++++ b/sc/inc/undosort.hxx +@@ -0,0 +1,37 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ */ ++ ++#ifndef INCLUDED_SC_UNDOSORT_HXX ++#define INCLUDED_SC_UNDOSORT_HXX ++ ++#include ++#include ++ ++namespace sc { ++ ++class UndoSort : public ScSimpleUndo ++{ ++ ReorderParam maParam; ++ ++public: ++ UndoSort( ScDocShell* pDocSh, const ReorderParam& rParam ); ++ ++ virtual OUString GetComment() const; ++ virtual void Undo(); ++ virtual void Redo(); ++ ++private: ++ void Execute( bool bUndo ); ++}; ++ ++} ++ ++#endif ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/qa/unit/filters-test.cxx b/sc/qa/unit/filters-test.cxx +index e7dcae2..dab2b9e 100644 +--- a/sc/qa/unit/filters-test.cxx ++++ b/sc/qa/unit/filters-test.cxx +@@ -33,6 +33,10 @@ + #include "drwlayer.hxx" + #include "userdat.hxx" + #include "formulacell.hxx" ++#include ++#include ++#include ++#include + + #include + +diff --git a/sc/qa/unit/ucalc.cxx b/sc/qa/unit/ucalc.cxx +index e993a9b..fbc2919 100644 +--- a/sc/qa/unit/ucalc.cxx ++++ b/sc/qa/unit/ucalc.cxx +@@ -51,6 +51,7 @@ + #include "queryparam.hxx" + #include "edittextiterator.hxx" + #include "editutil.hxx" ++#include + + #include "formula/IFunctionDescription.hxx" + +@@ -4276,7 +4277,7 @@ void Test::testSortWithFormulaRefs() + aSortData.maKeyState[0].bDoSort = true; + aSortData.maKeyState[0].nField = 0; + +- pDoc->Sort(0, aSortData, false, NULL); ++ pDoc->Sort(0, aSortData, false, NULL, NULL); + + nEnd = SAL_N_ELEMENTS( aResults ); + for ( SCROW i = nStart; i < nEnd; ++i ) +@@ -4312,7 +4313,7 @@ void Test::testSortWithStrings() + aParam.maKeyState[0].bAscending = true; + aParam.maKeyState[0].nField = 1; + +- m_pDoc->Sort(0, aParam, false, NULL); ++ m_pDoc->Sort(0, aParam, false, NULL, NULL); + + CPPUNIT_ASSERT_EQUAL(OUString("Header"), m_pDoc->GetString(ScAddress(1,1,0))); + CPPUNIT_ASSERT_EQUAL(OUString("Val1"), m_pDoc->GetString(ScAddress(1,2,0))); +@@ -4320,7 +4321,7 @@ void Test::testSortWithStrings() + + aParam.maKeyState[0].bAscending = false; + +- m_pDoc->Sort(0, aParam, false, NULL); ++ m_pDoc->Sort(0, aParam, false, NULL, NULL); + + CPPUNIT_ASSERT_EQUAL(OUString("Header"), m_pDoc->GetString(ScAddress(1,1,0))); + CPPUNIT_ASSERT_EQUAL(OUString("Val2"), m_pDoc->GetString(ScAddress(1,2,0))); +@@ -4366,7 +4367,7 @@ void Test::testSort() + aSortData.maKeyState[0].nField = 1; + aSortData.maKeyState[0].bAscending = true; + +- m_pDoc->Sort(0, aSortData, false, NULL); ++ m_pDoc->Sort(0, aSortData, false, NULL, NULL); + + double nVal = m_pDoc->GetValue(1,0,0); + ASSERT_DOUBLES_EQUAL(nVal, 1.0); +@@ -4399,7 +4400,7 @@ void Test::testSort() + aSortData.nRow2 = aDataRange.aEnd.Row(); + aSortData.bHasHeader = true; + aSortData.maKeyState[0].nField = 0; +- m_pDoc->Sort(0, aSortData, false, NULL); ++ m_pDoc->Sort(0, aSortData, false, NULL, NULL); + + // Title should stay at the top, numbers should be sorted numerically, + // numbers always come before strings, and empty cells always occur at the +diff --git a/sc/source/core/data/documen3.cxx b/sc/source/core/data/documen3.cxx +index b2efbdf..75514fd 100644 +--- a/sc/source/core/data/documen3.cxx ++++ b/sc/source/core/data/documen3.cxx +@@ -1354,17 +1354,30 @@ bool ScDocument::UpdateOutlineRow( SCROW nStartRow, SCROW nEndRow, SCTAB nTab, b + return false; + } + +-void ScDocument::Sort(SCTAB nTab, const ScSortParam& rSortParam, bool bKeepQuery, ScProgress* pProgress) ++void ScDocument::Sort( ++ SCTAB nTab, const ScSortParam& rSortParam, bool bKeepQuery, ScProgress* pProgress, sc::ReorderParam* pUndo ) + { + if ( ValidTab(nTab) && nTab < static_cast(maTabs.size()) && maTabs[nTab] ) + { + bool bOldEnableIdle = IsIdleEnabled(); + EnableIdle(false); +- maTabs[nTab]->Sort(rSortParam, bKeepQuery, pProgress); ++ maTabs[nTab]->Sort(rSortParam, bKeepQuery, pProgress, pUndo); + EnableIdle(bOldEnableIdle); + } + } + ++void ScDocument::Reorder( const sc::ReorderParam& rParam, ScProgress* pProgress ) ++{ ++ ScTable* pTab = FetchTable(rParam.maSortRange.aStart.Tab()); ++ if (!pTab) ++ return; ++ ++ bool bOldEnableIdle = IsIdleEnabled(); ++ EnableIdle(false); ++ pTab->Reorder(rParam, pProgress); ++ EnableIdle(bOldEnableIdle); ++} ++ + SCSIZE ScDocument::Query(SCTAB nTab, const ScQueryParam& rQueryParam, bool bKeepSub) + { + if ( ValidTab(nTab) && nTab < static_cast(maTabs.size()) && maTabs[nTab] ) +@@ -2016,4 +2029,14 @@ void ScDocument::ExtendPrintArea( OutputDevice* pDev, SCTAB nTab, + maTabs[nTab]->ExtendPrintArea( pDev, nStartCol, nStartRow, rEndCol, nEndRow ); + } + ++void ScDocument::GetSortParam( ScSortParam& rParam, SCTAB nTab ) ++{ ++ rParam = mSheetSortParams[ nTab ]; ++} ++ ++void ScDocument::SetSortParam( ScSortParam& rParam, SCTAB nTab ) ++{ ++ mSheetSortParams[ nTab ] = rParam; ++} ++ + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx +index a4ede21..cb64221 100644 +--- a/sc/source/core/data/document10.cxx ++++ b/sc/source/core/data/document10.cxx +@@ -93,4 +93,22 @@ bool ScDocument::HasUniformRowHeight( SCTAB nTab, SCROW nRow1, SCROW nRow2 ) con + return pTab->HasUniformRowHeight(nRow1, nRow2); + } + ++void ScDocument::UnshareFormulaCells( SCTAB nTab, SCCOL nCol, std::vector& rRows ) ++{ ++ ScTable* pTab = FetchTable(nTab); ++ if (!pTab) ++ return; ++ ++ pTab->UnshareFormulaCells(nCol, rRows); ++} ++ ++void ScDocument::RegroupFormulaCells( SCTAB nTab, SCCOL nCol ) ++{ ++ ScTable* pTab = FetchTable(nTab); ++ if (!pTab) ++ return; ++ ++ pTab->RegroupFormulaCells(nCol); ++} ++ + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx +index 1397372..18194e1 100644 +--- a/sc/source/core/data/formulacell.cxx ++++ b/sc/source/core/data/formulacell.cxx +@@ -52,6 +52,8 @@ + #include "refupdatecontext.hxx" + #include + #include ++#include ++#include + + #include + +@@ -1915,8 +1917,23 @@ void ScFormulaCell::Notify( const SfxHint& rHint ) + const sc::RefColReorderHint& rRefColReorder = + static_cast(rRefHint); + if (!IsShared() || IsSharedTop()) +- pCode->MoveReference( +- aPos, rRefColReorder.getTab(), rRefColReorder.getStartRow(), rRefColReorder.getEndRow(), rRefColReorder.getColMap()); ++ pCode->MoveReferenceColReorder( ++ aPos, rRefColReorder.getTab(), ++ rRefColReorder.getStartRow(), ++ rRefColReorder.getEndRow(), ++ rRefColReorder.getColMap()); ++ } ++ break; ++ case sc::RefHint::RowReordered: ++ { ++ const sc::RefRowReorderHint& rRefRowReorder = ++ static_cast(rRefHint); ++ if (!IsShared() || IsSharedTop()) ++ pCode->MoveReferenceRowReorder( ++ aPos, rRefRowReorder.getTab(), ++ rRefRowReorder.getStartColumn(), ++ rRefRowReorder.getEndColumn(), ++ rRefRowReorder.getRowMap()); + } + break; + default: +@@ -1961,6 +1978,23 @@ void ScFormulaCell::Notify( const SfxHint& rHint ) + } + } + ++void ScFormulaCell::Query( SvtListener::QueryBase& rQuery ) const ++{ ++ switch (rQuery.getId()) ++ { ++ case SC_LISTENER_QUERY_FORMULA_GROUP_POS: ++ { ++ sc::RefQueryFormulaGroup& rRefQuery = ++ static_cast(rQuery); ++ if (IsShared()) ++ rRefQuery.add(aPos); ++ } ++ break; ++ default: ++ ; ++ } ++} ++ + void ScFormulaCell::SetDirty( bool bDirtyFlag ) + { + if ( !IsInChangeTrack() ) +diff --git a/sc/source/core/data/sortparam.cxx b/sc/source/core/data/sortparam.cxx +index d416f32..e4aee16 100644 +--- a/sc/source/core/data/sortparam.cxx ++++ b/sc/source/core/data/sortparam.cxx +@@ -252,4 +252,55 @@ void ScSortParam::MoveToDest() + } + } + ++namespace sc { ++ ++namespace { ++ ++struct ReorderIndex ++{ ++ struct LessByPos2 : std::binary_function ++ { ++ bool operator() ( const ReorderIndex& r1, const ReorderIndex& r2 ) const ++ { ++ return r1.mnPos2 < r2.mnPos2; ++ } ++ }; ++ ++ SCCOLROW mnPos1; ++ SCCOLROW mnPos2; ++ ++ ReorderIndex( SCCOLROW nPos1, SCCOLROW nPos2 ) : mnPos1(nPos1), mnPos2(nPos2) {} ++}; ++ ++} ++ ++void ReorderParam::reverse() ++{ ++ SCCOLROW nStart; ++ if (mbByRow) ++ nStart = maSortRange.aStart.Row(); ++ else ++ nStart = maSortRange.aStart.Col(); ++ ++ size_t n = maOrderIndices.size(); ++ std::vector aBucket; ++ aBucket.reserve(n); ++ for (size_t i = 0; i < n; ++i) ++ { ++ SCCOLROW nPos1 = i + nStart; ++ SCCOLROW nPos2 = maOrderIndices[i]; ++ aBucket.push_back(ReorderIndex(nPos1, nPos2)); ++ } ++ ++ std::sort(aBucket.begin(), aBucket.end(), ReorderIndex::LessByPos2()); ++ std::vector aNew; ++ aNew.reserve(n); ++ for (size_t i = 0; i < n; ++i) ++ aNew.push_back(aBucket[i].mnPos1); ++ ++ maOrderIndices.swap(aNew); ++} ++ ++} ++ + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx +index 6a169ef..31cfe2e 100644 +--- a/sc/source/core/data/table3.cxx ++++ b/sc/source/core/data/table3.cxx +@@ -61,6 +61,7 @@ + #include + #include + #include ++#include + + #include "svl/sharedstringpool.hxx" + +@@ -257,39 +258,46 @@ private: + SCCOLROW mnLastIndex; /// index of last non-empty cell position. + sal_uInt16 nUsedSorts; + +- std::vector maOldIndices; ++ std::vector maOrderIndices; + bool mbKeepQuery; + + public: + ScSortInfoArray( sal_uInt16 nSorts, SCCOLROW nInd1, SCCOLROW nInd2 ) : +- pppInfo( new ScSortInfo**[nSorts]), ++ pppInfo(NULL), + nCount( nInd2 - nInd1 + 1 ), nStart( nInd1 ), + mnLastIndex(nInd2), + nUsedSorts(nSorts), + mbKeepQuery(false) + { +- for ( sal_uInt16 nSort = 0; nSort < nUsedSorts; nSort++ ) ++ if (nUsedSorts) + { +- ScSortInfo** ppInfo = new ScSortInfo* [nCount]; +- for ( SCSIZE j = 0; j < nCount; j++ ) +- ppInfo[j] = new ScSortInfo; +- pppInfo[nSort] = ppInfo; ++ pppInfo = new ScSortInfo**[nUsedSorts]; ++ for ( sal_uInt16 nSort = 0; nSort < nUsedSorts; nSort++ ) ++ { ++ ScSortInfo** ppInfo = new ScSortInfo* [nCount]; ++ for ( SCSIZE j = 0; j < nCount; j++ ) ++ ppInfo[j] = new ScSortInfo; ++ pppInfo[nSort] = ppInfo; ++ } + } + + for (size_t i = 0; i < nCount; ++i) +- maOldIndices.push_back(i+nStart); ++ maOrderIndices.push_back(i+nStart); + } + + ~ScSortInfoArray() + { +- for ( sal_uInt16 nSort = 0; nSort < nUsedSorts; nSort++ ) ++ if (pppInfo) + { +- ScSortInfo** ppInfo = pppInfo[nSort]; +- for ( SCSIZE j = 0; j < nCount; j++ ) +- delete ppInfo[j]; +- delete [] ppInfo; ++ for ( sal_uInt16 nSort = 0; nSort < nUsedSorts; nSort++ ) ++ { ++ ScSortInfo** ppInfo = pppInfo[nSort]; ++ for ( SCSIZE j = 0; j < nCount; j++ ) ++ delete ppInfo[j]; ++ delete [] ppInfo; ++ } ++ delete[] pppInfo; + } +- delete[] pppInfo; + + if (mpRows) + std::for_each(mpRows->begin(), mpRows->end(), ScDeleteObjectByPtr()); +@@ -299,11 +307,30 @@ public: + + bool IsKeepQuery() const { return mbKeepQuery; } + ++ /** ++ * Call this only during normal sorting, not from reordering. ++ */ ++ ScSortInfo** GetFirstArray() const ++ { ++ OSL_ASSERT(pppInfo); ++ return pppInfo[0]; ++ } ++ ++ /** ++ * Call this only during normal sorting, not from reordering. ++ */ + ScSortInfo* Get( sal_uInt16 nSort, SCCOLROW nInd ) +- { return (pppInfo[nSort])[ nInd - nStart ]; } ++ { ++ OSL_ASSERT(pppInfo); ++ return (pppInfo[nSort])[ nInd - nStart ]; ++ } + ++ /** ++ * Call this only during normal sorting, not from reordering. ++ */ + void Swap( SCCOLROW nInd1, SCCOLROW nInd2 ) + { ++ OSL_ASSERT(pppInfo); + SCSIZE n1 = static_cast(nInd1 - nStart); + SCSIZE n2 = static_cast(nInd2 - nStart); + for ( sal_uInt16 nSort = 0; nSort < nUsedSorts; nSort++ ) +@@ -314,7 +341,7 @@ public: + ppInfo[n2] = pTmp; + } + +- std::swap(maOldIndices[n1], maOldIndices[n2]); ++ std::swap(maOrderIndices[n1], maOrderIndices[n2]); + + if (mpRows) + { +@@ -324,13 +351,47 @@ public: + } + } + ++ void SetOrderIndices( const std::vector& rIndices ) ++ { ++ maOrderIndices = rIndices; ++ } ++ ++ /** ++ * @param rIndices indices are actual row positions on the sheet, not an ++ * offset from the top row. ++ */ ++ void ReorderByRow( const std::vector& rIndices ) ++ { ++ if (!mpRows) ++ return; ++ ++ RowsType& rRows = *mpRows; ++ ++ std::vector aOrderIndices2; ++ aOrderIndices2.reserve(rIndices.size()); ++ ++ RowsType aRows2; ++ aRows2.reserve(rRows.size()); ++ ++ std::vector::const_iterator it = rIndices.begin(), itEnd = rIndices.end(); ++ for (; it != itEnd; ++it) ++ { ++ size_t nPos = *it - nStart; // switch to an offset to top row. ++ aRows2.push_back(rRows[nPos]); ++ aOrderIndices2.push_back(maOrderIndices[nPos]); ++ } ++ ++ rRows.swap(aRows2); ++ maOrderIndices.swap(aOrderIndices2); ++ } ++ + sal_uInt16 GetUsedSorts() const { return nUsedSorts; } +- ScSortInfo** GetFirstArray() const { return pppInfo[0]; } ++ + SCCOLROW GetStart() const { return nStart; } + SCCOLROW GetLast() const { return mnLastIndex; } + SCSIZE GetCount() const { return nCount; } + +- const std::vector& GetOldIndices() const { return maOldIndices; } ++ const std::vector& GetOrderIndices() const { return maOrderIndices; } + + RowsType& InitDataRows( size_t nRowSize, size_t nColSize ) + { +@@ -348,19 +409,98 @@ public: + } + }; + +-ScSortInfoArray* ScTable::CreateSortInfoArray( SCCOLROW nInd1, SCCOLROW nInd2, bool bKeepQuery ) ++namespace { ++ ++void initDataRows( ++ ScSortInfoArray& rArray, ScTable& rTab, ScColumn* pCols, ++ SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, ++ bool bPattern, bool bHiddenFiltered ) ++{ ++ // Fill row-wise data table. ++ ScSortInfoArray::RowsType& rRows = rArray.InitDataRows(nRow2-nRow1+1, nCol2-nCol1+1); ++ ++ for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol) ++ { ++ ScColumn& rCol = pCols[nCol]; ++ ++ // Skip reordering of cell formats if the whole span is on the same pattern entry. ++ bool bUniformPattern = rCol.GetPatternCount(nRow1, nRow2) < 2u; ++ ++ sc::ColumnBlockConstPosition aBlockPos; ++ rCol.InitBlockPosition(aBlockPos); ++ for (SCROW nRow = nRow1; nRow <= nRow2; ++nRow) ++ { ++ ScSortInfoArray::Row& rRow = *rRows[nRow-nRow1]; ++ ScSortInfoArray::Cell& rCell = rRow.maCells[nCol-nCol1]; ++ ++ rCell.maCell = rCol.GetCellValue(aBlockPos, nRow); ++ rCell.mpAttr = rCol.GetCellTextAttr(aBlockPos, nRow); ++ rCell.mpBroadcaster = rCol.GetBroadcaster(aBlockPos, nRow); ++ rCell.mpNote = rCol.GetCellNote(aBlockPos, nRow); ++ ++ if (!bUniformPattern && bPattern) ++ rCell.mpPattern = rCol.GetPattern(nRow); ++ } ++ } ++ ++ if (bHiddenFiltered) ++ { ++ for (SCROW nRow = nRow1; nRow <= nRow2; ++nRow) ++ { ++ ScSortInfoArray::Row& rRow = *rRows[nRow-nRow1]; ++ rRow.mbHidden = rTab.RowHidden(nRow); ++ rRow.mbFiltered = rTab.RowFiltered(nRow); ++ } ++ } ++} ++ ++} ++ ++ScSortInfoArray* ScTable::CreateSortInfoArray( const sc::ReorderParam& rParam ) ++{ ++ ScSortInfoArray* pArray = NULL; ++ ++ if (rParam.mbByRow) ++ { ++ // Create a sort info array with just the data table. ++ SCROW nRow1 = rParam.maSortRange.aStart.Row(); ++ SCROW nRow2 = rParam.maSortRange.aEnd.Row(); ++ SCCOL nCol1 = rParam.maSortRange.aStart.Col(); ++ SCCOL nCol2 = rParam.maSortRange.aEnd.Col(); ++ ++ pArray = new ScSortInfoArray(0, nRow1, nRow2); ++ pArray->SetKeepQuery(rParam.mbHiddenFiltered); ++ ++ initDataRows( ++ *pArray, *this, aCol, nCol1, nRow1, nCol2, nRow2, ++ rParam.mbPattern, rParam.mbHiddenFiltered); ++ } ++ else ++ { ++ SCCOLROW nCol1 = rParam.maSortRange.aStart.Col(); ++ SCCOLROW nCol2 = rParam.maSortRange.aEnd.Col(); ++ ++ pArray = new ScSortInfoArray(0, nCol1, nCol2); ++ pArray->SetKeepQuery(rParam.mbHiddenFiltered); ++ } ++ ++ return pArray; ++} ++ ++ScSortInfoArray* ScTable::CreateSortInfoArray( ++ const ScSortParam& rSortParam, SCCOLROW nInd1, SCCOLROW nInd2, bool bKeepQuery ) + { + sal_uInt16 nUsedSorts = 1; +- while ( nUsedSorts < aSortParam.GetSortKeyCount() && aSortParam.maKeyState[nUsedSorts].bDoSort ) ++ while ( nUsedSorts < rSortParam.GetSortKeyCount() && rSortParam.maKeyState[nUsedSorts].bDoSort ) + nUsedSorts++; + ScSortInfoArray* pArray = new ScSortInfoArray( nUsedSorts, nInd1, nInd2 ); + pArray->SetKeepQuery(bKeepQuery); + +- if ( aSortParam.bByRow ) ++ if ( rSortParam.bByRow ) + { + for ( sal_uInt16 nSort = 0; nSort < nUsedSorts; nSort++ ) + { +- SCCOL nCol = static_cast(aSortParam.maKeyState[nSort].nField); ++ SCCOL nCol = static_cast(rSortParam.maKeyState[nSort].nField); + ScColumn* pCol = &aCol[nCol]; + sc::ColumnBlockConstPosition aBlockPos; + pCol->InitBlockPosition(aBlockPos); +@@ -372,49 +512,15 @@ ScSortInfoArray* ScTable::CreateSortInfoArray( SCCOLROW nInd1, SCCOLROW nInd2, b + } + } + +- // Fill row-wise data table. +- ScSortInfoArray::RowsType& rRows = pArray->InitDataRows( +- nInd2 - nInd1 + 1, aSortParam.nCol2 - aSortParam.nCol1 + 1); +- +- for (SCCOL nCol = aSortParam.nCol1; nCol <= aSortParam.nCol2; ++nCol) +- { +- ScColumn& rCol = aCol[nCol]; +- +- // Skip reordering of cell formats if the whole span is on the same pattern entry. +- bool bUniformPattern = rCol.GetPatternCount(nInd1, nInd2) < 2u; +- +- sc::ColumnBlockConstPosition aBlockPos; +- rCol.InitBlockPosition(aBlockPos); +- for (SCROW nRow = nInd1; nRow <= nInd2; ++nRow) +- { +- ScSortInfoArray::Row& rRow = *rRows[nRow-nInd1]; +- ScSortInfoArray::Cell& rCell = rRow.maCells[nCol-aSortParam.nCol1]; +- +- rCell.maCell = rCol.GetCellValue(aBlockPos, nRow); +- rCell.mpAttr = rCol.GetCellTextAttr(aBlockPos, nRow); +- rCell.mpBroadcaster = rCol.GetBroadcaster(aBlockPos, nRow); +- rCell.mpNote = rCol.GetCellNote(aBlockPos, nRow); +- +- if (!bUniformPattern && aSortParam.bIncludePattern) +- rCell.mpPattern = rCol.GetPattern(nRow); +- } +- } +- +- if (bKeepQuery) +- { +- for (SCROW nRow = nInd1; nRow <= nInd2; ++nRow) +- { +- ScSortInfoArray::Row& rRow = *rRows[nRow-nInd1]; +- rRow.mbHidden = RowHidden(nRow); +- rRow.mbFiltered = RowFiltered(nRow); +- } +- } ++ initDataRows( ++ *pArray, *this, aCol, rSortParam.nCol1, nInd1, rSortParam.nCol2, nInd2, ++ rSortParam.bIncludePattern, bKeepQuery); + } + else + { + for ( sal_uInt16 nSort = 0; nSort < nUsedSorts; nSort++ ) + { +- SCROW nRow = aSortParam.maKeyState[nSort].nField; ++ SCROW nRow = rSortParam.maKeyState[nSort].nField; + for ( SCCOL nCol = static_cast(nInd1); + nCol <= static_cast(nInd2); nCol++ ) + { +@@ -530,12 +636,13 @@ void ScTable::DestroySortCollator() + + namespace { + +-class ColReorderNotifier : std::unary_function ++template ++class ReorderNotifier : std::unary_function + { +- sc::RefColReorderHint maHint; ++ _Hint maHint; + public: +- ColReorderNotifier( const sc::ColReorderMapType& rColMap, SCTAB nTab, SCROW nRow1, SCROW nRow2 ) : +- maHint(rColMap, nTab, nRow1, nRow2) {} ++ ReorderNotifier( const _ReorderMap& rMap, SCTAB nTab, _Index nPos1, _Index nPos2 ) : ++ maHint(rMap, nTab, nPos1, nPos2) {} + + void operator() ( SvtListener* p ) + { +@@ -543,77 +650,86 @@ public: + } + }; + +-} ++typedef ReorderNotifier ColReorderNotifier; ++typedef ReorderNotifier RowReorderNotifier; + +-void ScTable::SortReorder( ScSortInfoArray* pArray, ScProgress* pProgress ) ++class FormulaGroupPosCollector : std::unary_function + { +- if (aSortParam.bByRow) ++ sc::RefQueryFormulaGroup& mrQuery; ++ ++public: ++ FormulaGroupPosCollector( sc::RefQueryFormulaGroup& rQuery ) : mrQuery(rQuery) {} ++ ++ void operator() ( SvtListener* p ) + { +- SortReorderByRow(pArray, pProgress); +- return; ++ p->Query(mrQuery); + } ++}; + +- size_t nCount = pArray->GetCount(); ++} ++ ++void ScTable::SortReorderByColumn( ++ ScSortInfoArray* pArray, SCROW nRow1, SCROW nRow2, bool bPattern, ScProgress* pProgress ) ++{ + SCCOLROW nStart = pArray->GetStart(); + SCCOLROW nLast = pArray->GetLast(); +- ScSortInfo** ppInfo = pArray->GetFirstArray(); +- +- std::vector aTable(nCount); + +- SCSIZE nPos; +- for ( nPos = 0; nPos < nCount; nPos++ ) +- aTable[ppInfo[nPos]->nOrg - nStart] = ppInfo[nPos]; ++ std::vector aIndices = pArray->GetOrderIndices(); ++ size_t nCount = aIndices.size(); + + // Cut formula grouping at row and reference boundaries before the reordering. +- ScRange aSortRange(nStart, aSortParam.nRow1, nTab, nLast, aSortParam.nRow2, nTab); ++ ScRange aSortRange(nStart, nRow1, nTab, nLast, nRow2, nTab); + for (SCCOL nCol = nStart; nCol <= nLast; ++nCol) + aCol[nCol].SplitFormulaGroupByRelativeRef(aSortRange); + ++ // table to keep track of column index to position in the index table. ++ std::vector aPosTable(nCount); ++ for (size_t i = 0; i < nCount; ++i) ++ aPosTable[aIndices[i]-nStart] = i; ++ + SCCOLROW nDest = nStart; +- for ( nPos = 0; nPos < nCount; nPos++, nDest++ ) ++ for (size_t i = 0; i < nCount; ++i, ++nDest) + { +- SCCOLROW nOrg = ppInfo[nPos]->nOrg; +- if ( nDest != nOrg ) ++ SCCOLROW nSrc = aIndices[i]; ++ if (nDest != nSrc) + { +- aCol[nDest].Swap(aCol[nOrg], aSortParam.nRow1, aSortParam.nRow2, aSortParam.bIncludePattern); ++ aCol[nDest].Swap(aCol[nSrc], nRow1, nRow2, bPattern); + +- // neue Position des weggeswapten eintragen +- ScSortInfo* p = ppInfo[nPos]; +- p->nOrg = nDest; +- ::std::swap(p, aTable[nDest-nStart]); +- p->nOrg = nOrg; +- ::std::swap(p, aTable[nOrg-nStart]); +- OSL_ENSURE( p == ppInfo[nPos], "SortReorder: nOrg MisMatch" ); ++ // Update the position of the index that was originally equal to nDest. ++ size_t nPos = aPosTable[nDest-nStart]; ++ aIndices[nPos] = nSrc; ++ aPosTable[nSrc-nStart] = nPos; + } +- if(pProgress) +- pProgress->SetStateOnPercent( nPos ); ++ ++ if (pProgress) ++ pProgress->SetStateOnPercent(i); + } + + // Reset formula cell positions which became out-of-sync after column reordering. + for (SCCOL nCol = nStart; nCol <= nLast; ++nCol) +- aCol[nCol].ResetFormulaCellPositions(aSortParam.nRow1, aSortParam.nRow2); ++ aCol[nCol].ResetFormulaCellPositions(nRow1, nRow2); + + // Set up column reorder map (for later broadcasting of reference updates). +- sc::ColReorderMapType aColMap; +- const std::vector& rOldIndices = pArray->GetOldIndices(); ++ sc::ColRowReorderMapType aColMap; ++ const std::vector& rOldIndices = pArray->GetOrderIndices(); + for (size_t i = 0, n = rOldIndices.size(); i < n; ++i) + { + SCCOL nNew = i + nStart; +- SCROW nOld = rOldIndices[i]; +- aColMap.insert(sc::ColReorderMapType::value_type(nOld, nNew)); ++ SCCOL nOld = rOldIndices[i]; ++ aColMap.insert(sc::ColRowReorderMapType::value_type(nOld, nNew)); + } + + // Collect all listeners within sorted range ahead of time. + std::vector aListeners; + for (SCCOL nCol = nStart; nCol <= nLast; ++nCol) +- aCol[nCol].CollectListeners(aListeners, aSortParam.nRow1, aSortParam.nRow2); ++ aCol[nCol].CollectListeners(aListeners, nRow1, nRow2); + + // Remove any duplicate listener entries and notify all listeners + // afterward. We must ensure that we notify each unique listener only + // once. + std::sort(aListeners.begin(), aListeners.end()); + aListeners.erase(std::unique(aListeners.begin(), aListeners.end()), aListeners.end()); +- ColReorderNotifier aFunc(aColMap, nTab, aSortParam.nRow1, aSortParam.nRow2); ++ ColReorderNotifier aFunc(aColMap, nTab, nRow1, nRow2); + std::for_each(aListeners.begin(), aListeners.end(), aFunc); + + // Re-join formulas at row boundaries now that all the references have +@@ -621,28 +737,28 @@ void ScTable::SortReorder( ScSortInfoArray* pArray, ScProgress* pProgress ) + for (SCCOL nCol = nStart; nCol <= nLast; ++nCol) + { + sc::CellStoreType& rCells = aCol[nCol].maCells; +- sc::CellStoreType::position_type aPos = rCells.position(aSortParam.nRow1); ++ sc::CellStoreType::position_type aPos = rCells.position(nRow1); + sc::SharedFormulaUtil::joinFormulaCellAbove(aPos); +- aPos = rCells.position(aPos.first, aSortParam.nRow2+1); ++ aPos = rCells.position(aPos.first, nRow2+1); + sc::SharedFormulaUtil::joinFormulaCellAbove(aPos); + } + } + +-void ScTable::SortReorderByRow( ScSortInfoArray* pArray, ScProgress* pProgress ) ++void ScTable::SortReorderByRow( ++ ScSortInfoArray* pArray, SCCOL nCol1, SCCOL nCol2, ScProgress* pProgress ) + { ++ if (nCol2 < nCol1) ++ return; ++ + SCROW nRow1 = pArray->GetStart(); + SCROW nRow2 = pArray->GetLast(); + ScSortInfoArray::RowsType* pRows = pArray->GetDataRows(); + assert(pRows); // In sort-by-row mode we must have data rows already populated. + +- // Detach all formula cells within the sorted range first. +- sc::EndListeningContext aCxt(*pDocument); +- DetachFormulaCells(aCxt, aSortParam.nCol1, nRow1, aSortParam.nCol2, nRow2); +- + // Cells in the data rows only reference values in the document. Make + // a copy before updating the document. + +- size_t nColCount = aSortParam.nCol2 - aSortParam.nCol1 + 1; ++ size_t nColCount = nCol2 - nCol1 + 1; + boost::ptr_vector aSortedCols; // storage for copied cells. + SortedRowFlags aRowFlags; + aSortedCols.reserve(nColCount); +@@ -659,7 +775,7 @@ void ScTable::SortReorderByRow( ScSortInfoArray* pArray, ScProgress* pProgress ) + ScSortInfoArray::Row* pRow = (*pRows)[i]; + for (size_t j = 0; j < pRow->maCells.size(); ++j) + { +- ScAddress aCellPos(aSortParam.nCol1 + j, nRow1 + i, nTab); ++ ScAddress aCellPos(nCol1 + j, nRow1 + i, nTab); + + ScSortInfoArray::Cell& rCell = pRow->maCells[j]; + +@@ -681,14 +797,14 @@ void ScTable::SortReorderByRow( ScSortInfoArray* pArray, ScProgress* pProgress ) + case CELLTYPE_FORMULA: + { + assert(rCell.mpAttr); +- size_t n = rCellStore.size(); +- sc::CellStoreType::iterator itBlk = rCellStore.push_back( rCell.maCell.mpFormula->Clone( +- aCellPos, SC_CLONECELL_DEFAULT | SC_CLONECELL_ADJUST3DREL)); +- +- // Join the formula cells as we fill the container. +- size_t nOffset = n - itBlk->position; +- sc::CellStoreType::position_type aPos(itBlk, nOffset); +- sc::SharedFormulaUtil::joinFormulaCellAbove(aPos); ++ ScAddress aOldPos = rCell.maCell.mpFormula->aPos; ++ ++ ScFormulaCell* pNew = rCell.maCell.mpFormula->Clone( ++ aCellPos, SC_CLONECELL_DEFAULT | SC_CLONECELL_ADJUST3DREL); ++ pNew->CopyAllBroadcasters(*rCell.maCell.mpFormula); ++ pNew->GetCode()->AdjustReferenceOnMovedOrigin(aOldPos, aCellPos); ++ ++ sc::CellStoreType::iterator itBlk = rCellStore.push_back(pNew); + } + break; + default: +@@ -737,7 +853,7 @@ void ScTable::SortReorderByRow( ScSortInfoArray* pArray, ScProgress* pProgress ) + + for (size_t i = 0, n = aSortedCols.size(); i < n; ++i) + { +- SCCOL nThisCol = i + aSortParam.nCol1; ++ SCCOL nThisCol = i + nCol1; + + { + sc::CellStoreType& rDest = aCol[nThisCol].maCells; +@@ -812,10 +928,62 @@ void ScTable::SortReorderByRow( ScSortInfoArray* pArray, ScProgress* pProgress ) + SetRowFiltered(it->mnRow1, it->mnRow2, true); + } + +- // Attach all formula cells within sorted range, to have them start listening again. +- sc::StartListeningContext aStartListenCxt(*pDocument); +- AttachFormulaCells( +- aStartListenCxt, aSortParam.nCol1, nRow1, aSortParam.nCol2, nRow2); ++ // Set up row reorder map (for later broadcasting of reference updates). ++ sc::ColRowReorderMapType aRowMap; ++ const std::vector& rOldIndices = pArray->GetOrderIndices(); ++ for (size_t i = 0, n = rOldIndices.size(); i < n; ++i) ++ { ++ SCROW nNew = i + nRow1; ++ SCROW nOld = rOldIndices[i]; ++ aRowMap.insert(sc::ColRowReorderMapType::value_type(nOld, nNew)); ++ } ++ ++ // Collect all listeners within sorted range ahead of time. ++ std::vector aListeners; ++ for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol) ++ aCol[nCol].CollectListeners(aListeners, nRow1, nRow2); ++ ++ // Remove any duplicate listener entries. We must ensure that we notify ++ // each unique listener only once. ++ std::sort(aListeners.begin(), aListeners.end()); ++ aListeners.erase(std::unique(aListeners.begin(), aListeners.end()), aListeners.end()); ++ ++ // Collect positions of all shared formula cells outside the sorted range, ++ // and make them unshared before notifying them. ++ sc::RefQueryFormulaGroup aFormulaGroupPos; ++ aFormulaGroupPos.setSkipRange(ScRange(nCol1, nRow1, nTab, nCol2, nRow2, nTab)); ++ ++ std::for_each(aListeners.begin(), aListeners.end(), FormulaGroupPosCollector(aFormulaGroupPos)); ++ const sc::RefQueryFormulaGroup::TabsType& rGroupTabs = aFormulaGroupPos.getAllPositions(); ++ sc::RefQueryFormulaGroup::TabsType::const_iterator itGroupTab = rGroupTabs.begin(), itGroupTabEnd = rGroupTabs.end(); ++ for (; itGroupTab != itGroupTabEnd; ++itGroupTab) ++ { ++ const sc::RefQueryFormulaGroup::ColsType& rCols = itGroupTab->second; ++ sc::RefQueryFormulaGroup::ColsType::const_iterator itCol = rCols.begin(), itColEnd = rCols.end(); ++ for (; itCol != itColEnd; ++itCol) ++ { ++ const sc::RefQueryFormulaGroup::ColType& rCol = itCol->second; ++ std::vector aBounds(rCol); ++ pDocument->UnshareFormulaCells(itGroupTab->first, itCol->first, aBounds); ++ } ++ } ++ ++ // Notify the listeners. ++ RowReorderNotifier aFunc(aRowMap, nTab, nCol1, nCol2); ++ std::for_each(aListeners.begin(), aListeners.end(), aFunc); ++ ++ // Re-group formulas in affected columns. ++ for (itGroupTab = rGroupTabs.begin(); itGroupTab != itGroupTabEnd; ++itGroupTab) ++ { ++ const sc::RefQueryFormulaGroup::ColsType& rCols = itGroupTab->second; ++ sc::RefQueryFormulaGroup::ColsType::const_iterator itCol = rCols.begin(), itColEnd = rCols.end(); ++ for (; itCol != itColEnd; ++itCol) ++ pDocument->RegroupFormulaCells(itGroupTab->first, itCol->first); ++ } ++ ++ // Re-group columns in the sorted range too. ++ for (SCCOL i = nCol1; i <= nCol2; ++i) ++ aCol[i].RegroupFormulaCells(); + } + + short ScTable::CompareCell( +@@ -1034,11 +1202,21 @@ void ScTable::DecoladeRow( ScSortInfoArray* pArray, SCROW nRow1, SCROW nRow2 ) + } + } + +-void ScTable::Sort(const ScSortParam& rSortParam, bool bKeepQuery, ScProgress* pProgress) ++void ScTable::Sort( ++ const ScSortParam& rSortParam, bool bKeepQuery, ScProgress* pProgress, sc::ReorderParam* pUndo ) + { + aSortParam = rSortParam; + InitSortCollator( rSortParam ); + bGlobalKeepQuery = bKeepQuery; ++ ++ if (pUndo) ++ { ++ // Copy over the basic sort parameters. ++ pUndo->mbByRow = rSortParam.bByRow; ++ pUndo->mbPattern = rSortParam.bIncludePattern; ++ pUndo->mbHiddenFiltered = bKeepQuery; ++ } ++ + if (rSortParam.bByRow) + { + SCROW nLastRow = 0; +@@ -1052,15 +1230,19 @@ void ScTable::Sort(const ScSortParam& rSortParam, bool bKeepQuery, ScProgress* p + if(pProgress) + pProgress->SetState( 0, nLastRow-nRow1 ); + +- boost::scoped_ptr pArray(CreateSortInfoArray(nRow1, nLastRow, bKeepQuery)); ++ boost::scoped_ptr pArray(CreateSortInfoArray(aSortParam, nRow1, nLastRow, bKeepQuery)); + + if ( nLastRow - nRow1 > 255 ) + DecoladeRow(pArray.get(), nRow1, nLastRow); + + QuickSort(pArray.get(), nRow1, nLastRow); +- SortReorder(pArray.get(), pProgress); ++ SortReorderByRow(pArray.get(), aSortParam.nCol1, aSortParam.nCol2, pProgress); + +- // #i59745# update position of caption objects of cell notes --> reported at (SortReorder) ScColumn::SwapCellNotes level ++ if (pUndo) ++ { ++ pUndo->maSortRange = ScRange(rSortParam.nCol1, nRow1, nTab, rSortParam.nCol2, nLastRow, nTab); ++ pUndo->maOrderIndices = pArray->GetOrderIndices(); ++ } + } + } + else +@@ -1077,17 +1259,48 @@ void ScTable::Sort(const ScSortParam& rSortParam, bool bKeepQuery, ScProgress* p + if(pProgress) + pProgress->SetState( 0, nLastCol-nCol1 ); + +- boost::scoped_ptr pArray(CreateSortInfoArray(nCol1, nLastCol, bKeepQuery)); ++ boost::scoped_ptr pArray(CreateSortInfoArray(aSortParam, nCol1, nLastCol, bKeepQuery)); + + QuickSort(pArray.get(), nCol1, nLastCol); +- SortReorder(pArray.get(), pProgress); ++ SortReorderByColumn(pArray.get(), aSortParam.nRow1, aSortParam.nRow2, aSortParam.bIncludePattern, pProgress); + +- // #i59745# update position of caption objects of cell notes --> reported at (SortReorder) ScColumn::SwapCellNotes level ++ if (pUndo) ++ { ++ pUndo->maSortRange = ScRange(nCol1, aSortParam.nRow1, nTab, nLastCol, aSortParam.nRow2, nTab); ++ pUndo->maOrderIndices = pArray->GetOrderIndices(); ++ } + } + } + DestroySortCollator(); + } + ++void ScTable::Reorder( const sc::ReorderParam& rParam, ScProgress* pProgress ) ++{ ++ if (rParam.maOrderIndices.empty()) ++ return; ++ ++ boost::scoped_ptr pArray(CreateSortInfoArray(rParam)); ++ if (!pArray) ++ return; ++ ++ if (rParam.mbByRow) ++ { ++ // Re-play sorting from the known sort indices. ++ pArray->ReorderByRow(rParam.maOrderIndices); ++ ++ SortReorderByRow( ++ pArray.get(), rParam.maSortRange.aStart.Col(), rParam.maSortRange.aEnd.Col(), pProgress); ++ } ++ else ++ { ++ // Ordering by column is much simpler. Just set the order indices and we are done. ++ pArray->SetOrderIndices(rParam.maOrderIndices); ++ SortReorderByColumn( ++ pArray.get(), rParam.maSortRange.aStart.Row(), rParam.maSortRange.aEnd.Row(), ++ rParam.mbPattern, pProgress); ++ } ++} ++ + namespace { + + class SubTotalRowFinder +@@ -2078,7 +2291,7 @@ void ScTable::TopTenQuery( ScQueryParam& rParam ) + bSortCollatorInitialized = true; + InitSortCollator( aLocalSortParam ); + } +- boost::scoped_ptr pArray(CreateSortInfoArray(nRow1, rParam.nRow2, bGlobalKeepQuery)); ++ boost::scoped_ptr pArray(CreateSortInfoArray(aSortParam, nRow1, rParam.nRow2, bGlobalKeepQuery)); + DecoladeRow( pArray.get(), nRow1, rParam.nRow2 ); + QuickSort( pArray.get(), nRow1, rParam.nRow2 ); + ScSortInfo** ppInfo = pArray->GetFirstArray(); +diff --git a/sc/source/core/data/table7.cxx b/sc/source/core/data/table7.cxx +index 2e6aad1..f3528dd 100644 +--- a/sc/source/core/data/table7.cxx ++++ b/sc/source/core/data/table7.cxx +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + + void ScTable::DeleteBeforeCopyFromClip( sc::CopyFromClipContext& rCxt, const ScTable& rClipTab ) + { +@@ -78,4 +79,20 @@ bool ScTable::HasUniformRowHeight( SCROW nRow1, SCROW nRow2 ) const + return nRow2 <= aData.mnRow2; + } + ++void ScTable::UnshareFormulaCells( SCCOL nCol, std::vector& rRows ) ++{ ++ if (!ValidCol(nCol)) ++ return; ++ ++ sc::SharedFormulaUtil::unshareFormulaCells(aCol[nCol].maCells, rRows); ++} ++ ++void ScTable::RegroupFormulaCells( SCCOL nCol ) ++{ ++ if (!ValidCol(nCol)) ++ return; ++ ++ aCol[nCol].RegroupFormulaCells(); ++} ++ + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/source/core/tool/listenerquery.cxx b/sc/source/core/tool/listenerquery.cxx +new file mode 100644 +index 0000000..bf9d38f +--- /dev/null ++++ b/sc/source/core/tool/listenerquery.cxx +@@ -0,0 +1,72 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ */ ++ ++#include ++#include ++#include ++ ++namespace sc { ++ ++RefQueryFormulaGroup::RefQueryFormulaGroup() : ++ SvtListener::QueryBase(SC_LISTENER_QUERY_FORMULA_GROUP_POS), ++ maSkipRange(ScAddress::INITIALIZE_INVALID) {} ++ ++RefQueryFormulaGroup::~RefQueryFormulaGroup() {} ++ ++void RefQueryFormulaGroup::setSkipRange( const ScRange& rRange ) ++{ ++ maSkipRange = rRange; ++} ++ ++void RefQueryFormulaGroup::add( const ScAddress& rPos ) ++{ ++ if (!rPos.IsValid()) ++ return; ++ ++ if (maSkipRange.IsValid() && maSkipRange.In(rPos)) ++ // This is within the skip range. Skip it. ++ return; ++ ++ TabsType::iterator itTab = maTabs.find(rPos.Tab()); ++ if (itTab == maTabs.end()) ++ { ++ std::pair r = ++ maTabs.insert(TabsType::value_type(rPos.Tab(), ColsType())); ++ if (!r.second) ++ // Insertion failed. ++ return; ++ ++ itTab = r.first; ++ } ++ ++ ColsType& rCols = itTab->second; ++ ColsType::iterator itCol = rCols.find(rPos.Col()); ++ if (itCol == rCols.end()) ++ { ++ std::pair r = ++ rCols.insert(ColsType::value_type(rPos.Col(), ColType())); ++ if (!r.second) ++ // Insertion failed. ++ return; ++ ++ itCol = r.first; ++ } ++ ++ ColType& rCol = itCol->second; ++ rCol.push_back(rPos.Row()); ++} ++ ++const RefQueryFormulaGroup::TabsType& RefQueryFormulaGroup::getAllPositions() const ++{ ++ return maTabs; ++} ++ ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/source/core/tool/refhint.cxx b/sc/source/core/tool/refhint.cxx +index 0e70b4f..29a9166 100644 +--- a/sc/source/core/tool/refhint.cxx ++++ b/sc/source/core/tool/refhint.cxx +@@ -31,12 +31,12 @@ const ScAddress& RefMovedHint::getDelta() const + return maMoveDelta; + } + +-RefColReorderHint::RefColReorderHint( const sc::ColReorderMapType& rColMap, SCTAB nTab, SCROW nRow1, SCROW nRow2 ) : ++RefColReorderHint::RefColReorderHint( const sc::ColRowReorderMapType& rColMap, SCTAB nTab, SCROW nRow1, SCROW nRow2 ) : + RefHint(ColumnReordered), mrColMap(rColMap), mnTab(nTab), mnRow1(nRow1), mnRow2(nRow2) {} + + RefColReorderHint::~RefColReorderHint() {} + +-const sc::ColReorderMapType& RefColReorderHint::getColMap() const ++const sc::ColRowReorderMapType& RefColReorderHint::getColMap() const + { + return mrColMap; + } +@@ -56,6 +56,31 @@ SCROW RefColReorderHint::getEndRow() const + return mnRow2; + } + ++RefRowReorderHint::RefRowReorderHint( const sc::ColRowReorderMapType& rRowMap, SCTAB nTab, SCCOL nCol1, SCCOL nCol2 ) : ++ RefHint(RowReordered), mrRowMap(rRowMap), mnTab(nTab), mnCol1(nCol1), mnCol2(nCol2) {} ++ ++RefRowReorderHint::~RefRowReorderHint() {} ++ ++const sc::ColRowReorderMapType& RefRowReorderHint::getRowMap() const ++{ ++ return mrRowMap; ++} ++ ++SCTAB RefRowReorderHint::getTab() const ++{ ++ return mnTab; ++} ++ ++SCCOL RefRowReorderHint::getStartColumn() const ++{ ++ return mnCol1; ++} ++ ++SCCOL RefRowReorderHint::getEndColumn() const ++{ ++ return mnCol2; ++} ++ + } + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/source/core/tool/sharedformula.cxx b/sc/source/core/tool/sharedformula.cxx +index ed35690..6f66365 100644 +--- a/sc/source/core/tool/sharedformula.cxx ++++ b/sc/source/core/tool/sharedformula.cxx +@@ -297,6 +297,35 @@ void SharedFormulaUtil::unshareFormulaCell(const CellStoreType::position_type& a + rCell.SetCellGroup(xNone); + } + ++void SharedFormulaUtil::unshareFormulaCells(CellStoreType& rCells, std::vector& rRows) ++{ ++ if (rRows.empty()) ++ return; ++ ++ // Sort and remove duplicates. ++ std::sort(rRows.begin(), rRows.end()); ++ rRows.erase(std::unique(rRows.begin(), rRows.end()), rRows.end()); ++ ++ // Add next cell positions to the list (to ensure that each position becomes a single cell). ++ std::vector aRows2; ++ std::vector::const_iterator it = rRows.begin(), itEnd = rRows.end(); ++ for (; it != itEnd; ++it) ++ { ++ if (*it > MAXROW) ++ break; ++ ++ aRows2.push_back(*it); ++ ++ if (*it < MAXROW) ++ aRows2.push_back(*it+1); ++ } ++ ++ // Remove duplicates again (the vector should still be sorted). ++ aRows2.erase(std::unique(aRows2.begin(), aRows2.end()), aRows2.end()); ++ ++ splitFormulaCellGroups(rCells, aRows2); ++} ++ + } + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx +index ab47bee..c289960 100644 +--- a/sc/source/core/tool/token.cxx ++++ b/sc/source/core/tool/token.cxx +@@ -2914,8 +2914,8 @@ void ScTokenArray::MoveReference( + } + } + +-void ScTokenArray::MoveReference( +- const ScAddress& rPos, SCTAB nTab, SCROW nRow1, SCROW nRow2, const sc::ColReorderMapType& rColMap ) ++void ScTokenArray::MoveReferenceColReorder( ++ const ScAddress& rPos, SCTAB nTab, SCROW nRow1, SCROW nRow2, const sc::ColRowReorderMapType& rColMap ) + { + FormulaToken** p = pCode; + FormulaToken** pEnd = p + static_cast(nLen); +@@ -2932,7 +2932,7 @@ void ScTokenArray::MoveReference( + if (aAbs.Tab() == nTab && nRow1 <= aAbs.Row() && aAbs.Row() <= nRow2) + { + // Inside reordered row range. +- sc::ColReorderMapType::const_iterator it = rColMap.find(aAbs.Col()); ++ sc::ColRowReorderMapType::const_iterator it = rColMap.find(aAbs.Col()); + if (it != rColMap.end()) + { + // This column is reordered. +@@ -2960,7 +2960,7 @@ void ScTokenArray::MoveReference( + if (aAbs.aStart.Tab() == nTab && nRow1 <= aAbs.aStart.Row() && aAbs.aEnd.Row() <= nRow2) + { + // Inside reordered row range. +- sc::ColReorderMapType::const_iterator it = rColMap.find(aAbs.aStart.Col()); ++ sc::ColRowReorderMapType::const_iterator it = rColMap.find(aAbs.aStart.Col()); + if (it != rColMap.end()) + { + // This column is reordered. +@@ -2978,6 +2978,69 @@ void ScTokenArray::MoveReference( + } + } + ++void ScTokenArray::MoveReferenceRowReorder( const ScAddress& rPos, SCTAB nTab, SCCOL nCol1, SCCOL nCol2, const sc::ColRowReorderMapType& rRowMap ) ++{ ++ FormulaToken** p = pCode; ++ FormulaToken** pEnd = p + static_cast(nLen); ++ for (; p != pEnd; ++p) ++ { ++ switch ((*p)->GetType()) ++ { ++ case svSingleRef: ++ { ++ ScToken* pToken = static_cast(*p); ++ ScSingleRefData& rRef = pToken->GetSingleRef(); ++ ScAddress aAbs = rRef.toAbs(rPos); ++ ++ if (aAbs.Tab() == nTab && nCol1 <= aAbs.Col() && aAbs.Col() <= nCol2) ++ { ++ // Inside reordered column range. ++ sc::ColRowReorderMapType::const_iterator it = rRowMap.find(aAbs.Row()); ++ if (it != rRowMap.end()) ++ { ++ // This column is reordered. ++ SCROW nNewRow = it->second; ++ aAbs.SetRow(nNewRow); ++ rRef.SetAddress(aAbs, rPos); ++ } ++ } ++ } ++ break; ++ case svDoubleRef: ++ { ++ ScToken* pToken = static_cast(*p); ++ ScComplexRefData& rRef = pToken->GetDoubleRef(); ++ ScRange aAbs = rRef.toAbs(rPos); ++ ++ if (aAbs.aStart.Tab() != aAbs.aEnd.Tab()) ++ // Must be a single-sheet reference. ++ break; ++ ++ if (aAbs.aStart.Row() != aAbs.aEnd.Row()) ++ // Whole range must fit in a single row. ++ break; ++ ++ if (aAbs.aStart.Tab() == nTab && nCol1 <= aAbs.aStart.Col() && aAbs.aEnd.Col() <= nCol2) ++ { ++ // Inside reordered column range. ++ sc::ColRowReorderMapType::const_iterator it = rRowMap.find(aAbs.aStart.Row()); ++ if (it != rRowMap.end()) ++ { ++ // This row is reordered. ++ SCCOL nNewRow = it->second; ++ aAbs.aStart.SetRow(nNewRow); ++ aAbs.aEnd.SetRow(nNewRow); ++ rRef.SetRange(aAbs, rPos); ++ } ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ } ++} ++ + namespace { + + bool adjustSingleRefInName( +diff --git a/sc/source/filter/xml/XMLExportDatabaseRanges.cxx b/sc/source/filter/xml/XMLExportDatabaseRanges.cxx +index ea2b31c..8e954ad 100644 +--- a/sc/source/filter/xml/XMLExportDatabaseRanges.cxx ++++ b/sc/source/filter/xml/XMLExportDatabaseRanges.cxx +@@ -35,6 +35,7 @@ + #include "subtotalparam.hxx" + #include "queryparam.hxx" + #include "queryentry.hxx" ++#include + + #include "svx/dataaccessdescriptor.hxx" + +diff --git a/sc/source/filter/xml/xmldrani.cxx b/sc/source/filter/xml/xmldrani.cxx +index 9478b0c..c6a8727 100644 +--- a/sc/source/filter/xml/xmldrani.cxx ++++ b/sc/source/filter/xml/xmldrani.cxx +@@ -34,6 +34,7 @@ + #include "rangeutl.hxx" + #include "queryentry.hxx" + #include "dputil.hxx" ++#include + + #include + #include +diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx +index d9d5550..900bf3e 100644 +--- a/sc/source/ui/docshell/dbdocfun.cxx ++++ b/sc/source/ui/docshell/dbdocfun.cxx +@@ -47,6 +47,7 @@ + #include "queryentry.hxx" + #include "markdata.hxx" + #include "progress.hxx" ++#include + + #include + #include +@@ -433,8 +434,6 @@ sal_Bool ScDBDocFunc::Sort( SCTAB nTab, const ScSortParam& rSortParam, + ScDocument* pDoc = rDocShell.GetDocument(); + if (bRecord && !pDoc->IsUndoEnabled()) + bRecord = false; +- SCTAB nSrcTab = nTab; +- ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer(); + + ScDBData* pDBData = pDoc->GetDBAtArea( nTab, rSortParam.nCol1, rSortParam.nRow1, + rSortParam.nCol2, rSortParam.nRow2 ); +@@ -444,28 +443,25 @@ sal_Bool ScDBDocFunc::Sort( SCTAB nTab, const ScSortParam& rSortParam, + return false; + } + +- ScDBData* pDestData = NULL; +- ScRange aOldDest; +- sal_Bool bCopy = !rSortParam.bInplace; ++ bool bCopy = !rSortParam.bInplace; + if ( bCopy && rSortParam.nDestCol == rSortParam.nCol1 && + rSortParam.nDestRow == rSortParam.nRow1 && rSortParam.nDestTab == nTab ) + bCopy = false; ++ + ScSortParam aLocalParam( rSortParam ); + if ( bCopy ) + { +- aLocalParam.MoveToDest(); +- if ( !ValidColRow( aLocalParam.nCol2, aLocalParam.nRow2 ) ) +- { +- if (!bApi) +- rDocShell.ErrorMessage(STR_PASTE_FULL); ++ // Copy the data range to the destination then move the sort range to it. ++ ScRange aSrcRange(rSortParam.nCol1, rSortParam.nRow1, nTab, rSortParam.nCol2, rSortParam.nRow2, nTab); ++ ScAddress aDestPos(rSortParam.nDestCol,rSortParam.nDestRow,rSortParam.nDestTab); ++ ++ ScDocFunc& rDocFunc = rDocShell.GetDocFunc(); ++ bool bRet = rDocFunc.MoveBlock(aSrcRange, aDestPos, false, bRecord, bPaint, bApi); ++ ++ if (!bRet) + return false; +- } + +- nTab = rSortParam.nDestTab; +- pDestData = pDoc->GetDBAtCursor( rSortParam.nDestCol, rSortParam.nDestRow, +- rSortParam.nDestTab, sal_True ); +- if (pDestData) +- pDestData->GetArea(aOldDest); ++ aLocalParam.MoveToDest(); + } + + ScEditableTester aTester( pDoc, nTab, aLocalParam.nCol1,aLocalParam.nRow1, +@@ -515,133 +511,23 @@ sal_Bool ScDBDocFunc::Sort( SCTAB nTab, const ScSortParam& rSortParam, + if ( aQueryParam.GetEntry(0).bDoQuery ) + bRepeatQuery = sal_True; + +- if (bRepeatQuery && bCopy) +- { +- if ( aQueryParam.bInplace || +- aQueryParam.nDestCol != rSortParam.nDestCol || +- aQueryParam.nDestRow != rSortParam.nDestRow || +- aQueryParam.nDestTab != rSortParam.nDestTab ) // Query auf selben Zielbereich? +- bRepeatQuery = false; +- } +- +- ScUndoSort* pUndoAction = 0; +- if ( bRecord ) +- { +- // Referenzen ausserhalb des Bereichs werden nicht veraendert ! +- +- ScDocument* pUndoDoc = new ScDocument( SCDOCMODE_UNDO ); +- // Zeilenhoehen immer (wegen automatischer Anpassung) +- //! auf ScBlockUndo umstellen +- pUndoDoc->InitUndo( pDoc, nTab, nTab, false, sal_True ); +- +- /* #i59745# Do not copy note captions to undo document. All existing +- caption objects will be repositioned while sorting which is tracked +- in drawing undo. When undo is executed, the old positions will be +- restored, and the cells with the old notes (which still refer to the +- existing captions) will be copied back into the source document. */ +- pDoc->CopyToDocument( aLocalParam.nCol1, aLocalParam.nRow1, nTab, +- aLocalParam.nCol2, aLocalParam.nRow2, nTab, +- IDF_ALL|IDF_NOCAPTIONS, false, pUndoDoc ); +- +- const ScRange* pR = 0; +- if (pDestData) +- { +- /* #i59745# Do not copy note captions from destination range to +- undo document. All existing caption objects will be removed +- which is tracked in drawing undo. When undo is executed, the +- caption objects are reinserted with drawing undo, and the cells +- with the old notes (which still refer to the existing captions) +- will be copied back into the source document. */ +- pDoc->CopyToDocument( aOldDest, IDF_ALL|IDF_NOCAPTIONS, false, pUndoDoc ); +- pR = &aOldDest; +- } +- +- // Zeilenhoehen immer (wegen automatischer Anpassung) +- //! auf ScBlockUndo umstellen +-// if (bRepeatQuery) +- pDoc->CopyToDocument( 0, aLocalParam.nRow1, nTab, MAXCOL, aLocalParam.nRow2, nTab, +- IDF_NONE, false, pUndoDoc ); +- +- ScDBCollection* pUndoDB = NULL; +- ScDBCollection* pDocDB = pDoc->GetDBCollection(); +- if (!pDocDB->empty()) +- pUndoDB = new ScDBCollection( *pDocDB ); +- +- pUndoAction = new ScUndoSort( &rDocShell, nTab, rSortParam, pUndoDoc, pUndoDB, pR ); +- rDocShell.GetUndoManager()->AddUndoAction( pUndoAction ); +- +- // #i59745# collect all drawing undo actions affecting cell note captions +- if( pDrawLayer ) +- pDrawLayer->BeginCalcUndo(false); +- } +- +- if ( bCopy ) +- { +- if (pDestData) +- pDoc->DeleteAreaTab(aOldDest, IDF_CONTENTS); // Zielbereich vorher loeschen +- +- ScRange aSource( rSortParam.nCol1,rSortParam.nRow1,nSrcTab, +- rSortParam.nCol2,rSortParam.nRow2,nSrcTab ); +- ScAddress aDest( rSortParam.nDestCol, rSortParam.nDestRow, rSortParam.nDestTab ); +- +- rDocShell.GetDocFunc().MoveBlock( aSource, aDest, false, false, false, sal_True ); +- } ++ sc::ReorderParam aUndoParam; + + // don't call ScDocument::Sort with an empty SortParam (may be empty here if bCopy is set) + if (aLocalParam.GetSortKeyCount() && aLocalParam.maKeyState[0].bDoSort) + { + ScProgress aProgress(&rDocShell, ScGlobal::GetRscString(STR_PROGRESS_SORTING), 0); +- pDoc->Sort( nTab, aLocalParam, bRepeatQuery, &aProgress ); ++ pDoc->Sort(nTab, aLocalParam, bRepeatQuery, &aProgress, &aUndoParam); + } + +- sal_Bool bSave = sal_True; +- if (bCopy) +- { +- ScSortParam aOldSortParam; +- pDBData->GetSortParam( aOldSortParam ); +- if (aOldSortParam.GetSortKeyCount() && +- aOldSortParam.maKeyState[0].bDoSort && aOldSortParam.bInplace) +- { +- bSave = false; +- aOldSortParam.nDestCol = rSortParam.nDestCol; +- aOldSortParam.nDestRow = rSortParam.nDestRow; +- aOldSortParam.nDestTab = rSortParam.nDestTab; +- pDBData->SetSortParam( aOldSortParam ); // dann nur DestPos merken +- } +- } +- if (bSave) // Parameter merken ++ if (bRecord) + { +- pDBData->SetSortParam( rSortParam ); +- pDBData->SetHeader( rSortParam.bHasHeader ); //! ??? +- pDBData->SetByRow( rSortParam.bByRow ); //! ??? ++ // Set up an undo object. ++ sc::UndoSort* pUndoAction = new sc::UndoSort(&rDocShell, aUndoParam); ++ rDocShell.GetUndoManager()->AddUndoAction(pUndoAction); + } + +- if (bCopy) // neuen DB-Bereich merken +- { +- // Tabelle umschalten von aussen (View) +- //! SetCursor ??!?! +- +- ScRange aDestPos( aLocalParam.nCol1, aLocalParam.nRow1, nTab, +- aLocalParam.nCol2, aLocalParam.nRow2, nTab ); +- ScDBData* pNewData; +- if (pDestData) +- pNewData = pDestData; // Bereich vorhanden -> anpassen +- else // Bereich ab Cursor/Markierung wird angelegt +- pNewData = rDocShell.GetDBData(aDestPos, SC_DB_MAKE, SC_DBSEL_FORCE_MARK ); +- if (pNewData) +- { +- pNewData->SetArea( nTab, +- aLocalParam.nCol1,aLocalParam.nRow1, +- aLocalParam.nCol2,aLocalParam.nRow2 ); +- pNewData->SetSortParam( aLocalParam ); +- pNewData->SetHeader( aLocalParam.bHasHeader ); //! ??? +- pNewData->SetByRow( aLocalParam.bByRow ); +- } +- else +- { +- OSL_FAIL("Zielbereich nicht da"); +- } +- } ++ pDBData->SetSortParam(rSortParam); + + ScRange aDirtyRange( + aLocalParam.nCol1, nStartRow, nTab, +@@ -661,23 +547,12 @@ sal_Bool ScDBDocFunc::Sort( SCTAB nTab, const ScSortParam& rSortParam, + nStartX = 0; + nEndX = MAXCOL; + } +- if (pDestData) +- { +- if ( nEndX < aOldDest.aEnd.Col() ) +- nEndX = aOldDest.aEnd.Col(); +- if ( nEndY < aOldDest.aEnd.Row() ) +- nEndY = aOldDest.aEnd.Row(); +- } + rDocShell.PostPaint(ScRange(nStartX, nStartY, nTab, nEndX, nEndY, nTab), nPaint); + } + + if (!bUniformRowHeight) + rDocShell.AdjustRowHeight(nStartRow, aLocalParam.nRow2, nTab); + +- // #i59745# set collected drawing undo actions at sorting undo action +- if( pUndoAction && pDrawLayer ) +- pUndoAction->SetDrawUndoAction( pDrawLayer->GetCalcUndo() ); +- + aModificator.SetDocumentModified(); + + return sal_True; +diff --git a/sc/source/ui/undo/undobase.cxx b/sc/source/ui/undo/undobase.cxx +index 609b6fe..6342910 100644 +--- a/sc/source/ui/undo/undobase.cxx ++++ b/sc/source/ui/undo/undobase.cxx +@@ -31,6 +31,7 @@ + #include "subtotalparam.hxx" + #include "globstr.hrc" + #include ++#include + + TYPEINIT1(ScSimpleUndo, SfxUndoAction); + TYPEINIT1(ScBlockUndo, ScSimpleUndo); +diff --git a/sc/source/ui/undo/undosort.cxx b/sc/source/ui/undo/undosort.cxx +new file mode 100644 +index 0000000..4ff0960 +--- /dev/null ++++ b/sc/source/ui/undo/undosort.cxx +@@ -0,0 +1,55 @@ ++/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ ++/* ++ * This file is part of the LibreOffice project. ++ * ++ * This Source Code Form is subject to the terms of the Mozilla Public ++ * License, v. 2.0. If a copy of the MPL was not distributed with this ++ * file, You can obtain one at http://mozilla.org/MPL/2.0/. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++namespace sc { ++ ++UndoSort::UndoSort( ScDocShell* pDocSh, const ReorderParam& rParam ) : ++ ScSimpleUndo(pDocSh), maParam(rParam) {} ++ ++OUString UndoSort::GetComment() const ++{ ++ return ScGlobal::GetRscString(STR_UNDO_SORT); ++} ++ ++void UndoSort::Undo() ++{ ++ BeginUndo(); ++ Execute(true); ++ EndUndo(); ++} ++ ++void UndoSort::Redo() ++{ ++ BeginRedo(); ++ Execute(false); ++ EndRedo(); ++} ++ ++void UndoSort::Execute( bool bUndo ) ++{ ++ ScDocument& rDoc = *pDocShell->GetDocument(); ++ sc::ReorderParam aParam = maParam; ++ if (bUndo) ++ aParam.reverse(); ++ rDoc.Reorder(aParam, NULL); ++ ++ ScUndoUtil::MarkSimpleBlock(pDocShell, maParam.maSortRange); ++ ++ pDocShell->PostPaint(maParam.maSortRange, PAINT_GRID); ++ pDocShell->PostDataChanged(); ++} ++ ++} ++ ++/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sc/source/ui/unoobj/cellsuno.cxx b/sc/source/ui/unoobj/cellsuno.cxx +index a9cf2eb..c1963e0 100644 +--- a/sc/source/ui/unoobj/cellsuno.cxx ++++ b/sc/source/ui/unoobj/cellsuno.cxx +@@ -124,6 +124,7 @@ + #include "tokenarray.hxx" + #include "stylehelper.hxx" + #include "dputil.hxx" ++#include + + #include + #include +diff --git a/sc/source/ui/unoobj/datauno.cxx b/sc/source/ui/unoobj/datauno.cxx +index 8886776..26838e1 100644 +--- a/sc/source/ui/unoobj/datauno.cxx ++++ b/sc/source/ui/unoobj/datauno.cxx +@@ -51,6 +51,7 @@ + #include "dpshttab.hxx" + #include "queryentry.hxx" + #include "dputil.hxx" ++#include + + #include + #include +diff --git a/svl/source/notify/listener.cxx b/svl/source/notify/listener.cxx +index 66207bf..f905090 100644 +--- a/svl/source/notify/listener.cxx ++++ b/svl/source/notify/listener.cxx +@@ -21,6 +21,14 @@ + #include + #include + ++SvtListener::QueryBase::QueryBase( sal_uInt16 nId ) : mnId(nId) {} ++SvtListener::QueryBase::~QueryBase() {} ++ ++sal_uInt16 SvtListener::QueryBase::getId() const ++{ ++ return mnId; ++} ++ + SvtListener::SvtListener() {} + + SvtListener::SvtListener( const SvtListener &r ) : +@@ -75,12 +83,26 @@ bool SvtListener::IsListening( SvtBroadcaster& rBroadcaster ) const + return maBroadcasters.count(&rBroadcaster) > 0; + } + ++void SvtListener::CopyAllBroadcasters( const SvtListener& r ) ++{ ++ BroadcastersType aCopy(r.maBroadcasters); ++ maBroadcasters.swap(aCopy); ++ BroadcastersType::iterator it = maBroadcasters.begin(), itEnd = maBroadcasters.end(); ++ for (; it != itEnd; ++it) ++ { ++ SvtBroadcaster* p = *it; ++ p->Add(this); ++ } ++} ++ + bool SvtListener::HasBroadcaster() const + { + return !maBroadcasters.empty(); + } + +-void SvtListener::Notify( const SfxHint& ) {} ++void SvtListener::Notify( const SfxHint& /*rHint*/ ) {} ++ ++void SvtListener::Query( QueryBase& /*rQuery*/ ) const {} + + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +-- +1.9.3 + diff --git a/SOURCES/0045-emf-emulate-hatch-with-color-blend.patch b/SOURCES/0045-emf-emulate-hatch-with-color-blend.patch new file mode 100644 index 0000000..71059fb --- /dev/null +++ b/SOURCES/0045-emf-emulate-hatch-with-color-blend.patch @@ -0,0 +1,189 @@ +From 28bd6fe0c4fdca575ef078d6e5ff2a5acb852ac3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Toma=C5=BE=20Vajngerl?= +Date: Sat, 19 Jul 2014 21:52:09 +0200 +Subject: [PATCH 045/137] emf+: emulate hatch with color blend + +Conflicts: + cppcanvas/source/mtfrenderer/emfplus.cxx + +Change-Id: I2ac8f790c79c269d4c1fa650e703c3645c567ca4 +Reviewed-on: https://gerrit.libreoffice.org/10436 +Reviewed-by: Andras Timar +Tested-by: Andras Timar +--- + cppcanvas/source/mtfrenderer/emfplus.cxx | 134 ++++++++++++++++++++++++++++++- + 1 file changed, 132 insertions(+), 2 deletions(-) + +diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx +index 0c53c59..e6b1ea8 100644 +--- a/cppcanvas/source/mtfrenderer/emfplus.cxx ++++ b/cppcanvas/source/mtfrenderer/emfplus.cxx +@@ -123,6 +123,63 @@ enum EmfPlusCombineMode + EmfPlusCombineModeComplement = 0x00000005 + }; + ++enum EmfPlusHatchStyle ++{ ++ HatchStyleHorizontal = 0x00000000, ++ HatchStyleVertical = 0x00000001, ++ HatchStyleForwardDiagonal = 0x00000002, ++ HatchStyleBackwardDiagonal = 0x00000003, ++ HatchStyleLargeGrid = 0x00000004, ++ HatchStyleDiagonalCross = 0x00000005, ++ HatchStyle05Percent = 0x00000006, ++ HatchStyle10Percent = 0x00000007, ++ HatchStyle20Percent = 0x00000008, ++ HatchStyle25Percent = 0x00000009, ++ HatchStyle30Percent = 0x0000000A, ++ HatchStyle40Percent = 0x0000000B, ++ HatchStyle50Percent = 0x0000000C, ++ HatchStyle60Percent = 0x0000000D, ++ HatchStyle70Percent = 0x0000000E, ++ HatchStyle75Percent = 0x0000000F, ++ HatchStyle80Percent = 0x00000010, ++ HatchStyle90Percent = 0x00000011, ++ HatchStyleLightDownwardDiagonal = 0x00000012, ++ HatchStyleLightUpwardDiagonal = 0x00000013, ++ HatchStyleDarkDownwardDiagonal = 0x00000014, ++ HatchStyleDarkUpwardDiagonal = 0x00000015, ++ HatchStyleWideDownwardDiagonal = 0x00000016, ++ HatchStyleWideUpwardDiagonal = 0x00000017, ++ HatchStyleLightVertical = 0x00000018, ++ HatchStyleLightHorizontal = 0x00000019, ++ HatchStyleNarrowVertical = 0x0000001A, ++ HatchStyleNarrowHorizontal = 0x0000001B, ++ HatchStyleDarkVertical = 0x0000001C, ++ HatchStyleDarkHorizontal = 0x0000001D, ++ HatchStyleDashedDownwardDiagonal = 0x0000001E, ++ HatchStyleDashedUpwardDiagonal = 0x0000001F, ++ HatchStyleDashedHorizontal = 0x00000020, ++ HatchStyleDashedVertical = 0x00000021, ++ HatchStyleSmallConfetti = 0x00000022, ++ HatchStyleLargeConfetti = 0x00000023, ++ HatchStyleZigZag = 0x00000024, ++ HatchStyleWave = 0x00000025, ++ HatchStyleDiagonalBrick = 0x00000026, ++ HatchStyleHorizontalBrick = 0x00000027, ++ HatchStyleWeave = 0x00000028, ++ HatchStylePlaid = 0x00000029, ++ HatchStyleDivot = 0x0000002A, ++ HatchStyleDottedGrid = 0x0000002B, ++ HatchStyleDottedDiamond = 0x0000002C, ++ HatchStyleShingle = 0x0000002D, ++ HatchStyleTrellis = 0x0000002E, ++ HatchStyleSphere = 0x0000002F, ++ HatchStyleSmallGrid = 0x00000030, ++ HatchStyleSmallCheckerBoard = 0x00000031, ++ HatchStyleLargeCheckerBoard = 0x00000032, ++ HatchStyleOutlinedDiamond = 0x00000033, ++ HatchStyleSolidDiamond = 0x00000034 ++}; ++ + using namespace ::com::sun::star; + using namespace ::basegfx; + +@@ -362,9 +419,28 @@ namespace cppcanvas + sal_Int32 surroundColorsNumber; + ::Color* surroundColors; + EMFPPath *path; ++ EmfPlusHatchStyle hatchStyle; + + public: + EMFPBrush () ++ : type(0) ++ , additionalFlags(0) ++ , wrapMode(0) ++ , areaX(0.0) ++ , areaY(0.0) ++ , areaWidth(0.0) ++ , areaHeight(0.0) ++ , hasTransformation(false) ++ , blendPoints(0) ++ , blendPositions(NULL) ++ , blendFactors(NULL) ++ , colorblendPoints(0) ++ , colorblendPositions(NULL) ++ , colorblendColors(NULL) ++ , surroundColorsNumber(0) ++ , surroundColors(NULL) ++ , path(NULL) ++ , hatchStyle(HatchStyleHorizontal) + { + blendPositions = NULL; + colorblendPositions = NULL; +@@ -418,7 +494,20 @@ namespace cppcanvas + s >> color; + solidColor = ::Color (0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff); + SAL_INFO ("cppcanvas.emf", "EMF+\tsolid color: 0x" << std::hex << color << std::dec); +- ++ break; ++ } ++ case 1: ++ { ++ sal_uInt32 style; ++ sal_uInt32 foregroundColor; ++ sal_uInt32 backgroundColor; ++ s >> style; ++ s >> foregroundColor; ++ s >> backgroundColor; ++ ++ hatchStyle = static_cast(style); ++ solidColor = ::Color(0xff - (foregroundColor >> 24), (foregroundColor >> 16) & 0xff, (foregroundColor >> 8) & 0xff, foregroundColor & 0xff); ++ secondColor = ::Color(0xff - (backgroundColor >> 24), (backgroundColor >> 16) & 0xff, (backgroundColor >> 8) & 0xff, backgroundColor & 0xff); + break; + } + // path gradient +@@ -1157,8 +1246,49 @@ namespace cppcanvas + rState.isFillColorSet = false; + rState.isLineColorSet = false; + +- if (brush->type == 3 || brush->type == 4) { ++ if (brush->type == 1) ++ { ++ // EMF+ like hatching is currently not supported. These are just color blends which serve as an approximation for some of them ++ // for the others the hatch "background" color (secondColor in brush) is used. + ++ bool isHatchBlend = true; ++ double blendFactor = 0.0; ++ ++ switch (brush->hatchStyle) ++ { ++ case HatchStyle05Percent: blendFactor = 0.05; break; ++ case HatchStyle10Percent: blendFactor = 0.10; break; ++ case HatchStyle20Percent: blendFactor = 0.20; break; ++ case HatchStyle25Percent: blendFactor = 0.25; break; ++ case HatchStyle30Percent: blendFactor = 0.30; break; ++ case HatchStyle40Percent: blendFactor = 0.40; break; ++ case HatchStyle50Percent: blendFactor = 0.50; break; ++ case HatchStyle60Percent: blendFactor = 0.60; break; ++ case HatchStyle70Percent: blendFactor = 0.70; break; ++ case HatchStyle75Percent: blendFactor = 0.75; break; ++ case HatchStyle80Percent: blendFactor = 0.80; break; ++ case HatchStyle90Percent: blendFactor = 0.90; break; ++ default: ++ isHatchBlend = false; ++ break; ++ } ++ rState.isFillColorSet = true; ++ rState.isLineColorSet = false; ++ ::Color fillColor; ++ if (isHatchBlend) ++ { ++ fillColor = brush->solidColor; ++ fillColor.Merge(brush->secondColor, static_cast(255 * blendFactor)); ++ } ++ else ++ { ++ fillColor = brush->secondColor; ++ } ++ rState.fillColor = ::vcl::unotools::colorToDoubleSequence(fillColor, rCanvas->getUNOCanvas()->getDevice()->getDeviceColorSpace()); ++ pPolyAction = ActionSharedPtr ( internal::PolyPolyActionFactory::createPolyPolyAction( localPolygon, rParms.mrCanvas, rState ) ); ++ } ++ else if (brush->type == 3 || brush->type == 4) ++ { + if (brush->type == 3 && !(brush->additionalFlags & 0x1)) + return; // we are unable to parse these brushes yet + +-- +1.9.3 + diff --git a/SOURCES/0046-bnc-881024-Handle-0-font-height-just-like-outdev-dra.patch b/SOURCES/0046-bnc-881024-Handle-0-font-height-just-like-outdev-dra.patch new file mode 100644 index 0000000..da7a402 --- /dev/null +++ b/SOURCES/0046-bnc-881024-Handle-0-font-height-just-like-outdev-dra.patch @@ -0,0 +1,41 @@ +From 48242717e3a7a8d4c936bad0b96d75cca70b5e0b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Toma=C5=BE=20Vajngerl?= +Date: Fri, 18 Jul 2014 13:36:59 +0200 +Subject: [PATCH 046/137] bnc#881024 Handle 0 font height just like outdev & + drawinglayer + +Change-Id: I80055e4101873e0ddd408ac1f0ee9c75cc3bf6b3 +Reviewed-on: https://gerrit.libreoffice.org/10435 +Reviewed-by: Andras Timar +Tested-by: Andras Timar +--- + cppcanvas/source/mtfrenderer/implrenderer.cxx | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +diff --git a/cppcanvas/source/mtfrenderer/implrenderer.cxx b/cppcanvas/source/mtfrenderer/implrenderer.cxx +index a8145bb..b7cbcab 100644 +--- a/cppcanvas/source/mtfrenderer/implrenderer.cxx ++++ b/cppcanvas/source/mtfrenderer/implrenderer.cxx +@@ -809,7 +809,18 @@ namespace cppcanvas + + // TODO(Q3): This code smells of programming by + // coincidence (the next two if statements) +- const ::Size rFontSizeLog( rFont.GetSize() ); ++ ++ ::Size rFontSizeLog( rFont.GetSize() ); ++ ++ if (rFontSizeLog.Height() == 0) ++ { ++ // guess 16 pixel (as in VCL) ++ rFontSizeLog = ::Size(0, 16); ++ ++ // convert to target MapUnit if not pixels ++ rFontSizeLog = OutputDevice::LogicToLogic(rFontSizeLog, MAP_PIXEL, rParms.mrVDev.GetMapMode()); ++ } ++ + const sal_Int32 nFontWidthLog = rFontSizeLog.Width(); + if( nFontWidthLog != 0 ) + { +-- +1.9.3 + diff --git a/SOURCES/0046-fdo-66984-Define-an-assignment-operator-to-prevent-d.patch b/SOURCES/0046-fdo-66984-Define-an-assignment-operator-to-prevent-d.patch deleted file mode 100644 index ec3bd15..0000000 --- a/SOURCES/0046-fdo-66984-Define-an-assignment-operator-to-prevent-d.patch +++ /dev/null @@ -1,113 +0,0 @@ -From 1d33b1de2b9eeef0043c057bbfa539ab1e7c3238 Mon Sep 17 00:00:00 2001 -From: Kohei Yoshida -Date: Fri, 6 Dec 2013 19:44:21 -0500 -Subject: [PATCH 046/109] fdo#66984: Define an assignment operator to prevent - double deletion. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The code path was assigning one ScDPObject to another via assignment, -but we didn't define one. So we were using the compiler generated -assignment which only shallow-copies data members, which ultimately -caused double-deletion of one of its data members. - -Change-Id: Ie98d0789e51aebff683dbcc0e533a9a0a87943d5 -(cherry picked from commit bd976e5b070ec68a4f842190db4d0c1ea0e93428) -Reviewed-on: https://gerrit.libreoffice.org/6966 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - sc/inc/dpobject.hxx | 3 +++ - sc/source/core/data/dpobject.cxx | 49 +++++++++++++++++++++++++++++++++++----- - 2 files changed, 46 insertions(+), 6 deletions(-) - -diff --git a/sc/inc/dpobject.hxx b/sc/inc/dpobject.hxx -index 8505a53..06d4957 100644 ---- a/sc/inc/dpobject.hxx -+++ b/sc/inc/dpobject.hxx -@@ -118,11 +118,14 @@ public: - ScDPObject(const ScDPObject& r); - ~ScDPObject(); - -+ ScDPObject& operator= (const ScDPObject& r); -+ - void EnableGetPivotData(bool b); - - void SetAllowMove(bool bSet); - - void InvalidateData(); -+ void Clear(); - void ClearTableData(); - void ReloadGroupTableData(); - -diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx -index 677ccd5..169231a 100644 ---- a/sc/source/core/data/dpobject.cxx -+++ b/sc/source/core/data/dpobject.cxx -@@ -354,12 +354,34 @@ ScDPObject::ScDPObject(const ScDPObject& r) : - - ScDPObject::~ScDPObject() - { -- delete pOutput; -- delete pSaveData; -- delete pSheetDesc; -- delete pImpDesc; -- delete pServDesc; -- ClearTableData(); -+ Clear(); -+} -+ -+ScDPObject& ScDPObject::operator= (const ScDPObject& r) -+{ -+ Clear(); -+ -+ pDoc = r.pDoc; -+ aTableName = r.aTableName; -+ aTableTag = r.aTableTag; -+ aOutRange = r.aOutRange; -+ mnAutoFormatIndex = r.mnAutoFormatIndex; -+ nHeaderRows = r.nHeaderRows; -+ mbHeaderLayout = r.mbHeaderLayout; -+ bAllowMove = false; -+ bSettingsChanged = false; -+ mbEnableGetPivotData = r.mbEnableGetPivotData; -+ -+ if (r.pSaveData) -+ pSaveData = new ScDPSaveData(*r.pSaveData); -+ if (r.pSheetDesc) -+ pSheetDesc = new ScSheetSourceDesc(*r.pSheetDesc); -+ if (r.pImpDesc) -+ pImpDesc = new ScImportSourceDesc(*r.pImpDesc); -+ if (r.pServDesc) -+ pServDesc = new ScDPServiceDesc(*r.pServDesc); -+ -+ return *this; - } - - void ScDPObject::EnableGetPivotData(bool b) -@@ -780,6 +802,21 @@ void ScDPObject::InvalidateData() - bSettingsChanged = true; - } - -+void ScDPObject::Clear() -+{ -+ delete pOutput; -+ delete pSaveData; -+ delete pSheetDesc; -+ delete pImpDesc; -+ delete pServDesc; -+ pOutput = NULL; -+ pSaveData = NULL; -+ pSheetDesc = NULL; -+ pImpDesc = NULL; -+ pServDesc = NULL; -+ ClearTableData(); -+} -+ - void ScDPObject::ClearTableData() - { - ClearSource(); --- -1.8.4.2 - diff --git a/SOURCES/0047-EMF-Fill-line-cap-object-if-EmfPlusCustomLineCapData.patch b/SOURCES/0047-EMF-Fill-line-cap-object-if-EmfPlusCustomLineCapData.patch deleted file mode 100644 index f0b2e04..0000000 --- a/SOURCES/0047-EMF-Fill-line-cap-object-if-EmfPlusCustomLineCapData.patch +++ /dev/null @@ -1,111 +0,0 @@ -From 812963c5ff6e1c4685eddb830a82a69a3801d820 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Mat=C3=BA=C5=A1=20Kukan?= -Date: Fri, 6 Dec 2013 14:40:50 +0100 -Subject: [PATCH 047/109] EMF+: Fill line cap object if - EmfPlusCustomLineCapDataFillPath is set. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Change-Id: I7b53a8f18e1fb24b1ae0322bdf0980e431a0725f -(cherry picked from commit 131f3230d98f24faf57d9404e333cb1fb183345b) -Reviewed-on: https://gerrit.libreoffice.org/6960 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - cppcanvas/source/inc/implrenderer.hxx | 2 +- - cppcanvas/source/mtfrenderer/emfplus.cxx | 23 ++++++++++++++++++++--- - 2 files changed, 21 insertions(+), 4 deletions(-) - -diff --git a/cppcanvas/source/inc/implrenderer.hxx b/cppcanvas/source/inc/implrenderer.hxx -index d602945..a6f86e0 100644 ---- a/cppcanvas/source/inc/implrenderer.hxx -+++ b/cppcanvas/source/inc/implrenderer.hxx -@@ -284,7 +284,7 @@ static float GetSwapFloat( SvStream& rSt ) - /// Render LineCap, like the start or end arrow of a polygon. - /// @return how much we should shorten the original polygon. - double EMFPPlusDrawLineCap(const ::basegfx::B2DPolygon& rPolygon, double fPolyLength, -- const ::basegfx::B2DPolyPolygon& rLineCap, bool bStart, -+ const ::basegfx::B2DPolyPolygon& rLineCap, bool isFilled, bool bStart, - const com::sun::star::rendering::StrokeAttributes& rAttributes, - const ActionFactoryParameters& rParms, OutDevState& rState); - -diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx -index 2387934..a11dc8b 100644 ---- a/cppcanvas/source/mtfrenderer/emfplus.cxx -+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx -@@ -626,6 +626,7 @@ namespace cppcanvas - sal_uInt32 strokeStartCap, strokeEndCap, strokeJoin; - float miterLimit; - basegfx::B2DPolyPolygon polygon; -+ bool mbIsFilled; - - public: - EMFPCustomLineCap() : EMFPObject() -@@ -652,7 +653,7 @@ namespace cppcanvas - aAttributes.MiterLimit = miterLimit; - } - -- void ReadPath(SvStream& s, ImplRenderer& rR, bool bClosed) -+ void ReadPath(SvStream& s, ImplRenderer& rR, bool bFill) - { - sal_Int32 pathLength; - s >> pathLength; -@@ -669,7 +670,7 @@ namespace cppcanvas - path.Read(s, pathFlags, rR); - - polygon = path.GetPolygon(rR, false); -- polygon.setClosed(bClosed); -+ mbIsFilled = bFill; - - // transformation to convert the path to what LibreOffice - // expects -@@ -1321,7 +1322,7 @@ namespace cppcanvas - } - - double ImplRenderer::EMFPPlusDrawLineCap(const ::basegfx::B2DPolygon& rPolygon, double fPolyLength, -- const ::basegfx::B2DPolyPolygon& rLineCap, bool bStart, const rendering::StrokeAttributes& rAttributes, -+ const ::basegfx::B2DPolyPolygon& rLineCap, bool bIsFilled, bool bStart, const rendering::StrokeAttributes& rAttributes, - const ActionFactoryParameters& rParms, OutDevState& rState) - { - if (!rLineCap.count()) -@@ -1350,6 +1351,20 @@ namespace cppcanvas - rParms.mrCurrActionIndex += pAction->getActionCount()-1; - } - -+ if (bIsFilled) -+ { -+ bool bWasFillColorSet = rState.isFillColorSet; -+ rState.isFillColorSet = true; -+ rState.fillColor = rState.lineColor; -+ ActionSharedPtr pAction2(internal::PolyPolyActionFactory::createPolyPolyAction(aArrow, rParms.mrCanvas, rState)); -+ if (pAction2) -+ { -+ maActions.push_back(MtfAction(pAction2, rParms.mrCurrActionIndex)); -+ rParms.mrCurrActionIndex += pAction2->getActionCount()-1; -+ } -+ rState.isFillColorSet = bWasFillColorSet; -+ } -+ - return rAttributes.StrokeWidth; - } - -@@ -1404,6 +1419,7 @@ namespace cppcanvas - pen->customStartCap->SetAttributes(aAttributes); - - fStart = EMFPPlusDrawLineCap(aPolygon, fPolyLength, pen->customStartCap->polygon, -+ pen->customStartCap->mbIsFilled, - true, aAttributes, rParms, rState); - } - -@@ -1414,6 +1430,7 @@ namespace cppcanvas - pen->customEndCap->SetAttributes(aAttributes); - - fEnd = EMFPPlusDrawLineCap(aPolygon, fPolyLength, pen->customEndCap->polygon, -+ pen->customEndCap->mbIsFilled, - false, aAttributes, rParms, rState); - } - --- -1.8.4.2 - diff --git a/SOURCES/0047-bnc-881024-Don-t-world-transform-font-size-in-WMF-EM.patch b/SOURCES/0047-bnc-881024-Don-t-world-transform-font-size-in-WMF-EM.patch new file mode 100644 index 0000000..ad61410 --- /dev/null +++ b/SOURCES/0047-bnc-881024-Don-t-world-transform-font-size-in-WMF-EM.patch @@ -0,0 +1,74 @@ +From f5949d09321e3ac62538df0e70e58284bd1cab32 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Toma=C5=BE=20Vajngerl?= +Date: Fri, 18 Jul 2014 13:36:13 +0200 +Subject: [PATCH 047/137] bnc#881024 Don't world transform font size in WMF/EMF + import + +Conflicts: + vcl/source/filter/wmf/winmtf.cxx + +Change-Id: Ia865b84ee2b159ff7251ab5a769a2b635dd2a1ea +Reviewed-on: https://gerrit.libreoffice.org/10434 +Reviewed-by: Andras Timar +Tested-by: Andras Timar +--- + vcl/source/filter/wmf/winmtf.cxx | 18 +++++++++++++----- + vcl/source/filter/wmf/winmtf.hxx | 2 +- + 2 files changed, 14 insertions(+), 6 deletions(-) + +diff --git a/vcl/source/filter/wmf/winmtf.cxx b/vcl/source/filter/wmf/winmtf.cxx +index 38e79a8..d8c2a67 100644 +--- a/vcl/source/filter/wmf/winmtf.cxx ++++ b/vcl/source/filter/wmf/winmtf.cxx +@@ -412,14 +412,22 @@ Point WinMtfOutput::ImplMap( const Point& rPt ) + return Point(); + }; + +- +-Size WinMtfOutput::ImplMap( const Size& rSz ) ++Size WinMtfOutput::ImplMap(const Size& rSz, bool bDoWorldTransform) + { + if ( mnWinExtX && mnWinExtY ) + { + // #i121382# apply the whole WorldTransform, else a rotation will be misinterpreted +- double fWidth = rSz.Width() * maXForm.eM11 + rSz.Height() * maXForm.eM21; +- double fHeight = rSz.Width() * maXForm.eM12 + rSz.Height() * maXForm.eM22; ++ double fWidth, fHeight; ++ if (bDoWorldTransform) ++ { ++ fWidth = rSz.Width() * maXForm.eM11 + rSz.Height() * maXForm.eM21; ++ fHeight = rSz.Width() * maXForm.eM12 + rSz.Height() * maXForm.eM22; ++ } ++ else ++ { ++ fWidth = rSz.Width(); ++ fHeight = rSz.Height(); ++ } + + if ( mnGfxMode == GM_COMPATIBLE ) + { +@@ -483,7 +491,7 @@ void WinMtfOutput::ImplMap( Font& rFont ) + { + // !!! HACK: we now always set the width to zero because the OS width is interpreted differently; + // must later be made portable in SV (KA 1996-02-08) +- Size aFontSize = ImplMap ( rFont.GetSize() ); ++ Size aFontSize = ImplMap (rFont.GetSize(), false); + + if( aFontSize.Height() < 0 ) + aFontSize.Height() *= -1; +diff --git a/vcl/source/filter/wmf/winmtf.hxx b/vcl/source/filter/wmf/winmtf.hxx +index 9db9245..e2c1f1c 100644 +--- a/vcl/source/filter/wmf/winmtf.hxx ++++ b/vcl/source/filter/wmf/winmtf.hxx +@@ -632,7 +632,7 @@ class WinMtfOutput + + Point ImplMap( const Point& rPt ); + Point ImplScale( const Point& rPt ); +- Size ImplMap( const Size& rSz ); ++ Size ImplMap( const Size& rSize, bool bDoWorldTransform = true); + Rectangle ImplMap( const Rectangle& rRectangle ); + void ImplMap( Font& rFont ); + Polygon& ImplMap( Polygon& rPolygon ); +-- +1.9.3 + diff --git a/SOURCES/0048-fdo-74295-win32-fpicker-correctly-set-the-default-fi.patch b/SOURCES/0048-fdo-74295-win32-fpicker-correctly-set-the-default-fi.patch new file mode 100644 index 0000000..5cc878c --- /dev/null +++ b/SOURCES/0048-fdo-74295-win32-fpicker-correctly-set-the-default-fi.patch @@ -0,0 +1,68 @@ +From 1a72abae4863c5f60c96b5fda2dcad8f46551fbd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Aurimas=20Fi=C5=A1eras?= +Date: Mon, 21 Jul 2014 10:43:42 +0300 +Subject: [PATCH 048/137] fdo#74295 win32 fpicker: correctly set the default + file name + +Revert "Cleaning: remove use of old edt1 from dlg.h (Windows)" +This reverts commit e9fd9c25269abe171e5f693a8c70b33ab5a01c85. + +Reviewed-on: https://gerrit.libreoffice.org/10429 +Reviewed-on: https://gerrit.libreoffice.org/10430 +Reviewed-by: Andras Timar +Tested-by: Andras Timar +(cherry picked from commit a37d99eb176d0a302f92af287cc0d19ba2663bbc) +(cherry picked from commit bb4ffcdf9a3682f13f0145055f81921a764c36f3) +Signed-off-by: Andras Timar +(cherry picked from commit 6466d0fec06e095bc596593357846802a24bb4af) +Signed-off-by: Andras Timar +--- + fpicker/source/win32/filepicker/WinFileOpenImpl.cxx | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +diff --git a/fpicker/source/win32/filepicker/WinFileOpenImpl.cxx b/fpicker/source/win32/filepicker/WinFileOpenImpl.cxx +index ee2760b..66e6caa 100644 +--- a/fpicker/source/win32/filepicker/WinFileOpenImpl.cxx ++++ b/fpicker/source/win32/filepicker/WinFileOpenImpl.cxx +@@ -584,7 +584,7 @@ void SAL_CALL CWinFileOpenImpl::InitControlLabel(HWND hWnd) + // Our approach is to align all static text controls with the + // static text control "File name" of the FileOpen dialog, + // all checkboxes and all list/comboboxes will be left aligned with +-// the standard combobox cmb13 (defined in MS platform sdk dlgs.h) ++// the standard combobox edt1/cmb13 (defined in MS platform sdk dlgs.h) + // and all push buttons will be left aligned with the standard + // "OK" button + //----------------------------------------------------------------- +@@ -689,6 +689,8 @@ void CWinFileOpenImpl::EnlargeStdControlLabels() const + HWND hFilterBoxLabel = GetDlgItem(m_hwndFileOpenDlg, stc2); + HWND hFileNameBoxLabel = GetDlgItem(m_hwndFileOpenDlg, stc3); + HWND hFileNameBox = GetDlgItem(m_hwndFileOpenDlg, cmb13); ++ if (!hFileNameBox) ++ hFileNameBox = GetDlgItem(m_hwndFileOpenDlg, edt1); // since Win2k it is cmb13 or edt1 + + HWND hFilterBox = GetDlgItem(m_hwndFileOpenDlg, cmb1); + HWND hOkButton = GetDlgItem(m_hwndFileOpenDlg, IDOK); +@@ -983,12 +985,15 @@ void SAL_CALL CWinFileOpenImpl::InitialSetDefaultName() + // open dialog (reason: see above setDefaultName) + if (m_bInitialSelChanged && m_defaultName.getLength()) + { +- // from W2k there is a combobox instead ++ // under W2k by default there is a combobox instead + // of an edit field for the file name edit field +- // So the control id of this box is cmb13 and not +- // edt1 as before +- HWND hwndEdt1 = GetDlgItem(m_hwndFileOpenDlg, cmb13); +- SetWindowText(hwndEdt1, reinterpret_cast(m_defaultName.getStr())); ++ // the control id of this box is cmb13 and not ++ // edt1 as before. ++ // However, edt1 is still possible. See fdo#74295 ++ HWND hFileNameBox = GetDlgItem(m_hwndFileOpenDlg, cmb13); ++ if (!hFileNameBox) ++ hFileNameBox = GetDlgItem(m_hwndFileOpenDlg, edt1); ++ SetWindowText(hFileNameBox, reinterpret_cast(m_defaultName.getStr())); + } + + m_bInitialSelChanged = sal_False; +-- +1.9.3 + diff --git a/SOURCES/0049-Resolves-fdo-81581-Mediawiki-doesn-t-recognize-under.patch b/SOURCES/0049-Resolves-fdo-81581-Mediawiki-doesn-t-recognize-under.patch new file mode 100644 index 0000000..dea9be9 --- /dev/null +++ b/SOURCES/0049-Resolves-fdo-81581-Mediawiki-doesn-t-recognize-under.patch @@ -0,0 +1,157 @@ +From 4d003b92fa632d38909543b7317ceb75c96beeac Mon Sep 17 00:00:00 2001 +From: Julien Nabet +Date: Mon, 21 Jul 2014 11:36:27 +0200 +Subject: [PATCH 049/137] Resolves fdo#81581: Mediawiki doesn't recognize + underlining + +Cherry-picked from b8f4db5bad245c2e340b3217b10df994785eecd3 + +Change-Id: I27ec27bd733e5161bbd18ba7cf813daa3ac6c089 +Reviewed-on: https://gerrit.libreoffice.org/10438 +Reviewed-by: Andras Timar +Tested-by: Andras Timar +--- + swext/mediawiki/src/filter/odt2mediawiki.xsl | 59 ++++++++++++++++++++++++---- + 1 file changed, 51 insertions(+), 8 deletions(-) + +diff --git a/swext/mediawiki/src/filter/odt2mediawiki.xsl b/swext/mediawiki/src/filter/odt2mediawiki.xsl +index 64474b3..1205536 100644 +--- a/swext/mediawiki/src/filter/odt2mediawiki.xsl ++++ b/swext/mediawiki/src/filter/odt2mediawiki.xsl +@@ -118,23 +118,26 @@ + + + ++ ++ ++ + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + +- ++ + + + +@@ -976,6 +979,8 @@ + select="($style mod (2 * $BOLD_BIT)) != 0"/> + ++ + + + ++ + + + ++ + + + <tt> + ++ ++ <u> ++ + + ''' + +@@ -1044,6 +1056,9 @@ + + ''' + ++ ++ </u> ++ + + </tt> + +@@ -1255,6 +1270,8 @@ + select="($style-mask mod (2 * $BOLD_BIT)) = 0"/> + ++ + + + + ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + +@@ -1473,9 +1516,9 @@ + guaranteed to be disjoint, therefore, addition can be use instead + of bitwise or (which is missing in XPath). --> + ++ select="$style-set + $bold-style + $italic-style + $underline-style + $superscript-style + $subscript-style + $code-style + $typewriter-style + $center-style + $right-style"/> + ++ select="$style-mask + $bold-mask + $italic-mask + $underline-mask + $superscript-mask + $subscript-mask + $code-mask + $typewriter-mask + $center-mask + $right-mask"/> + + + +-- +1.9.3 + diff --git a/SOURCES/0049-fdo-72488-Broken-text-when-showing-visible-space.patch b/SOURCES/0049-fdo-72488-Broken-text-when-showing-visible-space.patch deleted file mode 100644 index 6ed7b7f..0000000 --- a/SOURCES/0049-fdo-72488-Broken-text-when-showing-visible-space.patch +++ /dev/null @@ -1,48 +0,0 @@ -From b79b4b88c5eb6b0fe4092b5eb98f3088f316f7b2 Mon Sep 17 00:00:00 2001 -From: Khaled Hosny -Date: Sun, 8 Dec 2013 22:30:28 +0200 -Subject: [PATCH 049/109] fdo#72488: Broken text when showing visible space -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Turning on showing nonprinting characters replaces the space with bullet -character, but still draws the text with the original kern array, this -works fine until there are ligatures involving the space character as -the number of glyphs after replacing the space with the bullet will be -different and the kern array will be completely off. - -This is a hack that gives up on replacing the space with a bullet when -its width is zero, not sure if it would interfere with other legitimate -uses. - -Change-Id: I3803a2097b7c9dab1fb53b24404e8550c5bf537e -Reviewed-on: https://gerrit.libreoffice.org/7005 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - sw/source/core/txtnode/fntcache.cxx | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx -index 80b2ea8..0857604 100644 ---- a/sw/source/core/txtnode/fntcache.cxx -+++ b/sw/source/core/txtnode/fntcache.cxx -@@ -1531,7 +1531,13 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf ) - - for( sal_Int32 i = 0; i < aStr.getLength(); ++i ) - if( CH_BLANK == aStr[ i ] ) -- aStr = aStr.replaceAt(i, 1, OUString(CH_BULLET)); -+ { -+ /* fdo#72488 Hack: try to see if the space is zero width -+ * and don't bother with inserting a bullet in this case. -+ */ -+ if (pKernArray[i + nCopyStart] != pKernArray[ i + nCopyStart + 1]) -+ aStr = aStr.replaceAt(i, 1, OUString(CH_BULLET)); -+ } - } - - xub_StrLen nCnt = rInf.GetText().getLength(); --- -1.8.4.2 - diff --git a/SOURCES/0050-CID-736170-CID-736171-CID-736172-Out-of-Bounds-read-.patch b/SOURCES/0050-CID-736170-CID-736171-CID-736172-Out-of-Bounds-read-.patch deleted file mode 100644 index 796301c..0000000 --- a/SOURCES/0050-CID-736170-CID-736171-CID-736172-Out-of-Bounds-read-.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 74f181d285425bf7ec2ec8a18ad9f2e075f52594 Mon Sep 17 00:00:00 2001 -From: Julien Nabet -Date: Sat, 7 Dec 2013 19:05:47 +0100 -Subject: [PATCH 050/109] CID#736170, CID#736171, CID#736172 Out-of-Bounds - read/write -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Let's be sure that nMaxcolorIndex < 256 - -Change-Id: I349184ad92c8e7b10a90a32e093972bfaee52467 -Reviewed-on: https://gerrit.libreoffice.org/6970 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara -Reviewed-on: https://gerrit.libreoffice.org/6972 ---- - filter/source/graphicfilter/icgm/class5.cxx | 15 +++++++-------- - 1 file changed, 7 insertions(+), 8 deletions(-) - -diff --git a/filter/source/graphicfilter/icgm/class5.cxx b/filter/source/graphicfilter/icgm/class5.cxx -index c0319b7..eb53788 100644 ---- a/filter/source/graphicfilter/icgm/class5.cxx -+++ b/filter/source/graphicfilter/icgm/class5.cxx -@@ -316,17 +316,16 @@ void CGM::ImplDoClass5() - if ( nMaxColorIndex > 255 ) - { - mbStatus = sal_False; -+ break; - } -- else -- { -- if ( pElement->nLatestColorMaximumIndex < nMaxColorIndex ) -- pElement->nLatestColorMaximumIndex = nMaxColorIndex; -+ if ( pElement->nLatestColorMaximumIndex < nMaxColorIndex ) -+ pElement->nLatestColorMaximumIndex = nMaxColorIndex; - -- for ( nIndex = nColorStartIndex; nIndex <= nMaxColorIndex; nIndex++ ) -- { -- pElement->aLatestColorTable[ nIndex ] = ImplGetBitmapColor( sal_True ); -- } -+ for ( nIndex = nColorStartIndex; nIndex <= nMaxColorIndex; nIndex++ ) -+ { -+ pElement->aLatestColorTable[ nIndex ] = ImplGetBitmapColor( sal_True ); - } -+ - pElement->nColorMaximumIndex = pElement->nLatestColorMaximumIndex; - for ( nIndex = nColorStartIndex; nIndex <= nMaxColorIndex; nIndex++ ) - { --- -1.8.4.2 - diff --git a/SOURCES/0052-Resolves-fdo-80906-Delete-any-control-on-Dialog-edit.patch b/SOURCES/0052-Resolves-fdo-80906-Delete-any-control-on-Dialog-edit.patch new file mode 100644 index 0000000..cc0cf30 --- /dev/null +++ b/SOURCES/0052-Resolves-fdo-80906-Delete-any-control-on-Dialog-edit.patch @@ -0,0 +1,52 @@ +From 5f712e0376cf77386b788093e9d19cfd0ea29913 Mon Sep 17 00:00:00 2001 +From: Julien Nabet +Date: Mon, 21 Jul 2014 19:26:58 +0200 +Subject: [PATCH 052/137] Resolves fdo#80906: Delete any control on Dialog + editing window crashes LO +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Quick fix for this bt: +3 0x00002aaaab2935d2 in __GI___assert_fail (assertion=0x2aaae1f2806a "_pInterface != 0", + file=0x2aaae1f28018 "/home/julien/compile-libreoffice/libreoffice/include/com/sun/star/uno/Reference.h", line=402, + function=0x2aaae1f28480 ::operator->() const::__PRETTY_FUNCTION__> "interface_type* com::sun::star::uno::Reference< >::operator->() const [with interface_type = com::sun::star::resource::XStringResourceManager]") at assert.c:101 +4 0x00002aaae1e2963b in com::sun::star::uno::Reference::operator-> (this=0x7fffffff2d00) + at /home/julien/compile-libreoffice/libreoffice/include/com/sun/star/uno/Reference.h:402 +5 0x00002aaae1eb5c87 in basctl::LocalizationMgr::implHandleControlResourceProperties (aControlAny= + uno::Any { = {_vptr.XInterface = 0x8935ea8}, }, aDialogName="Dialog1", aCtrlName="TextField1", + xStringResourceManager=empty uno::Reference, xSourceStringResolver=empty uno::Reference, eMode=basctl::LocalizationMgr::REMOVE_IDS_FROM_RESOURCE) + at /home/julien/compile-libreoffice/libreoffice/basctl/source/basicide/localizationmgr.cxx:202 +6 0x00002aaae1eb92a0 in basctl::LocalizationMgr::deleteControlResourceIDsForDeletedEditorObject (pEditor=0x919d820, aControlAny= + uno::Any { = {_vptr.XInterface = 0x8935ea8}, }, aCtrlName="TextField1") + at /home/julien/compile-libreoffice/libreoffice/basctl/source/basicide/localizationmgr.cxx:896 +Indeed, LocalizationMgr::setControlResourceIDsForNewEditorObject just returns if !xStringResourceManager.is() +So let's do the same when trying to delete ControlResources +See http://opengrok.libreoffice.org/xref/core/basctl/source/basicide/localizationmgr.cxx#835 + +Cherry-picked from e1840cf944b36b7ead5800a036870e38f4ddb049 + +Change-Id: I4be49503cd2464f97a25840dfdc29877e5fb2b93 +Reviewed-on: https://gerrit.libreoffice.org/10449 +Reviewed-by: Caolán McNamara +Tested-by: Caolán McNamara +--- + basctl/source/basicide/localizationmgr.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/basctl/source/basicide/localizationmgr.cxx b/basctl/source/basicide/localizationmgr.cxx +index 2812387..9d0cc87 100644 +--- a/basctl/source/basicide/localizationmgr.cxx ++++ b/basctl/source/basicide/localizationmgr.cxx +@@ -199,7 +199,7 @@ sal_Int32 LocalizationMgr::implHandleControlResourceProperties + + Reference< XPropertySet > xPropertySet; + aControlAny >>= xPropertySet; +- if( xPropertySet.is() ) ++ if( xPropertySet.is() && xStringResourceManager.is()) + { + Sequence< Locale > aLocaleSeq = xStringResourceManager->getLocales(); + sal_Int32 nLocaleCount = aLocaleSeq.getLength(); +-- +1.9.3 + diff --git a/SOURCES/0053-fdo-81304-don-t-parse-file-name-as-part-of-URL.patch b/SOURCES/0053-fdo-81304-don-t-parse-file-name-as-part-of-URL.patch new file mode 100644 index 0000000..96a7557 --- /dev/null +++ b/SOURCES/0053-fdo-81304-don-t-parse-file-name-as-part-of-URL.patch @@ -0,0 +1,34 @@ +From a958b590a34a1eaa888a36285f6aa364606383ad Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Mon, 14 Jul 2014 15:07:52 +0200 +Subject: [PATCH 053/137] fdo#81304 don't parse file name as part of URL + +... because the name is not URL-encoded at this point, so parsing it as +a part of the URL will interpret special characters, e.g. #. + +Change-Id: I780baed1753e9674d835dc296d31c088b67d8ba7 +(cherry picked from commit f3d7734af45f30a87d6de76aa3de7593d541bdc8) +Reviewed-on: https://gerrit.libreoffice.org/10295 +Reviewed-by: Eike Rathke +Tested-by: Eike Rathke +--- + sfx2/source/doc/guisaveas.cxx | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/sfx2/source/doc/guisaveas.cxx b/sfx2/source/doc/guisaveas.cxx +index 446d9d5..13105dc 100644 +--- a/sfx2/source/doc/guisaveas.cxx ++++ b/sfx2/source/doc/guisaveas.cxx +@@ -1279,7 +1279,8 @@ OUString ModelData_Impl::GetRecommendedName( const OUString& aSuggestedName, con + uno::UNO_QUERY ); + if ( xTypeDetection.is() ) + { +- INetURLObject aObj( OUString( "file:///c:/" ) + aRecommendedName ); ++ INetURLObject aObj( OUString( "file:///c:/" ) ); ++ aObj.SetName( aRecommendedName ); + + uno::Sequence< beans::PropertyValue > aTypeNameProps; + if ( ( xTypeDetection->getByName( aTypeName ) >>= aTypeNameProps ) && aTypeNameProps.getLength() ) +-- +1.9.3 + diff --git a/SOURCES/0056-sax-xmloff-fix-ODF-import-export-of-text-time-text-t.patch b/SOURCES/0056-sax-xmloff-fix-ODF-import-export-of-text-time-text-t.patch deleted file mode 100644 index 7da9554..0000000 --- a/SOURCES/0056-sax-xmloff-fix-ODF-import-export-of-text-time-text-t.patch +++ /dev/null @@ -1,670 +0,0 @@ -From 4ac4c151af9f743203728792f9840c4bafbb9390 Mon Sep 17 00:00:00 2001 -From: Michael Stahl -Date: Tue, 10 Dec 2013 15:14:00 +0100 -Subject: [PATCH 056/109] sax, xmloff: fix ODF import/export of - text:time/text:time-value - -The value written for an Impress time field is something like -text:time-value="0000-00-00T23:28:07" (in LO 3.5+) or -text:time-value="0-00-00T23:28:07" (in OOo 3.3) which contains an -invalid all-zero date. Such values are actually rejected by the -ODF import since commit ae3e2f170045a1525f67e9f3e9b7e03d94f2b56b. - -Actually there was no real support to read the RelaxNG type -timeOrDateTime before. - -So fix that by: -- adding convertTimeOrDateTime/parseTimeOrDateTime functions to - sax::Converter -- recognizing and ignoring the 2 invalid all-zero values written by - LO 3.5 and historic OOo respectively -- writing a bare "time" in text:time-value if the DateTime struct - contains zero Date members - (Older OOo versions and AOO cannot actually read that, but everything - they _can_ read is invalid ODF...) - -(cherry picked from commit cc407e50e8a1a74f9d1ed29d444dce9bd2e9167a) - -The backport contains one change: -XMLTextFieldExport::ProcessTimeOrDateTime() still writes the invalid -value (to not add new backwards compat issues in stable branch), -so this patch only fixes the import side of things. - -Conflicts: - sax/source/tools/converter.cxx - xmloff/source/text/txtfldi.cxx - -Change-Id: I754076caee74a5163ed3f972af0f23796aa14f9f -Reviewed-on: https://gerrit.libreoffice.org/7026 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - include/sax/tools/converter.hxx | 9 ++ - sax/qa/cppunit/test_converter.cxx | 138 +++++++++++++++++++++++- - sax/source/tools/converter.cxx | 213 ++++++++++++++++++++++++++++---------- - xmloff/inc/txtflde.hxx | 6 ++ - xmloff/source/text/txtflde.cxx | 24 ++++- - xmloff/source/text/txtfldi.cxx | 4 +- - 6 files changed, 331 insertions(+), 63 deletions(-) - -diff --git a/include/sax/tools/converter.hxx b/include/sax/tools/converter.hxx -index 615308c..683fadb 100644 ---- a/include/sax/tools/converter.hxx -+++ b/include/sax/tools/converter.hxx -@@ -160,10 +160,19 @@ public: - const com::sun::star::util::DateTime& rDateTime, - bool bAddTimeIf0AM = false ); - -+ /** convert util::DateTime to ISO "time" or "dateTime" string */ -+ static void convertTimeOrDateTime(OUStringBuffer& rBuffer, -+ const com::sun::star::util::DateTime& rDateTime, -+ sal_Int16 const* pTimeZoneOffset); -+ - /** convert ISO "date" or "dateTime" string to util::DateTime */ - static bool convertDateTime( com::sun::star::util::DateTime& rDateTime, - const OUString& rString ); - -+ /** convert ISO "time" or "dateTime" string to util::DateTime */ -+ static bool parseTimeOrDateTime(com::sun::star::util::DateTime& rDateTime, -+ const OUString& rString); -+ - /** convert ISO "date" or "dateTime" string to util::DateTime or - util::Date */ - static bool convertDateOrDateTime( -diff --git a/sax/qa/cppunit/test_converter.cxx b/sax/qa/cppunit/test_converter.cxx -index cfda248..f4b0c12 100644 ---- a/sax/qa/cppunit/test_converter.cxx -+++ b/sax/qa/cppunit/test_converter.cxx -@@ -53,6 +53,7 @@ public: - - void testDuration(); - void testDateTime(); -+ void testTime(); - void testDouble(); - void testMeasure(); - void testBool(); -@@ -64,6 +65,7 @@ public: - CPPUNIT_TEST_SUITE(ConverterTest); - CPPUNIT_TEST(testDuration); - CPPUNIT_TEST(testDateTime); -+ CPPUNIT_TEST(testTime); - CPPUNIT_TEST(testDouble); - CPPUNIT_TEST(testMeasure); - CPPUNIT_TEST(testBool); -@@ -240,7 +242,7 @@ void ConverterTest::testDateTime() - doTestDateTimeF( "0001-13-01T00:00:00" ); // invalid: M > 12 - doTestDateTimeF( "0001-01-32T00:00:00" ); // invalid: D > 31 - doTestDateTimeF( "0001-01-01T25:00:00" ); // invalid: H > 24 -- doTestDateTimeF( "0001-01-01T00:60:00" ); // invalid: H > 59 -+ doTestDateTimeF( "0001-01-01T00:60:00" ); // invalid: M > 59 - doTestDateTimeF( "0001-01-01T00:00:60" ); // invalid: S > 59 - doTestDateTimeF( "0001-01-01T24:01:00" ); // invalid: H=24, but M != 0 - doTestDateTimeF( "0001-01-01T24:00:01" ); // invalid: H=24, but S != 0 -@@ -251,9 +253,143 @@ void ConverterTest::testDateTime() - doTestDateTimeF( "0001-01-02T00:00:00-14:01" ); // invalid: TZ < -14:00 - doTestDateTimeF( "2100-02-29T00:00:00-00:00" ); // invalid: no leap year - doTestDateTimeF( "1900-02-29T00:00:00-00:00" ); // invalid: no leap year -+ doTestDateTimeF( "00:00:00" ); // invalid: no date -+ doTestDateTimeF( "T00:00:00" ); // invalid: no date - SAL_INFO("sax.cppunit","\nSAX CONVERTER TEST END"); - } - -+static void doTestTime(util::DateTime const & rdt, char const*const pis, -+ char const*const i_pos = 0) -+{ -+ char const*const pos((i_pos) ? i_pos : pis); -+ OUString is(OUString::createFromAscii(pis)); -+ util::DateTime odt; -+ SAL_INFO("sax.cppunit","about to convert '" << is << "'"); -+ bool bSuccess( Converter::parseTimeOrDateTime(odt, is) ); -+ SAL_INFO("sax.cppunit","Y:" << odt.Year << " M:" << odt.Month << " D:" << odt.Day << " H:" << odt.Hours << " M:" << odt.Minutes << " S:" << odt.Seconds << " nS:" << odt.NanoSeconds << " UTC: " << (bool)odt.IsUTC); -+ CPPUNIT_ASSERT(bSuccess); -+ CPPUNIT_ASSERT(eqDateTime(rdt, odt)); -+ OUStringBuffer buf; -+ Converter::convertTimeOrDateTime(buf, odt, 0); -+ SAL_INFO("sax.cppunit","" << buf.toString()); -+ CPPUNIT_ASSERT_EQUAL(OUString::createFromAscii(pos), -+ buf.makeStringAndClear()); -+} -+ -+static void doTestTimeF(char const*const pis) -+{ -+ util::DateTime odt; -+ bool bSuccess = Converter::parseTimeOrDateTime(odt, -+ OUString::createFromAscii(pis)); -+ SAL_INFO("sax.cppunit","Y:" << odt.Year << " M:" << odt.Month << " D:" << odt.Day << " H:" << odt.Hours << "H M:" << odt.Minutes << " S:" << odt.Seconds << " nS:" << odt.NanoSeconds); -+ CPPUNIT_ASSERT(!bSuccess); -+} -+ -+void ConverterTest::testTime() // time or dateTime + horrible backcompat mess -+{ -+ doTestTime( util::DateTime(0, 0, 0, 0, 1, 1, 1, false), -+ "0001-01-01T00:00:00" ); -+ doTestTime( util::DateTime(0, 0, 0, 0, 1, 1, 1, false), -+ "0001-01-01T00:00:00" ); -+ doTestTime( util::DateTime(0, 0, 0, 0, 1, 1, 1, true), -+ "0001-01-01T00:00:00Z" ); -+ doTestTime( util::DateTime(0, 0, 0, 0, 1, 1, -1, false), -+ "-0001-01-01T00:00:00"); -+ doTestTime( util::DateTime(0, 0, 0, 0, 1, 1, -1, true), -+ "-0001-01-01T01:00:00+01:00", "-0001-01-01T00:00:00Z"); -+ doTestTime( util::DateTime(0, 0, 0, 0, 1, 1, -324, false), -+ "-0324-01-01T00:00:00" ); -+ doTestTime( util::DateTime(0, 0, 0, 0, 1, 1, 1, true), -+ "0001-01-01T00:00:00-00:00", "0001-01-01T00:00:00Z" ); -+ doTestTime( util::DateTime(0, 0, 0, 0, 1, 1, 1, true), -+ "0001-01-01T00:00:00+00:00", "0001-01-01T00:00:00Z" ); -+ doTestTime( util::DateTime(0, 0, 0, 12, 2, 1, 1, true), -+ "0001-01-02T00:00:00-12:00", "0001-01-02T12:00:00Z" ); -+ doTestTime( util::DateTime(0, 0, 0, 12, 1, 1, 1, true), -+ "0001-01-02T00:00:00+12:00", "0001-01-01T12:00:00Z" ); -+ doTestTime( util::DateTime(990000000, 59, 59, 23, 31, 12, 9999, false), -+ "9999-12-31T23:59:59.99", "9999-12-31T23:59:59.990000000" ); -+ doTestTime( util::DateTime(990000000, 59, 59, 23, 31, 12, 9999, true), -+ "9999-12-31T23:59:59.99Z", "9999-12-31T23:59:59.990000000Z" ); -+ doTestTime( util::DateTime(999999999, 59, 59, 23, 31, 12, 9999, false), -+ "9999-12-31T23:59:59.9999999999999999999999999999999999999", -+ "9999-12-31T23:59:59.999999999" ); -+ doTestTime( util::DateTime(999999999, 59, 59, 23, 31, 12, 9999, true), -+ "9999-12-31T23:59:59.9999999999999999999999999999999999999Z", -+ "9999-12-31T23:59:59.999999999Z" ); -+ doTestTime( util::DateTime(0, 0, 0, 0, 29, 2, 2000, true), // leap year -+ "2000-02-29T00:00:00-00:00", "2000-02-29T00:00:00Z" ); -+ doTestTime( util::DateTime(0, 0, 0, 0, 29, 2, 1600, true), // leap year -+ "1600-02-29T00:00:00-00:00", "1600-02-29T00:00:00Z" ); -+ doTestTime( util::DateTime(0, 0, 0, 24, 1, 1, 333, false) -+ /*(0, 0, 0, 0, 2, 1, 333)*/, -+ "0333-01-01T24:00:00"/*, "0333-01-02T00:00:00"*/ ); -+ // While W3C XMLSchema specifies a minimum of 4 year digits we are lenient -+ // in what we accept. -+ doTestTime( util::DateTime(0, 0, 0, 0, 1, 1, 1, false), -+ "1-01-01T00:00:00", "0001-01-01T00:00:00" ); -+ -+ doTestTime( util::DateTime(0, 0, 0, 0, 0, 0, 0, false), "00:00:00" ); -+ doTestTime( util::DateTime(0, 0, 0, 24, 0, 0, 0, false), "24:00:00" ); -+ doTestTime( util::DateTime(0, 0, 59, 0, 0, 0, 0, false), "00:59:00" ); -+ doTestTime( util::DateTime(0, 1, 2, 4, 0, 0, 0, true), "04:02:01Z" ); -+ doTestTime( util::DateTime(0, 1, 2, 4, 0, 0, 0, true), -+ "05:02:01+01:00", "04:02:01Z" ); -+ doTestTime( util::DateTime(0, 11, 12, 9, 0, 0, 0, true), -+ "05:12:11-04:00", "09:12:11Z" ); -+ doTestTime( util::DateTime(990000000, 59, 59, 23, 0, 0, 0, false), -+ "23:59:59.99", "23:59:59.990000000" ); -+ doTestTime( util::DateTime(990000000, 59, 59, 23, 0, 0, 0, true), -+ "23:59:59.99Z", "23:59:59.990000000Z" ); -+ // backwards compatible: recognize invalid 0000-00-00 date (LO 3.5) -+ doTestTime( util::DateTime(0, 1, 0, 0, 0, 0, 0, false), -+ "0000-00-00T00:00:01", "00:00:01" ); -+ // backwards compatible: recognize invalid 0-00-00 date (OOo) -+ doTestTime( util::DateTime(0, 0, 1, 0, 0, 0, 0, false), -+ "0-00-00T00:01:00", "00:01:00" ); -+ -+ doTestTimeF( "+0001-01-01T00:00:00" ); // invalid: ^+ -+ doTestTimeF( "0001-1-01T00:00:00" ); // invalid: < 2 M -+ doTestTimeF( "0001-01-1T00:00:00" ); // invalid: < 2 D -+ doTestTimeF( "0001-01-01T0:00:00" ); // invalid: < 2 H -+ doTestTimeF( "0001-01-01T00:0:00" ); // invalid: < 2 M -+ doTestTimeF( "0001-01-01T00:00:0" ); // invalid: < 2 S -+ doTestTimeF( "0001-01-01T00:00:00." ); // invalid: .$ -+ doTestTimeF( "0001-01-01T00:00:00+1:00" ); // invalid: < 2 TZ H -+ doTestTimeF( "0001-01-01T00:00:00+00:1" ); // invalid: < 2 TZ M -+ doTestTimeF( "0001-13-01T00:00:00" ); // invalid: M > 12 -+ doTestTimeF( "0001-01-32T00:00:00" ); // invalid: D > 31 -+ doTestTimeF( "0001-01-01T25:00:00" ); // invalid: H > 24 -+ doTestTimeF( "0001-01-01T00:60:00" ); // invalid: M > 59 -+ doTestTimeF( "0001-01-01T00:00:60" ); // invalid: S > 59 -+ doTestTimeF( "0001-01-01T24:01:00" ); // invalid: H=24, but M != 0 -+ doTestTimeF( "0001-01-01T24:00:01" ); // invalid: H=24, but S != 0 -+ doTestTimeF( "0001-01-01T24:00:00.1" ); // invalid: H=24, but H != 0 -+ doTestTimeF( "0001-01-02T00:00:00+15:00" ); // invalid: TZ > +14:00 -+ doTestTimeF( "0001-01-02T00:00:00+14:01" ); // invalid: TZ > +14:00 -+ doTestTimeF( "0001-01-02T00:00:00-15:00" ); // invalid: TZ < -14:00 -+ doTestTimeF( "0001-01-02T00:00:00-14:01" ); // invalid: TZ < -14:00 -+ doTestTimeF( "2100-02-29T00:00:00-00:00" ); // invalid: no leap year -+ doTestTimeF( "1900-02-29T00:00:00-00:00" ); // invalid: no leap year -+ doTestTimeF( "T00:00:00" ); // invalid: T -+ doTestTimeF( "0:00:00" ); // invalid: < 2 H -+ doTestTimeF( "00:0:00" ); // invalid: < 2 M -+ doTestTimeF( "00:00:0" ); // invalid: < 2 S -+ doTestTimeF( "00:00:00." ); // invalid: .$ -+ doTestTimeF( "00:00:00+1:00" ); // invalid: < 2 TZ H -+ doTestTimeF( "00:00:00+00:1" ); // invalid: < 2 TZ M -+ doTestTimeF( "25:00:00" ); // invalid: H > 24 -+ doTestTimeF( "00:60:00" ); // invalid: M > 59 -+ doTestTimeF( "00:00:60" ); // invalid: S > 59 -+ doTestTimeF( "24:01:00" ); // invalid: H=24, but M != 0 -+ doTestTimeF( "24:00:01" ); // invalid: H=24, but S != 0 -+ doTestTimeF( "24:00:00.1" ); // invalid: H=24, but H != 0 -+ doTestTimeF( "00:00:00+15:00" ); // invalid: TZ > +14:00 -+ doTestTimeF( "00:00:00+14:01" ); // invalid: TZ > +14:00 -+ doTestTimeF( "00:00:00-15:00" ); // invalid: TZ < -14:00 -+ doTestTimeF( "00:00:00-14:01" ); // invalid: TZ < -14:00 -+} -+ - void doTestDouble(char const*const pis, double const rd, - sal_Int16 const nSourceUnit, sal_Int16 const nTargetUnit) - { -diff --git a/sax/source/tools/converter.cxx b/sax/source/tools/converter.cxx -index e99690e..bc8b0c1 100644 ---- a/sax/source/tools/converter.cxx -+++ b/sax/source/tools/converter.cxx -@@ -1231,6 +1231,69 @@ void Converter::convertDate( - convertDateTime(i_rBuffer, dt, false); - } - -+static void convertTime( -+ OUStringBuffer& i_rBuffer, -+ const com::sun::star::util::DateTime& i_rDateTime) -+{ -+ if (i_rDateTime.Hours < 10) { -+ i_rBuffer.append(sal_Unicode('0')); -+ } -+ i_rBuffer.append( static_cast(i_rDateTime.Hours) ) -+ .append(sal_Unicode(':')); -+ if (i_rDateTime.Minutes < 10) { -+ i_rBuffer.append(sal_Unicode('0')); -+ } -+ i_rBuffer.append( static_cast(i_rDateTime.Minutes) ) -+ .append(sal_Unicode(':')); -+ if (i_rDateTime.Seconds < 10) { -+ i_rBuffer.append(sal_Unicode('0')); -+ } -+ i_rBuffer.append( static_cast(i_rDateTime.Seconds) ); -+ if (i_rDateTime.NanoSeconds > 0) { -+ OSL_ENSURE(i_rDateTime.NanoSeconds < 1000000000,"NanoSeconds cannot be more than 999 999 999"); -+ i_rBuffer.append(sal_Unicode('.')); -+ std::ostringstream ostr; -+ ostr.fill('0'); -+ ostr.width(9); -+ ostr << i_rDateTime.NanoSeconds; -+ i_rBuffer.append(OUString::createFromAscii(ostr.str().c_str())); -+ } -+} -+ -+static void convertTimeZone( -+ OUStringBuffer& i_rBuffer, -+ const com::sun::star::util::DateTime& i_rDateTime, -+ sal_Int16 const* pTimeZoneOffset) -+{ -+ if (pTimeZoneOffset) -+ { -+ lcl_AppendTimezone(i_rBuffer, *pTimeZoneOffset); -+ } -+ else if (i_rDateTime.IsUTC) -+ { -+ lcl_AppendTimezone(i_rBuffer, 0); -+ } -+} -+ -+/** convert util::DateTime to ISO "time" or "dateTime" string */ -+void Converter::convertTimeOrDateTime( -+ OUStringBuffer& i_rBuffer, -+ const com::sun::star::util::DateTime& i_rDateTime, -+ sal_Int16 const* pTimeZoneOffset) -+{ -+ if (i_rDateTime.Year == 0 || -+ i_rDateTime.Month < 1 || i_rDateTime.Month > 12 || -+ i_rDateTime.Day < 1 || i_rDateTime.Day > 31) -+ { -+ convertTime(i_rBuffer, i_rDateTime); -+ convertTimeZone(i_rBuffer, i_rDateTime, pTimeZoneOffset); -+ } -+ else -+ { -+ convertDateTime(i_rBuffer, i_rDateTime, true); -+ } -+} -+ - /** convert util::DateTime to ISO "date" or "dateTime" string */ - void Converter::convertDateTime( - OUStringBuffer& i_rBuffer, -@@ -1238,10 +1301,7 @@ void Converter::convertDateTime( - bool i_bAddTimeIf0AM ) - { - const sal_Unicode dash('-'); -- const sal_Unicode col (':'); -- const sal_Unicode dot ('.'); - const sal_Unicode zero('0'); -- const sal_Unicode tee ('T'); - - sal_Int32 const nYear(abs(i_rDateTime.Year)); - if (i_rDateTime.Year < 0) { -@@ -1271,42 +1331,11 @@ void Converter::convertDateTime( - i_rDateTime.Hours != 0 || - i_bAddTimeIf0AM ) - { -- i_rBuffer.append(tee); -- if( i_rDateTime.Hours < 10 ) { -- i_rBuffer.append(zero); -- } -- i_rBuffer.append( static_cast(i_rDateTime.Hours) ) -- .append(col); -- if( i_rDateTime.Minutes < 10 ) { -- i_rBuffer.append(zero); -- } -- i_rBuffer.append( static_cast(i_rDateTime.Minutes) ) -- .append(col); -- if( i_rDateTime.Seconds < 10 ) { -- i_rBuffer.append(zero); -- } -- i_rBuffer.append( static_cast(i_rDateTime.Seconds) ); -- if( i_rDateTime.NanoSeconds > 0 ) { -- OSL_ENSURE(i_rDateTime.NanoSeconds < 1000000000,"NanoSeconds cannot be more than 999 999 999"); -- i_rBuffer.append(dot); -- std::ostringstream ostr; -- ostr.fill('0'); -- ostr.width(9); -- ostr << i_rDateTime.NanoSeconds; -- i_rBuffer.append(OUString::createFromAscii(ostr.str().c_str())); -- } -+ i_rBuffer.append(sal_Unicode('T')); -+ convertTime(i_rBuffer, i_rDateTime); - } - -- sal_uInt16 * pTimezone(0); // FIXME pass this as parameter -- if (pTimezone) -- { -- lcl_AppendTimezone(i_rBuffer, *pTimezone); -- } -- else if (i_rDateTime.IsUTC) -- { -- // append local time -- lcl_AppendTimezone(i_rBuffer, 0); -- } -+ convertTimeZone(i_rBuffer, i_rDateTime, 0); - } - - /** convert ISO "date" or "dateTime" string to util::DateTime */ -@@ -1379,11 +1408,17 @@ static void lcl_ConvertToUTC( - { - return; - } -+ sal_Int16 nDayAdd(0); - while (24 <= o_rHours) - { - o_rHours -= 24; -- ++o_rDay; -+ ++nDayAdd; - } -+ if (o_rDay == 0) -+ { -+ return; // handle time without date - don't adjust what isn't there -+ } -+ o_rDay += nDayAdd; - sal_Int16 const nDaysInMonth(lcl_MaxDaysPerMonth(o_rMonth, o_rYear)); - if (o_rDay <= nDaysInMonth) - { -@@ -1414,6 +1449,10 @@ static void lcl_ConvertToUTC( - ++nDaySubtract; - } - o_rHours -= nOffsetHours; -+ if (o_rDay == 0) -+ { -+ return; // handle time without date - don't adjust what isn't there -+ } - if (nDaySubtract < o_rDay) - { - o_rDay -= nDaySubtract; -@@ -1453,18 +1492,17 @@ readDateTimeComponent(const OUString & rString, - return true; - } - -- -- - /** convert ISO "date" or "dateTime" string to util::DateTime or util::Date */ --bool Converter::convertDateOrDateTime( -- util::Date & rDate, util::DateTime & rDateTime, -- bool & rbDateTime, const OUString & rString ) -+static bool lcl_parseDate( -+ bool & isNegative, -+ sal_Int32 & nYear, sal_Int32 & nMonth, sal_Int32 & nDay, -+ bool & bHaveTime, -+ sal_Int32 & nPos, -+ const OUString & string, -+ bool const bIgnoreInvalidOrMissingDate) - { - bool bSuccess = true; -- bool isNegative(false); - -- const OUString string = rString.trim().toAsciiUpperCase(); -- sal_Int32 nPos(0); - if (string.getLength() > nPos) - { - if (sal_Unicode('-') == string[nPos]) -@@ -1474,13 +1512,15 @@ bool Converter::convertDateOrDateTime( - } - } - -- sal_Int32 nYear(0); - { - // While W3C XMLSchema specifies years with a minimum of 4 digits, be - // leninent in what we accept for years < 1000. One digit is acceptable - // if the remainders match. - bSuccess = readDateTimeComponent(string, nPos, nYear, 1, false); -- bSuccess &= (0 < nYear); -+ if (!bIgnoreInvalidOrMissingDate) -+ { -+ bSuccess &= (0 < nYear); -+ } - bSuccess &= (nPos < string.getLength()); // not last token - } - if (bSuccess && (sal_Unicode('-') != string[nPos])) // separator -@@ -1492,11 +1532,14 @@ bool Converter::convertDateOrDateTime( - ++nPos; - } - -- sal_Int32 nMonth(0); - if (bSuccess) - { - bSuccess = readDateTimeComponent(string, nPos, nMonth, 2, true); -- bSuccess &= (0 < nMonth) && (nMonth <= 12); -+ if (!bIgnoreInvalidOrMissingDate) -+ { -+ bSuccess &= (0 < nMonth); -+ } -+ bSuccess &= (nMonth <= 12); - bSuccess &= (nPos < string.getLength()); // not last token - } - if (bSuccess && (sal_Unicode('-') != string[nPos])) // separator -@@ -1508,14 +1551,16 @@ bool Converter::convertDateOrDateTime( - ++nPos; - } - -- sal_Int32 nDay(0); - if (bSuccess) - { - bSuccess = readDateTimeComponent(string, nPos, nDay, 2, true); -- bSuccess &= (0 < nDay) && (nDay <= lcl_MaxDaysPerMonth(nMonth, nYear)); -+ if (!bIgnoreInvalidOrMissingDate) -+ { -+ bSuccess &= (0 < nDay); -+ } -+ bSuccess &= (nDay <= lcl_MaxDaysPerMonth(nMonth, nYear)); - } - -- bool bHaveTime(false); - if (bSuccess && (nPos < string.getLength())) - { - if (sal_Unicode('T') == string[nPos]) // time separator -@@ -1525,6 +1570,40 @@ bool Converter::convertDateOrDateTime( - } - } - -+ return bSuccess; -+} -+ -+/** convert ISO "date" or "dateTime" string to util::DateTime or util::Date */ -+static bool lcl_parseDateTime( -+ util::Date *const pDate, util::DateTime & rDateTime, -+ bool & rbDateTime, -+ const OUString & rString, -+ bool const bIgnoreInvalidOrMissingDate) -+{ -+ bool bSuccess = true; -+ -+ const OUString string = rString.trim().toAsciiUpperCase(); -+ -+ bool isNegative(false); -+ sal_Int32 nYear(0); -+ sal_Int32 nMonth(0); -+ sal_Int32 nDay(0); -+ sal_Int32 nPos(0); -+ bool bHaveTime(false); -+ -+ if ( !bIgnoreInvalidOrMissingDate -+ || string.indexOf(':') == -1 // no time? -+ || (string.indexOf('-') != -1 -+ && string.indexOf('-') < string.indexOf(':'))) -+ { -+ bSuccess &= lcl_parseDate(isNegative, nYear, nMonth, nDay, -+ bHaveTime, nPos, string, bIgnoreInvalidOrMissingDate); -+ } -+ else -+ { -+ bHaveTime = true; -+ } -+ - sal_Int32 nHours(0); - sal_Int32 nMinutes(0); - sal_Int32 nSeconds(0); -@@ -1658,7 +1737,7 @@ bool Converter::convertDateOrDateTime( - sal_uInt16 * pTimezone(0); // FIXME pass this as parameter - sal_Int16 const nTimezoneOffset = ((bHaveTimezoneMinus) ? (-1) : (+1)) - * ((nTimezoneHours * 60) + nTimezoneMinutes); -- if (bHaveTime) // time is optional -+ if (!pDate || bHaveTime) // time is optional - { - rDateTime.Year = - ((isNegative) ? (-1) : (+1)) * static_cast(nYear); -@@ -1691,10 +1770,10 @@ bool Converter::convertDateOrDateTime( - } - else - { -- rDate.Year = -+ pDate->Year = - ((isNegative) ? (-1) : (+1)) * static_cast(nYear); -- rDate.Month = static_cast(nMonth); -- rDate.Day = static_cast(nDay); -+ pDate->Month = static_cast(nMonth); -+ pDate->Day = static_cast(nDay); - if (bHaveTimezone) - { - if (pTimezone) -@@ -1713,6 +1792,26 @@ bool Converter::convertDateOrDateTime( - return bSuccess; - } - -+/** convert ISO "time" or "dateTime" string to util::DateTime */ -+bool Converter::parseTimeOrDateTime( -+ util::DateTime & rDateTime, -+ const OUString & rString) -+{ -+ bool dummy; -+ return lcl_parseDateTime( -+ 0, rDateTime, dummy, rString, true); -+} -+ -+/** convert ISO "date" or "dateTime" string to util::DateTime or util::Date */ -+bool Converter::convertDateOrDateTime( -+ util::Date & rDate, util::DateTime & rDateTime, -+ bool & rbDateTime, -+ const OUString & rString ) -+{ -+ return lcl_parseDateTime( -+ &rDate, rDateTime, rbDateTime, rString, false); -+} -+ - - /** gets the position of the first comma after npos in the string - rStr. Commas inside '"' pairs are not matched */ -diff --git a/xmloff/inc/txtflde.hxx b/xmloff/inc/txtflde.hxx -index 30e607b..53b84cf 100644 ---- a/xmloff/inc/txtflde.hxx -+++ b/xmloff/inc/txtflde.hxx -@@ -366,6 +366,12 @@ protected: - sal_Bool bIsDate, /// export as date (rather than date/time)? - sal_uInt16 nPrefix = XML_NAMESPACE_TEXT); /// attribute name prefix - -+ /// export time or dateTime -+ void ProcessTimeOrDateTime( -+ enum ::xmloff::token::XMLTokenEnum eXMLName, /// attribute token -+ const ::com::sun::star::util::DateTime& rTime, /// date/time value -+ sal_uInt16 nPrefix = XML_NAMESPACE_TEXT); /// attribute name prefix -+ - /// export all attributes for bibliography data fields - void ProcessBibliographyData( - const ::com::sun::star::uno::Reference < -diff --git a/xmloff/source/text/txtflde.cxx b/xmloff/source/text/txtflde.cxx -index 7e013db..0ad8fcb 100644 ---- a/xmloff/source/text/txtflde.cxx -+++ b/xmloff/source/text/txtflde.cxx -@@ -1261,17 +1261,17 @@ void XMLTextFieldExport::ExportFieldHelper( - if (xPropSetInfo->hasPropertyByName(sPropertyDateTimeValue)) - { - // no value -> current time -- ProcessDateTime(XML_TIME_VALUE, -+ ProcessTimeOrDateTime(XML_TIME_VALUE, - GetDateTimeProperty(sPropertyDateTimeValue, - rPropSet), -- sal_False ); -+ XML_NAMESPACE_TEXT); - } - if (xPropSetInfo->hasPropertyByName(sPropertyDateTime)) - { - // no value -> current time -- ProcessDateTime(XML_TIME_VALUE, -+ ProcessTimeOrDateTime(XML_TIME_VALUE, - GetDateTimeProperty(sPropertyDateTime,rPropSet), -- sal_False ); -+ XML_NAMESPACE_TEXT); - } - if (xPropSetInfo->hasPropertyByName(sPropertyIsFixed)) - { -@@ -2674,6 +2674,22 @@ void XMLTextFieldExport::ProcessDateTime(enum XMLTokenEnum eName, - } - } - -+/// export a time or dateTime -+void XMLTextFieldExport::ProcessTimeOrDateTime(enum XMLTokenEnum eName, -+ const util::DateTime& rTime, -+ sal_uInt16 nPrefix) -+{ -+ OUStringBuffer aBuffer; -+ -+ // date/time value -+// ::sax::Converter::convertTimeOrDateTime(aBuffer, rTime, 0); -+// NOTE: for 4.1 continue writing the invalid value that old versions can read -+ ::sax::Converter::convertDateTime(aBuffer, rTime); -+ -+ // output attribute -+ ProcessString(eName, aBuffer.makeStringAndClear(), sal_True, nPrefix); -+} -+ - - SvXMLEnumMapEntry const aBibliographyDataTypeMap[] = - { -diff --git a/xmloff/source/text/txtfldi.cxx b/xmloff/source/text/txtfldi.cxx -index cf6bc10..875677c 100644 ---- a/xmloff/source/text/txtfldi.cxx -+++ b/xmloff/source/text/txtfldi.cxx -@@ -1106,6 +1106,7 @@ void XMLTimeFieldImportContext::ProcessAttribute( - { - case XML_TOK_TEXTFIELD_TIME_VALUE: - { -+ // FIXME double appears unused? - double fTmp; - if (GetImport().GetMM100UnitConverter(). - convertDateTime(fTmp, sAttrValue)) -@@ -1114,7 +1115,8 @@ void XMLTimeFieldImportContext::ProcessAttribute( - bTimeOK = sal_True; - } - -- if (::sax::Converter::convertDateTime(aDateTimeValue, sAttrValue)) -+ if (::sax::Converter::parseTimeOrDateTime(aDateTimeValue, -+ sAttrValue)) - { - bTimeOK = sal_True; - } --- -1.8.4.2 - diff --git a/SOURCES/0057-fdo-66969-Set-selected-page-name-after-building-all-.patch b/SOURCES/0057-fdo-66969-Set-selected-page-name-after-building-all-.patch deleted file mode 100644 index 7474e6b..0000000 --- a/SOURCES/0057-fdo-66969-Set-selected-page-name-after-building-all-.patch +++ /dev/null @@ -1,121 +0,0 @@ -From 5618ac8ccddbff67b4b27a9c08f97d3bf2bcec3f Mon Sep 17 00:00:00 2001 -From: Kohei Yoshida -Date: Tue, 10 Dec 2013 12:50:48 -0500 -Subject: [PATCH 057/109] fdo#66969: Set selected page name after building all - dimension members. - -Because the new implementation relies on the visiblity flag of the -dimension members, they need to exist before setting currently selected -page, which is still used in documents generated by the older version of -LibreOffice. - -Change-Id: I6cec5fd3d2165f714fc01b596d3761890d87a4ff -(cherry picked from commit 2e1b90a4272defb917b23e2e360e171114d6fa4d) -Reviewed-on: https://gerrit.libreoffice.org/7027 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - sc/source/filter/xml/xmldpimp.cxx | 33 ++++++++++++++++++++++++++++++++- - sc/source/filter/xml/xmldpimp.hxx | 7 +++++++ - 2 files changed, 39 insertions(+), 1 deletion(-) - -diff --git a/sc/source/filter/xml/xmldpimp.cxx b/sc/source/filter/xml/xmldpimp.cxx -index 83f58f7..825060c 100644 ---- a/sc/source/filter/xml/xmldpimp.cxx -+++ b/sc/source/filter/xml/xmldpimp.cxx -@@ -412,6 +412,11 @@ void ScXMLDataPilotTableContext::SetButtons() - pDPObject->RefreshAfterLoad(); - } - -+void ScXMLDataPilotTableContext::SetSelectedPage( const OUString& rDimName, const OUString& rSelected ) -+{ -+ maSelectedPages.insert(SelectedPagesType::value_type(rDimName, rSelected)); -+} -+ - void ScXMLDataPilotTableContext::AddDimension(ScDPSaveDimension* pDim) - { - if (pDPSave) -@@ -548,10 +553,36 @@ void ScXMLDataPilotTableContext::EndElement() - if ( pDPCollection->GetByName(pDPObject->GetName()) ) - pDPObject->SetName( String() ); // ignore the invalid name, create a new name in AfterXMLLoading - -+ ProcessSelectedPages(); -+ - pDPCollection->InsertNewTable(pDPObject); - SetButtons(); - } - -+void ScXMLDataPilotTableContext::ProcessSelectedPages() -+{ -+ // Set selected pages after building all dimension members. -+ if (!pDPObject) -+ return; -+ -+ pDPObject->BuildAllDimensionMembers(); -+ ScDPSaveData* pSaveData = pDPObject->GetSaveData(); -+ if (!pSaveData) -+ return; -+ -+ SelectedPagesType::const_iterator it = maSelectedPages.begin(), itEnd = maSelectedPages.end(); -+ for (; it != itEnd; ++it) -+ { -+ const OUString& rDimName = it->first; -+ const OUString& rSelected = it->second; -+ ScDPSaveDimension* pDim = pSaveData->GetExistingDimensionByName(rDimName); -+ if (!pDim) -+ continue; -+ -+ pDim->SetCurrentPage(&rSelected); -+ } -+} -+ - void ScXMLDataPilotTableContext::SetGrandTotal( - XMLTokenEnum eOrientation, bool bVisible, const OUString& rDisplayName) - { -@@ -1111,7 +1142,7 @@ void ScXMLDataPilotFieldContext::EndElement() - pDim->SetOrientation(nOrientation); - if (bSelectedPage) - { -- pDim->SetCurrentPage(&sSelectedPage); -+ pDataPilotTable->SetSelectedPage(pDim->GetName(), sSelectedPage); - } - pDataPilotTable->AddDimension(pDim); - if (bIsGroupField) -diff --git a/sc/source/filter/xml/xmldpimp.hxx b/sc/source/filter/xml/xmldpimp.hxx -index 1aa851d..32f878d 100644 ---- a/sc/source/filter/xml/xmldpimp.hxx -+++ b/sc/source/filter/xml/xmldpimp.hxx -@@ -71,6 +71,8 @@ public: - - class ScXMLDataPilotTableContext : public SvXMLImportContext - { -+ typedef boost::unordered_map SelectedPagesType; -+ - struct GrandTotalItem - { - OUString maDisplayName; -@@ -114,9 +116,13 @@ class ScXMLDataPilotTableContext : public SvXMLImportContext - bool bDrillDown:1; - bool bHeaderGridLayout:1; - -+ SelectedPagesType maSelectedPages; -+ - const ScXMLImport& GetScImport() const { return (const ScXMLImport&)GetImport(); } - ScXMLImport& GetScImport() { return (ScXMLImport&)GetImport(); } - -+ void ProcessSelectedPages(); -+ - public: - - ScXMLDataPilotTableContext( ScXMLImport& rImport, sal_uInt16 nPrfx, -@@ -151,6 +157,7 @@ public: - void AddGroupDim(const ScDPSaveNumGroupDimension& aNumGroupDim); - void AddGroupDim(const ScDPSaveGroupDimension& aGroupDim); - void SetButtons(); -+ void SetSelectedPage( const OUString& rDimName, const OUString& rSelected ); - }; - - class ScXMLDPSourceSQLContext : public SvXMLImportContext --- -1.8.4.2 - diff --git a/SOURCES/0058-Resolves-fdo-81598-i125300-enhanced-handling-of-mult.patch b/SOURCES/0058-Resolves-fdo-81598-i125300-enhanced-handling-of-mult.patch new file mode 100644 index 0000000..3fb26e0 --- /dev/null +++ b/SOURCES/0058-Resolves-fdo-81598-i125300-enhanced-handling-of-mult.patch @@ -0,0 +1,115 @@ +From 628b75715c99df9716ab487f1bb1cad0f086d7ea Mon Sep 17 00:00:00 2001 +From: Armin Le Grand +Date: Wed, 23 Jul 2014 16:35:32 +0000 +Subject: [PATCH 058/137] Resolves: fdo#81598 #i125300# enhanced handling of + multiple ClipRegions... + +in MetafileProcessor + +(cherry picked from commit 02e2c7b225036c6478a1f7e8315a9c8361025a7f) + +Change-Id: Iefefc36c040507795bc2c25fe8d4a610eb12adb9 +(cherry picked from commit 2ddfaf1f03135c10d33e0e99ebe8a56d3783d214) +Reviewed-on: https://gerrit.libreoffice.org/10505 +Reviewed-by: David Tardon +Tested-by: David Tardon +--- + .../source/processor2d/vclmetafileprocessor2d.cxx | 65 ++++++++++++++++++---- + 1 file changed, 54 insertions(+), 11 deletions(-) + +diff --git a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx +index 94fc972..e6b2dd5 100644 +--- a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx ++++ b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx +@@ -1760,17 +1760,52 @@ namespace drawinglayer + + if(maClipPolyPolygon.count()) + { +- // there is already a clip polygon set; build clipped union of +- // current mask polygon and new one +- maClipPolyPolygon = basegfx::tools::clipPolyPolygonOnPolyPolygon( +- aMask, +- maClipPolyPolygon, +- true, // #i106516# we want the inside of aMask, not the outside +- false); ++ // due to the cost of PolyPolygon clipping and numerical reasons try first if the current ++ // and the new ClipRegion are ranges. If yes, processing can be simplified ++ if(basegfx::tools::isRectangle(aMask) ++ && basegfx::tools::isRectangle(maClipPolyPolygon)) ++ { ++ // both ClipPolygons are rectangles ++ if(aMask.getB2DRange().equal(maClipPolyPolygon.getB2DRange())) ++ { ++ // equal -> no change in ClipRegion needed, leave ++ // maClipPolyPolygon unchanged ++ } ++ else ++ { ++ // not equal -> create new ClipRegion from the two ranges ++ basegfx::B2DRange aClipRange(aMask.getB2DRange()); ++ ++ aClipRange.intersect(maClipPolyPolygon.getB2DRange()); ++ ++ if(aClipRange.isEmpty()) ++ { ++ // no common ClipRegion -> set empty ClipRegion, no content to show ++ maClipPolyPolygon.clear(); ++ } ++ else ++ { ++ // use common ClipRegion as new ClipRegion ++ maClipPolyPolygon = basegfx::B2DPolyPolygon( ++ basegfx::tools::createPolygonFromRect(aClipRange)); ++ } ++ } ++ } ++ else ++ { ++ // The current ClipRegion or the new one is not a rectangle; ++ // there is already a clip polygon set; build clipped union of ++ // current mask polygon and new one ++ maClipPolyPolygon = basegfx::tools::clipPolyPolygonOnPolyPolygon( ++ aMask, ++ maClipPolyPolygon, ++ true, // #i106516# we want the inside of aMask, not the outside ++ false); ++ } + } + else + { +- // use mask directly ++ // use new mask directly as ClipRegion + maClipPolyPolygon = aMask; + } + +@@ -1779,8 +1814,13 @@ namespace drawinglayer + // set VCL clip region; subdivide before conversion to tools polygon. Subdivision necessary (!) + // Removed subdivision and fixed in Region::ImplPolyPolyRegionToBandRegionFunc() in VCL where + // the ClipRegion is built from the Polygon. A AdaptiveSubdivide on the source polygon was missing there +- mpOutputDevice->Push(PUSH_CLIPREGION); +- mpOutputDevice->SetClipRegion(Region(maClipPolyPolygon)); ++ const bool bNewClipRegion(maClipPolyPolygon != aLastClipPolyPolygon); ++ ++ if(bNewClipRegion) ++ { ++ mpOutputDevice->Push(PUSH_CLIPREGION); ++ mpOutputDevice->SetClipRegion(Region(maClipPolyPolygon)); ++ } + + // recursively paint content + // #i121267# Only need to process sub-content when clip polygon is *not* empty. +@@ -1788,7 +1828,10 @@ namespace drawinglayer + process(rMaskCandidate.getChildren()); + + // restore VCL clip region +- mpOutputDevice->Pop(); ++ if(bNewClipRegion) ++ { ++ mpOutputDevice->Pop(); ++ } + } + + // restore to rescued clip polygon +-- +1.9.3 + diff --git a/SOURCES/0058-fdo-66969-Reset-group-dimension-data-from-all-refere.patch b/SOURCES/0058-fdo-66969-Reset-group-dimension-data-from-all-refere.patch deleted file mode 100644 index b4e2cfb..0000000 --- a/SOURCES/0058-fdo-66969-Reset-group-dimension-data-from-all-refere.patch +++ /dev/null @@ -1,208 +0,0 @@ -From b8339a06050fcbff25e3c990e1ff8ca02dc7bad5 Mon Sep 17 00:00:00 2001 -From: Kohei Yoshida -Date: Tue, 10 Dec 2013 15:56:06 -0500 -Subject: [PATCH 058/109] fdo#66969: Reset group dimension data from all - referencing pivot objects. - -The previous code was doing it only with the first referencing pivot table, -which would break the rest of them sharing the same cache if -the first one doesn't contain all group dimensions used in all of the -referencing pivot tables. - -Change-Id: I35d6907ef8db7ed69db42583cac92b2b74406e2c -(cherry picked from commit b3977983e9f662392426f581516d86d7034ad0fd) -Reviewed-on: https://gerrit.libreoffice.org/7028 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - sc/inc/dpobject.hxx | 10 +++---- - sc/source/core/data/dpobject.cxx | 57 ++++++++++++++++++++++++++-------------- - 2 files changed, 42 insertions(+), 25 deletions(-) - -diff --git a/sc/inc/dpobject.hxx b/sc/inc/dpobject.hxx -index 06d4957..51d4790 100644 ---- a/sc/inc/dpobject.hxx -+++ b/sc/inc/dpobject.hxx -@@ -290,7 +290,7 @@ public: - private: - ScDPCache* getExistingCache(const ScRange& rRange); - -- void updateCache(const ScRange& rRange, const ScDPDimensionSaveData* pDimData, std::set& rRefs); -+ void updateCache(const ScRange& rRange, std::set& rRefs); - bool remove(const ScDPCache* p); - }; - -@@ -313,8 +313,7 @@ public: - ScDPCache* getExistingCache(const OUString& rName); - - void updateCache( -- const OUString& rName, const ScRange& rRange, -- const ScDPDimensionSaveData* pDimData, std::set& rRefs); -+ const OUString& rName, const ScRange& rRange, std::set& rRefs); - bool remove(const ScDPCache* p); - }; - -@@ -358,8 +357,9 @@ public: - com::sun::star::uno::Reference createRowSet( - sal_Int32 nSdbType, const OUString& rDBName, const OUString& rCommand); - -- void updateCache(sal_Int32 nSdbType, const OUString& rDBName, const OUString& rCommand, -- const ScDPDimensionSaveData* pDimData, std::set& rRefs); -+ void updateCache( -+ sal_Int32 nSdbType, const OUString& rDBName, const OUString& rCommand, -+ std::set& rRefs); - bool remove(const ScDPCache* p); - }; - -diff --git a/sc/source/core/data/dpobject.cxx b/sc/source/core/data/dpobject.cxx -index 169231a..653bc0c 100644 ---- a/sc/source/core/data/dpobject.cxx -+++ b/sc/source/core/data/dpobject.cxx -@@ -2809,6 +2809,25 @@ struct FindInvalidRange : public std::unary_function - } - }; - -+void setGroupItemsToCache( ScDPCache& rCache, const std::set& rRefs ) -+{ -+ // Go through all referencing pivot tables, and re-fill the group dimension info. -+ std::set::const_iterator itRef = rRefs.begin(), itRefEnd = rRefs.end(); -+ for (; itRef != itRefEnd; ++itRef) -+ { -+ const ScDPObject* pObj = *itRef; -+ const ScDPSaveData* pSave = pObj->GetSaveData(); -+ if (!pSave) -+ continue; -+ -+ const ScDPDimensionSaveData* pGroupDims = pSave->GetExistingDimensionData(); -+ if (!pGroupDims) -+ continue; -+ -+ pGroupDims->WriteToCache(rCache); -+ } -+} -+ - } - - bool ScDPCollection::SheetCaches::hasCache(const ScRange& rRange) const -@@ -2926,8 +2945,7 @@ void ScDPCollection::SheetCaches::updateReference( - } - } - --void ScDPCollection::SheetCaches::updateCache( -- const ScRange& rRange, const ScDPDimensionSaveData* pDimData, std::set& rRefs) -+void ScDPCollection::SheetCaches::updateCache(const ScRange& rRange, std::set& rRefs) - { - RangeIndexType::iterator it = std::find(maRanges.begin(), maRanges.end(), rRange); - if (it == maRanges.end()) -@@ -2947,12 +2965,15 @@ void ScDPCollection::SheetCaches::updateCache( - } - - ScDPCache& rCache = *itCache->second; -+ -+ // Update the cache with new cell values. This will clear all group dimension info. - rCache.InitFromDoc(mpDoc, rRange); -- if (pDimData) -- pDimData->WriteToCache(rCache); - - std::set aRefs(rCache.GetAllReferences()); - rRefs.swap(aRefs); -+ -+ // Make sure to re-populate the group dimension info. -+ setGroupItemsToCache(rCache, rRefs); - } - - bool ScDPCollection::SheetCaches::remove(const ScDPCache* p) -@@ -3010,8 +3031,7 @@ size_t ScDPCollection::NameCaches::size() const - } - - void ScDPCollection::NameCaches::updateCache( -- const OUString& rName, const ScRange& rRange, const ScDPDimensionSaveData* pDimData, -- std::set& rRefs) -+ const OUString& rName, const ScRange& rRange, std::set& rRefs) - { - CachesType::iterator itr = maCaches.find(rName); - if (itr == maCaches.end()) -@@ -3021,12 +3041,14 @@ void ScDPCollection::NameCaches::updateCache( - } - - ScDPCache& rCache = *itr->second; -+ // Update the cache with new cell values. This will clear all group dimension info. - rCache.InitFromDoc(mpDoc, rRange); -- if (pDimData) -- pDimData->WriteToCache(rCache); - - std::set aRefs(rCache.GetAllReferences()); - rRefs.swap(aRefs); -+ -+ // Make sure to re-populate the group dimension info. -+ setGroupItemsToCache(rCache, rRefs); - } - - bool ScDPCollection::NameCaches::remove(const ScDPCache* p) -@@ -3171,7 +3193,7 @@ uno::Reference ScDPCollection::DBCaches::createRowSet( - - void ScDPCollection::DBCaches::updateCache( - sal_Int32 nSdbType, const OUString& rDBName, const OUString& rCommand, -- const ScDPDimensionSaveData* pDimData, std::set& rRefs) -+ std::set& rRefs) - { - DBType aType(nSdbType, rDBName, rCommand); - CachesType::iterator it = maCaches.find(aType); -@@ -3204,12 +3226,12 @@ void ScDPCollection::DBCaches::updateCache( - return; - } - -- if (pDimData) -- pDimData->WriteToCache(rCache); -- - comphelper::disposeComponent(xRowSet); - std::set aRefs(rCache.GetAllReferences()); - aRefs.swap(rRefs); -+ -+ // Make sure to re-populate the group dimension info. -+ setGroupItemsToCache(rCache, rRefs); - } - - bool ScDPCollection::DBCaches::remove(const ScDPCache* p) -@@ -3271,11 +3293,6 @@ sal_uLong ScDPCollection::ReloadCache(ScDPObject* pDPObj, std::set& - if (!pDPObj) - return STR_ERR_DATAPILOTSOURCE; - -- const ScDPSaveData* pSaveData = pDPObj->GetSaveData(); -- const ScDPDimensionSaveData* pDimData = NULL; -- if (pSaveData) -- pDimData = pSaveData->GetExistingDimensionData(); -- - if (pDPObj->IsSheetData()) - { - // data source is internal sheet. -@@ -3292,7 +3309,7 @@ sal_uLong ScDPCollection::ReloadCache(ScDPObject* pDPObj, std::set& - // cache by named range - ScDPCollection::NameCaches& rCaches = GetNameCaches(); - if (rCaches.hasCache(pDesc->GetRangeName())) -- rCaches.updateCache(pDesc->GetRangeName(), pDesc->GetSourceRange(), pDimData, rRefs); -+ rCaches.updateCache(pDesc->GetRangeName(), pDesc->GetSourceRange(), rRefs); - else - { - // Not cached yet. Collect all tables that use this named -@@ -3305,7 +3322,7 @@ sal_uLong ScDPCollection::ReloadCache(ScDPObject* pDPObj, std::set& - // cache by cell range - ScDPCollection::SheetCaches& rCaches = GetSheetCaches(); - if (rCaches.hasCache(pDesc->GetSourceRange())) -- rCaches.updateCache(pDesc->GetSourceRange(), pDimData, rRefs); -+ rCaches.updateCache(pDesc->GetSourceRange(), rRefs); - else - { - // Not cached yet. Collect all tables that use this range as -@@ -3324,7 +3341,7 @@ sal_uLong ScDPCollection::ReloadCache(ScDPObject* pDPObj, std::set& - ScDPCollection::DBCaches& rCaches = GetDBCaches(); - if (rCaches.hasCache(pDesc->GetCommandType(), pDesc->aDBName, pDesc->aObject)) - rCaches.updateCache( -- pDesc->GetCommandType(), pDesc->aDBName, pDesc->aObject, pDimData, rRefs); -+ pDesc->GetCommandType(), pDesc->aDBName, pDesc->aObject, rRefs); - else - { - // Not cached yet. Collect all tables that use this range as --- -1.8.4.2 - diff --git a/SOURCES/0059-bnc-862510-PPTX-import-bullets-have-color-as-followi.patch b/SOURCES/0059-bnc-862510-PPTX-import-bullets-have-color-as-followi.patch new file mode 100644 index 0000000..fa33f45 --- /dev/null +++ b/SOURCES/0059-bnc-862510-PPTX-import-bullets-have-color-as-followi.patch @@ -0,0 +1,37 @@ +From 41ed9c8e761b69987c978d41fd89aa1a169f60dd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Mat=C3=BA=C5=A1=20Kukan?= +Date: Thu, 24 Jul 2014 15:46:13 +0200 +Subject: [PATCH 059/137] bnc#862510: PPTX import: bullets have color as + following text by default. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +aTextCharacterStyle contains font theme color set in Shape::createAndInsert. + +(cherry picked from commit d60cec0e60c5c0880f8098d39443c391abed80b2) + +Change-Id: I55e66aeaa7176fbd3f64dcdf075d411f460947d4 +Reviewed-on: https://gerrit.libreoffice.org/10514 +Reviewed-by: Caolán McNamara +Tested-by: Caolán McNamara +--- + oox/source/drawingml/textparagraph.cxx | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/oox/source/drawingml/textparagraph.cxx b/oox/source/drawingml/textparagraph.cxx +index 7bb719a..79c1664 100644 +--- a/oox/source/drawingml/textparagraph.cxx ++++ b/oox/source/drawingml/textparagraph.cxx +@@ -113,6 +113,8 @@ void TextParagraph::insertAt( + if( !aioBulletList.hasProperty( PROP_BulletColor ) && maRuns.size() > 0 + && (*maRuns.begin())->getTextCharacterProperties().maCharColor.isUsed() ) + aioBulletList[ PROP_BulletColor ] <<= (*maRuns.begin())->getTextCharacterProperties().maCharColor.getColor( rFilterBase.getGraphicHelper() ); ++ if( !aioBulletList.hasProperty( PROP_BulletColor ) && aTextCharacterStyle.maCharColor.isUsed() ) ++ aioBulletList[ PROP_BulletColor ] <<= aTextCharacterStyle.maCharColor.getColor( rFilterBase.getGraphicHelper() ); + + float fCharacterSize = nCharHeight > 0 ? GetFontHeight ( nCharHeight ) : pTextParagraphStyle->getCharHeightPoints( 18 ); + aParaProp.pushToPropSet( &rFilterBase, xProps, aioBulletList, &pTextParagraphStyle->getBulletList(), sal_True, fCharacterSize, true ); +-- +1.9.3 + diff --git a/SOURCES/0059-fdo-68160-Revert-Resolves-ii122335-Disabling-the-old.patch b/SOURCES/0059-fdo-68160-Revert-Resolves-ii122335-Disabling-the-old.patch deleted file mode 100644 index bdaec5f..0000000 --- a/SOURCES/0059-fdo-68160-Revert-Resolves-ii122335-Disabling-the-old.patch +++ /dev/null @@ -1,150 +0,0 @@ -From 4c0ac90b4864d5eee401b54cdcd54e29ae4ddc53 Mon Sep 17 00:00:00 2001 -From: Eike Rathke -Date: Wed, 11 Dec 2013 23:34:55 +0100 -Subject: [PATCH 059/109] fdo#68160 Revert "Resolves: #ii122335# Disabling the - old task pane" -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -fdo#68160 Revert "Partly revert "Resolves: #ii122335# Disabling the old task pane"" - -This reverts commit cb4225144f1fff44f9bb972fe06f51524da11b8b. - -To be able to revert 95ae39c0c34c9a5e6fa6e72bf3a631a9a799b872 entirely. - -fdo#68160 Revert "Resolves: #ii122335# Disabling the old task pane" - -This reverts commit 95ae39c0c34c9a5e6fa6e72bf3a631a9a799b872. - -We need a TaskPane even in Writer and Calc to be used by extensions. -Sidebar is experimental so TaskPane is needed anyway for Impress (see -fdo#72371). - -Change-Id: Ia94ab377a59996ba434b56e3823117183674afb7 -Reviewed-on: https://gerrit.libreoffice.org/7042 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - sc/source/ui/view/tabvwsh.cxx | 1 + - sc/uiconfig/scalc/menubar/menubar.xml | 1 + - sw/source/ui/uiview/view0.cxx | 1 + - sw/uiconfig/sglobal/menubar/menubar.xml | 1 + - sw/uiconfig/sweb/menubar/menubar.xml | 1 + - sw/uiconfig/swform/menubar/menubar.xml | 1 + - sw/uiconfig/swreport/menubar/menubar.xml | 1 + - sw/uiconfig/swriter/menubar/menubar.xml | 1 + - sw/uiconfig/swxform/menubar/menubar.xml | 1 + - 9 files changed, 9 insertions(+) - -diff --git a/sc/source/ui/view/tabvwsh.cxx b/sc/source/ui/view/tabvwsh.cxx -index 7949e17..537499b 100644 ---- a/sc/source/ui/view/tabvwsh.cxx -+++ b/sc/source/ui/view/tabvwsh.cxx -@@ -54,6 +54,7 @@ SFX_IMPL_INTERFACE(ScTabViewShell,SfxViewShell,ScResId(SCSTR_TABVIEWSHELL)) - SFX_CHILDWINDOW_REGISTRATION(SfxTemplateDialogWrapper::GetChildWindowId()); - SFX_CHILDWINDOW_REGISTRATION(SfxInfoBarContainerChild::GetChildWindowId()); - SFX_CHILDWINDOW_CONTEXT_REGISTRATION(SID_NAVIGATOR); -+ SFX_CHILDWINDOW_REGISTRATION(SID_TASKPANE); - SFX_CHILDWINDOW_REGISTRATION(::sfx2::sidebar::SidebarChildWindow::GetChildWindowId()); - SFX_CHILDWINDOW_REGISTRATION(ScNameDlgWrapper::GetChildWindowId()); - SFX_CHILDWINDOW_REGISTRATION(ScNameDefDlgWrapper::GetChildWindowId()); -diff --git a/sc/uiconfig/scalc/menubar/menubar.xml b/sc/uiconfig/scalc/menubar/menubar.xml -index 777c324..ca8d8ba 100644 ---- a/sc/uiconfig/scalc/menubar/menubar.xml -+++ b/sc/uiconfig/scalc/menubar/menubar.xml -@@ -139,6 +139,7 @@ - - - -+ - - - -diff --git a/sw/source/ui/uiview/view0.cxx b/sw/source/ui/uiview/view0.cxx -index 73555a8..e5f7b3b 100644 ---- a/sw/source/ui/uiview/view0.cxx -+++ b/sw/source/ui/uiview/view0.cxx -@@ -90,6 +90,7 @@ SFX_IMPL_NAMED_VIEWFACTORY(SwView, "Default") - SFX_IMPL_INTERFACE( SwView, SfxViewShell, SW_RES(RID_TOOLS_TOOLBOX) ) - { - SFX_CHILDWINDOW_CONTEXT_REGISTRATION(SID_NAVIGATOR); -+ SFX_CHILDWINDOW_REGISTRATION(SID_TASKPANE); - SFX_CHILDWINDOW_REGISTRATION(::sfx2::sidebar::SidebarChildWindow::GetChildWindowId()); - SFX_CHILDWINDOW_REGISTRATION(SfxTemplateDialogWrapper::GetChildWindowId()); - SFX_CHILDWINDOW_REGISTRATION(SfxInfoBarContainerChild::GetChildWindowId()); -diff --git a/sw/uiconfig/sglobal/menubar/menubar.xml b/sw/uiconfig/sglobal/menubar/menubar.xml -index 3c310f2..f79d0ec 100644 ---- a/sw/uiconfig/sglobal/menubar/menubar.xml -+++ b/sw/uiconfig/sglobal/menubar/menubar.xml -@@ -137,6 +137,7 @@ - - - -+ - - - -diff --git a/sw/uiconfig/sweb/menubar/menubar.xml b/sw/uiconfig/sweb/menubar/menubar.xml -index 30229a7..3cb3b76 100644 ---- a/sw/uiconfig/sweb/menubar/menubar.xml -+++ b/sw/uiconfig/sweb/menubar/menubar.xml -@@ -108,6 +108,7 @@ - - - -+ - - - -diff --git a/sw/uiconfig/swform/menubar/menubar.xml b/sw/uiconfig/swform/menubar/menubar.xml -index 4f22cf1..806da2d 100644 ---- a/sw/uiconfig/swform/menubar/menubar.xml -+++ b/sw/uiconfig/swform/menubar/menubar.xml -@@ -136,6 +136,7 @@ - - - -+ - - - -diff --git a/sw/uiconfig/swreport/menubar/menubar.xml b/sw/uiconfig/swreport/menubar/menubar.xml -index 39284e8..bc90989 100644 ---- a/sw/uiconfig/swreport/menubar/menubar.xml -+++ b/sw/uiconfig/swreport/menubar/menubar.xml -@@ -137,6 +137,7 @@ - - - -+ - - - -diff --git a/sw/uiconfig/swriter/menubar/menubar.xml b/sw/uiconfig/swriter/menubar/menubar.xml -index 618e757..9506ab9 100644 ---- a/sw/uiconfig/swriter/menubar/menubar.xml -+++ b/sw/uiconfig/swriter/menubar/menubar.xml -@@ -141,6 +141,7 @@ - - - -+ - - - -diff --git a/sw/uiconfig/swxform/menubar/menubar.xml b/sw/uiconfig/swxform/menubar/menubar.xml -index e1d2c83..84b1fc3 100644 ---- a/sw/uiconfig/swxform/menubar/menubar.xml -+++ b/sw/uiconfig/swxform/menubar/menubar.xml -@@ -138,6 +138,7 @@ - - - -+ - - - --- -1.8.4.2 - diff --git a/SOURCES/0060-Related-fdo-81457-skip-setting-an-empty-allocation.patch b/SOURCES/0060-Related-fdo-81457-skip-setting-an-empty-allocation.patch new file mode 100644 index 0000000..f96a634 --- /dev/null +++ b/SOURCES/0060-Related-fdo-81457-skip-setting-an-empty-allocation.patch @@ -0,0 +1,247 @@ +From aeef56b3731e746406b441550aea217dcb39371d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Tue, 22 Jul 2014 14:20:33 +0100 +Subject: [PATCH 060/137] Related: fdo#81457 skip setting an empty allocation + +if the dimension is 0, don't bother calculating +a bunch of <= 0 sizes, rely on the parents clipping +to hide the lot instead + +(cherry picked from commit 13807fbf9f3a4aae6767da8bcf796bea4b065159) + +and + +Related: fdo#81457 quadratic time required when setting a11y name + +when calling SetAccessibleName GetAccessibleName is called +in order to send a name changed a11y event. Getting an Accessible +Name is very slow in a non-layout aware widget because it scans +for a "nearby" label and there is none in this widget, but it +has a huge pile of other widgets to iterate over. + +call add_mnemonic_label before hand to cut off that entire +branch. + +While we're at it, only call InitControl to adjust to a new +width if the new width is different from the old width + +(cherry picked from commit aff263c8b814c6bf352312403d3c1e448c8013a3) + +Conflicts: + include/sfx2/dinfdlg.hxx + +Change-Id: Ie4ba1276127226e49442278e46447b84bbeb1cde +Reviewed-on: https://gerrit.libreoffice.org/10463 +Reviewed-by: David Tardon +Tested-by: David Tardon +--- + include/sfx2/dinfdlg.hxx | 14 ++++++---- + sfx2/source/dialog/dinfdlg.cxx | 63 +++++++++++++++++++++++++++++------------- + vcl/source/window/tabpage.cxx | 11 +++++--- + 3 files changed, 60 insertions(+), 28 deletions(-) + +diff --git a/include/sfx2/dinfdlg.hxx b/include/sfx2/dinfdlg.hxx +index a4d6acd..81b57bc 100644 +--- a/include/sfx2/dinfdlg.hxx ++++ b/include/sfx2/dinfdlg.hxx +@@ -407,6 +407,10 @@ struct CustomPropertyLine + class CustomPropertiesWindow : public Window + { + private: ++ FixedText* m_pHeaderAccName; ++ FixedText* m_pHeaderAccType; ++ FixedText* m_pHeaderAccValue; ++ + ComboBox m_aNameBox; + ListBox m_aTypeBox; + Edit m_aValueEdit; +@@ -441,13 +445,13 @@ private: + + public: + CustomPropertiesWindow(Window* pParent, +- const OUString &rHeaderAccName, +- const OUString &rHeaderAccType, +- const OUString &rHeaderAccValue); ++ FixedText *pHeaderAccName, ++ FixedText *pHeaderAccType, ++ FixedText *pHeaderAccValue); + ~CustomPropertiesWindow(); + +- void InitControls( HeaderBar* pHeaderBar, const ScrollBar* pScrollBar ); +- sal_uInt16 GetVisibleLineCount() const; ++ bool InitControls( HeaderBar* pHeaderBar, const ScrollBar* pScrollBar ); ++ sal_uInt16 GetVisibleLineCount() const; + inline sal_Int32 GetLineHeight() const { return m_nLineHeight; } + void AddLine( const OUString& sName, com::sun::star::uno::Any& rAny ); + bool AreAllLinesValid() const; +diff --git a/sfx2/source/dialog/dinfdlg.cxx b/sfx2/source/dialog/dinfdlg.cxx +index a7c6c95..4a278c1 100644 +--- a/sfx2/source/dialog/dinfdlg.cxx ++++ b/sfx2/source/dialog/dinfdlg.cxx +@@ -1401,10 +1401,13 @@ void CustomPropertyLine::SetRemoved() + } + + CustomPropertiesWindow::CustomPropertiesWindow(Window* pParent, +- const OUString &rHeaderAccName, +- const OUString &rHeaderAccType, +- const OUString &rHeaderAccValue) : ++ FixedText *pHeaderAccName, ++ FixedText *pHeaderAccType, ++ FixedText *pHeaderAccValue) : + Window(pParent), ++ m_pHeaderAccName(pHeaderAccName), ++ m_pHeaderAccType(pHeaderAccType), ++ m_pHeaderAccValue(pHeaderAccValue), + m_aNameBox ( this, SfxResId( SFX_CB_PROPERTY_NAME ) ), + m_aTypeBox ( this, SfxResId( SFX_LB_PROPERTY_TYPE ) ), + m_aValueEdit ( this, SfxResId( SFX_ED_PROPERTY_VALUE ) ), +@@ -1424,9 +1427,12 @@ CustomPropertiesWindow::CustomPropertiesWindow(Window* pParent, + m_aBoxLoseFocusTimer.SetTimeout( 300 ); + m_aBoxLoseFocusTimer.SetTimeoutHdl( LINK( this, CustomPropertiesWindow, BoxTimeoutHdl ) ); + +- m_aNameBox.SetAccessibleName(rHeaderAccName); +- m_aTypeBox.SetAccessibleName(rHeaderAccType); +- m_aValueEdit.SetAccessibleName(rHeaderAccValue); ++ m_aNameBox.add_mnemonic_label(m_pHeaderAccName); ++ m_aNameBox.SetAccessibleName(m_pHeaderAccName->GetText()); ++ m_aTypeBox.add_mnemonic_label(m_pHeaderAccType); ++ m_aTypeBox.SetAccessibleName(m_pHeaderAccType->GetText()); ++ m_aValueEdit.add_mnemonic_label(m_pHeaderAccValue); ++ m_aValueEdit.SetAccessibleName(m_pHeaderAccValue->GetText()); + + m_aNameBox.Hide(); + m_aTypeBox.Hide(); +@@ -1592,8 +1598,10 @@ void CustomPropertiesWindow::ValidateLine( CustomPropertyLine* pLine, bool bIsFr + } + } + +-void CustomPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBar* pScrollBar ) ++bool CustomPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBar* pScrollBar ) + { ++ bool bChanged = false; ++ + DBG_ASSERT( pHeaderBar, "CustomPropertiesWindow::InitControls(): invalid headerbar" ); + DBG_ASSERT( pScrollBar, "CustomPropertiesWindow::InitControls(): invalid scrollbar" ); + +@@ -1614,14 +1622,21 @@ void CustomPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBa + while ( *pCurrent ) + { + Rectangle aRect = pHeaderBar->GetItemRect( pHeaderBar->GetItemId( nPos++ ) ); +- Size aSize = (*pCurrent)->GetSizePixel(); +- Point aPos = (*pCurrent)->GetPosPixel(); ++ Size aOrigSize = (*pCurrent)->GetSizePixel(); ++ Point aOrigPos = (*pCurrent)->GetPosPixel(); ++ Size aSize(aOrigSize); ++ Point aPos(aOrigPos); + long nWidth = aRect.GetWidth() - nOffset; + if ( *pCurrent == &m_aRemoveButton ) + nWidth -= pScrollBar->GetSizePixel().Width(); + aSize.Width() = nWidth; + aPos.X() = aRect.getX() + ( nOffset / 2 ); +- (*pCurrent)->SetPosSizePixel( aPos, aSize ); ++ ++ if (aOrigSize != aSize || aOrigPos != aPos) ++ { ++ (*pCurrent)->SetPosSizePixel(aPos, aSize); ++ bChanged = true; ++ } + + if ( *pCurrent == &m_aValueEdit ) + { +@@ -1646,6 +1661,7 @@ void CustomPropertiesWindow::InitControls( HeaderBar* pHeaderBar, const ScrollBa + + pCurrent++; + } ++ return bChanged; + } + + sal_uInt16 CustomPropertiesWindow::GetVisibleLineCount() const +@@ -1705,9 +1721,12 @@ void CustomPropertiesWindow::AddLine( const OUString& sName, Any& rAny ) + + pNewLine->m_aTypeBox.SetLoseFocusHdl( LINK( this, CustomPropertiesWindow, BoxLoseFocusHdl ) ); + +- pNewLine->m_aNameBox.SetAccessibleName(m_aNameBox.GetAccessibleName()); +- pNewLine->m_aTypeBox.SetAccessibleName(m_aTypeBox.GetAccessibleName()); +- pNewLine->m_aValueEdit.SetAccessibleName(m_aValueEdit.GetAccessibleName()); ++ pNewLine->m_aNameBox.add_mnemonic_label(m_pHeaderAccName); ++ pNewLine->m_aNameBox.SetAccessibleName(m_pHeaderAccName->GetText()); ++ pNewLine->m_aTypeBox.add_mnemonic_label(m_pHeaderAccType); ++ pNewLine->m_aTypeBox.SetAccessibleName(m_pHeaderAccType->GetText()); ++ pNewLine->m_aValueEdit.add_mnemonic_label(m_pHeaderAccValue); ++ pNewLine->m_aValueEdit.SetAccessibleName(m_pHeaderAccValue->GetText()); + + long nPos = GetVisibleLineCount() * GetLineHeight(); + m_aCustomPropertiesLines.push_back( pNewLine ); +@@ -1967,10 +1986,13 @@ void CustomPropertiesControl::Init(VclBuilderContainer& rBuilder) + { + m_pHeaderBar = new HeaderBar(this, WB_BUTTONSTYLE | WB_BOTTOMBORDER); + m_pBody = new VclHBox(this); +- OUString sName = rBuilder.get("name")->GetText(); +- OUString sType = rBuilder.get("type")->GetText(); +- OUString sValue = rBuilder.get("value")->GetText(); +- m_pPropertiesWin = new CustomPropertiesWindow(m_pBody, sName, sType, sValue); ++ FixedText* pName = rBuilder.get("name"); ++ FixedText* pType = rBuilder.get("type"); ++ FixedText* pValue = rBuilder.get("value"); ++ OUString sName = pName->GetText(); ++ OUString sType = pType->GetText(); ++ OUString sValue = pValue->GetText(); ++ m_pPropertiesWin = new CustomPropertiesWindow(m_pBody, pName, pType, pValue); + m_pVertScroll = new ScrollBar(m_pBody, WB_VERT); + + set_hexpand(true); +@@ -2018,12 +2040,15 @@ void CustomPropertiesControl::setAllocation(const Size &rAllocation) + { + VclVBox::setAllocation(rAllocation); + +- m_pPropertiesWin->InitControls( m_pHeaderBar, m_pVertScroll ); ++ bool bWidgetsResized = m_pPropertiesWin->InitControls( m_pHeaderBar, m_pVertScroll ); + sal_Int32 nScrollOffset = m_pPropertiesWin->GetLineHeight(); + sal_Int32 nVisibleEntries = m_pPropertiesWin->GetSizePixel().Height() / nScrollOffset; + m_pVertScroll->SetPageSize( nVisibleEntries - 1 ); + m_pVertScroll->SetVisibleSize( nVisibleEntries ); +- m_pPropertiesWin->updateLineWidth(); ++ if (bWidgetsResized) ++ { ++ m_pPropertiesWin->updateLineWidth(); ++ } + } + + extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeCustomPropertiesControl(Window *pParent, +diff --git a/vcl/source/window/tabpage.cxx b/vcl/source/window/tabpage.cxx +index 67225ea..8d472c1 100644 +--- a/vcl/source/window/tabpage.cxx ++++ b/vcl/source/window/tabpage.cxx +@@ -210,22 +210,25 @@ Size TabPage::GetOptimalSize() const + void TabPage::SetPosSizePixel(const Point& rAllocPos, const Size& rAllocation) + { + Window::SetPosSizePixel(rAllocPos, rAllocation); +- if (isLayoutEnabled(this)) ++ if (isLayoutEnabled(this) && rAllocation.Width() && rAllocation.Height()) + VclContainer::setLayoutAllocation(*GetWindow(WINDOW_FIRSTCHILD), Point(0, 0), rAllocation); + } + + void TabPage::SetSizePixel(const Size& rAllocation) + { + Window::SetSizePixel(rAllocation); +- if (isLayoutEnabled(this)) ++ if (isLayoutEnabled(this) && rAllocation.Width() && rAllocation.Height()) + VclContainer::setLayoutAllocation(*GetWindow(WINDOW_FIRSTCHILD), Point(0, 0), rAllocation); + } + + void TabPage::SetPosPixel(const Point& rAllocPos) + { + Window::SetPosPixel(rAllocPos); +- if (isLayoutEnabled(this)) +- VclContainer::setLayoutAllocation(*GetWindow(WINDOW_FIRSTCHILD), Point(0, 0), GetOutputSizePixel()); ++ Size aAllocation(GetOutputSizePixel()); ++ if (isLayoutEnabled(this) && aAllocation.Width() && aAllocation.Height()) ++ { ++ VclContainer::setLayoutAllocation(*GetWindow(WINDOW_FIRSTCHILD), Point(0, 0), aAllocation); ++ } + } + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +-- +1.9.3 + diff --git a/SOURCES/0060-fdo-66864-Return-from-full-screen-should-restore-too.patch b/SOURCES/0060-fdo-66864-Return-from-full-screen-should-restore-too.patch deleted file mode 100644 index e01fb89..0000000 --- a/SOURCES/0060-fdo-66864-Return-from-full-screen-should-restore-too.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 171f2ca39a08299abe54e92e8096cdaa5e02a4dc Mon Sep 17 00:00:00 2001 -From: Jan Holesovsky -Date: Fri, 15 Nov 2013 10:59:36 +0100 -Subject: [PATCH 060/109] fdo#66864: Return from full-screen should restore - toolbars. - -The fix for fdo#37758 was not correct, we shouldn't fiddle with the m_bVisible -itself, but instead react on the m_bMasterHide flag; or at least that is my -understanding of the related framework code (why is it so confusing?!) - -Change-Id: I791fcea9e5e5313b6a5b776cb3187cbd1a028386 -(cherry picked from commit 986644335c3f9e99ec3c6bebc0b75cca0acdf79b) -Reviewed-on: https://gerrit.libreoffice.org/7065 -Reviewed-by: Jan Holesovsky -Tested-by: Jan Holesovsky ---- - .../source/layoutmanager/toolbarlayoutmanager.cxx | 26 +++++++++------------- - 1 file changed, 11 insertions(+), 15 deletions(-) - -diff --git a/framework/source/layoutmanager/toolbarlayoutmanager.cxx b/framework/source/layoutmanager/toolbarlayoutmanager.cxx -index 52a0d7b..1bb03d1 100644 ---- a/framework/source/layoutmanager/toolbarlayoutmanager.cxx -+++ b/framework/source/layoutmanager/toolbarlayoutmanager.cxx -@@ -294,7 +294,7 @@ Rectangle ToolbarLayoutManager::implts_calcDockingArea() - SolarMutexGuard aGuard; - - Window* pWindow = VCLUnoHelper::GetWindow( xWindow ); -- if ( pWindow && !xDockWindow->isFloating() && pConstIter->m_bVisible ) -+ if ( pWindow && !xDockWindow->isFloating() && pConstIter->m_bVisible && !pConstIter->m_bMasterHide ) - { - awt::Rectangle aPosSize = xWindow->getPosSize(); - if ( pConstIter->m_aDockedData.m_nDockedArea != nCurrDockingArea ) -@@ -442,7 +442,7 @@ bool ToolbarLayoutManager::requestToolbar( const OUString& rResourceURL ) - if ( !xUIElement.is() ) - bMustCallCreate = true; - -- bool bCreateOrShowToolbar( aRequestedToolbar.m_bVisible & !aRequestedToolbar.m_bMasterHide ); -+ bool bCreateOrShowToolbar( aRequestedToolbar.m_bVisible && !aRequestedToolbar.m_bMasterHide ); - - uno::Reference< awt::XWindow2 > xContainerWindow( m_xContainerWindow, uno::UNO_QUERY ); - if ( xContainerWindow.is() && aRequestedToolbar.m_bFloating ) -@@ -681,28 +681,24 @@ void ToolbarLayoutManager::setVisible( bool bVisible ) - UIElementVector::iterator pIter; - for ( pIter = aUIElementVector.begin(); pIter != aUIElementVector.end(); ++pIter ) - { -- pIter->m_bMasterHide = !bVisible; -+ if (!pIter->m_bFloating) -+ { -+ UIElement aUIElement(*pIter); -+ aUIElement.m_bMasterHide = !bVisible; -+ implts_setToolbar(aUIElement); -+ implts_setLayoutDirty(); -+ } -+ - Window* pWindow = getWindowFromXUIElement( pIter->m_xUIElement ); - if ( pWindow ) - { -- bool bSetVisible( pIter->m_bVisible & bVisible ); -+ bool bSetVisible( pIter->m_bVisible && bVisible ); - if ( !bSetVisible ) -- { - pWindow->Hide(); -- -- UIElement aUIElement( *pIter ); -- if ( !aUIElement.m_bFloating ) -- implts_setLayoutDirty(); -- -- aUIElement.m_bVisible = false; -- implts_setToolbar( aUIElement ); -- } - else - { - if ( pIter->m_bFloating ) - pWindow->Show(true, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE ); -- else -- implts_setLayoutDirty(); - } - } - } --- -1.8.4.2 - diff --git a/SOURCES/0061-Fix-for-Footer-is-missing-if-fisrt-page-different-he.patch b/SOURCES/0061-Fix-for-Footer-is-missing-if-fisrt-page-different-he.patch new file mode 100644 index 0000000..8ff23f9 --- /dev/null +++ b/SOURCES/0061-Fix-for-Footer-is-missing-if-fisrt-page-different-he.patch @@ -0,0 +1,301 @@ +From b9dcc06bf04c7a60fee2d5612caf3ca9a4d2d273 Mon Sep 17 00:00:00 2001 +From: Rohit Deshmukh +Date: Wed, 22 Jan 2014 18:03:21 +0530 +Subject: [PATCH 061/137] Fix for Footer is missing if fisrt page different + header/footer is set +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Reviewed on: + https://gerrit.libreoffice.org/7589 + +Signed-off-by: Luboš Luňák + +Conflicts: + sw/qa/extras/ooxmlexport/ooxmlexport.cxx + +Change-Id: I2a2f2abc0dcf5542b7b950f9a232d7155a055fdd +--- + sw/qa/extras/ooxmlexport/data/testTitlePage.docx | Bin 0 -> 16479 bytes + sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 8 ++++++++ + sw/source/filter/ww8/wrtw8sty.cxx | 2 +- + 3 files changed, 9 insertions(+), 1 deletion(-) + create mode 100644 sw/qa/extras/ooxmlexport/data/testTitlePage.docx + +diff --git a/sw/qa/extras/ooxmlexport/data/testTitlePage.docx b/sw/qa/extras/ooxmlexport/data/testTitlePage.docx +new file mode 100644 +index 0000000000000000000000000000000000000000..72bfdf81f886b6156144eda28ccb66ffd2ed394b +GIT binary patch +literal 16479 +zcmeHvWpLffvbEVUGc(7`%*@Qp%#1N(%xuS$nC+NiW@ct)j2$z^{O!XzIp^K_e!i-A +zRi&+xMyqF}>F#OGtlkRJpkSy#5I}E$fPjdA%$?uTrvd{3y@dh-LIHXMqAhH1=VEH- +zqOaoVVCt+(=V5C@mO4+Em;UC2w&RQ;lq(%XXGq1;$g +z9E%6w_bf58wvrNw3mfjZ+@F$2*<@wdAUw@Zo0yqWLU&x_A*CJon7PcJiw8g^r;BAK +zjBi=r!4PO}Dq4^^;5!`dj1k%K+ +zO8U7nX5`kQbPUhhSXAN}?pN`59;>^X^k=!#w*8>QXfB2y)$D4k0+-Cq>3k#Du_dDf +zZL1>J7Nyxg0F`rHRw>)n#sw;DKBT%UKsD?lRP@uce@=X%-b#6bf3P2_?050oyLa!j +z=k?o;(1h3JC@#Q}CCuto;GK9yZeS{kOX76w_u^Vw<6mCKTQhZ)fYWwJ%X*nPjv#&K +z=BKa@jam$9)82LvP|emr)=8K6WCV6HF#d)9X{wQ;7W`{nn)cKm-v%{*uh*mf*y;h49MW3A=rQlG4V$rlYxX=$B1t(M6sd{! +zegYdJ{(E@ZSSQLJmB{U05sW1<<;1KpX-!_Xqw2z4nlJOmbjG=PD+z6H$WmU>_E5a$ +zaV%eGGyX5B%(QW_-Rsr5y(&kEjZD#2ls7ckHVpJ+nej$t(Aej#Q%7ET9YuW+Av92* +zpd#oWeav)_wO$V1?_=?^oe^o)>TlWOWa9BD8%_kYQ6Tu+e@1 +zhR4UJS{%&g`~IjUNR%(ChHl1*;dyF!YQVOVQxDZHkf9|hw#`5cJg5_)l@irzPS1`& +z$}m{48J*B6fe>ml^X>B(H4E+uk@8#?lnsU@W(i^og_NwG;D~H7SKO`SCzp|_l;(WA +z34RYKmWW)|xfy&?-fvjPU?g4?Wq$MS4wCk&sIKr6RIfII+fm@ONkWtLBnxDOB*J)M +z^+=ztUM_|yfR<|S8zxRI!s_ZX(Qms$l0eMPv@<92guPoQRqbTvn+44^VVJnGW&MbpG-WP9rY}NCupS68nJ1--#!wDRC{?;I +zBr5dLVO-=D&P^ruono-4g`I*9x`<8EJLMK1X|UsNK9SBxvAN-3-E61_;e@bN9RtOF +z%Hg6A!@KGUSM(4Or3#fAj{ +zP|^h(qa+0%Y=!J75@-hjvtx9Es%soFEv1x$S6f!f@|)YNsfdY-#ET%hY4dD1$Crab +zWo3G2Ra=R@HZcQ~Xzw7!MQ)ghEHc<3&bX)gr=@taaHX>P=n0ihpxgboVN1)dUc0;M +z5nH4lF(@v?JrIo(s>0S(jR9CnlE~+V6-9S(DjZP{Igo7Z-Y!ARDoQn#>FVNB1|DvY +zLwZec)hZuZwV~Xp158Dks;IsXhsxtDMLfdVi60y+yqavX(1B+Pn9)Dd3TznaHlbn` +zXsqqPQh#^dN}(O@?T(NN?lx|#LemD1-&VLVstBSUSwD_;5NhiK_wXHYqljL1ANLk8OoDNzZQBIDeq8^5fJ>j`xEDYOs)oK})UOgrTHQ;Q7 +zJh*3LLHpUHsY*GhbN@*%AzO*v9GdaUphyR?=s)aFZ1?Ju&Ng*Y4(drFu-t +z-+)jehp^{+SsgKj>KnGa*+?m?(;_V>Nc>?2w2zcY1;`2Yo6uawl;76NK#AH0g6~#s +znkc+8edR%^;qX&7Sr9Cm;pSG`*xUkLMuNN)>!7(!YWn;GGFiq=yn9VhQH87ZCVjDp +zS2;Z&<5fQ~@qbR%eix3+{afo+!a6*!OpmvscDwxM*Wp8`IHMm7LU{8fRC<^Mww>V;24)Vm) +zyjXYvv*zF3nSL@g%BHrvK$s==Uc_{GDi9Ops0M4v?w$Bh7E_U#Kh`~-8BpyCGgcsa^O6h@#}G{&eI`KW;s6r^@1W}&7>3Y5Q7(oV@G2Foxw*6c#NF(yl6 +zUf(qwjp`0mK#3LRSI5Cw%@!=^sslja6# +zE)XmWMl}SrVLD_a7cH2P48uHuWlb=#E{19Ah8t>09)+VuTlh2xd61egO2}Ho%_$?7v^^+0=>Ym;NhLU9rm$Kzvs@ +z>nHGN2U>Ab|CU4Qq;XgqwSk~2bT9W0TbNN2LHDygl$Y|Q<W9Nz?1N +z9CT4kWfYjvJ;8>Hdt*q*bdpIudsn3dkL7qatg~5)!?A)?q^YE>Bp@l|rjpE%vm!tQ +zY1@U4prI#1@QIoW**5lh8n}CJ_j#kBC4rf~5{h{Xx=Kw#AEoet(rwu)t5H#bCDt3d +z1USxq%pY>%O}bEIaWUhS@T>?|I_ImHez|VOD)U!sg!NAyj9nq^(%w5jdUqBWF^l*Z +zB~6O!d@BVuwkPoPX&#qlA*T(&;1XM)XaVkky;umr;@;H);nFi!)&9ucz*U%!W=w~| +zEKxCW39{vMHiuPn(=acKs#BQC7aGdyynUj`gTb{>yf}L1#^!cp +z14o_a6L#kFbE_g(PdbIxZGc8 +zNmXuL?~G!B6e@lt(7K9=!WwIE?CIKM-puqGs?>H+i^55%?<Rdu +z;7}n=Dk4jm_K)T?rq3BygeGs&j$&3qA(=Ku<*_*|9jn3YJ$gUsEA~8lpO8zq^OP1$ +zQ&q%|Rfxgv=HIg6ASRZ7l1s3Kg)>z7E_`W63WHb|&vuJdl8Vji50~uJV*8XDnmG5y +z(sxC~_`0#e^{~&8Rl{T5Xb~9Ui@uGBn0@A}oXiq1+99HL9}#-{K5iCf#WCGQM~vB- +z!^}tr@OV4u>QUo1k4N!ZOkqqO@A4h(=ayMN131z34K0rGQRzOsbpevB`HW!Mari%gV$yQMkKo_-b|t-*u^uG6vW_Y@mpsg3iz9cTadjsZ|UMRiY-!Dc9aWgrtvPBP7{-NnY?5HOqBW_NFIn +zgA05Ew*%IL*pOuz7Ek;WwT`GVhnkMgql_muR`=|*umr5ufcHfW+;Azp>cwxg(GBPF +z&b1TAuD3;Gj}Rc>G8smh5K=Z%MwywUwYY<%eWorSqk0#^a#Gb-45sXCMZ1oM{dk&S +zv_F5hs%t$ZbZ3JdXNUor3P;o1+(Cp4lL}3sP1)IQhkvhm5->UTA?6g%cybAEY5e2! +zE#thCxxEUGxMwl$kQ1k6X8lm@st#o; +zB~;~JZf;d$b*R8Rtg4X +zvYjf`beJj4#8nb$75gr6KXf5+85jrw=ti3A(cF<2SwG8#LZGpMw=qXPpWwT(>6L7z +zGp6rSNwY9~C}AI1zr2NI!<@SomNN;1atYQP0p$edKTT{I7KW7u$DysX;?pyIG%6r8 +zvVyXWs4(Z_)RjYwItrBw4hpQAx3tatrP)4jcM8&fHDE+*&t|0-Fup(Z>3r%RFr> +zuxZZ?xX)SlzE@8_jzX^mla|0Y5A=9SLgDcWjx8LZjWqI3SXD|>b+Mdc(UT#%$Y^0C^(R&8T4R-A(HMhTJsx%Iz=m>y#RYiqzV{8bOgEx{B9p5sbo|&t +zRXw>tk+wJW#lhCd`#i-TeG^0vf8z@(UsSJ#BILOhs&*&uxMl`Sk*s=MSv5w#7&@1qgc>NV +zjE`I-bKuKtJ|O9SV(c~DRzlpiy*E2Uw{qS$>X44HAyol4qe}_av}=tTfF6*Gb{riZ +zwAK)%BSWC*Zos8O6X7C_%Ci&5cbQs6M3G+mjOi86eC%z5ydv@G>tIN0C?`FM`+YIW +z7KiJROk#1=vqTJ`DC6?Ma0yrgwa5e!JclOssdkdamanVrM*gRQX&S-nag9c)K!+B5 +z3Y+i +z?gzR&a<@>Z!JrTAoE`S#ulM_{W!V$$WE0I*oPqKP%b~KZ*R#C&QFx_LBn$b68_1(D +zUR4(4p~W1#MM$vDj_7o#i&62LM<}JaJ#UH#3(ZJ_nauG36PHlxFg3@!smnr35NQI^mqlQ4CR +zCfhEY;+9P+gf&x~cI8%&q4{F|6|>fAJ_G;KarrXTVKvY&6NJA+8_mpc`qC#k<8s(2 +zn|(1WrS3>6h!&|N&I)7XZ61?0Cz7<;!$Jn!NmvbI=Tx-XjFD~LEqWb8tdqr%gM?3= +zi7DII-FFQnM@;Ymi_ZRSprCaw)vj!RDG${&of#BhG%Gg)Gj(4*@T-pd-MIiw?5$Rc +zL*y*2w63wn$*xhUBeWXMwT($sxV_Lb8Yi3Kc2G6PoDnxwQvs(w@Ed +zG~JE52b^A1as2jA_F^v#a~g6*|ZYKEPnJqw!^A**`u3<;E^vi$oA2O_)L= +z)j>xg4$JJIxNayZVK8J^LV9z!Z1+oEiV5>j%H +zFStuYT#y|RuZiZ!jHPoj3y=4)=jdVL9apJ{oTp>xfv*EyDX9e8o2}m!*?645C5g2P +zsW|Xl!E1Qt*!jJlnB`EFu@;vAD>x)qJMG)nRVZ($@1Zm2SBOM&`dbrWO`lV;^9f%z +zm4p=-uukU_CVdSe02kbLWii@kO(??ai;Gu+CYxVQ%QtExCp-1c40#IQm^UFB4mGSO +z7uPp}W_(jopRX1Z{Y-=7uPt8vsEEuhmbK0Y%NKX5H+VF*O|pd*r1c(|8XTdw7$)vK +zZ|8zLmwiKhvqgGJDZmqRamI4@!jB}J?hWd*1UYRjX^2R5c_JO0T45{>9VyjY6|#J0 +z|L|7rw=wj}nOR8AWTwy17 +zy3seL1ah@W`5-;uHw$;~)S<6P?Q5&-h)S2)*^87$eZ0ztXhH1|C~PFgZmuIo6Q*aT +zhwfMI*}PLco~c9p02AFYG(#UAq{3{ES>I0I%Le&6jed2sHUK`+G&_}vRZr5Di5*fC +zM#dE`)}U?{--^dB(1jGl&W}Sxt!Q{f7)?q*FKui<&x`ABKlAO)k&u+q7KO5P6Q4q6 +zSH|A%T+;A?m?cP5eS$AhAOX04)5Q~7^Uk5d4lK! +zbY99+erOiGL!Psp;!bwpIi-PGknYaZVHG_s<0vaaDc+h}$f~__Y0Z9D`pNS6T!VPU +zQ4Qm2>u$9cMoek~O_2G_mAm!TNCdn@W@2k=r}~>FmGg|3N61mL?TQh~IFA&YHXb$# +zoIcvqP&Gjx`BBxNkz(W$g35G;jQ$51-KM1z$E-1v8c0) +zr_FDxF~?cD?ipO@p=ajh_XsrlV>)HnW4(Ei%y%e2C +zMSJEDv2pT)2G6m1nTHPDtx-Cy23a97+T7L4R#(^IpwW9iRL+cuG{3kDrX5ey?K_xk +zs@&0$CXFPxlM;jzN%W!II7WKux*1KaD<<+wG&3Jqf%I?~&0)>lj+)W4Y!R-cigeICr7S*;&Eo92YuUSVgBK-v4qiAPJX9*%(x_xVNMsuvw)lILj +zQz1<+pE@mC;FctGd(}+R4!s;r6$*WZf+>*wC&d$Y1=`AmkbmGv?`#~=c=~+Dv%tDZVmvq9Lj%1u +z8-Lj$`*pLV)P^L5^u72S8jm^}9$w^x8StEozyro285^$R3a~t%bXh1T=Pvv~4IcUM +zmP(=oSm@8eYByIp86t?JuKn9W@b(`}Om=!G6yeXP;Ud=QXOd99*jXx#R)sD=Krpwm +zFr;lI2Xw*G!{Uw=HxEvSdks&AbBzK*pz?9~Qr{Yu+~4-vt!Fp-(plJx(=y}L*VQ#s +zs+*GIu9LLzu*?#u&hwsVUUTfVFM+(MHjJ^?5r=MNEfb3;t*JxKF7l2t+VREvH{_yp +zb9#|JoUOv_7ApH%7vaZs+elb8eK>YsCagY`QCJXI9;FXCY1Mt0kMl}*>z+2{{e*YQ +zrUo}rRR>%ls+h3!5l=d?N^5zme?Mj-fupoTiDZw +z%OPMb77%g_&XT4h#?P`S?*{H-T6w%~Pbd$)4-R!xKYwtiK%*d*)2J_|zyn)X+SyLT +z_IqO{9C~N3_U4^l_^`?yDZ@dnVN>SI_|BH_T6vVjIP5!3wf(2O^rH_JT&w4n-4J%) +zQM-yu;1Rg|pxoR**?r8}9aOlz)2pjd*QJZQcuLo7J!T)dTff)vqz@a_%N%l50VmuT +zfRcU_N~f!7&0jU{Az3x-$y?X&PGaNP5;V&&nfwkfB8_Ly0|m&qC%+P;v3_lUrT$&2K>hx@q~ +z`4=S5X=Y@*D;M`&uas6K&-q_YTqh)UW}*k__#khG}Y0|1GU*# +zk|jP5)}!)#8_tFMEP~-!R*5d)`rz45ura~&;t>`3gc_Cgl(gP{Nzx2^oBWFSFc^cy +zGIp!hk-fOS8lNt5ht27yJ^ax6+z(##!tT0O9HFdtS)A-V``SI%|90nWV7(`rV9I;- +zg2W3!z*nR)eh?=HI{_fkI1z9;?vi9O4~>U-Q;Zrj7N^|6XV3zik|=M^U(+8@%C#x} +zF&Y}lA`d=|@;lPoyufq9JR#`iV#EM8DiJ^lg#kxiw@0R;p-;FX5m|3>T;Oll0SFVyhA^0Jv2_417ya +zECjVy@%Kx0?Q;yP#SHl7DwqTS2oxh#{%=kDy`o>+^Uo$)(V@dLP(=-3q4kGhqA3YQ +zK~w(Ow%;JXoDLTg@(ljfdfj_Vdc_A{GyeXZo9h>&j@JU}mEy|N@>RN{V*XOggfqPtvz~Z=AA1g$CEFK~WXB(Q#wOZ^8qGl!WCIQ=^yCAgKpoEA@#)^Z% +zs2~)qY<4TCCI^v}wKG^6PO(c#SS4-tTp=_W8@WnJ7)0$T0Mdk>T*oRLIt4qoJ3lm$ +zyKFYj|F=@1xLF_+I#v;I0MJk=hzg6AmDJ!@k#RrDOP$@P84jI&8OWoq>a +zn2MaPlU0Vq*$Kir4B)Z%>_bPQl3W@Mq}7%A)seD6C*VC^k>rSWRN0?x`)&^kUnQU65=HF=`^7)C~ +z-p3FEn%=;#hVe%HahpNjZ$Un|LA|PtvSe*?dTsvzRoHuZqaLoMOv{)czIhG%kvzN^ +zCtb*I$_!$CN?yw*Wg%aBFG=@tG67$d(nT(94jx_(VO%bQak~ARtZ6kC$n1t0FR#aJ +zjLx7E!g1w^#eSJFsb2Zze(}p%O3L(QC-?3u`ygH=pT`E_f_Z0nYQeBDbCfMb(2V5@ +z@~pn-H~6*bPp+*O#nsYC`gg`Pht0lM1Gg267=Z@WCFIZi8463gF3a^`H|oMQLr0H7 +zOC~v=4e$l4+W2uMbUH~>Ku;2NTVidv6KxfgJoIi$5Z0X28S!k^w+`vTN9KyW2-GT% +zaaV>aABV@i(y#W%0wf#Px^#!(#>Cl$9fTfKAN3E<+~ik>_b;$lo{xAuL9b`1N~!lw +zY@B%sAlg{?+O4P{rdR9jBXv6nZr$teCb;ovGN11RU$WO5iM5O5y2& +z7);%%1a)-04!g@v6f^a1;$DS%H=PA_vx##`Xjk2H2Wj7+xZ#QoCJ{8sAuf~qsR!lS +zY>)JGp75`Hm>s+>M0jaaeMrGw%uueT#UsZQ%Zkf^MbU$jM{ +z1t>~TnU%-CoUZecmtLrs_h!h08wm<+W6$wCz +z25?aooa`N(>5c83On+fs01^lO%Yz2!RAz#rG#~+HU<15Ec*r{=UpW2KiGZm*JQ&4$ +zd!i=SE^;_Yod$dRWxK2(-g`Iq*VpI9mVAw4*Tmya&$$oCQ&AtmqAUuSTqD*OMqFZ$ +z2^!;DE#Z>B0^!q^u4D*lkZVC!R@7|MLg4BpPL<>>zsfGj?RtN5Wf+|!7q%(Vklx6|GHgTXmE(=q8~lOwba0`mx3G +zj*(psL`5K=&J +zKcS6GhH73jcs(DrWAAHm;&l3$h9#I;?CCJV3QMcYAg|1TD=UoF#rJmU*T9l7=8SBI +zT4^E<9OyVSKp96p7S}PRHh$$fNNSs@O_Jf{=Vy`e&r@^jgIQ@(O>IQ$9iPht-~Lvp;4zlgP}XO3tOM~dgGL1jCr1LX6S6o{F{ +z>JV~H0SPJu3dzT=ksejVa)h|JJYo7rUV^Z +zmKC*~t@7K(yw7s_C_Uc_KP2o)zfE$BVZO%iL6a{kR?LMhAdI5WCadV!t1MPcC=av_ +z@yapl&B_sNn{b2mVYYdL8|SfoS)zguhIEQlTd||R(ed(hQLZ}-ocHFgi!)&3mT%Z% +zlD|JZNlrhcSXaDS7!?6x#_s+xJog1lgjGBC!b!x~LOL^iSi3W>-ViWHa-bM7@Ti#X +ze`yxyX5yyU#7&Ugf8YeqOqULauZiX}o4}IJNs0^_55}f&#IERshP3nUm4w&?9PgD8 +z8}2<9F@03%w4Iq0+Y0LOS^elst{>K&|ot*{M1Bl`flhxntvGjwqHue$^Ix!<=;C0XfS2E;a) +zm$2zaHeE%ebTJc*i%krhHQq3jWr!J4QccI#Hs#NCM`PJ$>!UpD-f%i?H{{-Zh;=op +z?KHzY!qi#Q_2rib4`z<>=8RCEgB{U7Klw9uY!8T^qh=1ovGhm1wJE!#Bl8>5NW!}% +zMrWyKvDEo0n#)!@${L;0=;pMMCwrVvGlA7kRtr7XEgyV8=yCtyMY=Q-_qxya-Fff8 +zr~Y-E_&9#p)ItTin@)06tJL5U*VtB4535bdTFiUoMUBpJaI~15qz{8%D&)qFuE0n(MdR#C0DG$vc=i7AZGe2yN5XFypcX=Mvu} +z`a}6^KVWsi9=lj;tLSt4K??h?9MwjQ{O|Z5SmZyWe`YQJg*F0^nE$N(cMkK< +z=%2Zef1%$4M!Fx+zw$W#|It!_(Dn!Pue{2i(f{*vL!C-yna12bq2c|MW%jvxL8g;(y_RfIwM*fc_Df{|x^*qWVjK +zH{0(GFaxCb{~2HXjQ{({_!k-o=!)Zq>VF?66{Nud9^se24L|{^1uQ!!bN_Po{{U_w +B@YDbR + +literal 0 +HcmV?d00001 + +diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +index bd8051a..e740174 100644 +--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx ++++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +@@ -2085,6 +2085,14 @@ DECLARE_OOXMLEXPORT_TEST(testBnc884615, "bnc884615.docx") + CPPUNIT_ASSERT_EQUAL(false, bool(getProperty(getShape(1), "Opaque"))); + } + ++DECLARE_OOXMLEXPORT_TEST(testTestTitlePage, "testTitlePage.docx") ++{ ++ xmlDocPtr pXmlDoc = parseExport("word/document.xml"); ++ if (!pXmlDoc) ++ return; ++ assertXPathChildren(pXmlDoc, "/w:document/w:body/w:sectPr/w:titlePg", 0); ++} ++ + #endif + + CPPUNIT_PLUGIN_IMPLEMENT(); +diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx +index 2675cc5..a4edf4b 100644 +--- a/sw/source/filter/ww8/wrtw8sty.cxx ++++ b/sw/source/filter/ww8/wrtw8sty.cxx +@@ -1748,7 +1748,7 @@ void MSWordExportBase::SectionProperties( const WW8_SepInfo& rSepInfo, WW8_PdAtt + { + const SwPageDesc *pFollow = pPd->GetFollow(); + const SwFrmFmt& rFollowFmt = pFollow->GetMaster(); +- if ( sw::util::IsPlausableSingleWordSection( *pPdFirstPgFmt, rFollowFmt ) ) ++ if ( sw::util::IsPlausableSingleWordSection( *pPdFirstPgFmt, rFollowFmt ) || titlePage ) + { + if (rSepInfo.pPDNd) + pPdFirstPgFmt = pPd->GetPageFmtOfNode( *rSepInfo.pPDNd ); +-- +1.9.3 + diff --git a/SOURCES/0061-fdo-70499-selectn-of-lock-unlocked-cells-with-worksh.patch b/SOURCES/0061-fdo-70499-selectn-of-lock-unlocked-cells-with-worksh.patch deleted file mode 100644 index 7089348..0000000 --- a/SOURCES/0061-fdo-70499-selectn-of-lock-unlocked-cells-with-worksh.patch +++ /dev/null @@ -1,123 +0,0 @@ -From ed0f9df37cac6c2e8d886488b2dbbe1034e0d385 Mon Sep 17 00:00:00 2001 -From: Noel Power -Date: Thu, 21 Nov 2013 18:12:50 +0000 -Subject: [PATCH 061/109] fdo#70499 selectn of lock/unlocked cells with - worksheet protection reversed - -The ooxml spec documentation is rather confusing ( for me at least ) and the -sense of the of the sheetProtection attributes as described seems reversed to -how I read it ( or maybe it is the equivelant option in ScTableProtection that -operates with the reverse sense ) In anycase the import ( and export ) -have been adjusted to take that into consideration, also the export now actually -deals with the defaults correctly. - -Change-Id: Ia69567b8898b39c9d171486cfa800e1748c5814b -Reviewed-on: https://gerrit.libreoffice.org/7075 -Reviewed-by: Kohei Yoshida -Tested-by: Kohei Yoshida ---- - sc/qa/unit/subsequent_export-test.cxx | 4 ++-- - sc/source/filter/excel/excrecds.cxx | 30 +++++++++++++++--------------- - sc/source/filter/oox/worksheetsettings.cxx | 30 +++++++++++++++--------------- - 3 files changed, 32 insertions(+), 32 deletions(-) - -diff --git a/sc/qa/unit/subsequent_export-test.cxx b/sc/qa/unit/subsequent_export-test.cxx -index 9a06e9a..f7b5141 100644 ---- a/sc/qa/unit/subsequent_export-test.cxx -+++ b/sc/qa/unit/subsequent_export-test.cxx -@@ -347,8 +347,8 @@ void ScExportTest::testSheetProtectionXLSX() - CPPUNIT_ASSERT( (sal_uInt8)aHash[1] == 61 ); - } - // we could flesh out this check I guess -- CPPUNIT_ASSERT ( pTabProtect->isOptionEnabled( ScTableProtection::OBJECTS ) ); -- CPPUNIT_ASSERT ( pTabProtect->isOptionEnabled( ScTableProtection::SCENARIOS ) ); -+ CPPUNIT_ASSERT ( !pTabProtect->isOptionEnabled( ScTableProtection::OBJECTS ) ); -+ CPPUNIT_ASSERT ( !pTabProtect->isOptionEnabled( ScTableProtection::SCENARIOS ) ); - } - xDocSh->DoClose(); - } -diff --git a/sc/source/filter/excel/excrecds.cxx b/sc/source/filter/excel/excrecds.cxx -index 39e4222..4330fe0 100644 ---- a/sc/source/filter/excel/excrecds.cxx -+++ b/sc/source/filter/excel/excrecds.cxx -@@ -520,21 +520,21 @@ void XclExpSheetProtection::SaveXml( XclExpXmlStream& rStrm ) - rWorksheet->singleElement( XML_sheetProtection, - XML_sheet, XclXmlUtils::ToPsz( true ), - XML_password, sHash.getStr(), -- XML_objects, pTabProtect->isOptionEnabled( ScTableProtection::OBJECTS ) ? XclXmlUtils::ToPsz( true ) : NULL, -- XML_scenarios, pTabProtect->isOptionEnabled( ScTableProtection::SCENARIOS ) ? XclXmlUtils::ToPsz( true ) : NULL, -- XML_formatCells, pTabProtect->isOptionEnabled( ScTableProtection::FORMAT_CELLS ) ? NULL : XclXmlUtils::ToPsz( true ), -- XML_formatColumns, pTabProtect->isOptionEnabled( ScTableProtection::FORMAT_COLUMNS ) ? NULL : XclXmlUtils::ToPsz( true ), -- XML_formatRows, pTabProtect->isOptionEnabled( ScTableProtection::FORMAT_ROWS ) ? NULL : XclXmlUtils::ToPsz( true ), -- XML_insertColumns, pTabProtect->isOptionEnabled( ScTableProtection::INSERT_COLUMNS ) ? NULL : XclXmlUtils::ToPsz( true ), -- XML_insertRows, pTabProtect->isOptionEnabled( ScTableProtection::INSERT_ROWS ) ? NULL : XclXmlUtils::ToPsz( true ), -- XML_insertHyperlinks, pTabProtect->isOptionEnabled( ScTableProtection::INSERT_HYPERLINKS ) ? NULL : XclXmlUtils::ToPsz( true ), -- XML_deleteColumns, pTabProtect->isOptionEnabled( ScTableProtection::DELETE_COLUMNS ) ? NULL : XclXmlUtils::ToPsz( true ), -- XML_deleteRows, pTabProtect->isOptionEnabled( ScTableProtection::DELETE_ROWS ) ? NULL : XclXmlUtils::ToPsz( true ), -- XML_selectLockedCells, pTabProtect->isOptionEnabled( ScTableProtection::SELECT_LOCKED_CELLS ) ? XclXmlUtils::ToPsz( true ) : NULL, -- XML_sort, pTabProtect->isOptionEnabled( ScTableProtection::SORT ) ? NULL : XclXmlUtils::ToPsz( true ), -- XML_autoFilter, pTabProtect->isOptionEnabled( ScTableProtection::AUTOFILTER ) ? NULL : XclXmlUtils::ToPsz( true ), -- XML_pivotTables, pTabProtect->isOptionEnabled( ScTableProtection::PIVOT_TABLES ) ? NULL : XclXmlUtils::ToPsz( true ), -- XML_selectUnlockedCells, pTabProtect->isOptionEnabled( ScTableProtection::SELECT_UNLOCKED_CELLS ) ? XclXmlUtils::ToPsz( true ) : NULL, -+ XML_objects, pTabProtect->isOptionEnabled( ScTableProtection::OBJECTS ) ? NULL : XclXmlUtils::ToPsz( true ), -+ XML_scenarios, pTabProtect->isOptionEnabled( ScTableProtection::SCENARIOS ) ? NULL : XclXmlUtils::ToPsz( true ), -+ XML_formatCells, pTabProtect->isOptionEnabled( ScTableProtection::FORMAT_CELLS ) ? XclXmlUtils::ToPsz( false ) : NULL, -+ XML_formatColumns, pTabProtect->isOptionEnabled( ScTableProtection::FORMAT_COLUMNS ) ? XclXmlUtils::ToPsz( false ) : NULL, -+ XML_formatRows, pTabProtect->isOptionEnabled( ScTableProtection::FORMAT_ROWS ) ? XclXmlUtils::ToPsz( false ) : NULL, -+ XML_insertColumns, pTabProtect->isOptionEnabled( ScTableProtection::INSERT_COLUMNS ) ? XclXmlUtils::ToPsz( false ) : NULL, -+ XML_insertRows, pTabProtect->isOptionEnabled( ScTableProtection::INSERT_ROWS ) ? XclXmlUtils::ToPsz( false ) : NULL, -+ XML_insertHyperlinks, pTabProtect->isOptionEnabled( ScTableProtection::INSERT_HYPERLINKS ) ? XclXmlUtils::ToPsz( false ) : NULL, -+ XML_deleteColumns, pTabProtect->isOptionEnabled( ScTableProtection::DELETE_COLUMNS ) ? XclXmlUtils::ToPsz( false ) : NULL, -+ XML_deleteRows, pTabProtect->isOptionEnabled( ScTableProtection::DELETE_ROWS ) ? XclXmlUtils::ToPsz( false ) : NULL, -+ XML_selectLockedCells, pTabProtect->isOptionEnabled( ScTableProtection::SELECT_LOCKED_CELLS ) ? NULL : XclXmlUtils::ToPsz( true ), -+ XML_sort, pTabProtect->isOptionEnabled( ScTableProtection::SORT ) ? XclXmlUtils::ToPsz( false ) : NULL, -+ XML_autoFilter, pTabProtect->isOptionEnabled( ScTableProtection::AUTOFILTER ) ? XclXmlUtils::ToPsz( false ) : NULL, -+ XML_pivotTables, pTabProtect->isOptionEnabled( ScTableProtection::PIVOT_TABLES ) ? XclXmlUtils::ToPsz( false ) : NULL, -+ XML_selectUnlockedCells, pTabProtect->isOptionEnabled( ScTableProtection::SELECT_UNLOCKED_CELLS ) ? NULL : XclXmlUtils::ToPsz( true ), - FSEND ); - } - } -diff --git a/sc/source/filter/oox/worksheetsettings.cxx b/sc/source/filter/oox/worksheetsettings.cxx -index 96ca193..aa13f9c 100644 ---- a/sc/source/filter/oox/worksheetsettings.cxx -+++ b/sc/source/filter/oox/worksheetsettings.cxx -@@ -244,21 +244,21 @@ void WorksheetSettings::finalizeImport() - aPass[1] = maSheetProt.mnPasswordHash & 0xFF; - aProtect.setPasswordHash(aPass, PASSHASH_XL); - } -- aProtect.setOption( ScTableProtection::OBJECTS, maSheetProt.mbObjects); -- aProtect.setOption( ScTableProtection::SCENARIOS, maSheetProt.mbScenarios ); -- aProtect.setOption( ScTableProtection::FORMAT_CELLS, maSheetProt.mbFormatCells ); -- aProtect.setOption( ScTableProtection::FORMAT_COLUMNS, maSheetProt.mbFormatColumns ); -- aProtect.setOption( ScTableProtection::FORMAT_ROWS, maSheetProt.mbFormatRows ); -- aProtect.setOption( ScTableProtection::INSERT_COLUMNS, maSheetProt.mbInsertColumns ); -- aProtect.setOption( ScTableProtection::INSERT_ROWS, maSheetProt.mbInsertRows ); -- aProtect.setOption( ScTableProtection::INSERT_HYPERLINKS, maSheetProt.mbInsertHyperlinks ); -- aProtect.setOption( ScTableProtection::DELETE_COLUMNS, maSheetProt.mbDeleteColumns ); -- aProtect.setOption( ScTableProtection::DELETE_ROWS,maSheetProt.mbDeleteRows ); -- aProtect.setOption( ScTableProtection::SELECT_LOCKED_CELLS, maSheetProt.mbSelectLocked ); -- aProtect.setOption( ScTableProtection::SORT, maSheetProt.mbSort ); -- aProtect.setOption( ScTableProtection::AUTOFILTER, maSheetProt.mbAutoFilter ); -- aProtect.setOption( ScTableProtection::PIVOT_TABLES, maSheetProt.mbPivotTables ); -- aProtect.setOption( ScTableProtection::SELECT_UNLOCKED_CELLS, maSheetProt.mbSelectUnlocked ); -+ aProtect.setOption( ScTableProtection::OBJECTS, !maSheetProt.mbObjects); -+ aProtect.setOption( ScTableProtection::SCENARIOS, !maSheetProt.mbScenarios ); -+ aProtect.setOption( ScTableProtection::FORMAT_CELLS, !maSheetProt.mbFormatCells ); -+ aProtect.setOption( ScTableProtection::FORMAT_COLUMNS, !maSheetProt.mbFormatColumns ); -+ aProtect.setOption( ScTableProtection::FORMAT_ROWS, !maSheetProt.mbFormatRows ); -+ aProtect.setOption( ScTableProtection::INSERT_COLUMNS, !maSheetProt.mbInsertColumns ); -+ aProtect.setOption( ScTableProtection::INSERT_ROWS, !maSheetProt.mbInsertRows ); -+ aProtect.setOption( ScTableProtection::INSERT_HYPERLINKS, !maSheetProt.mbInsertHyperlinks ); -+ aProtect.setOption( ScTableProtection::DELETE_COLUMNS, !maSheetProt.mbDeleteColumns ); -+ aProtect.setOption( ScTableProtection::DELETE_ROWS,!maSheetProt.mbDeleteRows ); -+ aProtect.setOption( ScTableProtection::SELECT_LOCKED_CELLS, !maSheetProt.mbSelectLocked ); -+ aProtect.setOption( ScTableProtection::SORT, !maSheetProt.mbSort ); -+ aProtect.setOption( ScTableProtection::AUTOFILTER, !maSheetProt.mbAutoFilter ); -+ aProtect.setOption( ScTableProtection::PIVOT_TABLES, !maSheetProt.mbPivotTables ); -+ aProtect.setOption( ScTableProtection::SELECT_UNLOCKED_CELLS, !maSheetProt.mbSelectUnlocked ); - - getScDocument().SetTabProtection( getSheetIndex(), &aProtect ); - } --- -1.8.4.2 - diff --git a/SOURCES/0062-fix-build-of-last-commit.patch b/SOURCES/0062-fix-build-of-last-commit.patch new file mode 100644 index 0000000..ea8fd2e --- /dev/null +++ b/SOURCES/0062-fix-build-of-last-commit.patch @@ -0,0 +1,26 @@ +From 9b2e8ef138a7c287bfd4534e4c115003c3c56575 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Lubo=C5=A1=20Lu=C5=88=C3=A1k?= +Date: Sun, 27 Jul 2014 18:22:09 +0200 +Subject: [PATCH 062/137] fix build of last commit + +Change-Id: I3c2e4763f25580c3418d476479a81efe65414b40 +--- + sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +index e740174..4db47e5 100644 +--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx ++++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +@@ -2090,7 +2090,7 @@ DECLARE_OOXMLEXPORT_TEST(testTestTitlePage, "testTitlePage.docx") + xmlDocPtr pXmlDoc = parseExport("word/document.xml"); + if (!pXmlDoc) + return; +- assertXPathChildren(pXmlDoc, "/w:document/w:body/w:sectPr/w:titlePg", 0); ++// assertXPathChildren(pXmlDoc, "/w:document/w:body/w:sectPr/w:titlePg", 0); + } + + #endif +-- +1.9.3 + diff --git a/SOURCES/0063-correctly-dispose-to-avoid-cyclic-dependencies.patch b/SOURCES/0063-correctly-dispose-to-avoid-cyclic-dependencies.patch deleted file mode 100644 index 32b0a5a..0000000 --- a/SOURCES/0063-correctly-dispose-to-avoid-cyclic-dependencies.patch +++ /dev/null @@ -1,81 +0,0 @@ -From a3f38bdaaff91abdf2e0f01d0b6370aa958e4a20 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= -Date: Tue, 10 Dec 2013 16:54:59 +0000 -Subject: [PATCH 063/109] correctly dispose to avoid cyclic dependencies - -accessibility cruft is still listening to dead tables so crashes in -slidesorting in main panel if moved slide has tables in it after visiting slide -sorter once. - -(cherry picked from commit 0b8e2e5efe20519e8b5563314bac0cbb84a3b967) - -Conflicts: - svx/source/table/svdotable.cxx - -Change-Id: I09f9a73b01fb2ddf059402146acdc7bd823798b9 -Reviewed-on: https://gerrit.libreoffice.org/7051 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna ---- - svx/source/table/svdotable.cxx | 20 +++++++++++++++++++- - 1 file changed, 19 insertions(+), 1 deletion(-) - -diff --git a/svx/source/table/svdotable.cxx b/svx/source/table/svdotable.cxx -index bed3988..474d42d 100644 ---- a/svx/source/table/svdotable.cxx -+++ b/svx/source/table/svdotable.cxx -@@ -268,9 +268,9 @@ void SdrTableObjImpl::init( SdrTableObj* pTable, sal_Int32 nColumns, sal_Int32 n - mpTableObj = pTable; - mxTable = new TableModel( pTable ); - mxTable->init( nColumns, nRows ); -- mpLayouter = new TableLayouter( mxTable ); - Reference< XModifyListener > xListener( static_cast< ::com::sun::star::util::XModifyListener* >(this) ); - mxTable->addModifyListener( xListener ); -+ mpLayouter = new TableLayouter( mxTable ); - UpdateWritingMode(); - LayoutTable( mpTableObj->aRect, true, true ); - mpTableObj->maLogicRect = mpTableObj->aRect; -@@ -282,6 +282,8 @@ SdrTableObjImpl& SdrTableObjImpl::operator=( const SdrTableObjImpl& rSource ) - { - if (this != &rSource) - { -+ disconnectTableStyle(); -+ - if( mpLayouter ) - { - delete mpLayouter; -@@ -307,6 +309,8 @@ SdrTableObjImpl& SdrTableObjImpl::operator=( const SdrTableObjImpl& rSource ) - ApplyCellStyles(); - mpTableObj->aRect = mpTableObj->maLogicRect; - LayoutTable( mpTableObj->aRect, false, false ); -+ -+ connectTableStyle(); - } - return *this; - } -@@ -453,8 +457,22 @@ bool SdrTableObjImpl::ApplyCellStyles() - - void SdrTableObjImpl::dispose() - { -+ disconnectTableStyle(); -+ mxTableStyle.clear(); -+ -+ if( mpLayouter ) -+ { -+ delete mpLayouter; -+ mpLayouter = 0; -+ } -+ - if( mxTable.is() ) -+ { -+ Reference< XModifyListener > xListener( static_cast< ::com::sun::star::util::XModifyListener* >(this) ); -+ mxTable->removeModifyListener( xListener ); - mxTable->dispose(); -+ mxTable.clear(); -+ } - } - - // ----------------------------------------------------------------------------- --- -1.8.4.2 - diff --git a/SOURCES/0063-fdo-81617-Split-formula-groups-at-sort-range-boundar.patch b/SOURCES/0063-fdo-81617-Split-formula-groups-at-sort-range-boundar.patch new file mode 100644 index 0000000..d8f6563 --- /dev/null +++ b/SOURCES/0063-fdo-81617-Split-formula-groups-at-sort-range-boundar.patch @@ -0,0 +1,73 @@ +From 290d0d779551b84dfa42e0c026ce4d7c0f00ea7a Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Sun, 27 Jul 2014 14:35:37 -0400 +Subject: [PATCH 063/137] fdo#81617: Split formula groups at sort range + boundaries. + +Otherwise, partially sorting a range may crash, or at best incorrectly +update formula references. + +Change-Id: Iefcb86d205d83ccc5b684048bfd9aadabf6e13eb +(cherry picked from commit a3fc7f20089062afa4f778e70ba8be84032a30a7) +Reviewed-on: https://gerrit.libreoffice.org/10583 +Reviewed-by: Eike Rathke +Tested-by: Eike Rathke +--- + sc/inc/table.hxx | 1 + + sc/source/core/data/table3.cxx | 8 ++++++++ + sc/source/core/data/table7.cxx | 8 ++++++++ + 3 files changed, 17 insertions(+) + +diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx +index 97ee720..f8928de 100644 +--- a/sc/inc/table.hxx ++++ b/sc/inc/table.hxx +@@ -888,6 +888,7 @@ public: + formula::FormulaTokenRef ResolveStaticReference( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ); + formula::VectorRefArray FetchVectorRefArray( SCCOL nCol, SCROW nRow1, SCROW nRow2 ); + ++ void SplitFormulaGroups( SCCOL nCol, std::vector& rRows ); + void UnshareFormulaCells( SCCOL nCol, std::vector& rRows ); + void RegroupFormulaCells( SCCOL nCol ); + +diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx +index 31cfe2e..3b63f7e 100644 +--- a/sc/source/core/data/table3.cxx ++++ b/sc/source/core/data/table3.cxx +@@ -755,6 +755,14 @@ void ScTable::SortReorderByRow( + ScSortInfoArray::RowsType* pRows = pArray->GetDataRows(); + assert(pRows); // In sort-by-row mode we must have data rows already populated. + ++ // Split formula groups at the sort range boundaries (if applicable). ++ std::vector aRowBounds; ++ aRowBounds.reserve(2); ++ aRowBounds.push_back(nRow1); ++ aRowBounds.push_back(nRow2+1); ++ for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol) ++ SplitFormulaGroups(nCol, aRowBounds); ++ + // Cells in the data rows only reference values in the document. Make + // a copy before updating the document. + +diff --git a/sc/source/core/data/table7.cxx b/sc/source/core/data/table7.cxx +index f3528dd..b427617 100644 +--- a/sc/source/core/data/table7.cxx ++++ b/sc/source/core/data/table7.cxx +@@ -79,6 +79,14 @@ bool ScTable::HasUniformRowHeight( SCROW nRow1, SCROW nRow2 ) const + return nRow2 <= aData.mnRow2; + } + ++void ScTable::SplitFormulaGroups( SCCOL nCol, std::vector& rRows ) ++{ ++ if (!ValidCol(nCol)) ++ return; ++ ++ sc::SharedFormulaUtil::splitFormulaCellGroups(aCol[nCol].maCells, rRows); ++} ++ + void ScTable::UnshareFormulaCells( SCCOL nCol, std::vector& rRows ) + { + if (!ValidCol(nCol)) +-- +1.9.3 + diff --git a/SOURCES/0064-disposed-but-not-dtored.patch b/SOURCES/0064-disposed-but-not-dtored.patch deleted file mode 100644 index 5f6b63c..0000000 --- a/SOURCES/0064-disposed-but-not-dtored.patch +++ /dev/null @@ -1,42 +0,0 @@ -From fcd101173cd3436f17a57dbe116f2ed35219a1e5 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= -Date: Wed, 11 Dec 2013 11:57:34 +0000 -Subject: [PATCH 064/109] disposed but not dtored - -just die when you are supposed to, without this endless amounts of accessiblity -cells remain after sorting slides with tables in them - -(cherry picked from commit 1c28065d8fe3e9a1394a7ecfc29e95a9639a1012) - -Conflicts: - svx/source/table/accessibletableshape.cxx - -Change-Id: Ice9a86b8b806e58f9bf871341a38f7729798dda9 -(cherry picked from commit a90e08cb15e712e1d15a16de9a2677e57d81fd13) -Reviewed-on: https://gerrit.libreoffice.org/7052 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna ---- - svx/source/table/accessibletableshape.cxx | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/svx/source/table/accessibletableshape.cxx b/svx/source/table/accessibletableshape.cxx -index a5e910e..8872591 100644 ---- a/svx/source/table/accessibletableshape.cxx -+++ b/svx/source/table/accessibletableshape.cxx -@@ -113,6 +113,12 @@ void AccessibleTableShapeImpl::dispose() - { - if( mxTable.is() ) - { -+ //remove all the cell's acc object in table's dispose. -+ for( AccessibleCellMap::iterator iter( maChildMap.begin() ); iter != maChildMap.end(); iter++ ) -+ { -+ (*iter).second->dispose(); -+ } -+ maChildMap.clear(); - Reference< XModifyListener > xListener( this ); - mxTable->removeModifyListener( xListener ); - mxTable.clear(); --- -1.8.4.2 - diff --git a/SOURCES/0064-fdo-79578-Properly-update-formulas-upon-change-in-db.patch b/SOURCES/0064-fdo-79578-Properly-update-formulas-upon-change-in-db.patch new file mode 100644 index 0000000..0f94b96 --- /dev/null +++ b/SOURCES/0064-fdo-79578-Properly-update-formulas-upon-change-in-db.patch @@ -0,0 +1,628 @@ +From 155af162b260ee49e1c6603baa2c2a96d6e93b67 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Mon, 28 Jul 2014 21:34:40 -0400 +Subject: [PATCH 064/137] fdo#79578: Properly update formulas upon change in db + collection. + +Update it to handle formula groups correctly. + +(cherry picked from commit 300845922eec7a28bc1da337acd21f138685d759) + +Conflicts: + sc/source/ui/docshell/dbdocfun.cxx + sc/source/ui/docshell/docfunc.cxx + sc/source/ui/docshell/docsh5.cxx + sc/source/ui/undo/undocell.cxx + sc/source/ui/undo/undodat.cxx + sc/source/ui/unoobj/nameuno.cxx + sc/source/ui/view/viewfunc.cxx + sc/source/ui/view/dbfunc.cxx + +Change-Id: I009a7fcf3d3fb17ef6951c50534ca6bc1fffc259 +Reviewed-on: https://gerrit.libreoffice.org/10605 +Reviewed-by: Eike Rathke +Tested-by: Eike Rathke +--- + sc/inc/column.hxx | 6 +++-- + sc/inc/document.hxx | 8 ++---- + sc/inc/formulacell.hxx | 1 - + sc/inc/table.hxx | 6 +++-- + sc/source/core/data/column2.cxx | 22 ---------------- + sc/source/core/data/column4.cxx | 43 +++++++++++++++++++++---------- + sc/source/core/data/documen4.cxx | 11 -------- + sc/source/core/data/document10.cxx | 17 +++++++++++-- + sc/source/core/data/formulacell.cxx | 51 ------------------------------------- + sc/source/core/data/table4.cxx | 6 ----- + sc/source/core/data/table7.cxx | 11 ++++++-- + sc/source/ui/docshell/dbdocfun.cxx | 14 +++++----- + sc/source/ui/docshell/docfunc.cxx | 4 +-- + sc/source/ui/docshell/docsh5.cxx | 4 +-- + sc/source/ui/undo/undocell.cxx | 2 +- + sc/source/ui/undo/undodat.cxx | 8 +++--- + sc/source/ui/undo/undorangename.cxx | 2 +- + sc/source/ui/unoobj/nameuno.cxx | 2 +- + sc/source/ui/view/dbfunc.cxx | 4 +-- + sc/source/ui/view/viewfunc.cxx | 2 +- + 20 files changed, 85 insertions(+), 139 deletions(-) + +diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx +index 1cac044..8962422 100644 +--- a/sc/inc/column.hxx ++++ b/sc/inc/column.hxx +@@ -373,9 +373,12 @@ public: + void PreprocessRangeNameUpdate( + sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt ); + +- void PostprocessRangeNameUpdate( ++ void CompileHybridFormula( + sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt ); + ++ void PreprocessDBDataUpdate( ++ sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt ); ++ + const SfxPoolItem* GetAttr( SCROW nRow, sal_uInt16 nWhich ) const; + const ScPatternAttr* GetPattern( SCROW nRow ) const; + const ScPatternAttr* GetMostUsedPattern( SCROW nStartRow, SCROW nEndRow ) const; +@@ -480,7 +483,6 @@ public: + void CollectListeners( std::vector& rListeners, SCROW nRow1, SCROW nRow2 ); + + void CompileDBFormula( sc::CompileFormulaContext& rCxt ); +- void CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ); + void CompileColRowNameFormula( sc::CompileFormulaContext& rCxt ); + + sal_Int32 GetMaxStringLen( SCROW nRowStart, SCROW nRowEnd, rtl_TextEncoding eCharSet ) const; +diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx +index c901af5..9d365cc 100644 +--- a/sc/inc/document.hxx ++++ b/sc/inc/document.hxx +@@ -516,11 +516,8 @@ public: + * Call this immediately before updating all named ranges. + */ + SC_DLLPUBLIC void PreprocessRangeNameUpdate(); +- +- /** +- * Call this immediately after all named ranges have been updated. +- */ +- SC_DLLPUBLIC void PostprocessRangeNameUpdate(); ++ SC_DLLPUBLIC void PreprocessDBDataUpdate(); ++ SC_DLLPUBLIC void CompileHybridFormula(); + + SCTAB GetMaxTableNumber() { return static_cast(maTabs.size()) - 1; } + void SetMaxTableNumber(SCTAB nNumber) { nMaxTableNumber = nNumber; } +@@ -1967,7 +1964,6 @@ public: + void StartTrackTimer(); + + void CompileDBFormula(); +- void CompileDBFormula( bool bCreateFormulaString ); + void CompileColRowNameFormula(); + + /** Maximum string length of a column, e.g. for dBase export. +diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx +index 9c7cd10..0a43f49 100644 +--- a/sc/inc/formulacell.hxx ++++ b/sc/inc/formulacell.hxx +@@ -310,7 +310,6 @@ public: + bool IsRunning() const; + void SetRunning( bool bVal ); + void CompileDBFormula( sc::CompileFormulaContext& rCxt ); +- void CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ); + void CompileColRowNameFormula( sc::CompileFormulaContext& rCxt ); + ScFormulaCell* GetPrevious() const; + ScFormulaCell* GetNext() const; +diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx +index f8928de..9d36a1e 100644 +--- a/sc/inc/table.hxx ++++ b/sc/inc/table.hxx +@@ -864,9 +864,12 @@ public: + void PreprocessRangeNameUpdate( + sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt ); + +- void PostprocessRangeNameUpdate( ++ void CompileHybridFormula( + sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt ); + ++ void PreprocessDBDataUpdate( ++ sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt ); ++ + ScConditionalFormatList* GetCondFormList(); + const ScConditionalFormatList* GetCondFormList() const; + void SetCondFormList( ScConditionalFormatList* pList ); +@@ -1029,7 +1032,6 @@ private: + bool GetNextMarkedCell( SCCOL& rCol, SCROW& rRow, const ScMarkData& rMark ) const; + bool TestTabRefAbs(SCTAB nTable) const; + void CompileDBFormula( sc::CompileFormulaContext& rCxt ); +- void CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ); + void CompileColRowNameFormula( sc::CompileFormulaContext& rCxt ); + void RebuildFormulaGroups(); + +diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx +index 63c5e0f..a8ba063 100644 +--- a/sc/source/core/data/column2.cxx ++++ b/sc/source/core/data/column2.cxx +@@ -3218,21 +3218,6 @@ public: + } + }; + +-class CompileDBFormula2Handler +-{ +- sc::CompileFormulaContext& mrCxt; +- bool mbCreateFormulaString; +- +-public: +- CompileDBFormula2Handler( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ) : +- mrCxt(rCxt), mbCreateFormulaString(bCreateFormulaString) {} +- +- void operator() (size_t, ScFormulaCell* p) +- { +- p->CompileDBFormula(mrCxt, mbCreateFormulaString); +- } +-}; +- + struct CompileColRowNameFormulaHandler + { + sc::CompileFormulaContext& mrCxt; +@@ -3254,13 +3239,6 @@ void ScColumn::CompileDBFormula( sc::CompileFormulaContext& rCxt ) + RegroupFormulaCells(); + } + +-void ScColumn::CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ) +-{ +- CompileDBFormula2Handler aFunc(rCxt, bCreateFormulaString); +- sc::ProcessFormula(maCells, aFunc); +- RegroupFormulaCells(); +-} +- + void ScColumn::CompileColRowNameFormula( sc::CompileFormulaContext& rCxt ) + { + CompileColRowNameFormulaHandler aFunc(rCxt); +diff --git a/sc/source/core/data/column4.cxx b/sc/source/core/data/column4.cxx +index 9a3ef12..bf3b817 100644 +--- a/sc/source/core/data/column4.cxx ++++ b/sc/source/core/data/column4.cxx +@@ -135,15 +135,19 @@ void ScColumn::DeleteBeforeCopyFromClip( sc::CopyFromClipContext& rCxt, const Sc + + namespace { + +-class PreRangeNameUpdateHandler ++class RecompileByOpcodeHandler + { + ScDocument* mpDoc; ++ const boost::unordered_set& mrOps; + sc::EndListeningContext& mrEndListenCxt; + sc::CompileFormulaContext& mrCompileFormulaCxt; + + public: +- PreRangeNameUpdateHandler( ScDocument* pDoc, sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt ) : ++ RecompileByOpcodeHandler( ++ ScDocument* pDoc, const boost::unordered_set& rOps, ++ sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt ) : + mpDoc(pDoc), ++ mrOps(rOps), + mrEndListenCxt(rEndListenCxt), + mrCompileFormulaCxt(rCompileCxt) {} + +@@ -163,12 +167,7 @@ public: + pTop = rEntry.mpCell; + + ScTokenArray* pCode = pTop->GetCode(); +- +- boost::unordered_set aOps; +- aOps.insert(ocBad); +- aOps.insert(ocColRowName); +- aOps.insert(ocName); +- bool bRecompile = pCode->HasOpCodes(aOps); ++ bool bRecompile = pCode->HasOpCodes(mrOps); + + if (bRecompile) + { +@@ -204,14 +203,14 @@ public: + } + }; + +-class PostRangeNameUpdateHandler ++class CompileHybridFormulaHandler + { + ScDocument* mpDoc; + sc::StartListeningContext& mrStartListenCxt; + sc::CompileFormulaContext& mrCompileFormulaCxt; + + public: +- PostRangeNameUpdateHandler( ScDocument* pDoc, sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt ) : ++ CompileHybridFormulaHandler( ScDocument* pDoc, sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt ) : + mpDoc(pDoc), + mrStartListenCxt(rStartListenCxt), + mrCompileFormulaCxt(rCompileCxt) {} +@@ -277,17 +276,35 @@ void ScColumn::PreprocessRangeNameUpdate( + // Collect all formula groups. + std::vector aGroups = GetFormulaGroupEntries(); + +- PreRangeNameUpdateHandler aFunc(pDocument, rEndListenCxt, rCompileCxt); ++ boost::unordered_set aOps; ++ aOps.insert(ocBad); ++ aOps.insert(ocColRowName); ++ aOps.insert(ocName); ++ RecompileByOpcodeHandler aFunc(pDocument, aOps, rEndListenCxt, rCompileCxt); ++ std::for_each(aGroups.begin(), aGroups.end(), aFunc); ++} ++ ++void ScColumn::PreprocessDBDataUpdate( ++ sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt ) ++{ ++ // Collect all formula groups. ++ std::vector aGroups = GetFormulaGroupEntries(); ++ ++ boost::unordered_set aOps; ++ aOps.insert(ocBad); ++ aOps.insert(ocColRowName); ++ aOps.insert(ocDBArea); ++ RecompileByOpcodeHandler aFunc(pDocument, aOps, rEndListenCxt, rCompileCxt); + std::for_each(aGroups.begin(), aGroups.end(), aFunc); + } + +-void ScColumn::PostprocessRangeNameUpdate( ++void ScColumn::CompileHybridFormula( + sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt ) + { + // Collect all formula groups. + std::vector aGroups = GetFormulaGroupEntries(); + +- PostRangeNameUpdateHandler aFunc(pDocument, rStartListenCxt, rCompileCxt); ++ CompileHybridFormulaHandler aFunc(pDocument, rStartListenCxt, rCompileCxt); + std::for_each(aGroups.begin(), aGroups.end(), aFunc); + } + +diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx +index 8a4e3ec..03ee3ef 100644 +--- a/sc/source/core/data/documen4.cxx ++++ b/sc/source/core/data/documen4.cxx +@@ -548,17 +548,6 @@ void ScDocument::CompileDBFormula() + } + } + +-void ScDocument::CompileDBFormula( bool bCreateFormulaString ) +-{ +- sc::CompileFormulaContext aCxt(this); +- TableContainer::iterator it = maTabs.begin(); +- for (;it != maTabs.end(); ++it) +- { +- if (*it) +- (*it)->CompileDBFormula(aCxt, bCreateFormulaString); +- } +-} +- + void ScDocument::CompileColRowNameFormula() + { + sc::CompileFormulaContext aCxt(this); +diff --git a/sc/source/core/data/document10.cxx b/sc/source/core/data/document10.cxx +index cb64221..26f34db 100644 +--- a/sc/source/core/data/document10.cxx ++++ b/sc/source/core/data/document10.cxx +@@ -57,7 +57,20 @@ void ScDocument::PreprocessRangeNameUpdate() + } + } + +-void ScDocument::PostprocessRangeNameUpdate() ++void ScDocument::PreprocessDBDataUpdate() ++{ ++ sc::EndListeningContext aEndListenCxt(*this); ++ sc::CompileFormulaContext aCompileCxt(this); ++ ++ TableContainer::iterator it = maTabs.begin(), itEnd = maTabs.end(); ++ for (; it != itEnd; ++it) ++ { ++ ScTable* p = *it; ++ p->PreprocessDBDataUpdate(aEndListenCxt, aCompileCxt); ++ } ++} ++ ++void ScDocument::CompileHybridFormula() + { + sc::StartListeningContext aStartListenCxt(*this); + sc::CompileFormulaContext aCompileCxt(this); +@@ -65,7 +78,7 @@ void ScDocument::PostprocessRangeNameUpdate() + for (; it != itEnd; ++it) + { + ScTable* p = *it; +- p->PostprocessRangeNameUpdate(aStartListenCxt, aCompileCxt); ++ p->CompileHybridFormula(aStartListenCxt, aCompileCxt); + } + } + +diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx +index 18194e1..bbaff4f 100644 +--- a/sc/source/core/data/formulacell.cxx ++++ b/sc/source/core/data/formulacell.cxx +@@ -3496,57 +3496,6 @@ void ScFormulaCell::CompileDBFormula( sc::CompileFormulaContext& rCxt ) + } + } + +-void ScFormulaCell::CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ) +-{ +- // Two phases must be called after each other +- // 1. Formula String with old generated names +- // 2. Formula String with new generated names +- if ( bCreateFormulaString ) +- { +- bool bRecompile = false; +- pCode->Reset(); +- for ( FormulaToken* p = pCode->First(); p && !bRecompile; p = pCode->Next() ) +- { +- switch ( p->GetOpCode() ) +- { +- case ocBad: // DB Area eventually goes bad +- case ocColRowName: // in case of the same names +- case ocDBArea: // DB Area +- bRecompile = true; +- break; +- case ocName: +- if ( p->GetIndex() >= SC_START_INDEX_DB_COLL ) +- bRecompile = true; // DB Area +- break; +- default: +- ; // nothing +- } +- } +- if ( bRecompile ) +- { +- OUString aFormula = GetFormula(rCxt); +- if ( GetMatrixFlag() != MM_NONE && !aFormula.isEmpty() ) +- { +- if ( aFormula[ aFormula.getLength()-1 ] == '}' ) +- aFormula = aFormula.copy( 0, aFormula.getLength()-1 ); +- if ( aFormula[0] == '{' ) +- aFormula = aFormula.copy( 1 ); +- } +- EndListeningTo( pDocument ); +- pDocument->RemoveFromFormulaTree( this ); +- pCode->Clear(); +- SetHybridFormula(aFormula, rCxt.getGrammar()); +- } +- } +- else if ( !pCode->GetLen() && !aResult.GetHybridFormula().isEmpty() ) +- { +- rCxt.setGrammar(eTempGrammar); +- Compile(rCxt, aResult.GetHybridFormula(), false); +- aResult.SetToken( NULL); +- SetDirty(); +- } +-} +- + void ScFormulaCell::CompileColRowNameFormula( sc::CompileFormulaContext& rCxt ) + { + pCode->Reset(); +diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx +index bfefd30..aef4726 100644 +--- a/sc/source/core/data/table4.cxx ++++ b/sc/source/core/data/table4.cxx +@@ -2062,12 +2062,6 @@ void ScTable::CompileDBFormula( sc::CompileFormulaContext& rCxt ) + aCol[i].CompileDBFormula(rCxt); + } + +-void ScTable::CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ) +-{ +- for (SCCOL i = 0; i <= MAXCOL; ++i) +- aCol[i].CompileDBFormula(rCxt, bCreateFormulaString); +-} +- + void ScTable::CompileColRowNameFormula( sc::CompileFormulaContext& rCxt ) + { + for (SCCOL i = 0; i <= MAXCOL; ++i) +diff --git a/sc/source/core/data/table7.cxx b/sc/source/core/data/table7.cxx +index b427617..1ede729 100644 +--- a/sc/source/core/data/table7.cxx ++++ b/sc/source/core/data/table7.cxx +@@ -50,11 +50,18 @@ void ScTable::PreprocessRangeNameUpdate( + aCol[i].PreprocessRangeNameUpdate(rEndListenCxt, rCompileCxt); + } + +-void ScTable::PostprocessRangeNameUpdate( ++void ScTable::PreprocessDBDataUpdate( ++ sc::EndListeningContext& rEndListenCxt, sc::CompileFormulaContext& rCompileCxt ) ++{ ++ for (SCCOL i = 0; i <= MAXCOL; ++i) ++ aCol[i].PreprocessDBDataUpdate(rEndListenCxt, rCompileCxt); ++} ++ ++void ScTable::CompileHybridFormula( + sc::StartListeningContext& rStartListenCxt, sc::CompileFormulaContext& rCompileCxt ) + { + for (SCCOL i = 0; i <= MAXCOL; ++i) +- aCol[i].PostprocessRangeNameUpdate(rStartListenCxt, rCompileCxt); ++ aCol[i].CompileHybridFormula(rStartListenCxt, rCompileCxt); + } + + void ScTable::UpdateScriptTypes( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ) +diff --git a/sc/source/ui/docshell/dbdocfun.cxx b/sc/source/ui/docshell/dbdocfun.cxx +index 900bf3e..29d2da1 100644 +--- a/sc/source/ui/docshell/dbdocfun.cxx ++++ b/sc/source/ui/docshell/dbdocfun.cxx +@@ -79,7 +79,7 @@ bool ScDBDocFunc::AddDBRange( const OUString& rName, const ScRange& rRange, sal_ + bool bCompile = !pDoc->IsImportingXML(); + bool bOk; + if ( bCompile ) +- pDoc->CompileDBFormula( sal_True ); // CreateFormulaString ++ pDoc->PreprocessDBDataUpdate(); + if ( rName == STR_DB_LOCAL_NONAME ) + { + pDoc->SetAnonymousDBData(rRange.aStart.Tab() , pNew); +@@ -90,7 +90,7 @@ bool ScDBDocFunc::AddDBRange( const OUString& rName, const ScRange& rRange, sal_ + bOk = pDocColl->getNamedDBs().insert(pNew); + } + if ( bCompile ) +- pDoc->CompileDBFormula( false ); // CompileFormulaString ++ pDoc->CompileHybridFormula(); + + if (!bOk) + { +@@ -128,9 +128,9 @@ bool ScDBDocFunc::DeleteDBRange(const OUString& rName) + if (bUndo) + pUndoColl = new ScDBCollection( *pDocColl ); + +- pDoc->CompileDBFormula( true ); // CreateFormulaString ++ pDoc->PreprocessDBDataUpdate(); + rDBs.erase(*p); +- pDoc->CompileDBFormula( false ); // CompileFormulaString ++ pDoc->CompileHybridFormula(); + + if (bUndo) + { +@@ -164,13 +164,13 @@ bool ScDBDocFunc::RenameDBRange( const OUString& rOld, const OUString& rNew ) + + ScDBCollection* pUndoColl = new ScDBCollection( *pDocColl ); + +- pDoc->CompileDBFormula(true); // CreateFormulaString ++ pDoc->PreprocessDBDataUpdate(); + rDBs.erase(*pOld); + bool bInserted = rDBs.insert(pNewData); + if (!bInserted) // Fehler -> alten Zustand wiederherstellen + pDoc->SetDBCollection(pUndoColl); // gehoert dann dem Dokument +- // +- pDoc->CompileDBFormula( false ); // CompileFormulaString ++ ++ pDoc->CompileHybridFormula(); + + if (bInserted) // Einfuegen hat geklappt + { +diff --git a/sc/source/ui/docshell/docfunc.cxx b/sc/source/ui/docshell/docfunc.cxx +index 2d85309..034f881 100644 +--- a/sc/source/ui/docshell/docfunc.cxx ++++ b/sc/source/ui/docshell/docfunc.cxx +@@ -4871,7 +4871,7 @@ bool ScDocFunc::SetNewRangeNames( ScRangeName* pNewRanges, bool bModifyDoc, SCTA + else + pDoc->SetRangeName( pNewRanges ); // takes ownership + if ( bCompile ) +- pDoc->PostprocessRangeNameUpdate(); ++ pDoc->CompileHybridFormula(); + + if (bModifyDoc) + { +@@ -4897,7 +4897,7 @@ void ScDocFunc::ModifyAllRangeNames( const boost::ptr_map + + pDoc->PreprocessRangeNameUpdate(); + pDoc->SetAllRangeNames(rRangeMap); +- pDoc->PostprocessRangeNameUpdate(); ++ pDoc->CompileHybridFormula(); + + aModificator.SetDocumentModified(); + SFX_APP()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED)); +diff --git a/sc/source/ui/docshell/docsh5.cxx b/sc/source/ui/docshell/docsh5.cxx +index ee63dcf..3c65fc0 100644 +--- a/sc/source/ui/docshell/docsh5.cxx ++++ b/sc/source/ui/docshell/docsh5.cxx +@@ -256,7 +256,7 @@ ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGe + OUString aNewName; + if (eMode==SC_DB_IMPORT) + { +- aDocument.CompileDBFormula( sal_True ); // CreateFormulaString ++ aDocument.PreprocessDBDataUpdate(); + pUndoColl = new ScDBCollection( *pColl ); // Undo fuer Import1-Bereich + + OUString aImport = ScGlobal::GetRscString( STR_DBNAME_IMPORT ); +@@ -289,7 +289,7 @@ ScDBData* ScDocShell::GetDBData( const ScRange& rMarked, ScGetDBMode eMode, ScGe + + if ( pUndoColl ) + { +- aDocument.CompileDBFormula( false ); // CompileFormulaString ++ aDocument.CompileHybridFormula(); + + ScDBCollection* pRedoColl = new ScDBCollection( *pColl ); + GetUndoManager()->AddUndoAction( new ScUndoDBData( this, pUndoColl, pRedoColl ) ); +diff --git a/sc/source/ui/undo/undocell.cxx b/sc/source/ui/undo/undocell.cxx +index 02f67a9..03f2288 100644 +--- a/sc/source/ui/undo/undocell.cxx ++++ b/sc/source/ui/undo/undocell.cxx +@@ -1059,7 +1059,7 @@ void ScUndoRangeNames::DoChange( sal_Bool bUndo ) + pDoc->SetRangeName( new ScRangeName( *pNewRanges ) ); + } + +- pDoc->PostprocessRangeNameUpdate(); ++ pDoc->CompileHybridFormula(); + + SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) ); + } +diff --git a/sc/source/ui/undo/undodat.cxx b/sc/source/ui/undo/undodat.cxx +index 57d0875..32af832 100644 +--- a/sc/source/ui/undo/undodat.cxx ++++ b/sc/source/ui/undo/undodat.cxx +@@ -1133,9 +1133,9 @@ void ScUndoDBData::Undo() + + sal_Bool bOldAutoCalc = pDoc->GetAutoCalc(); + pDoc->SetAutoCalc( false ); // Avoid unnecessary calculations +- pDoc->CompileDBFormula( sal_True ); // CreateFormulaString ++ pDoc->PreprocessDBDataUpdate(); + pDoc->SetDBCollection( new ScDBCollection(*pUndoColl), sal_True ); +- pDoc->CompileDBFormula( false ); // CompileFormulaString ++ pDoc->CompileHybridFormula(); + pDoc->SetAutoCalc( bOldAutoCalc ); + + SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) ); +@@ -1151,9 +1151,9 @@ void ScUndoDBData::Redo() + + sal_Bool bOldAutoCalc = pDoc->GetAutoCalc(); + pDoc->SetAutoCalc( false ); // Avoid unnecessary calculations +- pDoc->CompileDBFormula( sal_True ); // CreateFormulaString ++ pDoc->PreprocessDBDataUpdate(); + pDoc->SetDBCollection( new ScDBCollection(*pRedoColl), sal_True ); +- pDoc->CompileDBFormula( false ); // CompileFormulaString ++ pDoc->CompileHybridFormula(); + pDoc->SetAutoCalc( bOldAutoCalc ); + + SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_DBAREAS_CHANGED ) ); +diff --git a/sc/source/ui/undo/undorangename.cxx b/sc/source/ui/undo/undorangename.cxx +index 172f802..9a92b77 100644 +--- a/sc/source/ui/undo/undorangename.cxx ++++ b/sc/source/ui/undo/undorangename.cxx +@@ -79,7 +79,7 @@ void ScUndoAllRangeNames::DoChange(const boost::ptr_map& + + rDoc.PreprocessRangeNameUpdate(); + rDoc.SetAllRangeNames(rNames); +- rDoc.PostprocessRangeNameUpdate(); ++ rDoc.CompileHybridFormula(); + + SFX_APP()->Broadcast(SfxSimpleHint(SC_HINT_AREAS_CHANGED)); + } +diff --git a/sc/source/ui/unoobj/nameuno.cxx b/sc/source/ui/unoobj/nameuno.cxx +index 87ed766..3c3273c 100644 +--- a/sc/source/ui/unoobj/nameuno.cxx ++++ b/sc/source/ui/unoobj/nameuno.cxx +@@ -751,7 +751,7 @@ void ScNamedRangesObj::lock() + /** called from the XActionLockable interface methods on final unlock */ + void ScNamedRangesObj::unlock() + { +- pDocShell->GetDocument()->PostprocessRangeNameUpdate(); ++ pDocShell->GetDocument()->CompileHybridFormula(); + } + + // document::XActionLockable +diff --git a/sc/source/ui/view/dbfunc.cxx b/sc/source/ui/view/dbfunc.cxx +index e5ebd37..1cd3223 100644 +--- a/sc/source/ui/view/dbfunc.cxx ++++ b/sc/source/ui/view/dbfunc.cxx +@@ -224,9 +224,9 @@ void ScDBFunc::NotifyCloseDbNameDlg( const ScDBCollection& rNewColl, const std:: + + // register target in SBA no longer necessary + +- pDoc->CompileDBFormula( sal_True ); // CreateFormulaString ++ pDoc->PreprocessDBDataUpdate(); + pDoc->SetDBCollection( new ScDBCollection( rNewColl ) ); +- pDoc->CompileDBFormula( false ); // CompileFormulaString ++ pDoc->CompileHybridFormula(); + pOldColl = NULL; + pDocShell->PostPaint(ScRange(0, 0, 0, MAXCOL, MAXROW, MAXTAB), PAINT_GRID); + aModificator.SetDocumentModified(); +diff --git a/sc/source/ui/view/viewfunc.cxx b/sc/source/ui/view/viewfunc.cxx +index e308cad..13a785b 100644 +--- a/sc/source/ui/view/viewfunc.cxx ++++ b/sc/source/ui/view/viewfunc.cxx +@@ -2805,7 +2805,7 @@ bool ScViewFunc::InsertName( const OUString& rName, const OUString& rSymbol, + bOk = true; + pNewEntry = NULL; // never delete, insert took ownership + +- pDoc->PostprocessRangeNameUpdate(); ++ pDoc->CompileHybridFormula(); + + aModificator.SetDocumentModified(); + SFX_APP()->Broadcast( SfxSimpleHint( SC_HINT_AREAS_CHANGED ) ); +-- +1.9.3 + diff --git a/SOURCES/0065-Related-fdo-81641-create-new-styles-with-an-initial-.patch b/SOURCES/0065-Related-fdo-81641-create-new-styles-with-an-initial-.patch new file mode 100644 index 0000000..50bc26f --- /dev/null +++ b/SOURCES/0065-Related-fdo-81641-create-new-styles-with-an-initial-.patch @@ -0,0 +1,200 @@ +From 30ef30970073b969430011da25e9412ffc217e8b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Thu, 24 Jul 2014 11:55:46 +0100 +Subject: [PATCH 065/137] Related: fdo#81641 create new styles with an initial + name +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +instead of creating with a blank name and changing it later + +this way undo of a style creation is initialized with its name and so create a +style followed by deleting a style and undoing all those steps doesn't crash + +(cherry picked from commit e904562af54545684b32d2042ded6bdb9459edca) + +Conflicts: + include/sfx2/styledlg.hxx + sw/source/uibase/app/docst.cxx + +Change-Id: Ida7a34410d5d7b05edcb86950aabb3c672b82c8f + +style category listbox depends on being unsorted + +regression from + +commit 6ecfbf153a7c11c63d208630ac6a27064058099d +Author: Caolán McNamara +Date: Wed Mar 13 15:10:25 2013 +0000 + + drop unused resources and toggle label to activate replacement widget + +Change-Id: I65ca8ec58ed984120f3c2e7ba68507cbf8acf089 +(cherry picked from commit 11fab6b705638359b2ca0e3e85590aa7cc70a03a) + +Related: fdo#81641 exclude 'all styles' category from organizer page + +it doesn't make sense to be able to assign a style to +'all styles' + +Change-Id: I632c62f293b553e436ceb8da0baf2bb39941fd39 +(cherry picked from commit 2223ff6cb99df097a357674801835c7a260b551d) + +Resolves: fdo#81641 the new style shouldn't be a conditional style + +regression from + +commit 715d79bcc59d68c77dc84a1038998dd873df92e9 +Author: Cédric Bosdonnat +Date: Fri Nov 30 11:51:46 2012 +0100 + + Styles & Formatting: added SFXSTYLEBIT_ALL_VISIBLE and show hidden styles + +commit 2fd9c2bf9af0c50dae3af3dbe5e22965ccdb4ae7 +Author: Cédric Bosdonnat +Date: Sun Nov 25 15:24:42 2012 +0100 + + Allow to hide styles in the "Styles & Formating" dialog + + In its current state, the feature only hides the styles. Things to sort + out are: + + Add some automatic filter to show hidden styles + + Make the visibility persist in the file format + +(cherry picked from commit 1af0e46102350114dd5e854b7692c640dae2727f) + +Conflicts: + sw/source/uibase/app/docst.cxx + +Change-Id: I7244d424765db0d5ed3aeaf380a8e1af56aa7eaf +Reviewed-on: https://gerrit.libreoffice.org/10503 +Reviewed-by: Michael Stahl +Tested-by: Michael Stahl +--- + include/sfx2/styledlg.hxx | 3 +++ + sfx2/source/dialog/mgetempl.cxx | 16 +++++----------- + sfx2/source/dialog/styledlg.cxx | 14 ++++++++++++++ + sw/source/ui/app/docst.cxx | 6 +++++- + 4 files changed, 27 insertions(+), 12 deletions(-) + +diff --git a/include/sfx2/styledlg.hxx b/include/sfx2/styledlg.hxx +index b53e8cd..8888473 100644 +--- a/include/sfx2/styledlg.hxx ++++ b/include/sfx2/styledlg.hxx +@@ -25,6 +25,7 @@ + #include + + class SfxStyleSheetBase; ++class SfxStyleSheetBasePool; + + class SFX2_DLLPUBLIC SfxStyleDialog: public SfxTabDialog + { +@@ -45,6 +46,8 @@ public: + const SfxStyleSheetBase& GetStyleSheet() const { return *pStyle; } + + virtual short Ok(); ++ ++ static OUString GenerateUnusedName(SfxStyleSheetBasePool &rPool); + }; + + #endif +diff --git a/sfx2/source/dialog/mgetempl.cxx b/sfx2/source/dialog/mgetempl.cxx +index cedbdc1..97dcf81 100644 +--- a/sfx2/source/dialog/mgetempl.cxx ++++ b/sfx2/source/dialog/mgetempl.cxx +@@ -67,7 +67,9 @@ SfxManageStyleSheetPage::SfxManageStyleSheetPage(Window* pParent, const SfxItemS + m_pBaseLb->setMaxWidthChars(nMaxWidth); + get(m_pFilterFt, "categoryft"); + get(m_pFilterLb, "category"); +- m_pFilterLb->SetStyle(m_pFilterLb->GetStyle() | WB_SORT); ++ //note that the code depends on categories not being lexically ++ //sorted, so if its changed to sorted, the code needs to ++ //be adapted to be position unaware + m_pFilterLb->setMaxWidthChars(nMaxWidth); + get(m_pDescFt, "desc"); + +@@ -94,16 +96,7 @@ SfxManageStyleSheetPage::SfxManageStyleSheetPage(Window* pParent, const SfxItemS + if ( pStyle->GetName().isEmpty() && pPool ) + { + // NullString as Name -> generate Name +- OUString aNoName( SfxResId(STR_NONAME).toString() ); +- sal_uInt16 nNo = 1; +- OUString aNo( aNoName ); +- aNoName += OUString::number( nNo ); +- while ( pPool->Find( aNoName ) ) +- { +- ++nNo; +- aNoName = aNo; +- aNoName += OUString::number( nNo ); +- } ++ OUString aNoName(SfxStyleDialog::GenerateUnusedName(*pPool)); + pStyle->SetName( aNoName ); + aName = aNoName; + aFollow = pStyle->GetFollow(); +@@ -193,6 +186,7 @@ SfxManageStyleSheetPage::SfxManageStyleSheetPage(Window* pParent, const SfxItemS + + if ( pTupel->nFlags != SFXSTYLEBIT_AUTO && + pTupel->nFlags != SFXSTYLEBIT_USED && ++ pTupel->nFlags != SFXSTYLEBIT_ALL_VISIBLE && + pTupel->nFlags != SFXSTYLEBIT_ALL ) + { + m_pFilterLb->InsertEntry( pTupel->aName, nIdx ); +diff --git a/sfx2/source/dialog/styledlg.cxx b/sfx2/source/dialog/styledlg.cxx +index 6b4051d..d4945a8 100644 +--- a/sfx2/source/dialog/styledlg.cxx ++++ b/sfx2/source/dialog/styledlg.cxx +@@ -147,5 +147,19 @@ IMPL_LINK( SfxStyleDialog, CancelHdl, Button *, pButton ) + return 0; + } + ++OUString SfxStyleDialog::GenerateUnusedName(SfxStyleSheetBasePool &rPool) ++{ ++ OUString aNoName(SfxResId(STR_NONAME).toString()); ++ sal_uInt16 nNo = 1; ++ OUString aNo(aNoName); ++ aNoName += OUString::number(nNo); ++ while (rPool.Find(aNoName)) ++ { ++ ++nNo; ++ aNoName = aNo; ++ aNoName += OUString::number(nNo); ++ } ++ return aNoName; ++} + + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +diff --git a/sw/source/ui/app/docst.cxx b/sw/source/ui/app/docst.cxx +index 4c05499..1f12a30 100644 +--- a/sw/source/ui/app/docst.cxx ++++ b/sw/source/ui/app/docst.cxx +@@ -25,6 +25,7 @@ + + #include + #include ++#include + #include + #include + #include +@@ -285,6 +286,9 @@ void SwDocShell::ExecStyleSheet( SfxRequest& rReq ) + sal_False, &pItem )) + sParent = ((const SfxStringItem*)pItem)->GetValue(); + ++ if (sName.isEmpty() && mxBasePool.get()) ++ sName = SfxStyleDialog::GenerateUnusedName(*mxBasePool); ++ + nRet = Edit( sName, sParent, nFamily, nMask, sal_True, OString(), 0, rReq.IsAPI() ); + } + break; +@@ -615,7 +619,7 @@ sal_uInt16 SwDocShell::Edit( + + if( bNew ) + { +- if( SFXSTYLEBIT_ALL != nMask && SFXSTYLEBIT_USED != nMask ) ++ if (SFXSTYLEBIT_ALL != nMask && SFXSTYLEBIT_ALL_VISIBLE != nMask && SFXSTYLEBIT_USED != nMask) + nMask |= SFXSTYLEBIT_USERDEF; + else + nMask = SFXSTYLEBIT_USERDEF; +-- +1.9.3 + diff --git a/SOURCES/0065-fdo-72697-accept-future-loext-sender-initials.patch b/SOURCES/0065-fdo-72697-accept-future-loext-sender-initials.patch deleted file mode 100644 index b1ff273..0000000 --- a/SOURCES/0065-fdo-72697-accept-future-loext-sender-initials.patch +++ /dev/null @@ -1,47 +0,0 @@ -From bedc707bffdfe906a15036a40da1b9179d91b4fc Mon Sep 17 00:00:00 2001 -From: Eike Rathke -Date: Fri, 13 Dec 2013 23:05:06 +0100 -Subject: [PATCH 065/109] fdo#72697 accept future - -... of to-be - -Change-Id: Ia601c0debc5d66682aa92e14fb063395f9f48ab5 -(cherry picked from commit 1379294741ff85d4c09d9ded7579ad50dea88fb7) -Reviewed-on: https://gerrit.libreoffice.org/7076 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna ---- - xmloff/source/text/txtfldi.cxx | 2 +- - xmloff/source/text/txtimp.cxx | 3 ++- - 2 files changed, 3 insertions(+), 2 deletions(-) - -diff --git a/xmloff/source/text/txtfldi.cxx b/xmloff/source/text/txtfldi.cxx -index 875677c..3d99acf 100644 ---- a/xmloff/source/text/txtfldi.cxx -+++ b/xmloff/source/text/txtfldi.cxx -@@ -3669,7 +3669,7 @@ SvXMLImportContext* XMLAnnotationImportContext::CreateChildContext( - pContext = new XMLStringBufferImportContext(GetImport(), nPrefix, - rLocalName, aDateBuffer); - } -- else if( XML_NAMESPACE_TEXT == nPrefix ) -+ else if( XML_NAMESPACE_TEXT == nPrefix || XML_NAMESPACE_LO_EXT == nPrefix ) - { - if( IsXMLToken( rLocalName, XML_SENDER_INITIALS ) ) - pContext = new XMLStringBufferImportContext(GetImport(), nPrefix, -diff --git a/xmloff/source/text/txtimp.cxx b/xmloff/source/text/txtimp.cxx -index b5028ae..24221a6 100644 ---- a/xmloff/source/text/txtimp.cxx -+++ b/xmloff/source/text/txtimp.cxx -@@ -155,7 +155,8 @@ static SvXMLTokenMapEntry aTextPElemTokenMap[] = - // sender fields - { XML_NAMESPACE_TEXT, XML_SENDER_FIRSTNAME,XML_TOK_TEXT_SENDER_FIRSTNAME}, - { XML_NAMESPACE_TEXT, XML_SENDER_LASTNAME, XML_TOK_TEXT_SENDER_LASTNAME }, -- { XML_NAMESPACE_TEXT, XML_SENDER_INITIALS, XML_TOK_TEXT_SENDER_INITIALS }, -+ { XML_NAMESPACE_LO_EXT, XML_SENDER_INITIALS, XML_TOK_TEXT_SENDER_INITIALS }, -+ { XML_NAMESPACE_TEXT, XML_SENDER_INITIALS, XML_TOK_TEXT_SENDER_INITIALS }, - { XML_NAMESPACE_TEXT, XML_SENDER_TITLE, XML_TOK_TEXT_SENDER_TITLE }, - { XML_NAMESPACE_TEXT, XML_SENDER_POSITION, XML_TOK_TEXT_SENDER_POSITION }, - { XML_NAMESPACE_TEXT, XML_SENDER_EMAIL, XML_TOK_TEXT_SENDER_EMAIL }, --- -1.8.4.2 - diff --git a/SOURCES/0066-odbc-DBMetaData-NULL-pattern-equivalent-to-not-foo.patch b/SOURCES/0066-odbc-DBMetaData-NULL-pattern-equivalent-to-not-foo.patch deleted file mode 100644 index 8d65703..0000000 --- a/SOURCES/0066-odbc-DBMetaData-NULL-pattern-equivalent-to-not-foo.patch +++ /dev/null @@ -1,102 +0,0 @@ -From c8a237e87e909bb9fc8105fcad01317901f08c45 Mon Sep 17 00:00:00 2001 -From: Lionel Elie Mamane -Date: Sat, 14 Dec 2013 06:00:18 +0100 -Subject: [PATCH 066/109] odbc DBMetaData: NULL pattern equivalent to "%", not - "%foo" - -Change-Id: Ief475a1bf6e65b4786e8ee9c025b204f143a30e0 -Reviewed-on: https://gerrit.libreoffice.org/7080 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna ---- - .../drivers/odbcbase/ODatabaseMetaDataResultSet.cxx | 18 +++++++++--------- - 1 file changed, 9 insertions(+), 9 deletions(-) - -diff --git a/connectivity/source/drivers/odbcbase/ODatabaseMetaDataResultSet.cxx b/connectivity/source/drivers/odbcbase/ODatabaseMetaDataResultSet.cxx -index fbb1b59..7b524cc 100644 ---- a/connectivity/source/drivers/odbcbase/ODatabaseMetaDataResultSet.cxx -+++ b/connectivity/source/drivers/odbcbase/ODatabaseMetaDataResultSet.cxx -@@ -849,7 +849,7 @@ void ODatabaseMetaDataResultSet::openTables(const Any& catalog, const OUString& - OString aPKQ,aPKO,aPKN,aCOL; - const OUString *pSchemaPat = NULL; - -- if(schemaPattern.toChar() != '%') -+ if(schemaPattern != "%") - pSchemaPat = &schemaPattern; - else - pSchemaPat = NULL; -@@ -946,7 +946,7 @@ void ODatabaseMetaDataResultSet::openColumnPrivileges( const Any& catalog, cons - { - const OUString *pSchemaPat = NULL; - -- if(schema.toChar() != '%') -+ if(schema != "%") - pSchemaPat = &schema; - else - pSchemaPat = NULL; -@@ -981,7 +981,7 @@ void ODatabaseMetaDataResultSet::openColumns( const Any& catalog, - { - const OUString *pSchemaPat = NULL; - -- if(schemaPattern.toChar() != '%') -+ if(schemaPattern != "%") - pSchemaPat = &schemaPattern; - else - pSchemaPat = NULL; -@@ -1049,7 +1049,7 @@ void ODatabaseMetaDataResultSet::openProcedureColumns( const Any& catalog, - { - const OUString *pSchemaPat = NULL; - -- if(schemaPattern.toChar() != '%') -+ if(schemaPattern != "%") - pSchemaPat = &schemaPattern; - else - pSchemaPat = NULL; -@@ -1083,7 +1083,7 @@ void ODatabaseMetaDataResultSet::openProcedures(const Any& catalog, const OUStri - { - const OUString *pSchemaPat = NULL; - -- if(schemaPattern.toChar() != '%') -+ if(schemaPattern != "%") - pSchemaPat = &schemaPattern; - else - pSchemaPat = NULL; -@@ -1127,7 +1127,7 @@ void ODatabaseMetaDataResultSet::openSpecialColumns(sal_Bool _bRowVer,const Any& - - const OUString *pSchemaPat = NULL; - -- if(schema.toChar() != '%') -+ if(schema != "%") - pSchemaPat = &schema; - else - pSchemaPat = NULL; -@@ -1214,7 +1214,7 @@ void ODatabaseMetaDataResultSet::openPrimaryKeys(const Any& catalog, const OUStr - { - const OUString *pSchemaPat = NULL; - -- if(schema.toChar() != '%') -+ if(schema != "%") - pSchemaPat = &schema; - else - pSchemaPat = NULL; -@@ -1243,7 +1243,7 @@ void ODatabaseMetaDataResultSet::openTablePrivileges(const Any& catalog, const O - { - const OUString *pSchemaPat = NULL; - -- if(schemaPattern.toChar() != '%') -+ if(schemaPattern != "%") - pSchemaPat = &schemaPattern; - else - pSchemaPat = NULL; -@@ -1273,7 +1273,7 @@ void ODatabaseMetaDataResultSet::openIndexInfo( const Any& catalog, const OUStri - { - const OUString *pSchemaPat = NULL; - -- if(schema.toChar() != '%') -+ if(schema != "%") - pSchemaPat = &schema; - else - pSchemaPat = NULL; --- -1.8.4.2 - diff --git a/SOURCES/0067-coverity-1194911-Unchecked-dynamic_cast.patch b/SOURCES/0067-coverity-1194911-Unchecked-dynamic_cast.patch new file mode 100644 index 0000000..76319fe --- /dev/null +++ b/SOURCES/0067-coverity-1194911-Unchecked-dynamic_cast.patch @@ -0,0 +1,30 @@ +From 0693b37fec987a8d443847d9b98d611def5ebfc1 Mon Sep 17 00:00:00 2001 +From: Miklos Vajna +Date: Sat, 29 Mar 2014 21:13:21 +0100 +Subject: [PATCH 067/137] coverity#1194911 Unchecked dynamic_cast + +Change-Id: I1e7f4bcd8f54219d86ad7a003469d5a486090f47 +(cherry picked from commit 8736c5222a8e83a1310713a92492e63198749467) +Reviewed-on: https://gerrit.libreoffice.org/10630 +Reviewed-by: Michael Stahl +Tested-by: Michael Stahl +--- + writerfilter/source/dmapper/TablePropertiesHandler.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/writerfilter/source/dmapper/TablePropertiesHandler.cxx b/writerfilter/source/dmapper/TablePropertiesHandler.cxx +index b54b262..3aa4427 100644 +--- a/writerfilter/source/dmapper/TablePropertiesHandler.cxx ++++ b/writerfilter/source/dmapper/TablePropertiesHandler.cxx +@@ -97,7 +97,7 @@ namespace dmapper { + + DomainMapperTableManager* pManager = dynamic_cast(m_pTableManager); + // In case any of the cells has the btLr cell direction, then an explicit minimal size will just hide the whole row, don't do that. +- if (pMeasureHandler->GetRowHeightSizeType() != text::SizeType::MIN || !pManager->HasBtlrCell()) ++ if (pMeasureHandler->GetRowHeightSizeType() != text::SizeType::MIN || !pManager || !pManager->HasBtlrCell()) + { + // In case a cell already wanted fixed size, we should not overwrite it here. + if (!pManager || !pManager->IsRowSizeTypeInserted()) +-- +1.9.3 + diff --git a/SOURCES/0067-fdo-72697-actually-write-this-only-in-ODF-1.2-extend.patch b/SOURCES/0067-fdo-72697-actually-write-this-only-in-ODF-1.2-extend.patch deleted file mode 100644 index e781b00..0000000 --- a/SOURCES/0067-fdo-72697-actually-write-this-only-in-ODF-1.2-extend.patch +++ /dev/null @@ -1,80 +0,0 @@ -From c062276a068a14df530fa21e9099a489a26b2096 Mon Sep 17 00:00:00 2001 -From: Eike Rathke -Date: Fri, 13 Dec 2013 23:30:34 +0100 -Subject: [PATCH 067/109] fdo#72697 actually write this only in ODF 1.2 - extended - -(cherry picked from commit 49f9694e34d07468cff4a7e4de332f11be3e0dd8) - -Conflicts: - xmloff/source/text/txtflde.cxx - -Change-Id: I32097cc4b8a67615b0b6d6172cafd0edad7469b6 -(cherry picked from commit 4031765b004dded31f04c54f9a055b7a3d0053f2) -Reviewed-on: https://gerrit.libreoffice.org/7078 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna ---- - xmloff/source/text/txtflde.cxx | 38 +++++++++++++++++++++++++++----------- - 1 file changed, 27 insertions(+), 11 deletions(-) - -diff --git a/xmloff/source/text/txtflde.cxx b/xmloff/source/text/txtflde.cxx -index 0ad8fcb..6855a3b 100644 ---- a/xmloff/source/text/txtflde.cxx -+++ b/xmloff/source/text/txtflde.cxx -@@ -1752,14 +1752,17 @@ void XMLTextFieldExport::ExportFieldHelper( - GetExport().Characters(aBuffer.makeStringAndClear()); - } - -- // initials -- OUString aInitials( GetStringProperty(sPropertyInitials, rPropSet) ); -- if( !aInitials.isEmpty() ) -+ if (SvtSaveOptions().GetODFDefaultVersion() > SvtSaveOptions::ODFVER_012) - { -- SvXMLElementExport aCreatorElem( GetExport(), XML_NAMESPACE_TEXT, -- XML_SENDER_INITIALS, sal_True, -- sal_False ); -- GetExport().Characters(aInitials); -+ // initials -+ OUString aInitials( GetStringProperty(sPropertyInitials, rPropSet) ); -+ if( !aInitials.isEmpty() ) -+ { -+ SvXMLElementExport aCreatorElem( GetExport(), XML_NAMESPACE_TEXT, -+ XML_SENDER_INITIALS, sal_True, -+ sal_False ); -+ GetExport().Characters(aInitials); -+ } - } - - com::sun::star::uno::Reference < com::sun::star::text::XText > xText; -@@ -2226,10 +2229,23 @@ void XMLTextFieldExport::ExportElement(enum XMLTokenEnum eElementName, - if (eElementName != XML_TOKEN_INVALID) - { - // Element -- SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT, -- eElementName, bAddSpace, bAddSpace ); -- // export content -- GetExport().Characters(sContent); -+ if (eElementName == XML_SENDER_INITIALS) -+ { -+ if (SvtSaveOptions().GetODFDefaultVersion() > SvtSaveOptions::ODFVER_012) -+ { -+ SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT, -+ eElementName, bAddSpace, bAddSpace ); -+ // export content -+ GetExport().Characters(sContent); -+ } -+ } -+ else -+ { -+ SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_TEXT, -+ eElementName, bAddSpace, bAddSpace ); -+ // export content -+ GetExport().Characters(sContent); -+ } - } else { - // always export content - GetExport().Characters(sContent); --- -1.8.4.2 - diff --git a/SOURCES/0068-bnc-467459-fix-editeng-text-search-with-expanded-fie.patch b/SOURCES/0068-bnc-467459-fix-editeng-text-search-with-expanded-fie.patch new file mode 100644 index 0000000..088e917 --- /dev/null +++ b/SOURCES/0068-bnc-467459-fix-editeng-text-search-with-expanded-fie.patch @@ -0,0 +1,445 @@ +From 8220b70fe2dc270188751950ac6d872320db1aa2 Mon Sep 17 00:00:00 2001 +From: Michael Meeks +Date: Sun, 27 Jul 2014 00:21:50 -0400 +Subject: [PATCH 068/137] bnc#467459 - fix editeng text search with expanded + fields. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +(cherry picked from commit 274b628a2b523eb45e297352a85f0177c6e747f0) + +Signed-off-by: Matúš Kukan + +Conflicts: + editeng/source/editeng/editdoc.cxx + editeng/source/editeng/editdoc.hxx + +Change-Id: If59d0e2f886e94148b81cb6cfcad067733fcb918 +--- + editeng/CppunitTest_editeng_core.mk | 1 + + editeng/qa/unit/core-test.cxx | 100 +++++++++++++++++++-- + editeng/source/editeng/editdoc.cxx | 173 ++++++++++++++++++++++++------------ + editeng/source/editeng/editdoc.hxx | 12 ++- + editeng/source/editeng/impedit4.cxx | 6 +- + 5 files changed, 226 insertions(+), 66 deletions(-) + +diff --git a/editeng/CppunitTest_editeng_core.mk b/editeng/CppunitTest_editeng_core.mk +index 301c760..962fd8f 100644 +--- a/editeng/CppunitTest_editeng_core.mk ++++ b/editeng/CppunitTest_editeng_core.mk +@@ -61,6 +61,7 @@ $(eval $(call gb_CppunitTest_use_components,editeng_core,\ + configmgr/source/configmgr \ + framework/util/fwk \ + i18npool/util/i18npool \ ++ i18npool/source/search/i18nsearch \ + linguistic/source/lng \ + sfx2/util/sfx \ + ucb/source/core/ucb1 \ +diff --git a/editeng/qa/unit/core-test.cxx b/editeng/qa/unit/core-test.cxx +index 338a6cb7..4e3da9b 100644 +--- a/editeng/qa/unit/core-test.cxx ++++ b/editeng/qa/unit/core-test.cxx +@@ -25,6 +25,9 @@ + #include "editeng/postitem.hxx" + #include "editeng/section.hxx" + #include "editeng/editobj.hxx" ++#include "editeng/flditem.hxx" ++#include "svl/srchitem.hxx" ++#include "rtl/strbuf.hxx" + + #include + +@@ -44,22 +47,22 @@ public: + + void testConstruction(); + +- /** +- * Test UNO service class that implements text field items. +- */ ++ /// Test UNO service class that implements text field items. + void testUnoTextFields(); + +- /** +- * AutoCorrect tests +- */ ++ /// AutoCorrect tests + void testAutocorrect(); + ++ /// Test hyperlinks ++ void testHyperlinkSearch(); ++ + void testSectionAttributes(); + + CPPUNIT_TEST_SUITE(Test); + CPPUNIT_TEST(testConstruction); + CPPUNIT_TEST(testUnoTextFields); + CPPUNIT_TEST(testAutocorrect); ++ CPPUNIT_TEST(testHyperlinkSearch); + CPPUNIT_TEST(testSectionAttributes); + CPPUNIT_TEST_SUITE_END(); + +@@ -340,6 +343,91 @@ void Test::testAutocorrect() + } + } + ++namespace { ++ class UrlEditEngine : public EditEngine ++ { ++ public: ++ UrlEditEngine(SfxItemPool *pPool) : EditEngine(pPool) {} ++ ++ virtual OUString CalcFieldValue( const SvxFieldItem&, sal_Int32, sal_uInt16, Color*&, Color*& ) ++ { ++ return OUString("jim@bob.com"); // a sophisticated view of value: ++ } ++ }; ++} ++ ++// Odd accounting for hyperlink position & size etc. ++// https://bugzilla.novell.com/show_bug.cgi?id=467459 ++void Test::testHyperlinkSearch() ++{ ++ UrlEditEngine aEngine(mpItemPool); ++ EditDoc &rDoc = aEngine.GetEditDoc(); ++ ++ OUString aSampleText = "Please write email to . if you find a fish(not a dog)."; ++ aEngine.SetText(aSampleText); ++ ++ CPPUNIT_ASSERT_MESSAGE("set text", rDoc.GetParaAsString(sal_Int32(0)) == aSampleText); ++ ++ ContentNode *pNode = rDoc.GetObject(0); ++ EditSelection aSel(EditPaM(pNode, 22), EditPaM(pNode, 22)); ++ SvxURLField aURLField("mailto:///jim@bob.com", "jim@bob.com", ++ SVXURLFORMAT_REPR); ++ SvxFieldItem aField(aURLField, EE_FEATURE_FIELD); ++ ++ aEngine.InsertField(aSel, aField); ++ aEngine.UpdateFields(); ++ ++ OUString aContent = pNode->GetExpandedText(); ++ CPPUNIT_ASSERT_MESSAGE("get text", aContent == ++ "Please write email to jim@bob.com. if you find a fish(not a dog)."); ++ CPPUNIT_ASSERT_MESSAGE("wrong length", rDoc.GetTextLen() == (sal_uLong)aContent.getLength()); ++ ++ // Check expansion and positioning re-work ++ CPPUNIT_ASSERT_MESSAGE("wrong length", pNode->GetExpandedLen() == ++ (sal_uLong)aContent.getLength()); ++ for (sal_Int32 n = 0; n < aContent.getLength(); n++) ++ { ++ sal_Int32 nStart = n, nEnd = n; ++ pNode->UnExpandPositions(nStart,nEnd); ++ CPPUNIT_ASSERT_MESSAGE("out of bound start", nStart < pNode->Len()); ++ CPPUNIT_ASSERT_MESSAGE("out of bound end", nEnd <= pNode->Len()); ++ } ++ ++ static const struct { ++ sal_Int32 mnStart, mnEnd; ++ sal_Int32 mnNewStart, mnNewEnd; ++ } aTrickyOnes[] = { ++ { 0, 1, /* -> */ 0, 1 }, ++ { 21, 25, /* -> */ 21, 23 }, // the field is really just one char ++ { 25, 27, /* -> */ 22, 23 }, ++ { 50, 56, /* -> */ 40, 46 } ++ }; ++ for (size_t n = 0; n < SAL_N_ELEMENTS(aTrickyOnes); n++) ++ { ++ sal_Int32 nStart = aTrickyOnes[n].mnStart; ++ sal_Int32 nEnd = aTrickyOnes[n].mnEnd; ++ pNode->UnExpandPositions(nStart,nEnd); ++ ++ rtl::OStringBuffer aBuf; ++ aBuf = "bound check start is "; ++ aBuf.append(nStart).append(" but should be ").append(aTrickyOnes[n].mnNewStart); ++ aBuf.append(" in row ").append((sal_Int32)n); ++ CPPUNIT_ASSERT_MESSAGE(aBuf.getStr(), nStart == aTrickyOnes[n].mnNewStart); ++ aBuf = "bound check end is "; ++ aBuf.append(nEnd).append(" but should be ").append(aTrickyOnes[n].mnNewEnd); ++ aBuf.append(" in row ").append((sal_Int32)n); ++ CPPUNIT_ASSERT_MESSAGE(aBuf.getStr(), nEnd == aTrickyOnes[n].mnNewEnd); ++ } ++ ++ SvxSearchItem aItem(1); //SID_SEARCH_ITEM); ++ aItem.SetBackward(false); ++ aItem.SetSelection(false); ++ aItem.SetSearchString("fish"); ++ CPPUNIT_ASSERT_MESSAGE("no fish", aEngine.HasText(aItem)); ++ aItem.SetSearchString("dog"); ++ CPPUNIT_ASSERT_MESSAGE("no dog", aEngine.HasText(aItem)); ++} ++ + bool hasBold(const editeng::Section& rSecAttr) + { + std::vector::const_iterator it = rSecAttr.maAttributes.begin(), itEnd = rSecAttr.maAttributes.end(); +diff --git a/editeng/source/editeng/editdoc.cxx b/editeng/source/editeng/editdoc.cxx +index 7eb4398..6b5d6f1 100644 +--- a/editeng/source/editeng/editdoc.cxx ++++ b/editeng/source/editeng/editdoc.cxx +@@ -1699,6 +1699,119 @@ const OUString& ContentNode::GetString() const + return maString; + } + ++sal_uLong ContentNode::GetExpandedLen() const ++{ ++ sal_uLong nLen = maString.getLength(); ++ ++ // Fields can be longer than the placeholder in the Node ++ const CharAttribList::AttribsType& rAttrs = GetCharAttribs().GetAttribs(); ++ for (sal_Int32 nAttr = rAttrs.size(); nAttr; ) ++ { ++ const EditCharAttrib& rAttr = rAttrs[--nAttr]; ++ if (rAttr.Which() == EE_FEATURE_FIELD) ++ { ++ nLen += static_cast(rAttr).GetFieldValue().getLength(); ++ --nLen; // Standalone, to avoid corner cases when previous getLength() returns 0 ++ } ++ } ++ ++ return nLen; ++} ++ ++OUString ContentNode::GetExpandedText(sal_Int32 nStartPos, sal_Int32 nEndPos, bool bResolveFields) const ++{ ++ if ( nEndPos < 0 || nEndPos > Len() ) ++ nEndPos = Len(); ++ ++ DBG_ASSERT( nStartPos <= nEndPos, "Start and End reversed?" ); ++ ++ sal_Int32 nIndex = nStartPos; ++ OUString aStr; ++ const EditCharAttrib* pNextFeature = GetCharAttribs().FindFeature( nIndex ); ++ while ( nIndex < nEndPos ) ++ { ++ sal_Int32 nEnd = nEndPos; ++ if ( pNextFeature && ( pNextFeature->GetStart() < nEnd ) ) ++ nEnd = pNextFeature->GetStart(); ++ else ++ pNextFeature = 0; // Feature does not interest the below ++ ++ DBG_ASSERT( nEnd >= nIndex, "End in front of the index?" ); ++ //!! beware of sub string length of -1 ++ if (nEnd > nIndex) ++ aStr += GetString().copy(nIndex, nEnd - nIndex); ++ ++ if ( pNextFeature ) ++ { ++ switch ( pNextFeature->GetItem()->Which() ) ++ { ++ case EE_FEATURE_TAB: aStr += "\t"; ++ break; ++ case EE_FEATURE_LINEBR: aStr += "\x0A"; ++ break; ++ case EE_FEATURE_FIELD: ++ if ( bResolveFields ) ++ aStr += static_cast(pNextFeature)->GetFieldValue(); ++ break; ++ default: OSL_FAIL( "What feature?" ); ++ } ++ pNextFeature = GetCharAttribs().FindFeature( ++nEnd ); ++ } ++ nIndex = nEnd; ++ } ++ return aStr; ++} ++ ++void ContentNode::UnExpandPosition( sal_Int32 &rPos, bool bBiasStart ) ++{ ++ sal_Int32 nOffset = 0; ++ ++ const CharAttribList::AttribsType& rAttrs = GetCharAttribs().GetAttribs(); ++ for (size_t nAttr = 0; nAttr < rAttrs.size(); ++nAttr ) ++ { ++ const EditCharAttrib& rAttr = rAttrs[nAttr]; ++ assert (!(nAttr < rAttrs.size() - 1) || ++ rAttrs[nAttr].GetStart() < rAttrs[nAttr + 1].GetStart()); ++ ++ nOffset = rAttr.GetStart(); ++ ++ if (nOffset >= rPos) // happens after the position ++ return; ++ ++ sal_Int32 nChunk = 0; ++ if (rAttr.Which() == EE_FEATURE_FIELD) ++ { ++ nChunk += static_cast(rAttr).GetFieldValue().getLength(); ++ nChunk--; // Character representing the field in the string ++ ++ if (nOffset + nChunk >= rPos) // we're inside the field ++ { ++ if (bBiasStart) ++ rPos = rAttr.GetStart(); ++ else ++ rPos = rAttr.GetEnd(); ++ return; ++ } ++ // Adjust for the position ++ rPos -= nChunk; ++ } ++ } ++ assert (rPos <= Len()); ++} ++ ++/* ++ * Fields are represented by a single character in the underlying string ++ * and/or selection, however, they can be expanded to the full value of ++ * the field. When we're dealing with selection / offsets however we need ++ * to deal in character positions inside the real (unexpanded) string. ++ * This method maps us back to character offsets. ++ */ ++void ContentNode::UnExpandPositions( sal_Int32 &rStartPos, sal_Int32 &rEndPos ) ++{ ++ UnExpandPosition( rStartPos, true ); ++ UnExpandPosition( rEndPos, false ); ++} ++ + void ContentNode::SetChar(sal_uInt16 nPos, sal_Unicode c) + { + maString = maString.replaceAt(nPos, 1, OUString(c)); +@@ -2141,49 +2254,9 @@ OUString EditDoc::GetParaAsString( sal_Int32 nNode ) const + } + + OUString EditDoc::GetParaAsString( +- const ContentNode* pNode, sal_uInt16 nStartPos, sal_uInt16 nEndPos, bool bResolveFields) const ++ const ContentNode* pNode, sal_Int32 nStartPos, sal_Int32 nEndPos, bool bResolveFields) const + { +- if ( nEndPos > pNode->Len() ) +- nEndPos = pNode->Len(); +- +- DBG_ASSERT( nStartPos <= nEndPos, "Start and End reversed?" ); +- +- sal_uInt16 nIndex = nStartPos; +- OUString aStr; +- const EditCharAttrib* pNextFeature = pNode->GetCharAttribs().FindFeature( nIndex ); +- while ( nIndex < nEndPos ) +- { +- sal_uInt16 nEnd = nEndPos; +- if ( pNextFeature && ( pNextFeature->GetStart() < nEnd ) ) +- nEnd = pNextFeature->GetStart(); +- else +- pNextFeature = 0; // Feature does not interest the below +- +- DBG_ASSERT( nEnd >= nIndex, "End in front of the index?" ); +- //!! beware of sub string length of -1 which is also defined as STRING_LEN and +- //!! thus would result in adding the whole sub string up to the end of the node !! +- if (nEnd > nIndex) +- aStr += pNode->GetString().copy(nIndex, nEnd - nIndex); +- +- if ( pNextFeature ) +- { +- switch ( pNextFeature->GetItem()->Which() ) +- { +- case EE_FEATURE_TAB: aStr += "\t"; +- break; +- case EE_FEATURE_LINEBR: aStr += "\x0A"; +- break; +- case EE_FEATURE_FIELD: +- if ( bResolveFields ) +- aStr += static_cast(pNextFeature)->GetFieldValue(); +- break; +- default: OSL_FAIL( "What feature?" ); +- } +- pNextFeature = pNode->GetCharAttribs().FindFeature( ++nEnd ); +- } +- nIndex = nEnd; +- } +- return aStr; ++ return pNode->GetExpandedText(nStartPos, nEndPos, bResolveFields); + } + + EditPaM EditDoc::GetStartPaM() const +@@ -2204,21 +2277,7 @@ sal_uLong EditDoc::GetTextLen() const + for ( sal_Int32 nNode = 0; nNode < Count(); nNode++ ) + { + const ContentNode* pNode = GetObject( nNode ); +- nLen += pNode->Len(); +- // Fields can be longer than the placeholder in the Node +- const CharAttribList::AttribsType& rAttrs = pNode->GetCharAttribs().GetAttribs(); +- for (size_t nAttr = rAttrs.size(); nAttr; ) +- { +- const EditCharAttrib& rAttr = rAttrs[--nAttr]; +- if (rAttr.Which() == EE_FEATURE_FIELD) +- { +- sal_Int32 nFieldLen = static_cast(rAttr).GetFieldValue().getLength(); +- if ( !nFieldLen ) +- nLen--; +- else +- nLen += nFieldLen-1; +- } +- } ++ nLen += pNode->GetExpandedLen(); + } + return nLen; + } +diff --git a/editeng/source/editeng/editdoc.hxx b/editeng/source/editeng/editdoc.hxx +index dd04503..aba2a07 100644 +--- a/editeng/source/editeng/editdoc.hxx ++++ b/editeng/source/editeng/editdoc.hxx +@@ -247,6 +247,8 @@ private: + CharAttribList aCharAttribList; + boost::scoped_ptr mpWrongList; + ++ void UnExpandPosition( sal_Int32 &rStartPos, bool bBiasStart ); ++ + public: + ContentNode( SfxItemPool& rItemPool ); + ContentNode( const OUString& rStr, const ContentAttribs& rContentAttribs ); +@@ -282,8 +284,16 @@ public: + sal_uInt16 Len() const; + const OUString& GetString() const; + ++ /// return length including expanded fields ++ sal_uLong GetExpandedLen() const; ++ /// return content including expanded fields ++ OUString GetExpandedText(sal_Int32 nStartPos = 0, sal_Int32 nEndPos = -1, bool bResolveFields = true) const; ++ /// re-write offsets in the expanded text to string offsets ++ void UnExpandPositions( sal_Int32 &rStartPos, sal_Int32 &rEndPos ); ++ + void SetChar(sal_uInt16 nPos, sal_Unicode c); + void Insert(const OUString& rStr, sal_uInt16 nPos); ++ + void Append(const OUString& rStr); + void Erase(sal_uInt16 nPos); + void Erase(sal_uInt16 nPos, sal_uInt16 nCount); +@@ -769,7 +779,7 @@ public: + sal_uLong GetTextLen() const; + + OUString GetParaAsString( sal_Int32 nNode ) const; +- OUString GetParaAsString(const ContentNode* pNode, sal_uInt16 nStartPos = 0, sal_uInt16 nEndPos = 0xFFFF, bool bResolveFields = true) const; ++ OUString GetParaAsString(const ContentNode* pNode, sal_Int32 nStartPos = 0, sal_Int32 nEndPos = -1, bool bResolveFields = true) const; + + EditPaM GetStartPaM() const; + EditPaM GetEndPaM() const; +diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx +index b4ff56e..f4a9953 100644 +--- a/editeng/source/editeng/impedit4.cxx ++++ b/editeng/source/editeng/impedit4.cxx +@@ -2647,7 +2647,7 @@ sal_Bool ImpEditEngine::ImpSearch( const SvxSearchItem& rSearchItem, + ContentNode* pNode = aEditDoc.GetObject( nNode ); + + sal_Int32 nStartPos = 0; +- sal_Int32 nEndPos = pNode->Len(); ++ sal_Int32 nEndPos = pNode->GetExpandedLen(); + if ( nNode == nStartNode ) + { + if ( bBack ) +@@ -2664,7 +2664,7 @@ sal_Bool ImpEditEngine::ImpSearch( const SvxSearchItem& rSearchItem, + } + + // Searching ... +- OUString aParaStr( GetEditDoc().GetParaAsString( pNode ) ); ++ OUString aParaStr( pNode->GetExpandedText() ); + bool bFound = false; + if ( bBack ) + { +@@ -2681,6 +2681,8 @@ sal_Bool ImpEditEngine::ImpSearch( const SvxSearchItem& rSearchItem, + } + if ( bFound ) + { ++ pNode->UnExpandPositions( nStartPos, nEndPos ); ++ + rFoundSel.Min().SetNode( pNode ); + rFoundSel.Min().SetIndex( nStartPos ); + rFoundSel.Max().SetNode( pNode ); +-- +1.9.3 + diff --git a/SOURCES/0068-fdo-72163-fix-safer-way.patch b/SOURCES/0068-fdo-72163-fix-safer-way.patch deleted file mode 100644 index 2ac4e52..0000000 --- a/SOURCES/0068-fdo-72163-fix-safer-way.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 4f93ef75127d32da84bbf0275e679a0c9ce7b98d Mon Sep 17 00:00:00 2001 -From: Lionel Elie Mamane -Date: Mon, 2 Dec 2013 23:55:43 +0100 -Subject: [PATCH 068/109] fdo#72163: fix safer way - -Do not dispose m_xComposer, might still be used by our m_pCache. - -Change-Id: I6540c035c9159017c694b36e676721ec3e42db51 -Reviewed-on: https://gerrit.libreoffice.org/7094 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna ---- - dbaccess/source/core/api/RowSet.cxx | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/dbaccess/source/core/api/RowSet.cxx b/dbaccess/source/core/api/RowSet.cxx -index 6002747..6a3ba0a 100644 ---- a/dbaccess/source/core/api/RowSet.cxx -+++ b/dbaccess/source/core/api/RowSet.cxx -@@ -2260,7 +2260,6 @@ sal_Bool ORowSet::impl_initComposer_throw( OUString& _out_rCommandToExecute ) - { - try - { -- ::comphelper::disposeComponent( m_xComposer ); - m_xComposer.set( xFactory->createInstance( SERVICE_NAME_SINGLESELECTQUERYCOMPOSER ), UNO_QUERY_THROW ); - } - catch (const Exception& ) { m_xComposer = NULL; } --- -1.8.4.2 - diff --git a/SOURCES/0069-bnc-885548-Reset-the-default-user-to-the-document-ow.patch b/SOURCES/0069-bnc-885548-Reset-the-default-user-to-the-document-ow.patch new file mode 100644 index 0000000..9821b90 --- /dev/null +++ b/SOURCES/0069-bnc-885548-Reset-the-default-user-to-the-document-ow.patch @@ -0,0 +1,44 @@ +From 1f2d0f87e85375a86289b79dad7ed7d1b9014dc8 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Tue, 29 Jul 2014 10:33:04 -0400 +Subject: [PATCH 069/137] bnc#885548: Reset the default user to the document + owner at the end. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Otherwise the user name is set to the name of the user in the last revision +record, which will be used when recording new revisions. + +Change-Id: I9b5e39c3b3a85614af67f86db9ed2bb3509a9e2b +(cherry picked from commit 227d3e72b0b29b73440157b64d6fb56fa151e05e) +Reviewed-on: https://gerrit.libreoffice.org/10610 +Reviewed-by: Matúš Kukan +Tested-by: Matúš Kukan +--- + sc/source/filter/oox/revisionfragment.cxx | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/sc/source/filter/oox/revisionfragment.cxx b/sc/source/filter/oox/revisionfragment.cxx +index dd8cc4b..463b663 100644 +--- a/sc/source/filter/oox/revisionfragment.cxx ++++ b/sc/source/filter/oox/revisionfragment.cxx +@@ -249,6 +249,7 @@ void RevisionHeadersFragment::finalizeImport() + { + ScDocument& rDoc = getScDocument(); + o3tl::heap_ptr pCT(new ScChangeTrack(&rDoc)); ++ OUString aSelfUser = pCT->GetUser(); // owner of this document. + pCT->SetUseFixDateTime(true); + + const oox::core::Relations& rRels = getRelations(); +@@ -268,6 +269,7 @@ void RevisionHeadersFragment::finalizeImport() + importOoxFragment(xFragment, *xParser); + } + ++ pCT->SetUser(aSelfUser); // set the default user to the document owner. + rDoc.SetChangeTrack(pCT.release()); + + // Turn on visibility of tracked changes. +-- +1.9.3 + diff --git a/SOURCES/0070-fdo-81330-When-moving-to-a-different-sheet-set-3D-fl.patch b/SOURCES/0070-fdo-81330-When-moving-to-a-different-sheet-set-3D-fl.patch new file mode 100644 index 0000000..48b9305 --- /dev/null +++ b/SOURCES/0070-fdo-81330-When-moving-to-a-different-sheet-set-3D-fl.patch @@ -0,0 +1,48 @@ +From ca8a6d4ff366f0ad7c2da6b76f76f624c593592f Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Tue, 29 Jul 2014 22:33:56 -0400 +Subject: [PATCH 070/137] fdo#81330: When moving to a different sheet, set 3D + flag on. + +Change-Id: I16c6e687259635c4d0ac0e5dab0140941b409bc8 +(cherry picked from commit 5e55d5ffb70437e917e4092f4030d5a454fd20d6) +Reviewed-on: https://gerrit.libreoffice.org/10637 +Reviewed-by: Markus Mohrhard +Tested-by: Markus Mohrhard +--- + sc/source/core/tool/token.cxx | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx +index c289960..d392550 100644 +--- a/sc/source/core/tool/token.cxx ++++ b/sc/source/core/tool/token.cxx +@@ -2827,6 +2827,8 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove( + ScRange aOldRange = rCxt.maRange; + aOldRange.Move(-rCxt.mnColDelta, -rCxt.mnRowDelta, -rCxt.mnTabDelta); + ++ bool b3DFlag = rOldPos.Tab() != rNewPos.Tab(); ++ + FormulaToken** p = pCode; + FormulaToken** pEnd = p + static_cast(nLen); + for (; p != pEnd; ++p) +@@ -2845,6 +2847,7 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove( + } + + rRef.SetAddress(aAbs, rNewPos); ++ rRef.SetFlag3D(b3DFlag); + } + break; + case svDoubleRef: +@@ -2859,6 +2862,8 @@ sc::RefUpdateResult ScTokenArray::AdjustReferenceOnMove( + } + + rRef.SetRange(aAbs, rNewPos); ++ if (b3DFlag) ++ rRef.Ref1.SetFlag3D(true); + } + break; + case svIndex: +-- +1.9.3 + diff --git a/SOURCES/0071-Do-not-use-Boost-in-SDK-examples.patch b/SOURCES/0071-Do-not-use-Boost-in-SDK-examples.patch deleted file mode 100644 index 3d15338..0000000 --- a/SOURCES/0071-Do-not-use-Boost-in-SDK-examples.patch +++ /dev/null @@ -1,48 +0,0 @@ -From 4d678d76b51a14e81b0a29c7e96a338bd058526a Mon Sep 17 00:00:00 2001 -From: Stephan Bergmann -Date: Tue, 17 Dec 2013 10:52:48 +0100 -Subject: [PATCH 071/109] Do not use Boost in SDK examples - -Change-Id: I8b2af447fe3ee29261e538a53b4624ff8b6c4d1e -(cherry picked from commit ca4065680a402e3d0ff43e41744b24a9c980b2ef) -Reviewed-on: https://gerrit.libreoffice.org/7118 -Reviewed-by: Michael Stahl -Tested-by: Michael Stahl ---- - odk/examples/cpp/complextoolbarcontrols/ListenerHelper.h | 9 +++------ - 1 file changed, 3 insertions(+), 6 deletions(-) - -diff --git a/odk/examples/cpp/complextoolbarcontrols/ListenerHelper.h b/odk/examples/cpp/complextoolbarcontrols/ListenerHelper.h -index a1e633e..0fe4bd0 100644 ---- a/odk/examples/cpp/complextoolbarcontrols/ListenerHelper.h -+++ b/odk/examples/cpp/complextoolbarcontrols/ListenerHelper.h -@@ -17,8 +17,8 @@ - * the License at http://www.apache.org/licenses/LICENSE-2.0 . - */ - -+#include - #include --#include - - #include - #include -@@ -29,14 +29,11 @@ - - typedef std::vector < com::sun::star::uno::Reference < com::sun::star::frame::XStatusListener > > StatusListeners; - --typedef boost::unordered_map < ::rtl::OUString, -- StatusListeners, -- rtl::OUStringHash, -- std::equal_to< rtl::OUString > > ListenerMap; -+typedef std::map < ::rtl::OUString, StatusListeners > ListenerMap; - - // For every frame there is *one* Dispatch object for all possible commands - // this struct contains an array of listeners for every supported command --// these arrays are accessed by a boost::unordered_map (with the command string as index) -+// these arrays are accessed by a std::map (with the command string as index) - struct ListenerItem - { - ListenerMap aContainer; --- -1.8.4.2 - diff --git a/SOURCES/0071-fdo-80846-Get-the-parameter-order-right.patch b/SOURCES/0071-fdo-80846-Get-the-parameter-order-right.patch new file mode 100644 index 0000000..bcb4a9c --- /dev/null +++ b/SOURCES/0071-fdo-80846-Get-the-parameter-order-right.patch @@ -0,0 +1,32 @@ +From b50f1343fb51baf244761c424f3bb64be8125e42 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Tue, 29 Jul 2014 17:19:28 -0400 +Subject: [PATCH 071/137] fdo#80846: Get the parameter order right. + +It's column, row, tab in this order, not tab, column row. + +Change-Id: I32e69a403feaf18532c7ac241fa2a98fc65a4ba7 +(cherry picked from commit 1fcc30503549b47046c84333af542ed739f685ba) +Reviewed-on: https://gerrit.libreoffice.org/10633 +Reviewed-by: Markus Mohrhard +Tested-by: Markus Mohrhard +--- + sc/source/ui/undo/undobase.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sc/source/ui/undo/undobase.cxx b/sc/source/ui/undo/undobase.cxx +index 6342910..bc7a5e3 100644 +--- a/sc/source/ui/undo/undobase.cxx ++++ b/sc/source/ui/undo/undobase.cxx +@@ -170,7 +170,7 @@ public: + if (!bVal) + return; + +- ScRange aRange(mnCurTab, mnCurCol, nRow1, mnCurTab, mnCurCol, nRow2); ++ ScRange aRange(mnCurCol, nRow1, mnCurTab, mnCurCol, nRow2, mnCurTab); + mrDoc.BroadcastCells(aRange, SC_HINT_DATACHANGED); + }; + }; +-- +1.9.3 + diff --git a/SOURCES/0072-Keep-using-component_getImplementationEnvironment-in.patch b/SOURCES/0072-Keep-using-component_getImplementationEnvironment-in.patch deleted file mode 100644 index 0b8f005..0000000 --- a/SOURCES/0072-Keep-using-component_getImplementationEnvironment-in.patch +++ /dev/null @@ -1,354 +0,0 @@ -From 8071d87b62ab87b2a825394847e9313ea8ddfcb4 Mon Sep 17 00:00:00 2001 -From: Stephan Bergmann -Date: Tue, 17 Dec 2013 10:53:29 +0100 -Subject: [PATCH 072/109] Keep using component_getImplementationEnvironment in - extensions - -...instead of relying on the implicit CPPU_CURRENT_LANGUAGE_BINDING_NAME -convention. Keeping that convention an implementation detail makes it easier to -do improvements in the future. (Theoretically, the bundled extension in mysqlc -could be considered internal code and not adapted, but just be safe.) - -(cherry picked from commit fa2a7c1c95f78d20ed572091e12700fd4d852835) -Conflicts: - desktop/test/deployment/active/active_native.cxx - odk/examples/DevelopersGuide/Components/Addons/ProtocolHandlerAddon_cpp/component.cxx - odk/examples/cpp/counter/counter.cxx - -Change-Id: Iae41a6e072dabc2bf7c1481ba6cfed61680edf37 -Reviewed-on: https://gerrit.libreoffice.org/7119 -Reviewed-by: Michael Stahl -Tested-by: Michael Stahl ---- - desktop/test/deployment/active/active_native.cxx | 7 +++++++ - desktop/test/deployment/passive/passive_native.cxx | 7 +++++++ - mysqlc/source/mysqlc_services.cxx | 7 +++++++ - .../Components/Addons/ProtocolHandlerAddon_cpp/component.cxx | 8 ++++++++ - .../DevelopersGuide/Components/CppComponent/service2_impl.cxx | 7 +++++++ - .../DevelopersGuide/Database/DriverSkeleton/SServices.cxx | 7 +++++++ - .../OfficeDev/FilterDevelopment/FlatXmlFilterDetection/fdcomp.cxx | 7 +++++++ - .../OfficeDev/FilterDevelopment/FlatXmlFilter_cpp/FlatXml.cxx | 7 +++++++ - odk/examples/DevelopersGuide/examples.html | 4 ++-- - odk/examples/cpp/complextoolbarcontrols/exports.cxx | 7 +++++++ - odk/examples/cpp/counter/counter.cxx | 8 ++++++++ - odk/examples/cpp/custompanel/ctp_services.cxx | 8 ++++++++ - odk/examples/cpp/remoteclient/remoteclient.cxx | 8 ++++++++ - odk/settings/component.uno.def | 1 + - 14 files changed, 91 insertions(+), 2 deletions(-) - -diff --git a/desktop/test/deployment/active/active_native.cxx b/desktop/test/deployment/active/active_native.cxx -index 3afc099..0e0b1e6 100644 ---- a/desktop/test/deployment/active/active_native.cxx -+++ b/desktop/test/deployment/active/active_native.cxx -@@ -252,6 +252,13 @@ extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory( - pImplName, pServiceManager, pRegistryKey, services); - } - -+extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL -+component_getImplementationEnvironment( -+ char const ** ppEnvTypeName, uno_Environment **) -+{ -+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; -+} -+ - extern "C" sal_Bool SAL_CALL component_writeInfo( - void * pServiceManager, void * pRegistryKey) - { -diff --git a/desktop/test/deployment/passive/passive_native.cxx b/desktop/test/deployment/passive/passive_native.cxx -index 819f6ab..22586a4 100644 ---- a/desktop/test/deployment/passive/passive_native.cxx -+++ b/desktop/test/deployment/passive/passive_native.cxx -@@ -249,4 +249,11 @@ extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory( - pImplName, pServiceManager, pRegistryKey, services); - } - -+extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL -+component_getImplementationEnvironment( -+ char const ** ppEnvTypeName, uno_Environment **) -+{ -+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; -+} -+ - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/mysqlc/source/mysqlc_services.cxx b/mysqlc/source/mysqlc_services.cxx -index af1cabe..0ffe9cd 100644 ---- a/mysqlc/source/mysqlc_services.cxx -+++ b/mysqlc/source/mysqlc_services.cxx -@@ -22,6 +22,7 @@ - #include - #include - #include -+#include - - using namespace connectivity::mysqlc; - using ::com::sun::star::uno::Reference; -@@ -102,6 +103,12 @@ extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory( - }; - /* }}} */ - -+extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL -+component_getImplementationEnvironment( -+ char const ** ppEnvTypeName, uno_Environment **) -+{ -+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; -+} - - /* - * Local variables: -diff --git a/odk/examples/DevelopersGuide/Components/Addons/ProtocolHandlerAddon_cpp/component.cxx b/odk/examples/DevelopersGuide/Components/Addons/ProtocolHandlerAddon_cpp/component.cxx -index 20c2628..b71c694 100644 ---- a/odk/examples/DevelopersGuide/Components/Addons/ProtocolHandlerAddon_cpp/component.cxx -+++ b/odk/examples/DevelopersGuide/Components/Addons/ProtocolHandlerAddon_cpp/component.cxx -@@ -35,6 +35,7 @@ - - #include - #include -+#include - #include // helper for queryInterface() impl - #include // helper for component factory - // generated c++ interfaces -@@ -85,4 +86,11 @@ extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory(const sal_C - return pRet; - } - -+extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL -+component_getImplementationEnvironment( -+ char const ** ppEnvTypeName, uno_Environment **) -+{ -+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; -+} -+ - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/odk/examples/DevelopersGuide/Components/CppComponent/service2_impl.cxx b/odk/examples/DevelopersGuide/Components/CppComponent/service2_impl.cxx -index ac86ea1..fa6d875 100644 ---- a/odk/examples/DevelopersGuide/Components/CppComponent/service2_impl.cxx -+++ b/odk/examples/DevelopersGuide/Components/CppComponent/service2_impl.cxx -@@ -36,6 +36,7 @@ - #include // "3" implementing three interfaces - #include - #include -+#include - - #include - #include -@@ -206,6 +207,12 @@ SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory( - implName, xMgr, xRegistry, ::my_sc_impl::s_component_entries ); - } - -+SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment( -+ char const ** ppEnvTypeName, uno_Environment **) -+{ -+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; -+} -+ - } - - -diff --git a/odk/examples/DevelopersGuide/Database/DriverSkeleton/SServices.cxx b/odk/examples/DevelopersGuide/Database/DriverSkeleton/SServices.cxx -index 9e8fa4c..4873522 100644 ---- a/odk/examples/DevelopersGuide/Database/DriverSkeleton/SServices.cxx -+++ b/odk/examples/DevelopersGuide/Database/DriverSkeleton/SServices.cxx -@@ -37,6 +37,7 @@ - #include "SDriver.hxx" - #include - #include -+#include - - using namespace connectivity::skeleton; - using ::rtl::OUString; -@@ -143,5 +144,11 @@ extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory( - return pRet; - }; - -+extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL -+component_getImplementationEnvironment( -+ char const ** ppEnvTypeName, uno_Environment **) -+{ -+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; -+} - - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/odk/examples/DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilterDetection/fdcomp.cxx b/odk/examples/DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilterDetection/fdcomp.cxx -index e6b7885..9d234e9 100644 ---- a/odk/examples/DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilterDetection/fdcomp.cxx -+++ b/odk/examples/DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilterDetection/fdcomp.cxx -@@ -37,6 +37,7 @@ - - #include - #include -+#include - #include - #include - -@@ -72,6 +73,12 @@ SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory( - return pRet; - } - -+SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment( -+ char const ** ppEnvTypeName, uno_Environment **) -+{ -+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; -+} -+ - } - - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/odk/examples/DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilter_cpp/FlatXml.cxx b/odk/examples/DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilter_cpp/FlatXml.cxx -index 5cfe660..9dd347d 100644 ---- a/odk/examples/DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilter_cpp/FlatXml.cxx -+++ b/odk/examples/DevelopersGuide/OfficeDev/FilterDevelopment/FlatXmlFilter_cpp/FlatXml.cxx -@@ -38,6 +38,7 @@ - #include - #include - #include -+#include - - #include - -@@ -339,6 +340,12 @@ SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory( - return pRet; - } - -+SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment( -+ char const ** ppEnvTypeName, uno_Environment **) -+{ -+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; -+} -+ - } // extern "C" - - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/odk/examples/DevelopersGuide/examples.html b/odk/examples/DevelopersGuide/examples.html -index b33b16e..17db8e1 100644 ---- a/odk/examples/DevelopersGuide/examples.html -+++ b/odk/examples/DevelopersGuide/examples.html -@@ -573,7 +573,7 @@ the c++ ProtocolHandler example. - href="./Components/Addons/ProtocolHandlerAddon_cpp/component.cxx" - title="link to Components/Addons/ProtocolHandlerAddon_cpp/component.cxx">component.cxx - Implements the administrative --component functions (component_writeInfo, component_getFactory). -+component functions (component_writeInfo, component_getFactory, component_getImplementationEnvironment). - - - - href="./OfficeDev/FilterDevelopment/FlatXmlFilterDetection/fdcomp.cxx" - title="link to OfficeDev/FilterDevelopment/FlatXmlFilterDetection/fdcomp.cxx">fdcomp.cxx - Implements the administrative --component functions (component_writeInfo, component_getFactory). -+component functions (component_writeInfo, component_getFactory, component_getImplementationEnvironment). - - - -+#include - - #include "MyProtocolHandler.h" - #include "MyListener.h" -@@ -56,6 +57,12 @@ SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory(const sal_Char* pImplNa - return xFactory.get(); - } - -+SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment( -+ char const ** ppEnvTypeName, uno_Environment **) -+{ -+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; -+} -+ - } // extern C - - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/odk/examples/cpp/counter/counter.cxx b/odk/examples/cpp/counter/counter.cxx -index 6f65f5c..0773d60 100644 ---- a/odk/examples/cpp/counter/counter.cxx -+++ b/odk/examples/cpp/counter/counter.cxx -@@ -46,6 +46,7 @@ - - #include - #include -+#include - #include // helper for queryInterface() impl - #include // helper for component factory - // generated c++ interfaces -@@ -194,4 +195,11 @@ extern "C" SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory(const sal_C - return pRet; - } - -+extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL -+component_getImplementationEnvironment( -+ char const ** ppEnvTypeName, uno_Environment **) -+{ -+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; -+} -+ - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/odk/examples/cpp/custompanel/ctp_services.cxx b/odk/examples/cpp/custompanel/ctp_services.cxx -index c096a7b..a8f5702 100644 ---- a/odk/examples/cpp/custompanel/ctp_services.cxx -+++ b/odk/examples/cpp/custompanel/ctp_services.cxx -@@ -20,6 +20,7 @@ - #include "ctp_factory.hxx" - - #include -+#include - - //...................................................................................................................... - namespace sd { namespace colortoolpanel -@@ -52,6 +53,13 @@ extern "C" - { - return ::cppu::component_getFactoryHelper( pImplName, pServiceManager, pRegistryKey , ::sd::colortoolpanel::s_aServiceEntries ); - } -+ -+SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment( -+ char const ** ppEnvTypeName, uno_Environment **) -+{ -+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; -+} -+ - } - - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/odk/examples/cpp/remoteclient/remoteclient.cxx b/odk/examples/cpp/remoteclient/remoteclient.cxx -index c8886b0..037814b 100644 ---- a/odk/examples/cpp/remoteclient/remoteclient.cxx -+++ b/odk/examples/cpp/remoteclient/remoteclient.cxx -@@ -35,6 +35,7 @@ - - #include - #include -+#include - #include - - #include -@@ -245,6 +246,13 @@ SAL_DLLPUBLIC_EXPORT void * SAL_CALL component_getFactory( - - return pRet; - } -+ -+SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment( -+ char const ** ppEnvTypeName, uno_Environment **) -+{ -+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; -+} -+ - } - - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/odk/settings/component.uno.def b/odk/settings/component.uno.def -index 0c35f9a..1ca480a 100644 ---- a/odk/settings/component.uno.def -+++ b/odk/settings/component.uno.def -@@ -1,2 +1,3 @@ - EXPORTS - component_getFactory -+component_getImplementationEnvironment --- -1.8.4.2 - diff --git a/SOURCES/0072-fdo-78502-writerfilter-RTF-import-handle-u-keyword-i.patch b/SOURCES/0072-fdo-78502-writerfilter-RTF-import-handle-u-keyword-i.patch new file mode 100644 index 0000000..934a70c --- /dev/null +++ b/SOURCES/0072-fdo-78502-writerfilter-RTF-import-handle-u-keyword-i.patch @@ -0,0 +1,86 @@ +From 9f31376e9c55a00905da8f025083d307bc7afa42 Mon Sep 17 00:00:00 2001 +From: Michael Stahl +Date: Fri, 18 Jul 2014 23:40:40 +0200 +Subject: [PATCH 072/137] fdo#78502: writerfilter: RTF import: handle \u + keyword inside levelnumbers + +The ";" terminates an entry and shall not be inserted as text, +even if some over-engineered producer encodes it as {\uc1 \u59 ?}. + +Also, remove the special-casing of the \leveltext destination, since the +bugdoc does contain \uc inside it and it's not obvious why that should +be ignored. + +(cherry picked from commit e93f0852477b44df986807860c821319a921b199) + +fdo#78502: actually empty parameter to getParagraph() is not tested +(cherry picked from commit b9dca968c6fd0ab5ca140c65b0e54d153cd34986) + +Change-Id: I1e19c9df39597cb1b22bbda97853c829d7812e29 +Reviewed-on: https://gerrit.libreoffice.org/10398 +Reviewed-by: Miklos Vajna +Tested-by: Miklos Vajna +--- + sw/qa/extras/rtfimport/data/fdo78502.rtf | 12 ++++++++++++ + sw/qa/extras/rtfimport/rtfimport.cxx | 6 ++++++ + writerfilter/source/rtftok/rtfdocumentimpl.cxx | 7 ++++++- + 3 files changed, 24 insertions(+), 1 deletion(-) + create mode 100644 sw/qa/extras/rtfimport/data/fdo78502.rtf + +diff --git a/sw/qa/extras/rtfimport/data/fdo78502.rtf b/sw/qa/extras/rtfimport/data/fdo78502.rtf +new file mode 100644 +index 0000000..2a1baf3 +--- /dev/null ++++ b/sw/qa/extras/rtfimport/data/fdo78502.rtf +@@ -0,0 +1,12 @@ ++{\rtf \ansi \ansicpg0 \deff0 ++{\fonttbl {\f0 \froman \fcharset0 \fprq2 Times New Roman{\*\falt Times New Roman};}{\f1 \fnil \fcharset134 \fprq0 {\uc1 \u23435 ?}{\uc1 \u20307 ?}{\*\falt {\uc1 \u23435 ?}{\uc1 \u20307 ?}};}{\f2 \froman \fcharset0 \fprq0 Symbol{\*\falt Symbol};}} ++{\*\listtable ++{\list \listtemplateid300746803 \listhybrid ++{\listlevel \levelnfc23 \levelnfcn23 \leveljc0 \leveljcn0 \levelstartat1 \levelfollow0 \levelspace0 \levelindent0 \levellegal0 \levelnorestart0 {\leveltext {\uc1 \u1 ?}{\uc1 \u61623 ?}{\uc1 \u59 ?}}{\levelnumbers {\uc1 \u59 ?}}\fs20 \dbch \af1 \hich \af2 \loch \f2 \li720 \lin720 \fi-360 \jclisttab \tx720 } ++{\listlevel \levelnfc23 \levelnfcn23 \leveljc0 \leveljcn0 \levelstartat1 \levelfollow0 \levelspace0 \levelindent0 \levellegal0 \levelnorestart0 {\leveltext {\uc1 \u1 ?}{\uc1 \u61623 ?}{\uc1 \u59 ?}}{\levelnumbers {\uc1 \u59 ?}}\fs20 \dbch \af1 \hich \af2 \loch \f2 \li1440 \lin1440 \fi-360 \jclisttab \tx1440 } ++{\listlevel \levelnfc23 \levelnfcn23 \leveljc0 \leveljcn0 \levelstartat1 \levelfollow0 \levelspace0 \levelindent0 \levellegal0 \levelnorestart0 {\leveltext {\uc1 \u1 ?}{\uc1 \u61623 ?}{\uc1 \u59 ?}}{\levelnumbers {\uc1 \u59 ?}}\fs20 \dbch \af1 \hich \af2 \loch \f2 \li2160 \lin2160 \fi-360 \jclisttab \tx2160 } ++{\listname ;} ++\listid297210762 } ++} ++foo ++\par } +diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx +index 73ac0c9..ad23410 100644 +--- a/sw/qa/extras/rtfimport/rtfimport.cxx ++++ b/sw/qa/extras/rtfimport/rtfimport.cxx +@@ -961,6 +961,12 @@ DECLARE_RTFIMPORT_TEST(testFdo58646line, "fdo58646line.rtf") + getParagraph(1, "foo\nbar"); + } + ++DECLARE_RTFIMPORT_TEST(testFdo78502, "fdo78502.rtf") ++{ ++ // ";" separators were inserted as text ++ getParagraph(1, "foo"); ++} ++ + DECLARE_RTFIMPORT_TEST(testFdo58646, "fdo58646.rtf") + { + // Page break was ignored inside a continous section, on title page. +diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx +index 73eb3f2..9a711d8 100644 +--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx ++++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx +@@ -3466,8 +3466,13 @@ int RTFDocumentImpl::dispatchValue(RTFKeyword nKeyword, int nParam) + // static_cast() will do the right thing. + if ((SAL_MIN_INT16 <= nParam) && (nParam <= SAL_MAX_UINT16)) + { ++ if (m_aStates.top().nDestinationState == DESTINATION_LEVELNUMBERS) ++ { ++ if (nParam != ';') ++ m_aStates.top().aLevelNumbers.push_back(sal_Int32(nParam)); ++ } ++ else + m_aUnicodeBuffer.append(static_cast(nParam)); +- if (m_aStates.top().nDestinationState != DESTINATION_LEVELTEXT) + m_aStates.top().nCharsToSkip = m_aStates.top().nUc; + } + break; +-- +1.9.3 + diff --git a/SOURCES/0073-Avoid-inaccurate-floating-point-computations.patch b/SOURCES/0073-Avoid-inaccurate-floating-point-computations.patch deleted file mode 100644 index 03f3575..0000000 --- a/SOURCES/0073-Avoid-inaccurate-floating-point-computations.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 7a3eed5eb60d97fec397d3ad5c0bf62c703f8cf9 Mon Sep 17 00:00:00 2001 -From: Stephan Bergmann -Date: Tue, 17 Dec 2013 16:46:17 +0100 -Subject: [PATCH 073/109] Avoid inaccurate floating-point computations - -...otherwise at least my --disable-dbgutil --disable-debug Linux x86_64 build -failed the CppunitTest_sax_cpputest with 8999999 vs. 9000000 nanoseconds. - -(cherry picked from commit 695671eb18674ea58103093b9cf31a31afe8d2fd, -incorporating follow-up fixes 71448690d7c5904df45bf98243c5bb05a99245e5 -"readUnsignedNumberMaxDigits can read more than maxDigits chars" and -b9bcc9c5c10841dcdfa9ff5814344ce667678df3 "...and nDigits > 9 is harmless in -following for loop and need not be capped") - -Change-Id: I05e0febf413f9f9e01227a0cc4e0f46a5243fe61 -(cherry picked from commit 5bffe4dffd7496057c1fd70e46af800396f5b346) -Reviewed-on: https://gerrit.libreoffice.org/7122 -Reviewed-by: Michael Stahl -Tested-by: Michael Stahl ---- - sax/source/tools/converter.cxx | 10 +++++++--- - 1 file changed, 7 insertions(+), 3 deletions(-) - -diff --git a/sax/source/tools/converter.cxx b/sax/source/tools/converter.cxx -index bc8b0c1..429f5e4 100644 ---- a/sax/source/tools/converter.cxx -+++ b/sax/source/tools/converter.cxx -@@ -1120,9 +1120,13 @@ bool Converter::convertDuration(util::Duration& rDuration, - { - if (-1 != nTemp) - { -- const sal_Int32 nDigits = std::min(nPos - nStart, 9); -- OSL_ENSURE(nDigits > 0, "bad code monkey: negative digits"); -- nNanoSeconds=static_cast(nTemp)*(1000000000.0/pow(10.0,nDigits)); -+ nNanoSeconds = nTemp; -+ sal_Int32 nDigits = nPos - nStart; -+ assert(nDigits >= 0); -+ for (; nDigits < 9; ++nDigits) -+ { -+ nNanoSeconds *= 10; -+ } - nTemp=-1; - if (sal_Unicode('S') == string[nPos]) - { --- -1.8.4.2 - diff --git a/SOURCES/0073-fdo-81384-writerfilter-turn-the-horrible-btLr-cell-t.patch b/SOURCES/0073-fdo-81384-writerfilter-turn-the-horrible-btLr-cell-t.patch new file mode 100644 index 0000000..f65cdd4 --- /dev/null +++ b/SOURCES/0073-fdo-81384-writerfilter-turn-the-horrible-btLr-cell-t.patch @@ -0,0 +1,62 @@ +From 546cd96371b5ae012e4f3bfe963ea299e1dcec54 Mon Sep 17 00:00:00 2001 +From: Michael Stahl +Date: Tue, 29 Jul 2014 22:21:53 +0200 +Subject: [PATCH 073/137] fdo#81384: writerfilter: turn the horrible btLr cell + text dir hack + +... by 5 degrees to starboard, which lets the row in the bugdoc appear, +altough the height is a bit insufficient still. Why that works, is a +nautic mystery to me, i'd say this whole btLr emulation nonsense needs +to be keel-hauled, but after this patch i'll need some rum, arrrr... + +(regression from commit 0208ead70a9412ccd554fcef3e9308f8ca17037b + and commit 970160f78ef6cc7abacfa252daa8451e1f0117bb) + +Change-Id: Ie0c6ec88b6d6635379b9127f6460647f14776aad +(cherry picked from commit 5893a7536a0bbce57c4a2f89680dcb4cff3d06d7) +Reviewed-on: https://gerrit.libreoffice.org/10631 +Reviewed-by: Miklos Vajna +Tested-by: Miklos Vajna +--- + writerfilter/source/dmapper/DomainMapperTableManager.cxx | 3 --- + writerfilter/source/dmapper/TablePropertiesHandler.cxx | 5 ++++- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx +index 6a95be3..8271492 100644 +--- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx ++++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx +@@ -351,10 +351,7 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) + if (!getCellProps() || getCellProps()->find(PROP_VERTICAL_MERGE) == getCellProps()->end()) + { + // Though in case there will be a vertical merge, don't do this, it hides text that is supposed to be visible. +- TablePropertyMapPtr pRowPropMap( new TablePropertyMap ); +- pRowPropMap->Insert(PROP_SIZE_TYPE, uno::makeAny(text::SizeType::FIX)); + m_bRowSizeTypeInserted = true; +- insertRowProps(pRowPropMap); + } + m_bHasBtlrCell = true; + } +diff --git a/writerfilter/source/dmapper/TablePropertiesHandler.cxx b/writerfilter/source/dmapper/TablePropertiesHandler.cxx +index 3aa4427..e6576e0 100644 +--- a/writerfilter/source/dmapper/TablePropertiesHandler.cxx ++++ b/writerfilter/source/dmapper/TablePropertiesHandler.cxx +@@ -97,11 +97,14 @@ namespace dmapper { + + DomainMapperTableManager* pManager = dynamic_cast(m_pTableManager); + // In case any of the cells has the btLr cell direction, then an explicit minimal size will just hide the whole row, don't do that. +- if (pMeasureHandler->GetRowHeightSizeType() != text::SizeType::MIN || !pManager || !pManager->HasBtlrCell()) ++ const int MINLAY = 23; // sw/inc/swtypes.hxx, minimal possible size of frames. ++ if (!pManager || !pManager->HasBtlrCell() || pMeasureHandler->getMeasureValue() > ConversionHelper::convertTwipToMM100(MINLAY)) + { + // In case a cell already wanted fixed size, we should not overwrite it here. + if (!pManager || !pManager->IsRowSizeTypeInserted()) + pPropMap->Insert( PROP_SIZE_TYPE, uno::makeAny( pMeasureHandler->GetRowHeightSizeType() ), false); ++ else ++ pPropMap->Insert( PROP_SIZE_TYPE, uno::makeAny(text::SizeType::FIX), false); + + pPropMap->Insert( PROP_HEIGHT, uno::makeAny(pMeasureHandler->getMeasureValue() )); + } +-- +1.9.3 + diff --git a/SOURCES/0074-fdo-72850-ODF-export-don-t-export-spurious-style-dis.patch b/SOURCES/0074-fdo-72850-ODF-export-don-t-export-spurious-style-dis.patch deleted file mode 100644 index cb7763b..0000000 --- a/SOURCES/0074-fdo-72850-ODF-export-don-t-export-spurious-style-dis.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 854866140bff2ae4c587c7adc9b3170f06135437 Mon Sep 17 00:00:00 2001 -From: Michael Stahl -Date: Wed, 18 Dec 2013 23:34:54 +0100 -Subject: [PATCH 074/109] fdo#72850: ODF export: don't export spurious - style:display="false" - -... on style:header-left, style:header-first, style:footer-left, -style:footer-first. - -(regression from d92345561c998f7382cf9ef0fdcd29096f978435) - -Change-Id: I48c51fcd2b07ae8b0e3ec2c1087a388c6900b366 -(cherry picked from commit 8f73c7615ebe60ef71d6e8b49a0f19ddac6f03a0) -Reviewed-on: https://gerrit.libreoffice.org/7141 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna ---- - xmloff/source/text/XMLTextHeaderFooterContext.cxx | 1 + - xmloff/source/text/XMLTextMasterPageExport.cxx | 24 +++++++++++------------ - 2 files changed, 13 insertions(+), 12 deletions(-) - -diff --git a/xmloff/source/text/XMLTextHeaderFooterContext.cxx b/xmloff/source/text/XMLTextHeaderFooterContext.cxx -index ba423dc..335d95b 100644 ---- a/xmloff/source/text/XMLTextHeaderFooterContext.cxx -+++ b/xmloff/source/text/XMLTextHeaderFooterContext.cxx -@@ -54,6 +54,7 @@ XMLTextHeaderFooterContext::XMLTextHeaderFooterContext( SvXMLImport& rImport, sa - bLeft( bLft ), - bFirst( bFrst ) - { -+ // NOTE: if this ever handles XML_DISPLAY attr then beware of fdo#72850 ! - if( bLeft || bFirst ) - { - Any aAny; -diff --git a/xmloff/source/text/XMLTextMasterPageExport.cxx b/xmloff/source/text/XMLTextMasterPageExport.cxx -index aafe94a..cb3b2f5 100644 ---- a/xmloff/source/text/XMLTextMasterPageExport.cxx -+++ b/xmloff/source/text/XMLTextMasterPageExport.cxx -@@ -128,18 +128,18 @@ void XMLTextMasterPageExport::exportMasterPageContent( - sal_Bool bHeader = sal_False; - aAny >>= bHeader; - -- sal_Bool bHeaderFirst = sal_False; -+ sal_Bool bHeaderFirstShared = sal_False; - if( bHeader ) - { - aAny = rPropSet->getPropertyValue( sFirstShareContent ); -- aAny >>= bHeaderFirst; -+ aAny >>= bHeaderFirstShared; - } - -- sal_Bool bHeaderLeft = sal_False; -+ sal_Bool bHeaderLeftShared = sal_False; - if( bHeader ) - { - aAny = rPropSet->getPropertyValue( sHeaderShareContent ); -- aAny >>= bHeaderLeft; -+ aAny >>= bHeaderLeftShared; - } - - if( xHeaderText.is() ) -@@ -154,7 +154,7 @@ void XMLTextMasterPageExport::exportMasterPageContent( - - if( xHeaderTextFirst.is() && xHeaderTextFirst != xHeaderText ) - { -- if( !bHeaderFirst ) -+ if (bHeaderFirstShared) - GetExport().AddAttribute( XML_NAMESPACE_STYLE, - XML_DISPLAY, XML_FALSE ); - SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_STYLE, -@@ -164,7 +164,7 @@ void XMLTextMasterPageExport::exportMasterPageContent( - - if( xHeaderTextLeft.is() && xHeaderTextLeft != xHeaderText ) - { -- if( !bHeaderLeft ) -+ if (bHeaderLeftShared) - GetExport().AddAttribute( XML_NAMESPACE_STYLE, - XML_DISPLAY, XML_FALSE ); - SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_STYLE, -@@ -176,18 +176,18 @@ void XMLTextMasterPageExport::exportMasterPageContent( - sal_Bool bFooter = sal_False; - aAny >>= bFooter; - -- sal_Bool bFooterFirst = sal_False; -+ sal_Bool bFooterFirstShared = sal_False; - if( bFooter ) - { - aAny = rPropSet->getPropertyValue( sFirstShareContent ); -- aAny >>= bFooterFirst; -+ aAny >>= bFooterFirstShared; - } - -- sal_Bool bFooterLeft = sal_False; -+ sal_Bool bFooterLeftShared = sal_False; - if( bFooter ) - { - aAny = rPropSet->getPropertyValue( sFooterShareContent ); -- aAny >>= bFooterLeft; -+ aAny >>= bFooterLeftShared; - } - - if( xFooterText.is() ) -@@ -202,7 +202,7 @@ void XMLTextMasterPageExport::exportMasterPageContent( - - if( xFooterTextFirst.is() && xFooterTextFirst != xFooterText ) - { -- if( !bFooterFirst ) -+ if (bFooterFirstShared) - GetExport().AddAttribute( XML_NAMESPACE_STYLE, - XML_DISPLAY, XML_FALSE ); - SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_STYLE, -@@ -212,7 +212,7 @@ void XMLTextMasterPageExport::exportMasterPageContent( - - if( xFooterTextLeft.is() && xFooterTextLeft != xFooterText ) - { -- if( !bFooterLeft ) -+ if (bFooterLeftShared) - GetExport().AddAttribute( XML_NAMESPACE_STYLE, - XML_DISPLAY, XML_FALSE ); - SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_STYLE, --- -1.8.4.2 - diff --git a/SOURCES/0074-fdo-78904-LO-hangs-while-saving-the-document.patch b/SOURCES/0074-fdo-78904-LO-hangs-while-saving-the-document.patch new file mode 100644 index 0000000..67756c0 --- /dev/null +++ b/SOURCES/0074-fdo-78904-LO-hangs-while-saving-the-document.patch @@ -0,0 +1,1727 @@ +From f11ec770f360c33953efa989532ff21c28dd38df Mon Sep 17 00:00:00 2001 +From: Umesh Kadam +Date: Fri, 13 Jun 2014 17:26:19 +0530 +Subject: [PATCH 074/137] fdo#78904 : LO hangs while saving the document. + +- In case of framePr attributes being omitted in original xml, LO defaults + such attributes to incorrect values. +- Correcting these values in this fix. +- This fix stops LO from getting hang while saving the document, the actual + fix needs to be somewhere in the table layout. We need to restrict the + frame from being considered as part of the table as MSO does not allow + frame to be part of a table. + +Reviewed-on: https://gerrit.libreoffice.org/9774 +Reviewed-by: Miklos Vajna +Tested-by: Miklos Vajna +(cherry picked from commit 75fc9e669f209472ec6a282848166d96d02d84d9) + +This also fixes fdo#79391, but not compeletely on this branch. + +Change-Id: I4c35f7eff6ca1122901f5667fc26b849df527f60 +Signed-off-by: Michael Stahl +--- + sw/qa/core/data/ooxml/pass/fdo78904_fileHang.docx | Bin 0 -> 74704 bytes + sw/qa/extras/ooxmlimport/data/fdo78904.docx | Bin 0 -> 14388 bytes + sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 11 +++++++++++ + writerfilter/source/dmapper/DomainMapper_Impl.cxx | 23 ++++++++++++++++------ + 4 files changed, 28 insertions(+), 6 deletions(-) + create mode 100644 sw/qa/core/data/ooxml/pass/fdo78904_fileHang.docx + create mode 100644 sw/qa/extras/ooxmlimport/data/fdo78904.docx + +diff --git a/sw/qa/core/data/ooxml/pass/fdo78904_fileHang.docx b/sw/qa/core/data/ooxml/pass/fdo78904_fileHang.docx +new file mode 100644 +index 0000000000000000000000000000000000000000..dce50f3dce1abdfa07c994cba3b57dfae028bf6d +GIT binary patch +literal 74704 +zcmeFYgO4{n6z4nmjcwbuZQHhO+qP}nwryL_*z?RYyzlPKP4;I0gx!;-Nz7C$tzS75qIXUyL+|UwAjj;1Ps~f=g+Fp +z%C3zaDJ6qPx;7eAJ(Rw1tShSy2Iz}g@Og#Qq@Jilz*aU6;1kgorNKf4OArMgz>4St +zUmz5t7q|7zGFOp8Du`#`@ib6EU)h`|Un|S9ZsglavSLMsP0kDd3?2q5P*tZRL)SA^I7T5|5ttv0$(@1JT +zw%t#}Zr)s0E@MK+&el5!*MMsM-$EV%IrkXP +zGXjSxqST02#NdAdCq5AV5&C(CV1BoyS1Xi)I0#6p2mE)#e}6%N6#sviz)!;Nc>b?P +z{yz%9{D%nxXER$D2KxU||6e@(AIyaRW$UrYJJO&+u;KS$2S$^A96Qj&%Uk=BMIOZ0 +zprKhez#j0krQ7{|C4}9IJNoA@7c&a$IUzZ#JQcj)4MtjPg_}8s5(hS(b{#PgidvI8 +z*})cY67!8#_73X|yh*7=ys=C*#m6n-LZtk}<}8gRx?z+3s@;jWQcx-hNwYYwu{GWO +z6E7N|*;(b=T5wht_kwK`n(PMa@Om8B{?O+4n=?^plMqG@TlB`%wo>EHan@9?wAi+c +z3uJjo#P{@E=rBX3;*du4h;wh7YGvA!@=2<;r|tise_4|-G5&7f4I~CPc*>)`PBdB +z`9IrcHRTd=7*TsQt^y)EF-)HI=%&m%luO^1?br07G68g(khyo~2OH#JWP69;AKN!z +zQ{kH>kG)wJyS4e##*ZQEa`RfIhAYhIsbsu!TkOpJ`vIO9m@(p`v~e)=mZrFtCbj7f +z2fM!IVzj3T*?RhHFkR3##3mG?ulPmeTT9ILvieHo2d2IBCPWdh=xR<+hz?Z5>1RdW +zo#9QqS}slUBqjP4&cB}`WF9}y+q^SRq5Ds!2Fm2~wn6UBW!;loA-b&f9jY%g_FY=% +zQgb-@P%KAe)A(y1maj_uWT?g`gKa$pe#cd!u761_=Z=R3FN#cF`7qylQ+wTjh)YVX +z@Jrm2Gk17#z?{rLYAm4fCZ0?C<7W-Ti5>~5a{a&XK6WAx7hNcdA^3j9aiO(*`y3NY +zRMs~(mr!7(_B(%U^L~6KVN=UuV~Ak(V&frX37KM_1KoHH6^YMjw6w6C^eRx6!`%J| +zE5CF60bL-!;??==hwXjILwc!5512(r!}+mdEi$R|n;E;KpRpv?Pdz$JlaDGCHvM!K +zvB6r!!%13FxD-5OVxJ#<9f(}DP#DWUgP10zz$I70hefY$Nv*^VX_Ey^z|pB;s4PYl +z{;|qk?iL~R$#Rcvi$LfKXm$WF49ozoRHj&!1Y(?pWazLJ$;@+O4wj1wmX$%UQ(92h +z*t4F!VT*IWx?dODCRsjsa8{ARdfj2QPu(N8E7ZdZx85W<3@QKY-;_Kpetd5bNOq{r=*wY?om_qoHGsSY&8Sx6^yC5LT$3@ocZtVAkhY +z7RUVisGusB6|P~hS5tE^JeTIKi274R(~2#=2WsQ&MRLQ1fO(E#*5P;zZWNfxzJfrk +zBife%ZPgoYp~_UoAfG2``s(LxBAiukwO>x##)OmpEJ2EZVETanWdFYdp;nG_BHj)N +zXrmeg2t-byJ{jgow;+byyL4 +zdaV!$z=jW=DWzQD_33YJYVSuT)k>YPa{uu?n`qgn>7fzgf^Xr(J=J>hJ>#a*`0;&M +z_?=!|v5irO?-Rk!my<&`u?w$QK*>5iR`)QS$N$?hb%znSd +zlQ5fj7Pk;>8pw32<&_jK{n>itR}fC6zZs!BpEG*qXxPw$y?1Wsgrsl87Y>T|rlvny +zLY$D?JX#^~QRZ_z{?Y4!1M-A)7rz5r^drxcY?Nt!$8;J${?Rk0Gjhzg;vsNSQXLhD +z4slqfk8kjNLD{(t!7xs-ps~KeqqCQ>)1Yx9At5D@3p>8g(OYsTFdXuEMj6W(sg#r| +z<&;&68~fz@z}nd@SrSu-0Y41O3Nwx&#W>sInu|ebz&JU=Ir%x{#!nS&lo@sr#rW!# +zq#!P&39jXQ7C@gsKTSxROc;AY>W^*c0nkjGVI4minc{??DOFlTSP_b^Lks-vr4LRl{8;J +zlMWT+8!5rRH`FeSy;4$vTfHIKM5%R7HdzG7zj^O`zuxBU{g^km?a93jzxoHTjNbR` +z_36V#Ikp7^MO}=sk)||8@z!##6I7gB3kBQIj|@Gh-QVJ<=U>{q7C#OpNpzQ(vQ9RH +zITyYmV5Z#t9_Gz>eR+)oU0r<} +zd)t59e0*?}nvv}9UA>i-_jWX4S9}W$z)pBM*QCgXV2ZM3&tAH5DMk*-Pzl=IE&NJQ +zYTM^-Cly<4>)l~g@MzP?;5$D?q`20_1o%EU5<5CW&qvwwOtCPcU^pyMKx43{B{>c& +z+hr2u7yLcD+Pdx8tGdM7pWg$WPaGA`<%0LDd~n?mI@rb3Ik_Rm{ILZLsP;!2&C11~ +z`K_&Sx9&WWndxTzvVUZS0}5apC$e3fLr{#|DzK`RQInWbMsaHLxTAc$ev-;JE;(t( +zGnt@3RPL<>U?LQ=e!bEqa&-1?_uy=)_pM&9f}~mHPt#)!a;VTgUt-Ksu3`e>Jvbf? +zI#>2~rQ6-Rm-g+OoA&m$clK}YM)w+PLYfr3z~pK|I7)JVh9B3D!>)+fW#ga+eulq) +zuNi*dKLdV0WME)QwQ`54Ggn{hw9%VZ#LOJij;Excsi3N){^8Uby406%QQO|3N$O}G +zg0`ty&6Be7IZ6mXO*G=Jq8G(S*q`^qTVe>aRXh7*3mU2bX*jH6Jjt=m6yNgEwN&@5 +zcgPB7UzK^$v5pzJdkHhWEyIT3UtC1V;xlJNhoKgpjY_q{ +z0&Q178X?LN%M&EPOn9oR3$MgP;txy97CHNgh(*RT<>?J_=Kd68XK;dfTH=!u&5rAi +zlZkJNMI)gh)k@V`2!w738fRE@y^#}g(>iCyNa+UGE^*>g*tm&6l8^CqbR#8MG)4#> +zM2hFG)u^yT)Gk7f6aOOyz26N7qth6Igr^^t!7SNgOt@9&xr(S7M|9%eB4Jc}_)QIyO#kxjJ$Uwv6tgQh{D_ +zVf7b@R`ZV_?!hruNJ|rawQj&B|703_q-HE=uy@ooHft=06xH@^N05Pa?GB-xC!|aP +z5s(%fvQ^5CPCwD`Di(wa&=23>c6=(lsnxRO8eCwpL(@JoORrqeRBVjs!)KuWB``+m +zLck7x`TgGbT}L0OjD+B0y~)Z*l$ED&wp^Fmgy%SdzIk*1+r6X1bDhKY&iLIo7nk>1 +z+0wPYmuzIxgnv$&8$GDYSGJ=G*pIh1d%(uJvL8+s8Q_Nh*6V8ed$KT%Z<=V&J->X1 +zEKFvhs+MS>KPrg!2nS!#viTRiWxzmPL`lQI80dg$l*B2)io|3d-=qEUq(?eOPGf4j +zryuWtC@z+3FV6}iM&vO3hd3xN4d9AuK)Q%Ecga61%cM}jwsf+xCR%;7Q1LZ5PJvhx +z3V1hsS2y +zTF?^x8;4Ar<%Fbum0>gv7RC&BoyQ7R;{S8afIay_jFms}ea*lDF@Eo$)XHt>LL3VE +z{zV~$PBF=hOCt9Sl6_J#T0IW2V$9DOTZMy24ta!|IwTbzI7p;yev!;=W#0xt)$3kU +zX(sEqcnpl^!U2Ch)}gzbDL4c*YBiAX&*Ef=?F1j|Nq)*K8nJKghm>Og4T5>f?MQl4l&b*7>tXD)k_0J&0})iSZ5z$W() +zI*DgAm;5aq(f+7xg$FkTUUS{8RXMmF{M8BY#EgKXSBl; +z^qAV()^XYsZ@|2kS^~Ocj?_daSuf3;6r8zX +z1PP_2(K6&w&3+0TB^g$G=MS8n;*8wad$FDJ6wt3t`=P+~HvO1Rav-CZg=%E!aPt8r@;-9tft%*n7y( +z#$f|BVL9mxAvr5TsIb5Rr*r(Z7=B#Rv3I*o8E|Y?v17wbT#Uw;hG@h?ocC-7BB}w67v^sJyT9L +zWXD(lK+nRzG(+s3VPGUTso%3sba3M6r_0}TP~!+SG~%NH_{e%N2>>|dlkS8|{=iSb +zzAO|X{c2D6%`rOafDoYT;guJn@ME|cDYmfMTaKor5EmMu#L}Tf-as7eoVfI>TQvfGIaUt +z14ENm1t)hD2Bc+~ji6GfXISel$ZoYb4&K$Q?(=CzXZSBqOy5GUI`w5Qwt^jS2#;@<=H6{uOYZr(#Q +zPd7&*oaGENp-_!Cx>t};>otU557hia6`*Kx^u%hA$6uY#1>+NP>Pp%OeL&iHWxE@~ +z1hG=cp;$l2z}BDmiIw=F|3!hc)%yXe2idgX$kI5mpn)miVlV)91E)brZ+en8;^o=! +zuU^um{{vUR;9NBQ&E|HRUJiNblCP`yz0vodF?kCg7;>U< +zd)j2m>y7iiCjIY;#W{WMaKA{LvCMM?k?6X*_(PgB?8l15eRKL=hSuN1MzZbVnTUW} +zL;m~3cz`jRF=J(WQvX9^e2Q@5Wm6rE$eUoC5!IvCXm2@(c9|QK$L%en0Kj +zPRTFGS_?f$@d#wLWGE?g%rQ5isXhf@)Y!a6#4#+cl%&4cavCvGSd=X$A(Rt3pLjw0 +zq~E}nCHE}y1DHh;E{L_;Q$dn2({hPg2D*^R7WWYpjOaA%Y5a +zez8eF5ecUoBiUP9fn-)OUf*

_=ckef73-i&RQn{c(r+=e+>=I8AZ5cWcA^U98Ip +zUeAFjKWk7B2m(Z1nHp6?5`r54w~mx^PFz?M>_Br#9jc9`HaqP#c>)Eo4Se__5~Hdt +znvfu998Fa~V?caWr%?{apqcQVSb}u|6##@ZHkhMEAOB5-r(^3C*kD^bz)rIm`Be#7 +ztA4ach`X`sKkuzf0N)Yh19+$(_>rFWH +zyki>I|HmGOAo1uTj;+(U9|nuWoM2B{fuS~vx0^I?UvUkOxl1%?*H;;5Wx*(BT7gl2 +zzl4WQ?pXneU^78D6R3Ms`>OS~^B(7v^h}qn{7-4RkG)LzC#rgfF-U*AFLrcd&c9Z> +z#{~&lRJv!Y#J1QY`jK`6v(2}|w1|ar*p_vWlTeZu9Ygad@IW?09OkWPgpHSOU7HBSs4 +z0>WupO$byn@!D46cmynW%_-aH!C~)X3PUeAC@B~q^9X}0xk_bc*>Nd0b|L-Rr4%D# +z#VK`~O6=OKKsLEwpGJp8mmuw5Q})AB_A-W|oVfNnge38n%_75X&P$ZlqDG#XwSEKk +z0KG>{2&u0fQYz)AX)Z>;L6YQW|HgjP%ii&*Q@W|Y+v$e{O(Rw*88JLBpH&^P7) +z%jL&AtS0q>n{w2PV11SfX3#zz+)+sH0qP-}CB45$-`Go52&ZepyZTr%HX`sU_>-s6 +zVEj?vU@b6xLztxCUoseL?9)~uN{?*UJwum|;5Q@I=TApc64>^#0kbo4L6ln#{fhv6 +zEK1j=Zf2}7NLHVv?yW}@D*dowGyKt3h-a4Tn?}Q8m=(>)=j=HK@y+c2|nkxG^*tUz&y-{?xOVOpj260_A*{ +z2@m@b_6=m>E+U(~$sB(MJ2MlT;8iX{-# +zztT)3wTra|40p&^=@It_C`88f5Q)H$LAj1Om|O$MIKRkQIX@6F7)k%-!QyA22iZFB+4;=|rq@i2y{*!X +zfYVi)4EoP@sg950VJ!7F`J&pu=W;#tfDNMsQ`n2lmc^p<0K%38ei9?dSiDI(a@{IU +zHIm@_;a*Ic<-cuF88ByItcDNRNvV|%Q=-1no57@sI2;UO%^|`v&=!mIBf!Xta;T3&&XiUA$sC3$?O1I^5MX3vAp# +zVnn9B=4(=_=oXMs@Z=9hv7JmNj4d)2<6r6B*}Y4#HrD&_RRXN&8j~l~ +zK-oFI%@XUr&Pwrl$(4sa#YKnS`hSwCss@>?dmM7*f4k|n%``WMaO-$Pn5%Q<&>Mz< +zo*9o5+~vbJ+9=I$Ga=o7p?UF_;&O%F@l4ejy0Iiv~I{=cSi +z-Z1+bYh3b2gq-w?>j+dm%7)LeeX8=+W07m++y1TLwj_Sf3qE_DJsSsGH{nP7>u=-k +z4h|gKx(EAu2ig-yTt3PLI(%i^+9GzS9?lZ4VL4rim1bSH5)v-*SHWsl{Jyn4h^yPU)K~Yzo-Q2-WPvGKF +zLhH)Z9E4$68wPZ+-J7I?;GxXLE`t5;5a%QwEeYiOeb|EVyB#Ya(Xk1;;E*jLlLnNH#%WLVD!j +zz~A+7U#3*7WC#8b_*8hqjP}o_2at5s_C~ +z>oeih18ux=L?C92=(51KP#4iPqA-V3z9TMN4R!LZ@n&l5>rrf7(? +zy?`68RS|47T$G|bY#$P;qs1p6iLRn|8qcSv2b?4NY#C<`U!hzt}!Q(`at)~PEiG=pCU642HzPTq_rFJe6 +z549-xkdsHSQWg3`B`%(oSn^DuR!gK*QNqLPLZGP33F5Zx)p2qS^qcQ10>KL9>&Wiq6v1^$ +z#?uo_@2*%#4~-{KWQya6G4?Jy2S))ttxG8>L`hnQ1Y+Qdy*(!gJUyZ0271qP_UBM +zN9yVr#pZbEE20~LEOQy#JK_YJakQ-p*3f)Jp{^U +z+sim^!cxtHZkb-*B$IZ!)IkIeto_1hOh-y*$Hvapc;8;#Yvqc}`o_rI{JOe_MGK0@ +zl9&DVXipEHM=UiWmt#Dv-b!!FPN5G({;uHd +zbRV$257H_t;Dsn%S*N5xpf~HU#fy)59>_bn%8);F*6P0g*&Dc@8>V585Q7;0BUUZ= +zO3k?Lc_(blxjgZ9%vmy(?{sTkfuVu&UohaBSF$d&$W)v-X113NJaMDE6*ar +z5j-)yPEX!koqWYwvvy=TXDJ35c>h;;DajSgp3;Sk+Yq}SjIFFj6Mx)Jw~)RDVck5v +zuCxn0AFfdy1p0yPHdA_7?R@QT+zl3ABqsF58~E1kJbgOQ=@(?ppSVlN8cdA&$iBQI +z)i6PYvP#hf40O;DaAk+)uTXGyMBOo&HWg7B!Zw?^xzD9};5?lZ0=Ib*39J>eIr^lH +zVk|B+WM+u?T;fw=w@U^11pn`|KQA~*Wal$~0rEI5=Tl2QzEnjCIJQJh^hMr}>bhPN +zhc!&aqAm=tz*3mAQ2;dh)4r(1WH=8 +z!m^~K7mmXMeW}AXglifNK1O;O)qe2vA43&#dx&#;u>_HYBc6K@&c);hDv@5*LuT() +z9WN}P(mCGUC1Nk&*L;FEFI+ik7CC;?`5w +z{j>l|TJ<+s6m<<#9rWLC4E68G3&zHJqlXF52YtP3l_XS>E+Z6ExKZ?etfZ#p)s8Ki +zhsMvj->;*!ADZ8h6mtt6)QCeCafl#Ayt9 +z2(+0uO|kkRJz=l9kc016j5;{?c2kyprJgT{j;{C*#PazPS7PHb<~1Vy! +zRjmoR6W`9wy6g&^91aUy?9x;7Xy*vt!X<_ +zQXrm8Awz{OnBi-&M8vJ}BPieGgdZPz&MvpI48`B<#{FOiGHLlYrK8IWy?xnd<~))% +z$8$uPLhK(KjB^odxr)R+^Ta%rN1!Bt|3mNOJBi1!a9NitTp+w8;ZSx+FtlYfNrP@O +zqcEI-1r`GRr4cGyNFHUFgBd;Tn{Ejh`?m}wXr8NMqLouB)Hu&J?)|mLN|OnN(KC+A +ze(Cj>+=v`nu3*o2xLPtsl5n`zRuncZUE9-qRtH6o#PTLvk`Fm?Np>fqCQL{-b%h>@ +zOvfC@?yy%JevIVl1ib~yGXOnJ07mqe+|whbsV|ZCq$UD*W5_9A$UopG2d`mQvri0M +zDi^6u+b_0%_wpDQh{y{6^UM}e$md5get3D}w-;kCFeo!gU^&G{=SjlZ`ShELgQ5E) +zUeFT7F;OL=upf~YXgGx(%A+dd;-%4I=++qg0`&H!3ExS6&wD;{)W^%3Me%pqnvR$dgQDOMn@+z|%Cm@@ +zA`#u=+BW62&uG(0@oG5I-b9<5odF^(dP}$_Te7kX{9&jW4$(Mse|5jMfH{zoP@IJ< +zF@M_I9pJ6HLn#W<*#k_?vD^lw@4)o0Pv*UN7M%~=R_%~O&&J~S`^Cgxho6u$N{1EO +zr>V0T4C8IOe-o7H2N1uV(jXt`X}v|-&6B_@+4x9Ss`rKeQt_R`1-xR`9D-OoUlV(^ +zspF|f#40z)RKDvotI1PC<*stg7WPf`cx)9`ajQ`n*tC%m7n5_v8t1p7~cM(rR&0%W4~gQNQj)f*usVPpJ*euUnSfq<<63ZnE6BUPfeos!6` +za^nABLFpT?K%8~l>sw!DQSxB@H4`$z{ +zEs7#(M`$g9#yhw|v>O%d4L2Yku`iV3xi#tlW)G{cU*G}jCBf5{qxM}lTv`x;Fy@V9 +z*9+|pUVsYKKw3=<`ZkSv?>=@HT2Brxx6DRwCc20_0Cq@nibDlQEcz^e$uVdQEQQIT +zG4_h6Yo=po*M?&W@J7g;1#+p~R@Ts^7zjK>1EE~J#(TmkRsZIDG^B1Sfc4tLlLs~# +z5JzSxOTDdZ1_>q8&z-sGB5Nzw7UjmNU&Vks*-+$zNDUUaI5g0UYy?7GhUJJye7Pwb +zY2i7Y8*b~AFb=&Wc+UB56MyBFc|l>*}oiKB;DL7b|48F{SS_CR23$eL=xQhC|jz;<0%YhFiwZd-Y! +zMq-4Ss*PA1tc8-P{~7ayZ`68dh16@7C1Gn4(ZZ_LI+vvW8Kv=%l0H_{i0az2!2yy1 +zzX75pPsU5X$hTljrqydLm*jT>Qv;Kfba;eAY0JRK!U1hZQ?)|^K(yfuzKsNXIR#~n +zh}}8S%W!V%QK;CFSCsb*^v8gC)H27;H^7N6V~I0a%IA~8ojEzt1TeMQZgMbiJ?mI* +zdWbt+$IvZ-v?74H@@J!xklT!+4naXt`E~-%o3hnXy^gD(*!#R=2{UcxOwr90W=Sq= +zpwwbIB-$vTCxNQu4tUgfi`^IPMB}Lnnxi;h)rtH-ad&O#7I*e^BzWTY;^yp7Bkjle +zR%7o(d6WWp_T!W79hf?&NH(i;0I1%Mqre+rCdH=HR4CbWC23&T=**aTp +zm2&;@F-7bZoY2D0#le+WE2%VAL>G&q6ZbH<%6!$OR=VEzw=^=Hv&2rB!mUzk1F0vU +zKsOr~ENU6MRUNI7>@Dt7W<%^RT)ocSd%q8qDJW)`Eq*Cm>Y7#Xcl$S`L5l+vjXWK(Z3Zmc5qtJqZ~PA*G&MzEpHKmguHzK6@o@v7 +zYT2+aY!`su5DpsNJ^HTuG?vVeoCaFJz+0sR5x0k6-Jwb_K=b+tvg8_wlZSK!JChMX +zf6IfX!?%pgYSSGsvsr+`+RHKzWo-bXPvjb@3RfVF@pM)ss#L}n5el-?2QSzAE|sCK +zu~PnGJq5!qr5Bi5lUwRO^?__;fmkF7u`wy-Xl&Va=;16LxWU%J#`Yg_jOTC6qeh{J +zODN?ZdvP^iU{A3-AOen(O#^4i_)7sD@jU}3Lbf@JCj4Xj*WFdhS1j+d&@vWyj-9R* +zfwn2aSm2ZoAUPRM_32*N%6g$yB{gDP>m84#z`G>WU{$G1#Q@sPTa}Y($0UA{0X5i8 +z*v}~mJGJe2O|~KkFjPdl>poP59y7at`^LdwK(!w>nxF@T_ekq?Q`&SwA@1Qw&8v5B +zLS6crrW{iLJ+L3`%QM8bbMxr*T=(t0_RX)$bL{TLwqvNuPX~gu_g!1TqNkL2=$k1y +z@g;}1=<@5-eS`vj}sR +z?mqN@LC%9^2wG<97OzWDSo3nxn3&7%jWOoZ32acD1%D6DD>buGv5u)o`VA|y`APFJ +zn{E@trJ2pk^s0U+w#nK5n(MZslTS0>0^4}XLK*pPY~C#*n2zvKgIe6VYe5?!QKhsK +znc@Xyg%Rq&fuLKwS|Ubet-w|+0L~%{z%FuO6n%mzi;$B+-Vk&K&>{$F=|y*ThW?QG +z`FVfv`7mdJ%O864aZ&v20(bpg2BC>MC~g`LZ*LRRpuPQ0gQtgJoOfbp{&?!X-zO}% +z@dFR~V?Q`gMRoPCqCa9SY^_boliy%#KV#w;)0a%hiY%{pe?fz%YxJWzD71SL64y=G +z1Wj=xMYWVkA?E4(CFGHy#~GT4)2!en#Qpq$(-WAURrGV!eS+SrOK|wT3PTwVPx)Af +z_!IB|cE5VL)qUu`HR-8>gNF?%!7@0V#v3tk6vt;XRuD +zq8mhnE|TTBFJcF3whje88!QJw=+9_#5IUYnjZZv7Ks}TQb%tRbCWJOixdJia@!^v- +zsb8;te4X6?s^CDj(+ieqFpAt}GgTAeXj?get6Q|4t@|CW-~PA5)UI3pDLSuZDveQa +z-}`*<>n*ZxUJ;h~6{k8^M*_I%3sOl7I}|rFH%GQ3$pS{9Av! +zl@tD|gp9%RY}IU+(`i_#*bPUBV}csoCE!T|kEUd%4A2YY0vrx{e;);?W0~$m7zndI +zU#^auuzX#tU{x4&PzFz? +z4?8E%2EA>Y)8}Y#gf`0`$xWUMp)8A+I8IWS)ze|)tZAbtiiqJGmir&|Nu2tRhLcU}n6?_=ga?@5iZ&j0kc9_A +z7k|OEg?_*ZUv7^tVTWKPxk?ZYfkZQMhXQwO^Dvu^Ww#|U{5}cqwTUSV9kN|9 +zs~-|=shO}VrL8iCG<0nWLCY?Akuxq*SF& +z0`5%LU~=sSjr#>mo2RjZ2VU<)FDZmPgc9+s4=}lnjU|8oQ%ao}ZaB*A#i?Jn&n9&{ +zaT^g$@0=vLtJZe*SNc1oF~_d`)hsmt(nuynHh+4YcGNsfvER+zZmQ_=Ic??Ih=D+n +zM<@il9iQOqAmH0Ut_M5eLCBWDOSgZtOXbA9=4b-e)+ZLzgIjWbh(2MV8^42FC>D+> +zon#b?L}Eb$7XSrT)fZEgl3Qk+Dn^u<*)3;$&W&(l*oN0A5}99k1UEvV2o`FXslmL> +zkm{&Y)kKt+;zJ&U!CRdHP}rO*+xN%hF3xxeWdXfqVW|E5`P)$vYj*;~@MbD|aqv8+ +z_(y!1aMgrn&o5xW&z=n>u%Djd=#smMlNv`@(oz`%B&*3Urla(Iv!*PR>*(wcA;^hKPDL8t4l$EZ-xrh+=e&L`nGE9u|>f9Bc7u+=p_v9iG3t+hdLFVbSWPMGbTQ$5HiEs)!d8O@{hY0R*;=xi<>4zksvRr +z`crLe(KVIusTw}$*eD2KxFNCy8++OTi@;ytPdDdF|S#WyXa=}STAImWH +zCVB5o&{cFEHU$PS3xx@$I1VYoLWv2e@&uyKNclrc=SaM`^(v`T-1g$-q@w{v=AR&s +zO>#JX3hVZK{7+J?FpXxJb(wp58XOw)7avHkD55qtxJ)Q4xFo=qu8Tbwj#3n!Yyn~u +zs|~z|g=2!GdK^_4w6rQ@Sn>e`i4rkMaIQGhP>l(hGb)kvC@DEXNnWZqeLTUv^ +zP}LbJ7!IiB>KpTRPndvs_FrXsr@3S|vKkW(qg>hX8m|B}6W!ah0(7=|^>1(RRR?G2 +zvINgiCcU%nPaKAVOSb$t(flLtgGnPp`2>pGVbBrfU*ip$4x)MT8en)-_z|pJzoU9i +zi@maXTPX~?KU#<#bsY#R^q{So-;-tNTagT+)u6T?;N_}099%8B~=*a$XcR>$ikEHh=h%c*LZrS!4S$SDB_Ud?+K|c +z8{1z)I{!jEGWV!LZYd$JEFO)GHmAAaV!`!rjLJ3$JJTo|SZ!<}VGCU_mkE9uTl}_& +zwH%P(B5vx;?j_muv9v|S7v2fb%G@-K_Jk6=f6ECAQQ5N0}xA>Q=U#zx)+(Lpg+ +ze(#$EU4w(t?uq(RBk$W-fF%t$IK|K^FqA$cE>M09-U-Bh=_93Zcsb3o8s|9DJavTc +zJ&e4O)OdL%(TgI%*e>dwT^8k4LJfU7q9va<#jcz)Njqladi{X|+&5$>T;Zn{h@#|9 +z$efxRFK4y!-ICg +zfvHTS${$l;s#uQmp$XXKQ(T-3mk@`H!Z#+f#`1bc`}msn8u|;zG!kB{IX)dcW8vx@ +z$TRT~+Dk;W|MFCbm{*NKX%?bQVwh)ysL^}|FQ-}^Erc=hQQku2+0yy^Jltg?1nr46 +zD9>y-0#jj_+u{g0O%AAfW5;rx5BCWLDro4p$q9%F4Rzi3Xp>*k8tVk$(EbrlA<8W) +z#c(0p1FT%ZYs$6jkGj}L`_caH@AJLcSg$c4xTMUR@mlzIu7eIZ8P2a-WC^-EC)f^0#?xMTjJ5cEQ>r7DYVWv4SRyBexdmeo +z#DP{AIs-^G746>(fb=o9rDKHLKM{>uND6lL54)R2$E%s0SCPIIrwc?AhH!j~wr*r#q$A)LoRVr|5?uIln6zC;Jr#0%n4WnMS;%5F|5T +zTVWK_>`m066$-y%vqwFx)3$sv9y{G2%}HQ$w|H?g1tW-O{Sn-_LTqtm%`T)1&Nm{A +zUiQ;BcoEnLhZN{9JD3_q=9~_=P0uocbJ@O<-52B|0(orhi8XYF(a4Dw!?LvVRT{DR +zeIEy)<8B|lVAHa*R`7u{eDB{j&laOM7F=yeiJ)0BVSAZ^>#nhfV-ZI9FvS-T?CuQ) +zoXC5)&7RVy7PVO6X7`kNgc +z(+w)%92xtHdJVv02zYmPlBfaAI6m@D{UC3re6&$v-a$EK^<7wq$0n3&;kmNHw=G&* +z__WWdUez6;OTVmbur)#-<4zYH?7DU4PMZWB7V +zd|Zjs4Otypa8Og#aG|x^tyN+;pQ-ptqFV$b!iS&;x}Ia{Yq7LoA~@y!pz~a~+YGr( +zIjTmn)381>qLY3(dn&HG&URuNQ<56F9-WNWB1KF#Am6WHF_?YD&gZfA;#~YI)YHkK +z#4R3JR+I$Y?fh6jKM01N3oN6Sh}0UwH&g8CTGNj0cJHR=?shfSD4bwVHKoDj+mvyN +z$5%_oEDzp8_yO+(H%{1;H)lKZL78|k^zYW?g<26;<@^1{{`092BiO~`TOHQ3K0A@& +zmD?*^8l#y|P6Tz32Lo*DhS|&WeY9uw_4vZ<{l*aT*zq&_d*=H^C&0ta+m^E=n|tuJ +z`V~ETh%x8ZR{@D;)jV1C`ipL1;4agdeuvS*6_W*ivJV_3atM+Nqbe7k%{HWSkP9l4;vIC-@E-C_w34>#&cPe_J67-AV` +zBK{wlXXfMrxV+c34Gsb(y^t%;3CJ0cV7h-jQ4tMAc@C}K?FfE3Mur^_{I%cS(+fon +z($foV^Re*nv5-Mwkd0dYe$vu3>K%QL1>P?TE1!%j{=oKC9|5@mLJ)#TBC1SlSJA_) +zhJ&Q-q#^v8toQ}15rQSuc|7!6AQZ;0%D|ZN9^QJj;Z4%5Ta&=2eR4-*swFZn|2#Yr +z1H^SdD5MAT4oa#4aDok#t7t`;+aIt-E^_LVS=z@mL5(4 +z$9GAr={Mkn4Q8R#;`xn}tRcLLffVitlagOUW5uTa8RVNUtm*18n5YKJ)~Z6G-!Fs#@`cOrG7z#li=3`$2=Gf%@PWjkq;f6pnO^JVD=L9i +zN^sstOMIu3GIb108#8@OyrhblOdT}%Wbp-)g2c3(Ahj?>q`7N)Lyt(bD}z{1NeuP3 +zQ`?^8_Nu#72bv=;lZ0igKqsz5-2BR)kFvH--0|vq-lt{rm1Yqpi5*OYSRuZojPx)`P~V<^ +zBJ+4~aT8_@)d}Df98*g>)Bud+uVaD%tDYOPU>oZe-J6pSLkMlo{|{~N9AwM0b_wsc +zZQIuAK5g6X(>71rwr$(CZQFMDY2&o@_3yp&&3k9!PQ?5(6_Go#YDZL5t@Y%}%Bm-G +z6)f{Ul4!P}f}453+hV6x@KSDp9J2_~HN3Khc9phbd?XJj*B({mwk(#}SA^Z-Y9G?J +z^o_eqgiyiXwP__URHg6P?VXmxfv7F>%YeZfNsauzEE5RptE=6FVMG9C-8Waxduuz8 +zM+Hq?!F8(uYdsqJGQGBJ*-)*g(FL0;^tg!p9hOL`aQ1_x-ssID>aZfT-Oi+m1uGVm +zELy@JE;iYz#8g!^o1`ImhxqG*(#@~4|H7*rnlctlk~9xNm#AxBDvnUSl+)?V^P)kH +zLtr3S+Rk~?ErBDI_JC99i)S=@M3na635c706Yk4x$$=U-s46hX$)5vH3SgCR;j +zdO`;)J<9#zF++_xvo%`KkU*&BaPM;XWoBptgcrracx=S^`>bz7FJ(9bE#KUxua>9 +zS71|{S{wSE+NX8hpjtR3XAZhehb*G;-%5aMug8?)+Qe%3q^2vKBanfzBG&}r!jEYL*{*SuDGz67 +z_ZwU`{}KotVc52KD)08DAh`?*n{1G%=yCE*A<&#Oeuch#c~=@OL;e_6C8w|uW-IYM +zmZ5z3gmqu*c{+jX1@zq?(uf=@!ci0A69W3 +zjk$k6lVnn71ZuXZSj;F9r7K16hGa*BKw9 +z{ksr@hHT#)jd@NH`URH9=gt$^-7t|=rWAfzOjC$`G43iUQ9B<7@;gl5IeVfr`V95Z +zYH9=7Eiil;q9b{mtt%`mtQr2Wl3J!ThCBvM(EtJ`M&aLg6_1L3b@Ra7+qo +zEz<2oC~i+NWa_3&O)2w$`Zw_f#apNt;h7=JzcWEOC;P+YMtiWW$v%fXNpj*hby|5s +z?eZ^kISnG#lcUQt`eQt>Fc^mLKEb4yB*dM}LYhD06u$a#U&FbJ(B{Pn>kU!t0viy? +z3ZiB|h<6f{VI3P*6JhwU92Vm5LV2Ma3)ve`=L0X)fa}6-Cop>U7kAJj4z=+A;lCUh +zL;WzGNMA^z@(Yg%G4~^MfKqZ{(gAh%X3*>^DBVm%y*HK#R9GyM?TKnGjw*rP3Z|#QgGLHUSOBTTasmq +zWi|9UX(_oQ=#`S$&c4sIITAGI@A7~@3EU)N>ed_KTL(6F+6S1Y!ZQb18Eh(DAlNnr +znOsqbCD)P+SyUMQ6l8F;S}VkezFf>6J}Vu? +zqSj?ySua((AmW4!A7MdA)7MV~7vFV2PYiyfWVLAyY(@w|v55{HBRg;P3@`L@DwI9{ +z_t$R=R9D|YX=Ot!VH7ZC^I@tPaiV^Os1poM`ovGA&r}7Qz55Cs2vQ&_Ro;88iJ?H+ +zj|X0oC+HJ~1NJaeBz88O>O{{;QTN#5NdDVG6^=0IT4+hVFlcahJR^mv99CdIf8Xo0 +zL+N@OAj?(+<9-sW^jv8cH6yjegq=%mX;gwexIAs)P_uKG4O*e#P1F!e22 +zkCLseE31}(UlU*fiA8pG4o3#~2q@IlJ1iAziG>%9g`1rCO5(koE7w_?`}X??eQrSZ +zZ3Tyen;3)3e+OvIM=b8ig1Y$u=Cqa{ATNbpKyGRUshll9D@avQThxp{2nS+^8)we) +zLD_fSCj!34Sf_;is>^9M>&E_?KCFp#fJn~uQnd9YS&wYy;|nG@nUvG~&5H;d0pm>$ +zz&mPWBNNSDRKnDhWM#|~ZwG+K;bj)z(K9k)laQd~EvoM0g|Q6`S;rOG9vbpFbj4Bo +zuYej-*eOS%`2uOMr}X(DtDQhZ{W0coKGrxg151>~Lkkq&muLP7@;rM}GP3CfKh`8kpYipbx%C#4Z<|D-~y~>KA18R&m_~lrs +zJeAPfGWl|O8BNN@I!epFKH;oboUSXO@oT~p`;7UX0;8D&Kf!E~evx&f^UjE`5cMbc +zVWT_S7u-S~<4>bMlmV+>N{|}v*XBv)E$gksox!cM5?T9R6?TIhxv`ooFiD3t&a0ly +z-u3EfLGAT)XTVvo?)bGahykM(*@rjw(o48$@7He=*usxclmqr0TU23teg1bvKO^R?=bfQzHO +zk@jO73xQ)l%54=(>zkYyoy;P#ll9_-2U2wzr-M122JV$)4}0AQ!f}U!aDPV} +zPVCH4L0VP)s@?CV0Jo_dZOIh>sH?CeX+j`!!J6uRFR;vb&wLZjqIG{$XU=yt8Af8M +zqqWN+vKmwhOI|3L*!M}s*(RR95s)5mzC#;)X1wea8kk!R>9isTdm;z9f9f1?aB7n)bT^4!40|2x-msp4 +zD#0czj_&xHj^wN`ggvFm7(rQk+UdF`q3=k2V98>|fo@2tadj>HONyc9#Zeys?ZRR} +zt9QF>i57chB%3EGay#QS07fhGd= +zMxt1Dkyfi>b1VJ9>#V48%+N$jLHMrp{#lfk$WAg{Zux+VhQT>#5VT?YA4LlB8 +z+`UA4#JStF;0SPWpFnF1)pVhz<#U5W4}oLHl^k%<-OR9kLBWV8lD0@0hISajWNRerOjK;3)Z6_ +z19We4dh1V*D$(il72+z>@@#(8+4>!nCgW*vWqBF^dzi&R*+1r5*?+r14rxVr_qYJZ +zPAIk+;Qhv6QfjKV5vyvsf@(uF*qsz`KOPK}Iw#xz)Fb%rP$m>}O6~b~i0{ILuP%a2 +zRodw6K>%F=CP`Ys_~%bHge?HUIU;OTuD+nLD3Wohwi +znfxsUhYjY}t1r!yE5t#QMQtX(#e9~}Ma`>c6U>&WE?q`p!qh1c1lNQ2f^@z0&2^a! +z4DvN3Nq|TUP}&m;!gLJh5sZQSm6i;uGG#h?0`X}|I2?;Hl*B)qu}-bxChTYmnOMxZ +zE$m1xv=xI{y42V!`57u8(TqTiG)H_{M}i5H9P%tF7Wb12D5 +zLW`_6Q#@Dw@XXNODwTq-@h{BwaqLL%g_@6I_jeSPvwy+b>QeqX#^=c>Qs(|yR$E8% +zHvp1+F7=dgUR1)^#jpi6ih>-Qov2X>##zp(!&h?IZujotmLblTpox-cJt+Z=L*sutg*zkbe}uQAdR$6)Yx-E{@W^SsG|$ +z6dXNF>^N7+5-n#D?C3YcYERqgW{ICC6>V>_427o`DSA&&F6cV;-l?wv3KwPqj^YS5 +zvo;A|KTSk20U>)n`Cu`^hGysIGES=xCetWOb1IrzBJA|}YpsEL!Vvmya+k2*EGj-1 +z7dbqz>*7z>>30@dxoKN&@Af=t?eSQ=@;E^FSt99J +zT_WB7HfMcb?!*En7Esrd*uXK~df!i#6!OB|#MOYo8tw+q{&O0%q^wF;5-7xdi84c1k*-Cz~_;r%*_=qSIgmN799K8InK;WjYf`UXs>3?3+`y2 +z??G9M!nv~#oG>#8a~-&c|Nc^k*V*SnMI*A~JdmrRg70KIBFh2}m8H~llJd-`sHd9V +zVjo&7#Q1aFw}&u%Db+1JGx3Q<2rb;BPEZ-+e#ygHkCzwpyXRKy6D{KT)kC*q&UXj4 +zL;IS>RcM8KkhAEds|Ujq%mmFwwc_Ct&U4-bvr%=c-|_+Ec%pz3zXzdLXcD7lg*Xy0 +zr|2{DWsiGamny|r`}gFC>@#srNBHx!euY=Kt>}YYM<~@@DE+5r*Gib@-Qk#}Li#=H +z$((PU+8w8CMKIZW(B^=k^T*HPiPi_s_fdvJ#|zJb=es{iG(E}dIHND5D-f!`Q>Ww)k~X3BtF*8W#r{gqA~kmt{+-A_E=(vLU&P@EubYpqC4 +zD6{&cc)a1r*=Mc40NpML9XyH}%!Z+>VKu@Vam~>1Sqpthk(+dD41*h0?X{E)ej)xe +zev@09h%W=_)_RoYTj4HvM`>eImshR0r^TR41l?^K?ORzHknP8(#@Ae0_yeA=hxH>@ +z?sZMwn2nUa-Wc5=fYJd=Dhh~CBws;<)5mkbC#P#@%L;_I4W-4zyzn+DFv(PZi@)rF +zd1!~i+TPbg?Ty7z2i*0$UfFUR>GF%68bpMqg{?hLaX^uuV@h;#cu*FU*7~j?#E7Nn +zbsEP}YY+=2giu9|Gm(ywR*d67!l$A$1jFa(7JUZzP8Ysk#z0Qwz~R9G<9j4cuUe!f +zwapSz)<@ElLd}3~cdt*MSJ9PP&2p9H6q(@}x>~SF~uJV!-H$XX>^$Dr%xc-+d|iw +zYO;BB7>EWjyu*l7-m^nU&1Io>{D0s{{s?|l8R>8ZTLf$hyPY>@d1vQ!vO%3nZ;QV6 +z^vhujC)Dl6v!9gl4 +z1BWL2Ya^_akY-BM)wZ9E@eF$^v!A?$_2u-Q16)DyZT>wHRWBZ@?`k0EQ@)~nsYO>T +zQ%HHU9Xy-H2(ktIECZGTM4VZ)8g8g86bwk-3_&aY5$yB}p|!;!wCFA*L@W1BH(cyp +zOzjgZAnbBvG-V%^{V5pj0l@)c%2ia*82C7{n(t2xPjfI7?p&3KRZc*cob3~$Ev9Se +z6!>k)n(_#Rl#3;eZQPzA-vU(t3{2o9W2>N{EE@zquL4g{Yn{Ne{ME_WZYX&7U0xGJ +z#FfPQ%7bRzbEo%&mXMq;mm}(MGl=hqXfaY~#F%^jWV +zN~=EB$ECzgl%Mfr5PaHzygbUV1~b8}U@+;k3%NyRF|d~ejQbq^#wpQXd^{&=mF)xk +z{2uExH={Y-7KIxk;Uq~>ht%CG1H1Z{w`?pC%Z+=AMTJ5^sjIv{W|F`cMQAoF^%QV( +zWQ4AZn|wUTJRUcnqYYR`W{kLaY->bFJVZ#Ls#QTx86`Emojgy?gFh8>_{9=*rBy~E +zB4{6O=Lgp|MK$S@Wv>HKHXn}0y=6a1jL^+K*Zx8;;Z|PG(3gKs(`n1Hu<17I{O(-e +zT&*;M@j5~1O;1fS1%2n*OS<2Kxh*}0xvblPMyz%h3{lDVkYfWcZnm^fKhk$v2~i32 +zQ@A2$H`yQhWBydr|NHXBp2;t!otL$^ +zGXOONGI5x+SxD2!|AEpCW}RWMCGoaRLPb +z@SO#!U6f@1xUet#PJG5O72mlS+4eRCT#)x_@j}aLw@hg0%np`qUkqy)aE6w6D>9G_ +zT4MSjMVj9yeR)O<@en`;62Q%Az6f!6QeEzO^rUyPABy>yZa!~~6d;6%nfAOn&RdG< +z<2sL^hRTKUTiJL?B5ccfa|7pW^Vzw1Fga*$Ph4cuo7VItnJRWlOUK}BX!NY8vwKHa +z|Ei`|Oj^@m*TS{1>I+;)w;h%U^h!ZN%eCrw4AJb2KAl?iPkgak@v?thlYGJGbL1BY +zvxo~k2kxn4mj5(EeMV{*Ca6ruq6E2mLe1UKFo~(e&z-n|r6n|_k#KcDZNxIjD5FbS +zF!xh9_3d~h*VgSk66NDRgST$S4dMYLu!;C3dC7dQY`Kk;nHU2)eDu1e)ulJI0yKf@ +z4@Whf+HLN4JK3?-e~<7&ak95$I$O%tIpk0cE4KX;vk6v=8hF8tsYeVc+Ug?WK*Wiw +z;2AUHu~!N}{E9*7EV=-(7a?Xwe%*pecdUy-TuVB?Q^T+;dA*h +z^w!0P`O){5@D#Is{dU0j{%PBC4G(OP&%fN +z2y9;P1}Q)v;zu^9>Q6X|KY0c`@c7u$+diUasl$Z$;?vN(b00+91a?RKdV%a+3Irik +z_Oh;bMBlT00g4>8KV;+>Jj}H~pNA+dZ4!B9Z_w(A(%q>pOnA6*TJG(<<=-w*nWJ9| +z3XdUW!OLazdBNrgH*|)j1Gv6&r`WTOl78#qI@dteWM%#BH1xW6*ybL?ZH=tfTz3~U +zv-ZmxpDUmPZYH|uVjQ##{{0>S8L7MPZpS^rs}V=^+R?N#&KMLoH+;pc`AotDftrLy +zdMA*{cwaDnE-;4TALh%oH)-2k#oEAXN+E>;ZKdFKQ_V;ulZ1e(AD(2XfNXSJN9qzWB7*{4mh1+Q@#RgCvS~%}HF!sgRI4g)a1=5_ +z^{(F-BJdX{e+LwKHB?Vgb=Ir)O4c#0wlg2SY5w7B$^F61&w_ak&@|RC9l+Ppx$Cmw +zbZAAo<(>E|heL1OY{a@*IH?$H`jAdM_BIwHK2b+>+3UwO)3|W +zNIjTC6$E$S@f(k#bK|QYkvU9izJkyqsZ^DCHGz8Clw{5b)nF0sWii*`iu6qoc&)eD +z$W4#T{F7Pow6{>E6=ONXy)^a5{R(d8>{I(6Ono?t)Q=WL1}aE*P&`G}8$uoQkvg8H +zK&wW3<0Wz>sWca3ei4p5E!zd9Ppb>}3#661#bFQg2bQ&O1pFo2&!;8#R1;dWeP16O +z$3L84lt>nIssN7PsqCL;!xn|e`+H`*>V?I0c*;}o5(7Z`IigF6;->a_?MB5Wr)i-l +ze_++>y8_!HC6Yo`MqvONU@z&IxbiY)R=>mJ!(qrW0)0#*i~lb5hgz^CmnY01)aTB{ +zWR#Ou4>l2JVua+8I_>scyJZrKz(10b;c&9wM`4L53!YO@>M);OIg{@2U2Q4B6F`O3 +zb{+Mqd6K?5Dq9MLFg5bGv=L$EjFfxQdg1TjR*u;J{&J|B;1Jgn(z?vAuwJB;0VM +zH1w#5IJjgZxh};R4csQFb0)-J_pCl$$!APUe#OG?TRi(Um49A;FFHQZ(~mTs12ee?>h@jp5H=;AsQ-A&G#~a^Q1&_A5KnB@U4mA!=PI@RWc$VC4 +z&Ral)U)*9%fvYl@F3HvN_1F6svx7GNhY0S+Ze14ds|rcW-D%HTfi80$+0*C&#M?kn +z-69$!GM4}}^IuX*GO%UoH;`L+Q2PGj!4@JopsnMqP9!UwSgAsIyX+ewv_pzs2@yku +zsdF*^fs?u=5E`i1=L1V{lRn+aTG~u9l*j-wfq-0)Odeh_kiAh5T>IGwb0b23M_GCb +z5k4}Phyy6WS>{+MejoWx6ffTK0W(IG$Da{5o#TLN2^LoBrHjCHgyRzeZxTIiXnKiR +zJv{++l%LbMHztDKMxE8er{rNs*1Ru5*NiTaLMOTlZfOBaQ)y$BR&=H`Nf}F_dIj}q +zS@QRN?^CbjW^brAc6GbPFC5gt7`cA)21FG**AWrmGsn^5>{I#zoRhfbc2^yOrwNi+ +z%=z=Bv_s;WCKt=tJ@=qvzOn}!CU&3UcKew*s`oFAZ8yVzZ2jQS`32TCrI{idX)`4{ +z(jr;0n_cP8%;{aAA`k4@E9d51Dmgd@We)<^hS0oIms?;|T^PY`t&Cr46HH_pyPG`W +z)B}@Q3l=U;Trrpr0`Qfz*kb}_06A4p-gT{m+^NcuU}pSt4a7_&9w3Vvt>e$>0tt_< +z?CE|2`pam?h>pNKyVpE%ig9XNHGdd*xd+%=(Ac-PR^kf2*v^p>snrwq>aC@CR?hQF +zb!)ZM!*mHFnJ2C@tU{LNks`Z$-7?#x+wY0S73AKGhht|T2yHJj3~Bhp5iWPo`b-aUMu7}!J`l^1kKnzTvI@2OTA`z=ai;JK0q25rOG{?1d +z->~WxyF$E1l{lu|hE9JHg$QM3Gg>q5YvzGG!IR?-rvc-Y=-4i$s7xgyddeF}GxHg$ +z8liHYGR@V)n?Ir^lyPASHcNbP%Y? +z|7L_IF)iww +z+*GW!w|aq)BD^*4?HP+_7Z@+68xYoY3|bU3*L03$U#aS4jcPA?n#bYO)rZF}+5)p` +zKRPPitCrDb{gcBGD^?EpZt3V;aS8EKdXtt>D8}P@U!ySts2+V)oQfx7N}0=kwe1SS +zqJE=vCEWjhyOjVE*SH49uLo#r?%QL4*ypc1T#%U!@Zs>0p*2-SQnRYT03thdN1C_a +z%Wk*qVFA)97&x1t15#t4fE{#w`Uz{%;ZnxolHFZ6LOZ!G&;g#bRt;RJY?12LdT+}5 +z%9y1{8jA080grb@H7d>&&O{aQOUsbYQc@OT*LD{^XR8`D7Yix(U3Pozg}CPkURXuH +ziz5PArFEIc(^I!|fxtn`XLjByP?7*_9ni8P?A-m+JHyCrs$jN`KOdxixUtfx)H{`$ +zmfk&~%+zzt_xmymgP9eNG3#DSn8F4Av?5uni2cqYmy!y9>9`fgfdbN^qI{DyRTzkN +zHJjiP0p;jOrLr6(m9S-j=a^{V##by>i*gldzF#lXV&$l7KF=tfJ~b<`Igm;7eO=K5 +zH!Riiyedakb`=-8ZUhgUxV>PX9*FTnxK9;o=gUpU@l0r#eq749;1eVPBX_$`b>~Yy +z52a@h*k>zKy_~vUmrH3dV$mCEEt0ddL+4Gb=K2JP0JyI4(b%6QGEJHR53G(PDqmnx +zx8k4)60~S%$FHO9KkjkpTIJkFo60bi+|v10H8u6PgjWc%5ZpgJE(!e +zm42w21ABpW)16RDOoPFIZIUT2_v+>oJzPlOBu6n93BhG8H%JhWUxY_7+w20H;fklI +z-2z6DMOmOYw0(83r0e{lsKp5SuEe;d2SwF`kbID28H05({YNP{Cos(?)})V+IM$^G +zpqkvB9w8Gs6Yn5#w|NLuH6X0OP&UPO=X{f3c@4~6x?fWK-QI~EDPVGK;C*d8BXpwh +zSQD17I^gA_an1ouBq{x&G*=yjlCFU!>) +zY}MYuJ8sbpY9&(F+cWAG**icLaJ!M#(cj5neiSm~1)LJvrbUCG6^@J?2X}h@1qDRR +z{RI7cQn$-oSsf8$UiP%jvks9^Jat)IE=Qd;XZ-gH_KGb0XYS_Y%N(Q_~4 +zpAaTx;gAz{-RNg$)0n5BW@`SPmawRd14mgl3{2mptUOON5`{wTBxjGZ$a;>k4c!~` +z;LBkx;(QsJp;&JnsaTvJAuui0dJ_oAEMIz3;J})j-n?IKWx>snKV89hY@OnJTIz&; +zh1QN(svdL}t??_=JObsX*NGh&f2d{W9-kxK5d<#T>CL{4f`t)gr+dY9?#zT=I4TwiJ&U%~SIEzvtK45N +zxsUSzh~GV?+a&K^h!5>6q)hstB0rMo6I!KY68EWK#LO`;KAZ|Hkd$?hBX}0X5!Em1 +z6Ltx%Lm2A@4K^T&4eAuC<}O9Tqb`|m-g*sEr+<7RPQ94%n=dvgp(UpNfz8S<5Em&Z +zlPkGd|HWo1kks=Ke6iMh&1%9)L68S%k$?o9^rqg)`upoJEeUDbZSPGtx_F@peH`7S +z`drlQ!I#zV00|r2B*(I?SD%VP6hAq@qyQ$=@-nmTQ-g>@IF80ub-uRfT*u8m*Ns72 +zx9w=Aqz9&uq#!N=@qu)Ud#=Z79zxRa5W(r3d5RMYf|`mYb@`7u@}&=xU%|j`uLQJO +z&diVBq>&x4>p48i6W+sU2E^4jrF>;d#Xm)hy3T*NC2YdKCG^=;rrzA9m$Aq&=ocqz +zGf1&K07-&xnFv&0Vi#+*Np4|TA8>f^rYf~J>Pf+GZKxV^g|(=iRGU=Qs9dfcoHDh$FRdjMKYUm>ui+st +zZ7zoPl-hjf**%_+#bVz-CJ_3w+FG|mhL3khZNvxa?y-nagB9q$m&e9B(Kh^Px@aGz +z&fM6x2iF_J0*)Em+9=M*1ON|CZ!d?WQ*A%0Xgh-V!1o-Pw5wNlC6}mj6)$o-lfIAk +zsG^MNlz8eN-1`ao`xq4Pk#ffI5VAtvYAzh~n*vxSx2)6kx%*70zF!+u=!Z_Php@T- +zl<}gNMWk%)b)6dRv(9W+J|xow5A8|8^KcaVO7Wlo8%@sLvl3>p_hHwhBCSh3Lp{Z| +z^eZXb8RA~e_@H9?l+G8-7`n^M)%%tB0;>{*d>;7hpl6$keM#@2D4r;X-~kErSQuuM$o2ZM?+UyB-I{ +zm`ce|pbU&cC8VE|jW!%YIwIm{Zcuv2FFoEg%`x6^9#zLOOQC0wvxiTY@maL!hQhiN +z^S!;z^nj-zS%VHprQUV&1x~WY+S$_d>^!bt1hy?rJ7_~T`wk8A(<^dn(W1IL#D6s; +zY&uM(ZKqUBG0LQsO7kFc}+LdkZu-OC@vAc%Ft9l|rg=Ro~)2`GvkR +z2dRGihnc?aMASUxj<&4JW?^m=t;wv_!}M2Pof_7LZA_VVwEGbbTYB_JNkOm_T$6KU +zb?ZrGLur6_stQgJI6FU;cbB@a&ZJDuF|u=brGCV=5u+I^rbd`-5uMbSzt60KKMBS}6on$)68e?wWQ807=#xB!YC;Vxk +z>&)z3$0u~aK^<2fqprC=vn@BC4@m7T^*> +z`o!?D0sIC5Jcre^TT~m9-|wZQ3kmmwF54Q54}$QrFi{`zxR@!gFsV=TlRms4wQSzG +z?HMF;Wz7ax2-3i~FX$jt+!QLiYA^%X=$%7YulKVX;V;fjSL<;Z +z0ROzg0_z*Ze=={Q6S&(Y{}v}uZ~y@D|2Jo`&d%OqBLY0!t|4|C(j2VB|j$VT-E7hR`qflRYSUM=HsC( +zk|kNf`n3FV(R~E>V7}Mx?h;R$UA#l7Y3+JGCtQsO5)~-~$AU+M=~I#yJz7o*q@Hmb +z4>qjy{n_btq*K(SH}4$DTMNxbX)akk6-xez2B%3Y7JJ-9j;#>oR+T-F4D{O$E&t58 +z1)3R-+IV>PvKv7*v|^X%O5YdWpgfgiFWEtvm@)+=l4ZE!LvBKI|L#3|!$sZ)r%z+h +zjO4P3Xr18=>3dR;4ZdzO1hdYihV1#cbKJ*)^*y6#e8nL=so&MJIRo0jS+FY7PfBAf +z#2pd)Tz@j(Jao$FZ2xjHcwi+LW;!&^vHAulj3ZaSU^=ao->%y#oxM*$os=D!Fx^S` +znC>R6`m$zy-7EWx4R5Qt6a7jEYqIlrNu@pGI+AC95q6?6qLlcUN)Wjmaq%ckI8O<=m61G}uvQH>W25Ep?8oK7v_0xfyE~c({!7>>7%I{|* +z6`J#up(v9O2F@__4<5$Z48DXwU_aP?4_|J}m{f1rZ1>T&aLs6QWlv1H_5J)ojIg0M +zJO8s*Eg~g}_VSCVSNQ`f|WJaMA38zGm%(!;@G*_|{l!s&MXMtwL4{?*n +z&EndZJyE%Ntxe&JA964Jtl*DG#0@0LxOg<#A{RWt?zBZBZj{3Qo4lP7s5l~(mzoiP +zgq;PZKE$nanN4l7W65%m3wwVjqdHG;${ej`)XOhvQIP<|q!h1dEB}lb (A3TGp +zUo&?}($Z^5)_9FthK6vn%APvS6F(kW?LyeN^asnP}@a07J?;4HnKy3=+ +z!vy`QpK6RxE08d$gzPc{yKSp-Pr*7k(eXC2M9+OHt*KDkey7U~WHrDvXVzSt1t*8X +z%?I+hH?W-}l@ai$xU!|nlapNgECppc_N58`X!KsxAopL79RIt;@lsO#{6FO2f0Kj! +z?+yOH*@@q<9w7X7xTUznBfip{x2PyCm0(bP0CIK(h>8cGGXlp~+VCYTw3nB+55Pg< +z_&nNpbiK%{EJB`>o+i>BGlc~n$4Yg{jh#-ijnIm319o}kvS*_Iz1DT{z9}z9-v_{#>TIo +z8Szgh9-`x-@&=O1qsB+O?1)?phqeSa?c&*W`ZmRG0|7^7OI1$zwOtD9RgAJwHPe<-P!KL{xdY1nuJtxIL +z4`iSoad>n}i{zhrv4?^B$!@ivGR$%kn;$IC{l-%{vxp4WR|IMuH+d|-Mf%Rh3EY6! +zf(`TMtYo-wvdLY&za1n-ruZ~DATEolJBHkO(dwQfLK_Z!&;x&CEwx>s{3kgs$^o#* +z{$rO5@^5l%W~^`YKjb(we#~OvpOzEU9WciehqA6HeSwQD7?U>vQaaCpz7$NlF}2~+ +z=^TLQUUw7ud7U#iY4Vn*GVhBppPpHnOeN84OH=ss`0&BFr?L!`rPC}J%cXtSF|;3sjFOy2+)?b2`0mi +z5x16~_czHL+?=ip@DEFn-6DRLhw(oK9#G_dN-R7~T@GwzOXuMwR;u3G9N*9_3c+{t +zWgkcYmE#oK+v|zBf|B>5{Ia6_<y>{zP*kA +zPea!E^vf-OQPv4W1c?ngqVZ>)sy8CAmuZqRn9dIXiU{888;}kM7{F&%vV^Y=(9d(kwyIV4 +zUlzu}1>LP!eWc}s`_t$C;LtHJ(2CC$Sb_mVsShRuZ3hWthbv^}VGl|zglq;1s+R-; +z8IKQbo0JL>5sw7m`o{qMzcCQn68tp#zQ%vbf5L$Ef5l)40LaZP?A`4B`bzuyn*0W% +zsx0Ey2|Kf!3-#7se;t#eRm8T3HEwtrl +zg-4Pmn~RObFQ4Dz@AXv%B!?G-juMlgK^OV2@lT46h%lET(BpB`Db}rE5TM#ZLBQ&J +zI}xCRK!`~?!2$rGpaf|03L41Rj?NhP2<}3d*q}~8$@xNX*kGVAxLD=F=;$cunD`As +z=vZC&?HzH=t$iIW7;R|z0{=TTgk9+QjNeac|CIkk4cmWHgZLd<$LinX%`d8U%*Krx +z`5Sh;a74Uf*!j~LnixX59_+!pdeSxY)4N(OmV>U)OC(!Fh1PjXOp<1YSDa*3Z_!fHJ`n! +z9mykRncW|^uQ!O1fSHhR`P^- +z{c##02tZJZK+%GZ90z>!bj>+OE>j^OQz^jEhwHXr9Wvx&f1|p0yF;Hzs68bv-NPq$ +z@gs3FBDlwgsuX+datI|J#AVwc`z}0a&29f~cl^Gs>^M=Pox^Zc^7v&NEg9_pbqM{R +zqViv%rT(wb`iBz$M3k?(e?VZ6IsgzH9ugWB5dff*KnRTq0TKX0l1>T-01+|Bql>{% +zMhE7o60pOODofESl!kC(GNa+jK`CM3^8rT#pcQe1Kz>ljilX3gKyZg5V-t(h^Y8=x +z^9O*DkW)jlvcX~?HUi*TfEZD!n7|u%X;joi1PLEwWqAExq(ll6$O4jUL4p7G +z5OZdH9eVq|n}5oG3NhyY4zYjKYY+hV*1d1VV=?~Tg!~Ialmy0mP@`t|YjNWe9EaIt6;EP*BkSdvyO#f%|_t{x3F&|BVgsZ2mEU{5aUicp1fhE6%jEFcacbSaKZN +z$FV6b=p9DP%1~icEfXdgT6RLDX8!mxOHkJ_<2Z9+e0wWsICw}r1WZ3CEEnK_AXq{) +zD{;9P$T+M-@d)gcxP%NbnH)lNK!%hPG;C}!R%r&f3l&vO-fT^+m}2~px=#F$)$l4_QskF|w=aBx +zvWk_f5m-EAA}YCcoe%pdA<|nn{)F1gE&NA@DmQWJOwiQZz{W1Bxb3E>r=5=Q6%}Cv +ze?2ea6}ydyM9Gzu2|epckw~=8a9b+GXUNlGEAuv0P3>?d8Scbg%+YP^ +zm@>Ip`Gmhe?Du)VYr^8)drb{;B~VO*`oJNaqGFZSjDhhCmLGlPdSikQyYCPO6#IlX +zD$;UV8tt5*YD^5wOa|;)>^rS+bT0wJ>gW*Xo7ix=vm;eoIkX8xeLqy +zYOe!|Rg;;gM188Z$IO%YAMO4>zTPo9mtgA}jcwbujU8vlw#_HDZQHi(?AY9~ZS2_i +za?bnXzTwR}Js%5wvp8gVS-owcb +z;%V65`g1BRJ&4M1*vv)G=daIoxq@P&h`IQJFJ~`%g9ng;TEa7xw%Nf)s*Ha=FK0&y +ziv)9h@9*X@m)tc+zTXBZ|9pISup|97rt{9FM9K`26gWK);ad%x0|ICfVdzhv+%W%Wv<{4_)#Ronrf^qk8 +zoJDp=iijvg&vq+Z1-^Ei;n7jiGL*Qd$?)L%Jz#Zgq%?A6?5#1}6@@zbr{_0}3oD|u +z#4SJ+kNFu(4h`YAFxp?I5C3?Wt81n6RhP84KxqNBQwA}78CqGEVp7UXv#3@}INuDl +zGq^8Tn6$6l4CGaG{J-@$LY5`xm0-S33&VIDe%6aRpnA+{VFe}I`T9( +z&XQOXJ^qrKEyt-qKGJeK{R#~TBry2-QV^vzA{FsACy@U7Gw^p4&2A_U4K5LOdo@Rpe-(C?yiVM0AK*$BTKjHF22 +zr_MWrV8J=8<9E+VD+`5!l`ZNoaw$+IqMfM}C&=+Gr|ijXW5OtO*NhF739)SW<2A1C +z`Vi_)_dawK;+eZ-EfDg!i_m3vtEbdzO+K*~z1k9nk)(6*mb2 +zhdD+qC~c_}?+}|a`^79>BOtCF&)Y-N9$>TG#rIF5JdMTK*>pk@wslK70MD^e%MIMY +z3=Dz;v~C8M*)UBgOp#s`j!Su2v!o+dyH>~HO|tSq_K=qM>;XA^$q*H74RH>(DHRM5 +zy7}ztk4agk3$Y)ez)$vK4b32fmz825-p*R`1Lj-RwY3stTi*A~6eR&gQMkfgsF+pJ +zOJn;#2&!|G`6#s%GGcR#_Hm^(wxyf<+2p#fPZPVBTxOQRO^#K{Y_le?oE|!32HR5m +z0f3Z7+@qPg$ltH9N+ozB->j++z95|7v;j~4h%476~GnzOQHG6$!PnO|eA)k_Bf${uQ(iCrU#A>ro4AP0F!7`#L +zLn#&LUZM!lxaTfdI@C +z_R#)9VyV4e$TPwEZ^b>{^H-7 +z3uZM*ty;aB`u1hoH~fY+^lO?QK61vG(;1U9jxe7oT)33AV{*B~D6B^C +zzw3Wl9FEuRfGRbMCk5GX+)jqKpN?E@Jl}5u{N6Y8T{o)aKixOs-n*<{W7>PqpQ{Xe +z*8JMLzFy1TYCC#) +zboigTu3rFcnlXb8?t(qq@Ld~wpYPL^ey=BQrbF&-pIowG8(CRtLOXC_zHw{YhzGS< +zu{&@FVOjTMeAT(GpT3=n!tGfNJFci$0s;Vp(Mg*wKQ|8V^IMkjGQZYv`L3&@9&_ri +zwJgR-AA*s`I?^xnr(@tS2aU&3QnId%+_bI>j`vBn(W^f!vzobnn|#q*FRxL*dk0%T +zeXv~BXWPPjb%gR)oycqL%m!Bfh01@%&4n25*#6nca|1T|3e4=PuzSA913`)c6L{=H?j?tT8v0Wc%)$P=*h@^0b9`&zupmk`|iz9P#$*|6oT +z()#1~eE-S5{j&IPW$?wPx69S+t7jYV{Z{2^Ma_qH_v-pbHtzGBv^~#H=tzxFJ};f{ +zM`AbbkMG-58ey9fqmOkaPksGY#f}h`vLE|4VA*Zu;Q0d6tTpR1qvs%^?SL+tu**kZ +z-cyfrqk{0H#BEh)3(84vpssG~$3!V2$d7O_DGl;Ry_~!uAjgB>B-vfg3ocG`wTl&*$sP-#yQ*e%{6*| +z^=_E{G`RT9HB)N;3NC(}+_7f|2nzQnx_gy=;H%g>jlr;=X*PmOU0#+jHjcfI(@6!lDNtWx$|LjhXdx@*9G +z_HME`wDze@O{%6tq@~j#nl@gV3tGhLzeFf`Qhd_*G;%iKj0XA< +zSdEJfv*eBq7M(SN(OsV%w9GJG^N56$LqE`1o-$T!rJ0Xq!<9q7mR=!|sM(xZM@g&u +zVk0&*&{A26(|)aTK)=#vWm@=N6x@`dT-4u|%j^_O2Yye8XPK}x!$ +zsM(T#tK%rWq}o1W0w{S?A%X^0eTG`WUDmWF+i4Rc`JVncVggpNB9zKbE2&(xp(y2_ +zJSkorY~}p20;cMXwMCqa$QoU^ytkjrD^-$yLNc$kJ19O}%mQOPsVBiq=M0ITo>EljHo +z@y^nME`wq_@G`3TJDD-6iq8Qob4;$ezxKQ#f-sxUIN@b~`Ps!g#!8Hx8+CX_f~QRR +zwMkpRjcq4uw%xHk0G8dg-EY76+CsFTC-RD4q=Hs*M+_D!)$D7mTr}g^y-QB;M4`b; +zd2ohzc}#6(URNMA3TlpA +z4}`BA&%Bnm4;iJ~pm7)DfoQemwyTLquvWb*IMN|K*jKY_TIo&%BER?S$IyqH9=8n{ +zoN?w~%1jl9iz?4(rvMS8QdyQ8A4s4h6PCQjg3M>@_JkzA{}f7HwciF(GrdO4M($Im +zg0#2Gn1C6kgrmE+e0A`WYo8$`X4E7sc8#{=*XE7HT@xrXwafp$O +zkSr|S +z?vGLp2ot5pFo@J44x-e4E+Rqk&D$br!yVfO(C{5ypLUKr_%S{n;tqIRD|!p~KUvMy +zD{)JSnjucDW>~Z&nw9twuUMsbh*Qi*NC7V6c7o=@oA%u#TO0xHz!8V7alIQYR3bVZ +z!j{BB(7HbF#|#N`1(?}koMvf~M_vof%wL}_puc(*&e;AI`I_q#C4l(*1)z8wty8JQ +zsz~6Xg~94rCvbbh#na!n14$jdSQO>jdNabWmnTw5Lt34bnd#SHjQ +zOw*1she4c@{iB#h+g`Bt-*cKOfTqfP$%Vjo$Cv}d_efn9EpSJNNiT-i;n6fkO98$S +z1;ohChiV%u%j|8J0MnSgNL9rJj#Lu?6)MmI4?9(}Qn7KB%fm?xht{$YeH4$G0AW?x +z7Yk77Yg?58Pfvz=PUZ)2D_~Ed#RfvC)bdG#f?Kd1;rOHf3xS~B2U%HG6}yl3#~QSz +zP@t*H0GR+Gmao(B3f +z!EKk1=DHc+r$boEhcUs4Tl{U$##rc@ws=lT!n0BtPEm4fj1=S}&CRq5c1};aPSX7c +z-@!HHS%ZW{qgOD0b+TfltsRyMmXfEir4NUCg==K^Ru4#L-a+%A8%VGOmEX!4r;QZJ +zJQkYRqw1qt#l~JC+_PczXYg->((y9n2Og(y$-|O4Zjpg=Ey#_kkq=#$m-$6gt`1S6 +zyUTNtx^ij}0j76094Qj6vJ5mumIh2Uq1Yn_vPzWVGJwsx%?mbsuP28>;jr~viY<16 +zo_g0V8`M-Wlj%wpMv}kAbsmMe+fkNleB>fAIOL91Q_{6NpMYb}9ctym1U@>;(N^~O +zmW^0YL5GK{NVA-sf>I~{4MJ+a#SFw|?Dplbq|@Y5GM?0%@Zw~+i*$uZZEMR*F{lJQaHJ=U>|m0oytu*r;o|(k +zdn3&+z{fkCWR}67Pu$xO<**x4;{q^?S{3Xy(heZOBR~bal-M%u7Xx9tHKd#Tjo|Yg +zCvam?Zj@2MZ7F^~m*wXlrYPQ)?v;&1wI#k+1|BaC05}WpvJ2T93q}#8j$O5InvY(; +zz+ymBq#)7sLNK!RkG^Vlqp9kGVEf8Kbo;RNV%JiF1&B^?D48)IfIMjGDjmQ?Zv@1J +zaz=TFRev>9sOQ3`o3}}dkOC^`=DDd32T(uoC?%Ddi>9IK3a<+SU&@XwTW_CE&C?~c9s +zI|%*4tcSzyIdey^Z$5ovM$^;}r7wKky4K|VHZK`wHDcWg#=R|bLAnQtcsAwArBw!Gc5<-_vYewLevab_NSBj4Wh81Fng +zTwmWi-98=VQ5XAz3lGPc*WM9sy=7kR_YYQEvRjiO*IArF@|mCLtnJj>bsTd8@3UQD +zE3`v9+1xvT*aaWIKHCFJtcK$S)r+0%=G{j>lbfyoczgceOZMw|Bb&FM#k|Xpy#ViL +z?`G#{!l>_PYU9NCzZdQd|H%oC@Bgv$|M*}8^@!Z~I5ZAmk;@r2hY&bgvU-k-MWqZ) +zHAL4$KU|$m8ie#C@Id|E`7W?(o8fpLK!WEcpXf%y?#yj=C_?#nb$h02lF)Bif2a_F +zE8b8=NLb0Lwd;&Vd0?DM#X!T%{9cpXkY^v7o+Ob*0UCnM)nb@T@FtI?D1bQ}1@{NL +zu-Dj(vPP8aOv&VGy6o_KjSa4Jl>c!uI`%s}z7K9(wvFq(I4%O-P*lx`2_vZkuQeyu +zE~?>8W@zitk)Q1yBKl&&sOgL$>KW}Nz15gg>kTN&`ds<;4b)naa%*q`3r~aiLTa18 +z>gxxU|G(R;ez}7lRR;)Y=Nc5~2krQuHgj_Ju=yWHqDvoZrwy*g(`Rj$@1Tji>zeiK +zh&%_S(G!*ZA#)|pr16oAoY`d2jZKB((87Ip-_I)m9~6?jQZn7zdd0d1*e{UJYw@Dn +zyzft^)HvVbB@)`GsGz}bcMm41sNdYvksDD#g1x#uT!L8i=f&w19-76NkcemdyMMkf +z{J!hHyZxHV3GbYl12NH}IG2X|b#-TVKJF%s9MfhJhy9Z8oBdm}8Z*h+KdJ$K)OLWz +z-*3Iybmo?d-;NJ=M{A6#nUw6_-VSNgn2;Z~&&+mRj8$jdG?ZsXz)d+vmp)Bov^=%^9$$z?Gf +zH^fpkaQ|&%z`oay58&Ov`m)GJYP(;>k^SM4jKcKOxgbo48(Bl!&Q@Wp-681f)3*TM +z*Ec11>R?!|YOw)g@PErJfbmb<_NJlSSvYfnhsT8U2Y9}WjxwsMscC-B@pZ|Wuhp$N +zXMz}x`3~!H$bNTAM+st_HG6!`(h9TsF;S<9`8e1+KSeSnFqRVf%Khao#1>E|V|}?Z +z$BREW`9?8DbSMBK)_(3{6UxNHcO`IG^cZqDL8i=+$o@H4_86*~A@yJ5-9K=72=B~h +zx}TcP72n*V(wKi +z0c|*JB*)r+eb81rv1CJc80UOTR2jETnffPAHQ>S3#5jwp5V;O!pa+L!JpP0FB*rCCvkd^FsW4j +zj!x6Re>khRMDW6IQHI#Q$iFkdfd}13ua}R9yN9pKsHg9xV4S%yRNw&ZQZ{`T8=G!i +zHYd<35BC{ +z{9}QppFC}|tHrzoC71qiD5*Wfu9Oc_B3@RQiA+VkO*9EE*S~f&JkaQ}Ka(BhP*gzs +zMzQBk$*%hyFKN{@Zh&ulq`C!M?H9?owQmK9^kWnI~&M)QYk +zU=fQNL6g!3a*M~(1fPl<0Ajt-0GB7%4U=(O%G;uP)) +zs}4a61FUJyw(jz9mhc&jTc`bgN#%L;$5df_b!VtM)c +zS?QOZC3HE+H$_QPmvEg_WmJNPIfxkOpb#rNgPoD((?Sy5ayAHDx|D#^7gO3+Btq3r +zx-`{Pwe}w&-6`+`uNGQn6RKWuJ6I(*aS}xE<>7u>OCD7G +zI=Q@a=XE3S4G?R{_<0hwz3rCTIKzS-7I02_k7US|A{NS?vb`B1nwB}E!8{U(YOs$^ +zs0QZzd{V(N$tzXOW$;UHqFVS4pFvy+_SSWa@6s99Z_-K +z>>jY!HwlzF=Z(Ab1`>(LX(g(6-GF`jqk9R1%==6ZQ1r>yl!(dQ0aC)Cf?V6dP%Z2v0c@h~Bkrs{oAvDMY=} +z>dOoh0k&j7?73)-MG?f3vE_0=GiwILjI)tPW<*Pbnz*wc +z?VQmt#;JNL{cQf1(U=&20fKON1pV|^S#MVz^>raah2o&;nW@{orh|zYfi8avJR4WD +zT-ZGP6}6`|aFsQKCRSFym&^9dhFOOEAc(A-46=T6bNSF+9b^TPpOP{PyG;joI|yC= +zj#xh>3xV=-_=)`o8HgSrGq)0?w+(|N$iWYDHa*yKXmOyMPPQ@QW|>c{WFfW_q-~6X +zY!mPVvyihS81alyarv4yqF4Dm_mHwycQdxkhJK_6!d8bMW-mENIpXxVhA24P&DyXV +zJiyGuHi#8Sylrl#0IWv$ry(LgHJQ8q)HBKu5eVP9=1@QoPo+eYX_O?+Gep6MFcitl +ztv$*R5Decs>`=KD{foyHn(V)&LC#jm +z)2cxhKBgpa?jsZ#P6u{?^S+UXO+9@qSYk3{Z9BA#Z}{qBMAT8kf2ynh`2SB;MA6pw +zbMVgG0gIg)df=QHys~!y${3CZAT~%M9?4H?G9Kl1r$XR!*K9*OI^VHKh#e_;1h;b!ysGNY!Hymg90ENZYJ>T +zE`w;fn19wK%Yigh`0CTjq|z33}&k;J3atices)A1E_9 +zT8iO=h*QvpJWgE~&zZ}bJ#+~~5fX?n>%>zNLwSNn?nZ{}uopME<^k)LfrCxPOpUFb +zwWcWX+cL#-znAt*d3sNsTJ>nGEjm%9 +z3=?-DIqIb(WQKuxWWCJpK_HSAKG-@iZPdVkvg*xhX)$1R0YkQ^fEuFxWL9+^%h}h7 +zkFq+vMOKvCXiJF)g>`g&^*3llf$4x~A +z+RG7Vx!4W$dysrg3=9?p4j&))&5)<_Oes9s$nv7epo3B!LIp7A&nOJdmcZ6WVS^o4I-R-NE`x=1y7)Z4~hm){fKZ;Eo*U7QEIJ@yrHAH +zMSssHRHbFQ(|XtY(V9Rd4&&eu@a&`V;l>}dwWi_1qT2e2MJ$>Xhn#_+%RIVcjF3zr +zvSZJYRnmYgp@{6#GDCXkDuw&OkM<(yaMq=?ipkmg!T0hq1hn;!-g0+_Z?suB112~6 +zQgT>#TcZO2IP6b1gl=etXMi4>T5HMc-Ao9u#`bU_f&6#ORmP{%0Ou?7lF9(;V$mvj +zNpu3@;gLGBVo3pKWTlpJrK1L>{HH0h9ARb>wYW-KvoW(4JymJQhJ|Z;Pn9}x8OCT* +zGJvYoK_qGb-Q*@iKb?DEq(laJoqNTaS_w_djEeI-?f(686i;$DOW5GzQp8VeU7&h{ +zVznR))2<=~_Q!VfD%sgz8jww9+P15q+j4vnH3VqdVepXd3l}x*rrZ+FTjbR5q_9bN +zD1Q|>zu38^z5zoHDihb8z(4WY=WR~hp;Z|R%+I~rhhRln@1CVe3eLG +zT>3Il;sT}sv8D@o-37xB4j(fvhPYIQEfbNv_>Br*_?vB@tHF{^)jc?*NDbK|E +zXb|X%74Y*Gq=gYaUPVDvmvA`oM4guNsf7tG+&ET_>Z?#=y2|Sb^Z+IE$+2~eZr(Www}QYQw{&z$}Cp()vFuw6|=n3=PV=}dW*$d +zu}_v5=7?{&GrL%{b^FW8rUsh`eoBoq1T`E7_OoAl65)3JlGcbWXHiFIG+UB!IEvR6 +z!rmm8^`THY%tf2VAS2RxRZ+OU$p&00n#58h1DlY^CybpTVvX4!f+e3lHfbl|`R{KR +zNNfYZ6ow7}O!$9D&T)}sjvG|LP+yD1_uMS@;I$D-7g#$LO@A?EK=vca@JV!;){DT} +ztvWLG@Dx~Ahk~GL+E8pTi;NQZ0E>*yxIfftT*#x7m3fNhSMBEi%jD}{HaLON2+E=L +ztlML^c@9hu>`40MQb)Y(;-P-5EMhk&lEsFHcvT;LM(bn5*Z}(hU#mEA6F6q-nAHdt +z*yesAyRozUb}JKv{MZa^1VN1AxxH`P_HUVU=a^;2kc%jR*5m%&+Xe~O?*qMIQ&C`(W< +z<|txPjuD8CHM*9jcB`+B>YM;-Z_?d&h4jC(hnfuroy_o0f&K;dX8?<*88aitQCK=>VxJ(jM!SO4-L|#*aApJ7}Ln-JQXJ&vFMV~ +z;@u_Ms30ebrWLRUO)9=~L-2#V)3Fmz8stH-lrUgNbbEs|>VsfUY&VNdrr| +zpG5!ZUXFE1dm}VU%}paRrvJc{h;(m%KxqvTTx+@lM@Y`UrZ)smW}>z#cn&KBKI$_Lsxs*>EQw${IASKmh;s2Iu}Hmt_h-KKE)giTp~ah*fQAK@pm`PRlL +zHJ@Gf1*dMS;2!p}h*Ptr{7>rh5SUJ%^%>!Fz4R?5o(mBUz_oP5`RaypwK?d$#v<`@ +zT>EC*gYhdnu+U1v)8NS%*WbZQH!WVAzISqejtv|ndR-jxh0mgd3$Z20J3J>{=lIud +zuc_C{SjRKMHGcpVDwx>6pmH}S>}hV))=US<*7Be)c>dBxXrAXXvX7)NX2~lLo=)WE5^Y+I$DmM8?7Q5eHv6R +zCNjo@?Fiby;N1^&>fI^aaz!vS(O`y2s`Ihq{go6$ +zl>o{BS{Dj}KD!*4)Jokr +zO}uD>dOm*Pq7b5^-tBj8nyF!o;Vs9}-{fV_eYB84t#^thW6-n4%p7rGUhlt~Fa%zf +z26TR3xAT3Be2ur;jyDP`=>i9b%%=031}Wp=`{HQv@?bYhM~j&4C$10@M3v$|Em!bs +zY$(j$2ny@?$}12MUoTsjxN}ac +z>8MqFay42ZRHWv-b;D}qBq|qC06d;$U_=^;YkB7XQ_|R1JXg +zv)(=e)!781ERJ_d_9LM2(l5e(bsyoR@9gz84TkKL8BAtyP%vHcuS4GmgOr4Md7vwY@)+TjY6m66jW)DgZh%z;S*Yqawf!xHi!v)L +z$R;#51cAr4H)En;N{nv4EW<<%moovn+TiKCZj8@YK*pb4v_LYvy60EOG^smb-tXNn +z*&nH5baWQi!OB>wX93CpHtttDPq~1_;0oe;s*thln4+pcCGtRj)5u4qms=?yUM;nh=x@sW?-)`ZNa_ +zj?V-!ng2k2a2iAB!hJJZu3qX*W|J>HuC^@SJm$|=KRm+(&)9zHBAdM6SciQStX~8Y +zT@#|e3U1bKOGnCV?|@5UkG8F84G^W6cb6yXLix0-e7C&n?3mD2Xt0ZpAFdv0D|Z;) +z(9!BhDeGdPwkBTU$u8@AtPCl`#?LE5&faLu1>DFsCRDwuTxL~8v}*vhk+L?1!=r*z +zBWKQ5zl(QMrcHS}tm$3ALZ+|61`V5-0zlBy16*Mx46bV@0{^jfX@-qjyxCGjfpy7J +zhycNWjC(g^WlWe7{bPdcmxNU2iPk{G<)JVxebDZ5u?h|96e<&loABOsu$#?*U75xQ +zq7i7vj~LvqvJ&FfO3Tzn?oBuGaktk5K=6Q=ZJ5}!ttUTIY3Kq=04nCv&~(?;GI)w4 +zp+UMTbE2>MiI4aP{eLN~YsqUHQ~XuUTvRx5eIu6tnZATrmYqpD<3#AGjr5$+h!?%I +zOj~!u)J_1981|sIYs%Dme|)Po<+^-*;wf5|HWiTPomc!fWfOdIrj9*2-P?lGRr(q2 +zt$5wLXTx3Ybnlz7HvV~>(-qoEHUE}`m7dTz=ugD<;FqV2PqJKQFRbo)a=@0H+}o;w +z13u!f>72ULU9N)_VPa8Bk%{+q``Da8dsiaI_f+zh4;~SOnC>ikn5p;#tPY)W +z5`gjb(RaTa(VuM`x@pq9oo_HM-x{4G5jOrzl{$^O6Azrp43i$BX;6NAZ1jpXmOKW79!pk=pzWU4VPrjmV7;BSN +zz6=e_qW+unp}*^eF>gjC=y+vOj?g4PY46ltqB;lv#A4MPb569xSD6W>Muw(4?)RZa +z*-!c+Tf}qr+;(y|aMh7NFU$V@rW2UDuN1=h~;F`Qpvf$@e>CC!B>nN;iER9H-Dc^k44;DyDfW +zP7N(GYgap?E(}7!NTNOF2>pRw14kG}1-sM9HGSbLve9rk`o`BKWW(lyyX0k}9wk3~ +z)2II>inTJCli}E~I{Z8MbWshAt+9-^j!m@Jj9I;O1m1c_ISt#F$V|I`xN_Difpx;C +zwj(6(4zlIXp;GH`!Qoq9`PJzE!P|~_!rtV3y~v}v8a#^JkF?+RduwpyWH_K)3rO(^ +zdQrBQD_x|=*Lz-G>ZOM(-M=!7M(E}+K+v!^-SU(mrwJuF(3;F0x5M6fAhZHqW3@@O +z|BF4O2cZceFxYc={T*a$+T7K#m!^Pa#)s$g5qKgyaNH7*k;!l4)TU*3{_%Z=xS +z0WNGBUq1uM>n;B-TpwLQ^2#>v+C8;O&N +zku~Z#zd~t}$sjqJd$pRF%Nh#6VQqu$zI-*2Q +zji{#&X*m<%Y1;MYspOVpqfl*55?6npbFTLpJ$!MZSEj@VH?`7Jfh3WuI{Hmr$uxO! +zeVddVA*}`!)EMgZ0eZkSj~ZZ`k3#B63WX&i<3*&pur!lj?}l3}OV^G55s3=R*IL$D +z;_armjnHP)4Mk}Ys(f>XM2zOL@9kwd7Lj#}l=%Y0jO4OkxZfYoD##3#ZZ^YTRA3=? +z$pgoIulzn`IScWm|F|*drOe%4HkE|lhL8B`_+P3=ZYH)pnESR_lE*pDTm&d(x@(0! +z9@rE-Y53J)o%^#j*g%xyF$^=^98R)YAciWsOcq%kc_j#6D9307l)UoU>?PDI4XjUWsQlk8<`)8 +zag#;pECMx>IV#3Tp7l_L$%~-`w$;!Pf+RK|!xa`)A}<@f*1K>ALs{bq2Zt|lp$U`n +zib}YwS=W27PT)C)GI{|~ld2tPw36tF%DZe`{A91=HHI^K1N|mTJ-zx9XO +zl>=xAJ2^Kor%BR?jhaWTaUT4@H2F-d8!yHiDqCLmIe&9UF1Hda<@39oCg2jewRdjD +znPrY4YFh$PRc+ms-%npY!=JI%^kcGXu}0+x$(ijzXA +z#Np53N<1%Al^nvNhS&6f=-`@Kv(*AmK0p-3=ou&YvS?Z%1vN?0SyRQ@J5lDT9e~fc +z{yZ%?AE8K+lK?jRyv7TG24gAlp(8|^FrM=x|CP5;lWTxbKpTePVq3kE_5jp1nF2qv +zFySOREtlj_!hj6SQap3a!wSNq%-|oQ(jXww9FP(tsQi9AjwKz(>J&Rw2i_toZ1ieN;1$n` +z3gzh7CL$HmAaj3Bl2JOr2O%looXR5u4mu{kC%nRb6Uk&De(r;7!@UmpggRC0fHax$ +zq5ro-KK#J*&Wj#A%#WK-9-h%B5~hlH_16rOBBzMfT+^au?c1{h^zQ;aq)2?;0k}me +zO_HJDT7ZqAuRtIuvhC_sy2f9)bri_^fba&Opx}zq1g` +z!lP6OHDqW<9iM1+HhGpyEI4Ot!^}3Syx|J93&(h?GbE3`X=^lGyQeKNh#m7%wWihm +zIfH71KoYx%?lAkZxH-6Hi-=F4J7CJJ{8^2Z$y{^2P$ycZ1CcH})EhYq+9MtvV8)5t +zA3dQrB%*Bg*WHh%LN`j@WZnMdC6_C*rcuR@bWK +zU_dE1QeGE?!&J1wOd9T{L^Wpz9Za(}Ior*^xvE||&^N?A(2d3`OQf&xSMIqeNxK)y +zA$`iaj{H>-jHYWxcjlqfHa8k8NC!jsF@lSqG~mf1pd$_qX8zDA_CbWk8b1gp{Q~ +z{Z)odn(~s8s@JVTZ1Mh8jhGLnO)T?K&c?9s-Hd+Q<|5#*fz|)H21H=QCOSsBt@#)k +z6(@Jq7maBjQ5f3fnq +zr`$0!-n>pQA9%e^WdF{~%&@P_M#CObM|hzVIP4lkE9Rh>@6Cb|M#=*sM(O}B0DiQt^%@_vTSql6+UdZ8uxV|Abu~~_AmF95J)TTq +z!TR*C6q00H`4V5vIA`v*%^R?6T%k+ULq*0LsNC>dnaIk%)rf=4<2^U)e9hq7j(+xQ +zuUu(~zs)+4JhQp`@|7jeFOJZ+o8#m*qnBYIN3j6|IHc~S^$Mim!ajn^3UGQTU?MS{ +zi1SM-_2L98iYTI4lp_?7P{aJQpsZh#%9D47fUFvlkEci#4dD|ml=ZUQPYf3QHs>xe +zC^2DlEL^&=28?^vTygN$oxh1V4jk)Xq(Q<_`D|zHE4MF0git2cw04ek{;ib`?=MJ~ +zCfQF7V_FFzBW!*kEX$S8&!sr_63XaT_Pdo9qgJYHaEH;axw_L#N6VO|WMeN3At5y%5H{fX{Buq$E7XF;@IH-RKDo +z{?LBX%qX>h(tyUMWkU+W+Wu_6J7n2-=pG}lnT1ntYfnhIqPpJqZp59ErNF1VHr^6v +zqMdECuJ)iIdGWH-f7moFUVvAMb(<=(HnJ#X|lJ~vKQv?N;F9|Rbxx;^%R48YD +z-zZfHSr$|1yavx|T5{oo&N}QBcsl0-Q8A7J3@-k|iTw_PY-jMIS_-xSCqKfy;^JfO +zyJ!`}-}`s@&SqVr3DR+K+$E{4>j~XN8=>9hC_})d9lr*H;<}nw;PA{=sa_jWc15ij +z&@*zX-qrL@4EsnV_dMUJyx`M)+~i7ly%fw)775E=2vkP`_s2lukw`vF4Mx4T%Jq~i +z!&tzMHi>DZdW*%@KfN^v?3^z5t8AhaAt^O8x7^^bvbx;OX4_HrAEM}Y&Pt7Q9yLrU +zT?uQFiVK6fUods+w6Vg2Zi-lsMuh6nQiplA{6*5Er?1SLzLmO^!}Wl>TZJhLLd@al +z=NrW-dq&FPKYe=#q5Abvn`F+($M^6B>-7CPk56#^=x%QyOC$t4_~Om$5AEz-qbOpAP7A|E;72*c*JmT|ry>ISr +zUp54{o9-!y0T19VU)65GUdMSIidBk*nacg;GoT|LI=w~Ir0IsAt+p#;%HhN*WlA&X +z*#~~1#;(Yv2f&HPCLEZzS?BNDlMT|+n6(L8QK$90`0%Kt5&-X>PNqE>5-_S +z_DI}6ED!{rGDwL9^sVdC{GBrt@t&IjLD2Y%MGMAJe*v^K>Uj^*Z(n-6T_nX5B{xVS +zEnD3T25mXS%jns?R1+TFb+hCRZx#yfD^6=*UPjkh=o?b=|A)PIj1?|u)&;k1+qP}n +zwr$(CZQHhOoA0*wyZvs={?19}PI6Bsncs8QkF|QGs=Jd;ccrSj`+1%L@GVSseAD}W +z^WB{s+UhByQk{$nM42FAS3?CB{1{o&%${|w}4-O`9`FDIOx7bLA-xWC}QW} +z@L +zn$_m(eJt{crt9@04zW9I%qEz1X +zi8AQy-tNMwbnoy~o0_u1g%M5RmQ=buePsq6X>QA%@oiuDaNCkY{chOdy?+)suoh=5 +z^2MSu>w%2<8-OmpWn^Xe+~N9vf$|;^U4v4TzDAnx%wa@Dx3KYLbD`4y3?y%So&&<$ +z{&*}_9Y&$CFMwKPr`B;bj7W~n8~topZEMV(^1xdFsJlR)`%j^@UQLj+-3%p4PT68s +z`Nc8woj;TsO?`HvYBO(@V-)l4OEX8^-BsvmwTkIW59bsM+^VJRgtM`4jhYJt*tUmZ +zRZMkM6$)jS%}>Dkf1D(4q0I|CiIlqKYx$C-47Sm5R;M=i3q)#jKLU}qXy||^OlEBc +z0#DFchsooLn1^2r=36;wp~xn#n42J3bWic_$l#Z_FF*t+%hf*>xtWkjv7_dyS(1%L +z*YqM9r2diLhhT`7hI6vAvj@431;|D`;98Ou8(`*Kx>>n9_l&aj%ioIf61=nUD&~C| +zy!RV)7%AFOijbz)$J~v_uRi}n1Z!w7(l{75IJ$ymbyKA#Q3IZ9`^%B%($ +zU1{E=NPZcqT3 +z&dgI%-CBIA-qTakE*k`+2Ta*m7p%}aq7)N^`vJrWU&^2nTkp)ETSwD0vVz@Sg}9je1jA*>?U^A~ +zRbXSF$#h(Hm{tHD>@aI~n10nGnJ!IJlZ2CaB5W=6Hi`_|#nUU0j2e`cuk@JbM`w-M +zJ(N{FnnO9Yz0dpO`Jbo9>!{Y5eie*^VW3J)M`+)%3t7!lbZ~PMKyr3htw?-NHGyG7 +z>p^_|bWR=#f3jq(eX!3F{ccI!028nCOI-kHhp8gvLU*zn9rMagitWJV6+%U~{~Qs8#Egb{j+^G_z&!1U +z7T)x8jX^(T8HdgwN&XG%GGU=XtY_~KYWk+i(&gbi{?Jn@H4V6HAZYyV0Z8200rD1i +zkp_=Of|$EZYj0R0;TS5{c%H}gnOY7x`z?HE~AD}yi43Bw> +zU^`M1iD78=7XjF`i1_(*R+T35h|O4V*6}hDTkVEsEM9sda}SsSs?!+wJw?#67`d8u +zzP;6iHL-G``$uHRrVM%dbXX8oI+Ex#HIMPQKQFm=AX&rRA=jDRdV>6e%NWB2nQ3mq;1)Ffx9PJ-DhIt* +zS2dEKJa`dWzD9n9w$#iX1@NI!i^97&0$aAp>tB1fOBz>_u;zC21QhQevsOkYlw^e! +zCTt_F@6VX6ROtA}OwheWJSH06^(i6gM|`GJh@9fgjldpB$P}Qa&j}7x +zP@i$dp_1-|3vMk`cdT(7$vNQ^qS+-P*7FPAgz37h{ +zMa~gYEy-GMNH<4;vK_&g4y8E7p&P-z#VnE>yHuReY5y&=D_)Is=iD$W=ennh^wP!g +zFdGdvov3d6p|@sxx~oiAb8y462$z~t7cwf{rA1$d$`zRss_=R*Ddb}AYs^Le!H+`$f0UY=rbNT^O +zZ&-@-idnH^r=?-i10ckbwriY6WeLkof?0(TZ}UfKDv`8bJT>K%;X@_F!Rs$)w@5`t +zg4z`Qh47Boc>UcxhU$+@@LmMC7CIG$EXA3^{%8`r?)gK^TJh&Lgfgdk8>17Lnp}k{ +zC`DMS=j|9vbTGgIRp-8wMh}3;n4@raHEOm-1DQL60}BpI-)ZBZgZeLJ0#Vu}MUo~J +zNcNVQHlqf@6GxU;@b!F@gXIWSkA^N2x1=k_#An)yJD9|IAuL*RT*3L!1Qt(QmS=eI +z_u138wpOMXFb}?BFf8N{Mg-Xeokm2N>;`q=BxaRmvJp!RV&V`rpmw&A12s-Bs!y-e^%T01l +z)f|+fu~RyiR-lufzRQ8cLAx#NGMJ6O&nZm-j6LHzGY8uRegs`CO +zVE*92ctmLD4zx{2YII+B)ivE&`l_c+YcDG)asZ@%;EwIuDn#g-yAzL1sy38k$N-T?0k0szZE +zzhnc3?Lh)WMT&UaIKnc}QR{@uZ-3fZMt_7&7okB~=tDKagl9lSEvvieY^QZzAb +z^|LJT(nMCj4a8!&%4@8RTU&i9|*^o_V+RzW~!M9gLmZ+~Y< +zP{Zj`gCHIk*~r%igFJOi0v3gZR+phsX5bSA^#m~@-u%@%Oy(d#beV927Buz!+NSpr +z8~zM8OxlLUtSP5I!SWh_%Cgb%9b`=NQq$C--Gl=uaNc?l9irSAP?g0=v0YwzbTsg7 +zZ1BzHxq}ChP{ACYx%elPsX07Hz--#lC17EpLcH?fPuHHK(^!yP0N1%tb=x0=s+TFk +zo+NC_gcNkgRw#DO4L$ecOko{sg(T1Ha@AT8(^(0)XN(I+LvIZ7$s5C*Q*1)K;}jQV +z!Q1I{r~_B{%|>)^1RtODqYE@Py;!?mqY9)lyw7eU19+xZvI~?Pko5PlY;nBlS}1Kh +zLA#H$y5HrLFY+>Q$gK6Ym;flEleKI#aw)h~XlJ}&7)|jJ^yeXlXOnc$+HISroit4o +zilH+Va&8>T^?jw7-OT)po(HNzS2WHKn`S`Kq3u!uHOXEUCoGb#j8z3`z!+E~N|QAn +z1Tuwdd{r~p^)Dgc<1o>$W?B&-IXcRSsSiZr5e4rh0QIDWVx8A2o-7hwfIGqnS5^QY +zD6?i>hSZwPOEZ6dZ@?)F*RB6DtTPj8Ed-(MEdV7^Ekdh6>-1F4%Yq+poCAoADMp;B +zDn`1|TbVYZdwR&RT?ddsi!d`54x#l0mm%6WN6vHFXe>L!!|XaSLJ>)M%vl?-klSWJ +z11}>HB&}n{Yzilh+ocvKri-8W03IBiwnE$W%)+&2yAI1fprau8l~!YjhW!1G1-BXo +zfFSAvQzklKK$#I(IGTR9<$&uUk{k^Tdmunu9v!UQfcOhgL!3E!sfxxdUrv#-DD-7n +z$i5hU0kJqO<|+EUEahouJq~MQw=Sc36p@g;!~LCzvUwC&Rxrx5;!87&!}*&$BGLW< +z!2kPuyk=_Ip2C(vFP=C+Cj7{J*43HRR02HS(;=`X#uIdN6(l4rB&A;QQ-Hn17)P7% +zhUi^wHQO94x@fON0nnuKQZsU42wRI<>G_!Le0F%a_?VSi4tg*H5FzpcZEz!)K!D+e +zBEo0Z0Hm1vWHAvTLSxWU_`ogR3dAxARTK7K(0+|Ma<-ek7l@6LwrBWWWs-J+V^#;K +z{0El_r2&P=K$S(1wG97Mbrfhs2O0vR*r1itQM)epg+ayzvlLC7G>aw=Gm_<=Ch+nLiVAYTE+-1?`F?LOQ)V?Sh%|1oVSTh0;rhY7oyq(5-pu5} +z!|JYYk=0DU%dr>oHXWsJ)dF?6zN-$<1zejhK^m;TONxvHR +zG;ob>{g1fVphL$8-T$vVB5Aelj(owpA}?P~_?95w2z$dhD0q-@^2D)ZOkiF_xW@>o +z_1Ep8CBlL!>6+u5P`^#yV`B+LDzZ+{geNoDS{J&w{Z12wRR_ry9Fpi)k2ry-?>=?1 +z&il?KNRJZbDd@+SXi=8DE^e&pS8Wh4DV!Pty6))tm-T1-vdwr?b0eaw>(3<3I)#>I +zLUOu|jcEB8r~jVPzu7tTXo`+l!@0Oor!gC&w_{>F7~(CYP3ERnL#%=5DY1JR6k@1M}wk2z2_ +z+HJs24jQ(m*O8_i6gdJ{SuENY%x@sAuV!@&s{8XuKc!q+U68_ItXqJ>$Rq2q8KT(E +z90_UdC`gtCya|7j(JWJC3qCSQFS6N^PhzcOrCd +z11Yz&4}wIY3}D=YRni~w1c&!K0K+ZKX0UswmV7?ws?ou=BmIbP+mz-JU0VfR{g_X6 +zHiE3d%hQ}Kg=K4Q$tE!OjGjd}TeRe)OX#Kiz>I3gzo-uz`Hty%wv0bQ!M$(#HV&H- +z8g2)|!+?jh4(^VlgD{aCfNU8d09o!4ZRrh^v4^lv`~ZE%kDh{DD6K10pmc29)dEYJ +zx4CEb8~XvyCUZ1Dq{9U28BnK4r!q +zH68;j6{FS6P`79=hl~}QAE-4~hKdu^6o~imw~Npg8nsu7R?QXB@uIx|Hhyu%gFy6f +zIfMbX^Ne7wpg`CYeh3c&7np8r7pDqL+uNbzdwD@xEb2kfW(raDxB@6TmUopNN+Mx- +z?JL|_1$LQQ1Si*j8hTUjuspY}yJ1*JS0ACYG9b4=UWT8SVN?dtU-y6n>4_*Ey$JE +zpH1(zy|zS>pQrPKrc1gObx_4D>v;-~vGC0F~O9k@K!;nf;-H<@8TGnz}<*Oe!Zdy2|`WL$5 +znd)Be6TaKHDIqO>16-;C%nAMcZO`+Je)DfIq5ezfu+T40Tlr5iPsDSa%e|J$&K~PA +zARt_?0p;XNqv+PA#E5ljkB19w{&nL&P;|g=xIBqPuYk6F6k_CV8GqU5ZZ-XYEu{my +zwTIF|fp%f^jg>ybEsPARM@t7qdhv8bx$gdDfcfCR;35ee`cmh+b^u@lE=7bq<6(}} +zqk_&k1{grL-0olnh}ZhPk|cNvlW}1EyWxE#mvR!OOw)j^VXsUg=LPneJ5xDD`Jl4t +z-bTJ*u8q1*<;6~IRwN{@@^Uo`Ii^tQs>OZ|!~k1}U(-39=QW-{b7Hw_1mxsfcAVoT +z;1ZgPo```}YXnYpOaUUVOwAwbl5#a8lCr@?OKv@!il&-W_!K@R-7w)x*Aiy1kLtlz +zwDa@)MT)g=!w*TSvpTa>pAL<3=ww|Fdu+{gFN3IcM7wYQo(meK +zpDnXENS7}Qz=1Kj!7Jxs@Dns$rV)OiQY$xPeD*<<*90Hcl->E;-O%$2V!0#A7xxO~voaUn)jJ|`j*c@Hi#$T^8! +z^vUWSD`lUSf*>^^Vc`5^5r5SUkUbH~Rns*5T>oAUxooC+&Uh_G`sD-=|Rh#GK-6bEJhzi_nR4vYH1Vul57d +zN9Ph$)OUWKT1AEZ5)}QFIknyfzqS^l)`Gq)vwHiTu7)&-?y?D-{|NQSh7P%c@JscM+w$TN<6jrL +z4CEuzBtfUOD+Gt}lSP}PoLBL`l1uOaw7bHh=_VX>Z#MyK0>D@{MIJH2A}FXo`hO9RXLvhqEor&eUM=d9d(eAdw;WbAHLXM +zCq693@RHDMju#-c7H;9OVeY!!TOkyqLsl5X5_|i=;CMOnIW3>@MPP^*X>8mgGEN_gZW=&2n2R7 +zu;f^FvaqJu204*gC!gewkmW9M^Bs=*$U!|wF+uYK>wy9s2Ax_;OZ?|Mt%SMUa>)4V +z%+F@2VIIhG{NfR%Y;iJP?{0FL9PtyJ61%>IFg5U#@G=a#7TO_sL5eQ9`D*yUyf74P +zz9U|UVn9A@$Nwe +z!4WTU@kKCz1!E}Ieo`QU#2`F^4v0aYUuWa9ZYfhqndkmQc8e?_zZRF#nn1p*2|C-emfu +zbjpeH5Wy(G0=3&ie#l>8Edt3W&MOAV_XFs7l>%_l{`xAvBGnx+MvNDiMffwZo(L}B +z?3{jMi%mi}fq4|<4L#Z3Ys1){QXg(srlWF6(;SjqhE%NXV^c_}ZXFX=hF9FTe57N| +zg0?GAFv8<3nqEhH#rYJ|5Tk?)X{ICzAZRGTO77BT#tCR`jNS#vQW!>7+J(-Ieo< +z*iC2dsWLt5FEIVmf#%bxb-M{_T(#lnblm_*%MrK%iRJd$@!68*dnZ?%KN;JlKN-u7 +zFBv|{o|diW)pIf0Yu&lX#()MTb1F4EFyn@dM(jRN(NU3oi#VygLYpXc)-8%U!3V?0 +z*xov3*IA*}#L)ejNwN3Sy>;!je3S404{*};>f%!QIn(06YfeNyD?+ovP-Nw{L7R&D +zf?B=Tt+{VbuNtQ09gOSqr{b=hI&}&RA6kalEvvZGAR!;8gEClmO@AL{2j0gspE7`{ +zT@&RRNv4>NJrTK~#ND5UJ!#K2FQ00?l`SQGj@`{>l4RYi%=~W~*v4R9SnxSeI7Xxa +z4EN|s;jF*PiU>pG2eYTk2gyM7?9n{Ld*oqWME$}xE(p+7%my#gIDcUS)DCJBx@!Pu +z#qYX_Oa^+RQ7i$SPb$e~I&2~dN(Q^$p(1_{OPhvlOH|loDTduh@g9+F3bHj!X0q;N +zq|DGTTmx>IU3B$bshV*#6Eh~i00;QU)44YBr+g4(qYro#>sX7x(PHIN9QM%REniY! +zU8OCW4%MmXzI1yx>1Q(YI1_Nxl+`!mK{ZBIM}tMw(HH#^yRKUUV||0L7Ac +zkF>)#mvMlC27wyKi9940yX89VR27U4+Pm#j-&RC$W2QOmOVyW+8-57JQX!R$j39$o +zj=+Rh<(~4xJ3>8FpgePUYt@K)XFt{W4E8}BOl$V^i$A^h3Df8WNwoHa={2`HpCBGEsmPLUIVm%_3byJ;&@?!mW9@3xO<0Uj?qm9VRyu3W!uS=(~Y +zcZ&x>2~tKHQ7%bbVeED*6s-`C93K#=IK%i$(qrjx+M8aW$RrgPoq +z>6@#R$+-OMI(?98^OygmuyMJxZGHW#mux7U0~m*~V-i7f1o?+?{d3mxc0YyGu*2!& +zT?1pMoyKIYx;LvwX-&iFOexGbAWREV0QdALfP2uo`0pbqf~TO;ncjr7rPcr4!_1OG +zo5mzFRS>vR3P(;0dVneE9%4Q^#D+!Tc5Ts}jpVd5lldz;e^Vz5cccjl(U@aF +zjrmd*Y4KM8gs`jell7cWKPW+pFO^#<`hvwXU=2vlG9IKVsMTE+Hu#O1{pq@};^R%v +zgF#+Lx=^^M1RyA_Zj>`yTf5mrM@4mr*T!*x@zm?~nhN2i?cCzbp&p)F4#6LFC-W5x +za(W3JkGAAReZNR-Ham;CIp(LQjsW>MBrR +zZBy<=T0u{po)q)JU12#LW&e09KN_B$wSPXodC7|AY`FD +z?bTTbo;^1JFTWJ$#>*X77M7mnm8GL*Bkt|AmT0>$JR);pULB{isNnc|3G>>mX~>4; +zq|!ao=-2kjgk{%I{AEuUA>7D43iV315^W(c828f8tJQcxAfIY++uOU`Y%w!{dFvm1 +z#(1f+O7zeEUX_K;!7BXUK7sAxrGdh;{;q#8x_yguyeYj~#}Dk%M0m3x>iLd$u-r(} +zb^-IwGMKAuDqUqzRF#!>?b!+z%>2x8Z5__N$)12HUJ>cPMpcMO$ft2f{5(F&QHzqU#8{+85*zd5Sd+_1j@#Ml{Bv^3%YFNkn=HlWoeARB2_Xk_X5exa9g~c`w +z0IuQUFoM-97LZgWb{tTyOB`rH`E6`!@RF$Fu!1El@Q{L4bWMn@L&ar+RT);0R4pzX +z5Zus|-~whIEeO4RIdy6^_MC~r?_ZQZSjq5Zje9{patap>c*<$v18s?O+9E=@YIq_K +zB`CH`6rgh8>)u%kYkdcU)?$g2f8%^3j(=Y#tI1r}j01)h!#F)ShJAraDvpQOaLr+c?M3+F} +zWYu~T&-%oXfqa6*UN`2o@sYIsQLWx<&)Xh(E1vigMtb94->1Itx+2b#IRGf=wa(lN +z`|fF9cqv7H2YUn~fJ=6BvoeBvuY#f7rD^7W-_kx_@$;A`Fk?g +z!m&M9i@WTKM*%XJkmlv&Xv0J?lZ~@6Jh`&#|C8%4&#r^rYQ^H=lCtXT07GecJCfFT1{-RlnLmTc*?f^z7VQ?c54kipBhw!)M(d +z=5L#wAQAzEtK-E=MItcLY7>k2rpqW=I5j!58@&+8`Y6nED= +z#ane})Rmt{dv)*8*3u;B6iC!vTs}@fWWt5-L}d_lUe3~1Wu=R6%*~~+D?<{WAU=PE +znuC$57Yn)z&xOL$m;U|8s;%y+>Zb-}Rk_Jg!4-a`U66}v5cJ4edo-i=LQk3CX5jif +z8dr(3oF~}avCQ1vCMOp?PWieX +z6RlYa+9v$U%#<5?8elEKXT^3a>UzU^3#(aq$=X;=%F9*6SCal^CB5uvLKm+ijH>mM +z^KtG--Pyhv8ArTs*gjCYV0dr50{hgVs!C1xtqtqM`=3RVArM) +z=P?tsCdxq9wk=&;t*6ypXQP!dm76w~D2K3@V+zwL9h^hh>zx^`h9#DoMC0A3jz}Zg +z02QGlT6gger(S+vd%Z@DXam|H6_>7X2@3|~TO}yp~IzPp3~2WG?qsnVli_K8yZMU5PJMh-5@-Ac1X5-A3-Fnfsa+TYU{Mq;1{#MSn`L;zKFg^Z8Bte%*mt44 +zSW2}Kpd`T!cJ`i3?*jo*W_T1>s|LY|5dKtDnN&RO6dEfcDoe{H7` +z1N_mNJ5;FYSLwIA +zBy~oI&P_xZiPFQqLEO)Y_$h&CH`%Wl091lUAvv)#)23~RE;g94?s%8WXaDjJhxZRZ +zQgZ~~+5FD$-0Rt|L7S=dF(Y^=jFRT1LC+3%&vxzIt$9*Ijrn0+=VuWCq}%Za&VTq@ +zU!C>D*F?NXd;J6HzAf7eh}5mQw$MB&?%~YxL0L8yg7%gt1WQ{J8h-<6_tE^_<*8B6 +zwhT&w?GNqeZLGA1)@9f`NAaqy()^EpeKn_dx`8o5pG#vvk`MRCelsE^FMv#4smO^< +zTM(Ls1F|Ly9LS|@DzSi2lubOSY#mEA)sduJ-5R!W`AF`gf45cVH`Bj94XBIv_Fgja +z7hMLod$n3#UZ3e0tSrF8FDy*kAn2283?v{hAYqDAY&HJkX1D4nQ_a|6-nfJW--o1OYU4FIyE`9qFO{Njo +z^zl37Ebh+tt>)?hVw;Lk@1l-vWhqFv>xz}tRc9}9zw7R9#PJ5$$&=1K0Vi!bhq&B= +zj=-Ar9AwxO4}m9Q0KY|$QFndaz1kGkTvX;x5<7hstgb*SDMyKuWss4l!0^sE;V>^~ +z6BsMvsN+cg@$V{7Yr6z;uvJ&}{%zXwbn(^6&GVNQPi*uE{r=58cCB8C_k6b=sD&Ky +zety6n4i<&n*-#`%ee{#?mu>ZvgT>%fRkMi@Py!SIbIw`=p}ZU&ot)RV&%@-n{cQ!I +zG1w#D`agwsLcRg`P0)3E-5)bMa0R^xJ;e}h#B`z%b}KQ*_PiIk_AI$O^=Eql1pR{f +zv-MX4M<}8w&f{g1*+houCk&eK@a!H=LKsf-&xQtRy_th$L-LIiFQd9!_3ElRw4=7F +zcx%U3gx<`+?BPL%dhD2^@`BLmFsZ<3$9WTCe*}EDAaBvE-g;^N$jb#fVRR}M0XI_b +zaz_94Y7dNCv6pMukUX!CQbzqQn(D_(?_cnvO3{0hql%ZJH=wpm +zZAXw1NygJ7SmXmtF?fRmjF)DhpV7q$HGq?1X!%Y>g3*8f=m0UkGok@;RtPF|)&14F +ziUcFbC@RF+0xDXCNWppI3IUuTtXa&<6_SCxei32_C(D378YlyCCWQUYlRZ@;HWYqe%F-N~ZAFfE=(YM@Ck-s)(`gU +z%)#?=6IbiVVGr>QIKDh-=%!h +zIsRDuihw^jzoPe3e*z}PJpPvf7wH|c +z*WQa;75!gWG;{Z9@V~fL2Mh}EL(^kkG!GK(y@)L^F`<*6vh}g0xaI1^jPAa!EGHaa +zw-!T=R-N~EEYvn{Nb$|kjtjx1%jIVoTQ{-T8A3vg{{Udw5*=oE1pRU-g@37nsZ(yn +zW|(<|2$Rx&XZq&3%zp7q2=A09c%JJ|%uPXl-)U43j~4W*aQG#Ni=k3_9-Lb(p>&vH +z$$pJx+w#%5qI^HM*NXD=w4!=CxiqKeL2;dZ+bq(97ZdrRr&tj4a4ABK4WECYSLgW1 +zbRz2PG5;@R6m|0?vwlL>~7D +zaq*Js7b4iF$)5fguBI-l(=)Q^&J>KL=7{Q3eoVoQ*k)6M!<|W_)&!L)iM&DOYY)<$ +zm(@p%L>1NB^h75^=~McgR6d|)6%RK-PKLad;JOL2_YpC<{YN0GJ+MWq`ZlF}OwIBh +zZHk;!f4^yP9c1StS`viXr}QRu_G4|Ke +zN~n(IEB_DuFF5%BfFG_~*v)eLE0O)hT*m;Q05EoScCokBu(hGLbTPG6aI$xB{x8Z; +zf+7+CiUNZFH1hxYm?Q{V2MZvC-i3aHXLi>`R$3?s$09n>(*EhHF>X4zow(J2D*frD +zz9GG_^!S_cz9-}Q#-RKZH)q|%YLkRQ)Di_|ThH3_3$X#1Xl@D4nK+6?Gg#>9QvueG +zPa-}4=YGbbXkno+uN#Z6`6UBg*FS2S#W&7<+zq{5bA9~%RK-kQv=8_AAR@n4hA5nuC#q9X(`A3Z=|S=O8ja)IHnbc0Zl%t~YdeI4{k_ +z7hgwySIW}yNW`}PI{)^196y`2wsuN9k!x`c;&`khpVwpae0@2~-{a90?Y>`=E<6N{ +zK{Qp5zyBbdPp;miamMdin4~)%i9R^d%?Xo(<6r)#d0wLLHfhZchfMxz|1~h5ZyrU0 +znQWBt=G7!!Tx}GwUU*mLh_-)HF|F$3e%7t`P=1{Vmzn;gGkQz+RD?6nA>9kmM;O-x +z&ObS|D73d2FcR*RFiuB=H(X%zngWw)o6RLZaK=E8|AkV%O%kh1KYef!)l(yuQd-vu +z4OT>0g(u8c$Y=geT6iqJ${@iD_eUS{4k?74*m-_I!CNQ*-Ci&=XPZVIm;I*$n%=5^ +z&%T}<$qvc%8*Pu53y`9!lg-4qHE%}Y%mMw+ckJsqXnsC&y-jdF*g2(TYPh6AUowj& +zon(~Mp2@rO!S35)`eSSEX&<&nJ`Z{&xFrft(H`F?B|pS9(d;xGlO?EFBV=`WH_5}& +z{_(YeOXogD)eumRMJVIVU~zhl?IJ`9E-d! +z8(C4EP_^76RdIxky59P-tZ1Q?{yz*-_O!xR1qi*MqqP(%txc}rp<4n_(4)0~M4%n2 +znk%raQ<|9AxhjT_N++>N1bhiReYv<;<%EjLQu|7t6k7HZO?4|J9S|bNFp#!gU96fY +zaB7Qul|+QfN-H!<7u_f-Im1TaWag}nKDRAgTcd2~A +zl@%AQvqsR=f#*_%s4Zqo{Dk~3(Shhq5K9N6jb>d%wPqr>4TICe&$d_g{R9TeK!<8h +zlL|FQ_Se&GX)1Uibu|9iN;0B&Pf~{eK^77dKnBwdm<71^-p1yihW_Ky(9;|!qpZOC +z<4~b#1!~;zz@u9V@?Db6F~v+mzz@XJ{CtaJAb+Uin9YU)>TwB#$7910XT4#*-cgpHXT9J5rCZx8{BEY{D$bH(?++v(WJn9*HQ+kb`qAtNLnI|q +z6H}4;i3IauP7@q}?*sGkgtIq>kg2v)h!sHLVi#T{>FnVM>Q%KmGFpBuE2vrIu +zdYMpTOp9?%dA0V+BYGI4x=hVTBgbwiYV>%D5}5cub(=YmyYaN#MH)B;$bDislSc*Z +z{sLe|7&;=X{(ZRdh{lGrlWYqCYp*iV&g#{{1-DB-wW_TvA?g=DD`7B>KxSBZ*GfGp +zJV+C>cQxo9=!gT*?$xrl^mzT+K6lN)K2Vf9kf;~fDYno93^L}s;Y(IWKz(-t?mq4n +z;_XBEPqAlNGbdvr9eXf$@+d^KuV>(P1&y5Q@dV7HyqSYBk)Az>J9!i`+UG2X@#6uF +z9qBzumIdqGs;i5sR27h5(^9v^5MF!sTK1yUh8CR~)gE_6U8f0fuOE>c<_JxD6})ph +z5TSi0XILL1&p|I^FJ#aBcq+_g3AvZoy?{rl&g3c~t-8*JEvxZ7#oE7XuSrFE8MYgW +zJ^~F@!vM%a{ZQq|to#x@Dmx8tkBF=N?J|tOLL``q-UGv#%%0v#WEd9` +z@9yTxiu6Cl$6Pr5NX$ita4+*F4nyKB{LW9w;*fB?W4}L-h))!3dzNGWx9mrTE?*^e +zHK87Cz)V?fvWYm$?@zamwDmUGs_3(6`qar)m#Kj4-ABm;y86EZ%J`X+X|%JjnTs_; +z!9;o#rZ0iM<7y2R(F9&s!^FEB<`S;lQOGDC*hcsH-_gV>hvs*!p|qjXKXp0z&v-h& +zhmBrT|J+TepSc{4Ywt|t&~w@-2=`%o*3z<#pZXMrh^DK1V@yrGUv6zRrLI;ed48}6 +z^rnQ?Et;h_HCVTB2Osq*p&78-kg>?et9sfx?a1X3S4=3n?|R3H8s@^ElU0^Ogvu%r +zCsNVJ5mp|L1Wy%JbSLyB(u7oi-mn2s;+8990XPgxDxDcp#fr+8hkPjc*g&!hY)@0> +z@@19ualx=j!iqc_NtriLT&i`6_1PpWu`(`1Q{+w-l`CI-H0k_mJ4{bg?lv^*xg6Ei +zqXho;miuBP#eQ$29$PX@6^K>}yi_r)(M#Ss5y*oDh7n~`ElxhLmSmIpH!oSsc~p(< +z)XRd=dUmr-IDq%5fY|^Cp@1HEY^_La>GA|77#Qg3Pu&JdBrG7@vJ`EYqWmxvG~h}e +z34*qekT5_kx$iKUqz!~ah9+i-%aKq(9uLHS1Oa_8VA&*%gad|7g`yV$EsO{OB8RLH +z4I0v0O*B)+cY&_z&ys0PYb9T{O`F|{cvUKR->7Z +z#!4N;Csge8&P*qxLn~~cY9|bg%9>Krnw&)rZUi}I>T_@*%e+au(^WPS;XLQG6<7D$ +zKwk8c7E`d79)?hF?*6u*C*1qR)g=zS^mG)Vw+l#|4O;9@1PPn4B=RijtMMty%>NF( +znY7A?SG#8HPGD(jHYF;7o3+=)lXw`LvDNm{;z=Ayo3Z5<+gymP5u3F=Cy}GsjyN)R +z8$Q}*)HX<)^EU}OGIjC>uhsW_T7G6;x8dWg&!z{Qi*%K!P+}A=BJp4hfE)rp5h%CunyC#E4qn5&$HYvcV +zNnwiT(sXYnzI4^Kclovzcr~mNwkN><09$#_lzRMOgAI0n6TL-an8HWg+SQ=Y8S6l=PrvU3Q@MzDf+JWw}ejfMVh5n!1W8ZPybH-odCrcOr0ObEI)cF4tWz48A+GR7K +ze4(zqqBsB%QZ%#J(x)cTDiN!0WrL@WAsLupSAP2ba-hqmrPL~JKquATc+Yq8@eO3H +zDvew|Xe5I4Axq|@6VZ1kyg9iiG)3vElYmo1bkJK2Wg2Am$ZH%n(G){=O#D@|%PyNe +zKqHW>TG}zp{k^P3QbNTXv78V&Q3k}L@2+`dSHNDbqQYtEmjHAh2617dDa8y`smYbY +z&aINmt2(W%!c3n*=zr(^V1(zrN8deN_q#Q+vDg%XBCQv!ximiGF>u5LX~LF6_z)|+ +z4GV1|aEJ2kbQ;Rczd=k77lb{iuM@VPI~cd@1OvYAQgwH-@oj|(qvc0~lePky@+jj` +zQ3)S+T+RdFu9Q7rSem?&Q@tZM_K5Pf8C=Erh3;2|#O6sW4t>zu<~C4;^Nr%2ppfBF +z^z=025!}D_I6!m2S7oZ|nn`0YXq5->0t3PPc{N>d2wQ-`M*e^&L!LjRV|eCn4Dj^# +z2X%v%a?-gzVBUB}f{w2t-SBKr7l=1-9n~DwVbdmd(yrohWUijya&uR&)M_er%;F +zq)Tt;;P9U??f+Py|F*n2%7S*=38$?45R^9vH%)XR2{5tH=~*0bt9Uou&r3u*pHMbwa>K0B7K;fT8EQ0 +z`CHUs_J+2&qM_fZ$bgTs9{#4dxHa{Mo<~(&Jd9IigOir%QEeN&(3}OphNQ4b@m$Jv +z0=j4%sI6#p;Ec2ZaIpE=^`Lsy2+n4}p&MOqLIUyeq)CG|P!{9uG)GNIBr5$!Wog?W +zJA?O0&_oh&!v%yQ2X{)n{)o{tGwog&)2X>b4-lK+{cq9p&UDp +zb|EkjH?l)Kk*x_Tz5n9_~IVza5%{47ayKP3~|JB%8KtTGvihYc|)unNo +z)P@4oHwaI1#K|W12Md4`z6Ev)|0U9_og7iR<`(t`p4gEx>DVuHrfDU?GpuEkUt{#C +zNd;=O%^M$_&1_s#IA$2R+@dkG!4O}C1D(JjUJf#vAh_#E8oO*2Fp8I!eL+WkOv7R5 +z*T$}FW^e;(hUaHpTQ0?rAm(W4a~2ZT7L1S4=6lKzFG&syHELdDNQ!Pw!`F{j38T6c +zBGr6^%;sYwd-&V?VporI +zR%X1=&GD^hFULl-WbBcrH&9Of;%*5l=to`qrtk7R{rMUb-`!%pHQZGSE#n8H&|3pzV&_k|w5 +zF^>DW)5#<7x=F}0-y3vR8LiahgJnFjvv68@Q^Q0>Xp)Y>2ipF*GJ5`PB`z8!cNdTf +zku#|;b>>0#*J!!g;N +ze2g~Gp-Ybv5VmtgU4aGrl#BS2j8&744m+uiVbb#%Uy2}dak|f?E~zBvcW@SWcD`Fz +zs)t8jk6#$O+X$!9ceI0fI4&+i7F)i^NxwKvSPtuPrcVs1a;rTZfk}&L=PPPb_<)9s +zahhi{guOJnculCAmNV!Tr*}v&XOU7W*L$x-VPxYVowMfMzW4n8*OGfG84?6QVCB8(HCAvUzXBKfai^Q +z%A%k3M8bVjHCUSyeZ`iEjda739f|Ejp-F4t@yJy?x1E-`%n_S9yI)F9J$rM47tWT; +zed9zH)-S}YU;l`#hz?)Vhrt4I&vOdY#GPf#ZH)A*m%m%B2x$dCu2TB*M{z!*}+YvR2~GQ&&OwpqEhUh)nNwY=?|UMi4lVN+`E*lo3Ctwo>e +zrL{edsBm=g?xRslphDE|1iDO%qSraC*vqWRAEqsSs`sYXnKYw*(EL7KpA78|mN7KC +zWk4-0B{9VJoY7DP)}#Nb{d83IQpiMO=M_$HCCS^I<@FA2nuXVdg{yfUokRQ-Wx9T9 +zj)^mtYs!1y4d4cg_UH8%iCqY(arG|a5WF#k7dlTvy86DrXi9cwpUgbi@y{_W@wdI| +zZL4=-OM9z6od>zYO6Ftnu0Fl9jr&Gh#EouTTA8G7PZa7+i6q*2IfrK0q>5j{(Da-o +znAvvQ>Fmtb^`EQCHPpfsw5-msO`WQ>-{Sf}voozR=wtPc7;j&QdhqnBFzs2%j18 +zE2om(vuViLP1>#bEGK6dD#-5*i-S4u`933sDq%FcS>lp)f)>IHIrp?qU20-uripdu +zp_6jz2xh!4_w%KKhC2DCj@YBZXLHCsDS637Um;{Zdl5m_@;zS}X2%)(stEB0_4yfQ +zF}m;5rf*HHk#IE!-6HDD0X6UZt)lPFJC!+BgW+(RjacLv^_6gV%z7*`Ndai!0}akv +z4+V}lbsUTfUznyZ2pDgilN?0fF&y?_C(XM4gJ&F-H9+&UsTx7-qoiN!qU-duX8deQ +zyKnNe@!)OmDt$q;LJ_k~cl0F>J=M*d>c7r3K~hMDQ#bDrXkgMuF&E9KaioS>1|Zjb +zV^Y_ftei+|PNz1D!&bd!KCIa!YS(YE_8Fv^z@NLG>fce9wucdl-7T8^QQu|6Rp-YQ +zjd5ZhbnO}G>^8c*AROB^?WJl`3EAuNO9-1CU~}jA4DTkkeFiO$8o!3h*BLN2snagN +zyLnk?Ifx~wGH!KJgzlAJvSsvMJ`FRHb^491G2!UYMsK=VS)Xx(nI6-?x3t8eugPRq +zWnICyPp`K%JgN;6z@@|WqB7d$Nk~n+vC6lN5|p9vcWoHpm7tSiKC9KTAatf~c=bhm +zqE2ERFO>au(5(`NJECfK#B62rzh*QqW0+G%$;ws6>a168%Q`&3LCP1%talq*V|?Zf +zqUOwb#i@Q)bIy{-x{sE9D=p8?PtGOCNR?Sgi!L +zzLi0xiQ0W;!v~+O5S46(r1XVO>_5x|ieJ{zrul*8q1*){;#6mDyWgto_@RzxSN=NU +zW(6wd2h(-YWa=~3PI~h0+=1aprZsqA6O|L*LE~06ZvdCMGK$-On{al;R(%LoAw-EQx1#jQPLe +zlm;yP1-~znecGqd==sj1-~tnb$d$!9z5FEyvkpEThWRGEFZ^=fM-tzP +z6c4)GrJ=6%vB4x?GU45Yv`n6PS +zm^K`?x=0?|eK1uF#{^N2^V-+2XzmFjS_4Q)zTW=mwg>+^%91vupA~zXuRRe^43x3a +z%D8pul#PILJ#G{zU`l>VIE=0f!<1MPn!1uY^lSQl8 +za-X@=+z4E+=z&yG>KZR;2M@}ydTN^$onu+rdnr(`DonZYmaA*SH65mIVp@U<4kj>k*baxxgU7hO*swyOdu~XeIeaxR&!zZ +zFbc-O6#({A1R&t>9s~si-_c0_3hc6afv;fTH^+<76(A5nIHJsSy_^xQCi`11E!E=y +zmITI^-vN~duuTI}p+^cg9tiY1=Y5ds#umD2mu7bZB6S)Ni0Oz71X2aIA_u#@-)bOZ +z<>mkwv48awNhRtRn`0e7prImMAeKK`i~)-dNJkmih6u=io8kft!2@18PkB@gV(|JS +zw{~(uA#NX}ZL!tGq?F2zzyQ(%y*++$2cJJ`grk)spg-6^Vao@T%lh`^EP#AJ{5vcp +zen&3;KlOQ;AYlza4?0Ni9jZZ~0{=gHB*NV4nDIcK@Ss3J(@1%AFVNnvz->5EI0OHv +z9S~Nw=I3o4%xw_Df;P6+zdLYh1IHDow +zZ-nSc2zQ~K#$CYt{dye175X;(24ze9HD#nZ^VT|#NlL0sdze*0(g-Y +z1RFsV{s)0VA{-Fs4}PBLP9HgXRYNF1AaZ$Zcj}G(gK#|(0Aah+*IoYNe6S-tm6kdM_HCcM_K_C)hyno`_9;$I$+o4H#>!Q@B*88&b>c*` +z5eFCttl~WCOy{P&o51z{l0=>GB6a#zHu@+{Zz324{-n^gY`{(`TN~#vlotho7TM-% +z{^@HV$WdQjAONa=abe|Hc0Lr(2IpS(S$n +zLyS0w+B6*w;8}$ypIP3JE%YM)0ucs01@l54d$-cnSxnldx@vTAeK@MJkQ16SC-7bn +zy2ey@zF;ZGL}t_8+p#4UMpbuMKRd)4NoJzf*2#H+MKC$7P%w_IvS_CvLX1+F+=`>N +z*dTnkOS3JBP!3KbF?o#OCa$urYv}qFL^iN=MHk7|`dqYWNQc{a0ojlTKM>yPd}%Zq +zYZ%7Vd70Ua-a&5AHQtWyh7sR^b&@JC*{lkld&{glDNaD=XPdrg8@J`3$S0om-nFo`S6X;hbCQYIy%jpG`(9X=mFnxduD0%`NY +z)8^keGzp663yRax8uW_4!iB<$rDKSy(4SDlHh~=c08XHsb|tO4^gZ{LcvlSJy*oS5 +zWplw~lw#Z_uVk#IK>^$Ggr4`M`fJ(@`dO|&he>%~2nA|*rs))>FpT_i7dnjcU_07@ +zIk{>SH1hL!29G^^KkHXhRz2THWi`gU?RLm6V_^~GOp1A`t=Q5XBf6xygsr=2RGFE+ +z>FJZ8#$p%Yu)0vf`nU16HMu46OBvOkPiYaPABMuFsN?#`z#)Lx9dy(#AG9{#cHpOO +zLo}<j9onl-yWFS&EK@C_?_sh>SY%a&`6Qu#&25-s7A=ilfmWmT|Na)s^SQ^BstXEkT@WH26Av%M`TVK +z6IZe?!JC(8!^J8~V8f=LC{}p%K0gNrxK4n7`8eWTo-VtjtaH1+bGIqX<5D`SM3sgB +zD0Enxv+adHJn`nNwElG;U*kc-5V)KPD0#c7W{aV#<=XWzFK;^xp7h(znSu6D#jf +z^;59KEhAD2`}m6b{os@KniIEvT7M?s2XaWZ{tFH=!JB0nb(eDJtVA_8S!U1vn(MpX +zBPF3QjZtHXb~O|TY{xM#No?gG69S6kT?kt?Up8<$uo=r{?yagDw=2=nxTYx!5-f0d +z8MXOWr(2M-aU+#(nM_T+xf4GOWmdh-j?Q(K_v)w@%=$*Euq$%s^a@_b*#}rVs*dY5 +z`l`r+LT?nYIW8*E2SGk8AQD76RzP_*+{ko*`S#X5{m0Ju57`8qN}sw&v?JOEk%c-+64R +zIUJN!inS3@o)C~0SDSs95zom%6KAn=F@js*PCB@3JlL#EFmf%3-%FpzFKFSAg9h5eoOgy`T?4g_8udSd!UO +zTPTQ%T)Y$X#Z#*%d +z<4C<7^3a%>WXB4>BVkcig+e8^N0PHFI0q4n9F&qP7zl##LrfRa_$Tvuj4^x#hv{^2 +ztkQ=ygrX$nlmy88jJ32h$CkW0PH|X&{D>N#*ldqjaj=d1tyV-fA<_{7@6jF-M+&o+&_jWtY`7eyuSSlp` +zS14_6=}6g{X=fjsOomCuCu_jJY1Ev*gsX*CWBrh0X{BZ+RhbmYYuUQ_&f>)Sg)`yC +zhW%0ux0Sg&K*YfI(7lNylUziH333wh_L_t&zvUx6r_Bn=BEezgSEED?Lp@rLwG=q^ +z%gN2~=sp-i@8U{QhlhYz*|P +z)#2enb$QYlkYfyJ^)dzoMUOF1Yb&dlmzT@S%iZ1G_4W0|#YIr-(b3WF?(X{f`izW> +zh=_k@Qj +z&;Y9jjJ;KkHywuTunVK|hR(RL-l+_EKfny^qvWFHPOns^&G-*R>N2M +zd;IQ2J3Rl05F6Seg$CR!Nv4=4+|Au06abQi&NO7Xt^D9pB<Y7M1|l9?@!iS8T}{4-)DTKOk;wh={dV6jjEJ82M1^B+*uECaryr-2 +zLnOr_`GHs8rg7%Ibq8O*_tAWMdh+2yow25#h-G>EbbIk+JR5TPWU08jvv)^LIDbsj+vK63yU|y^5B=&Ri$>4K(#kWv=LfKD=_hb_ZtagI~@4bq3mFF@`>M%E5bZ +zpeV>(I!O|;-Qg-@BFl+m&bU3jNrL}+rhc;Ik@-DDL0J2US&B%JL5ckx1x>b9Y_lz5 +zAW-`l@!8X%!4JlRw{pfemat8B7=DaCj0F84>ykg8mhe?F;Z9aMQXoWSnf!2%=DnqX +z3jKw7EM^R`=5$9e9}7jxy%Tc5$;zPEvU_Xr-&o33kYTGwnt>Dgm#r0=oZ_fC{6@aAr3UGt`6mo7@tDv2+Ymo +zkuW{pYY%ZgwD*qFYC4T>@4)k*l!n{dsEj1?>tR7kIH~QQME_>cn6KQZquP?=GOoIqG$K-h1 +zZ!Cmod?z2voO08KMsmsZPzVseZ+XYe%dhEWpAx(lh)o?i#Yb4$-|)j=*+&z+LRS?4 +zCNR>`&?ro)t=e;C<`92#S-Bm2tsF7L3ss}AE@Ot>YnfUThV-bBx@_?8SPP?F9>Ju2wgOB)l>qppC)Zji}>7@ +z`C7e`2PYU$msS#(IJvxUEn<47ctwVBhq5Lu_E~iO-BAcTp*9hz73DA#FY@F~jtXI@ +zQAi({WE$LeSwN%j-={GiA?;co5CA|XXyN!j(-=2PcXwMSYqy`nS|ey0v&xGaU~KXt +zHg(0HVnCx0>k`8q@1@c2s8&KE8f^}Qbta`_I9ohV!YqcC3oRND24;@}SGT7QozI{q +zkxdviT=QPhSmp)&6^Bdlq2D|b_&WqN1PDSm)tNJ3Gn~>BJ$}YV71GGe7+%=? +z)4>Y=&#v@dni0a@Pl~=9Vg&QSO}wN%=B**D4*-qoe1K5ncSwE1{-y9p@w*Dd_k3=n +zZ|_AozVZ$bEa02%WF-TH5vJ!CJ2fL33FWx7E1$seZj|Vf^gz3Ga8M&7Fvn2PbRA}$YBI9q7$rMgy +z%C;Xw;m<2gF>5)I;{{xoOuivKLOWCaVAUDA$bhtZk%nfW0?f!fhqXN3mYG8IBQ2G_ +z(CK9LM{smn4$`_Y(Yfw=g<{!81?GNyDpQJNk#FUUs2A+4;2v$M!`X0HsA8_Htn`|+ +zwIYdQH;rAXiJUyx5zK$;W=D$*kdw5>{oEWFytO2?p55-HNF9LiQFPl+iK9`jRYx)$ +zE9?r1ou3YTTuKQze{PCn@{o}gIGD#c)}Y=YL_%EqKiEgyqv1;yzLP`)Cw3N9Utur47B10Kj(yfd5Wgx?m3Hw&aK>hEo-O+ +z)6@9P!Lw|e_>M;P;NoE+4&L>A@%Y&9R{&oVBTB>(86I0e|s;2;WJ1$twG +zTKu-u;ALs1@h3Npo9dB=U_*u8YTpuIY;9RiC$D#JAyvO55BUzT_4Fhdv*=Z{t5R`Z +zsUS7-9i;>&0)tw=iyC)A#1>DLTNzcthm`b$muu9pd|8gKpainws(|q~!KhU}e=`HF +zBIa1jmOrIc(2D6b=B<=s>Q@gqfyIx}iPI)huw`q?=X2r*t_}dH;;38Wub98yXc-z; +zI!8>Z*%0Q13)BmQB_;gG?!ie8aWG6HVR~C^xkJXTi%R!cAmU?VaBrDCAOf3biH<+p +z!C0(1KLs0tKS~NyMKJwuXY%yGxrN$S3zA~v3@mqqKnpe +zE+QNmeAS<-Ic&2%v7u-fDU*LKbzS@V{Je|!$3DO9Ao*J;_8o+~@b_m!C_&GcfqwZ` +zEMO``tf(c2t4sPHa~NYMX;SA_FOo`}#kZ;0)4!a?)AU6f)PxVw=mYOlAKbYIHg_a_ +z1(m?QrbwwUdLX!&&SuB?K-X3a6T5xK*z3@PhmE>#uNyfjaGdfb +z55py72FbYg4FoiwXss#ZX_2>1fNx7OBLzoLT~aOp{z+W44rhw3~8<> +zYKX~!wORmTM{Amd5!pKk*>IN5N&j)s;>`Te9ygsZ_S=i0S9q4?4MNuCH2p-fusU#1 +zxKEyFCB5M^xh2a|^h-UF1UCykG)CE4RRQQ-uW8`fexNuA*O_cj9PSU7d^2%oG?|v* +z8!Rra%&DM3z==4^w6lTo#9>xQ$iNv{g6v}q((aAF3yD-Yk{=UX@-d01=0GNgq%Vzw +z7OxW!fsmRd3Ea1H(arx14v7TNnP>E`s^+!9pq*D|;1=BfVt*{;8U*YK4Ug4f^$zmL +zfd#&aV_x$*$D~GN_Mz>9+dQlg#WcU0mcD;_ievsC#pR~H*ZwSJ|Mj<^7l=+Ftx+b +z-~;+1JAlpN$l~rcwQ@v`x4;@C^?7X*FToiUp+y9Hky~*}y1P2Z@$p{ehrY}9gfuM< +zeBC*L;$+TF4t%~D&;dH=0B=g5Sj_u84*C=5i@WE<1upz6q1Xf$E?I&{Wec#m&%`A; +zNNH_FbG$8#rYLZ+JPGtw9xd(tuD}}h>`L1AH8`V|8L}R0r@Clm6Lw#^^in^CT}G6E +zEAI!0LS#NG69wdc!T=juBra>=f52zk?%6YeYe&i&;$gq=*;%`^9xoesA~qfc|wjiuvG&}&-=Iz!eX6D;ltRc)74?5qHfRLBA*PS!M +z2QoaL7UZw+y0l$nSHFz;o*RvbQhyPoy%Vhw%+)r`q)g^**y!>5c5L8H +z{IoCqS;L;$lix1bOes>jXIwgQAUiGlbexgAp1Lf8tEC&ivM9Igc5H$znMO-vOjnZAAI9{6NJ)lpxaCgh6UI#KEkZci +z9;t84lvEp>&{eCJ%jelOc;Ix3=as;<73OUY%PPvb#dH_P>67^2P|5LSI^aZiqjTRM72OCb?rm7+jj(t>(2_)&qSPLP@TbJ +zxWtq$sS9)(W~nzI8T|*SG3<1tPhfTa0~k-S0a@VEp9A1b@Wyx(5$h!~?7gGZUB3Wb +zT>cy8Xed}k3=bHraou!8=uUk5b4x4_*g$qcsW-;YzQa}Uy+g09f~zpayQDVRX5jv; +zYGUfT3dse6`ycyWp8*4*iRBEQ)Wl7Q>AV*A$*=>Cb^(%WAm@$QxU!OJ`~=#6piR3F +zv7NzDyT0j>=0pvmIg3mF=N|s9lwW`;{s!!g@h{+V3X`82AXOae`AwHbU}5dU5v3r7 +zpic9Ge!*wn_(8fG%>y>7M-W%4J&*&iU_yZ|qX&uDJF4C}Y_UKar=L2l1&k4ezlgse2I2ew8QsXM2BKvx +zMn=Yy39lq);OqT5p8Tg4FPVnfbH#PY^9wxZ7_Se>p*1$zImqH}*llx%WU9^Z?y-1J +zu2>JK+s#K4GZx<`6>~xkGX-J0I2>e0E!Ljxx)*_g{5fV&RY1MZjH#xNPmnB8#WazK +zqWqe9(hBuG>1U*6B_jtyhv~@a(NQCdoz4<@#hbCw7m5QETq9= +zib~8K;+cB&CSn23VP#cP4VH-#fhT2|1{s_6{aa>oXNp2OHii|{f*aQ$zzWPLlLbD( +zD?+^%F(E6rr?-yNhf$xtFc0k-juxM}?oHO-q$k!kho?^QRd{;VFEX^fWD+KblheuxfKKgP_24);(2p=GW3yM;Kb^^(#bXM>)F0(BchX~z8k1Bvx#Lj +z)#7s#sXiOM;YP~(yrzsFP5K*~jT`%CvLa6?|3s>c*%Tw>L3Aqslo3M%&0O +z*KRE4&aRgKE-LzOk`=@@<5JXA`baUuHo+_eO{BDNi2yKF~}x)RUW}M;;N9@i{dAS!A9Jb-ofODKeljSM6>&lm)LVHvDmr_@||MqupKU% +zF6zVWe8{^Gw9i}b74tmToFP;hovI{pw1FjuH*GL&Z1|SFA>yE2mW$?#k?Ny3i&Uc9 +zHVo@?Zf3Z4-ircrf_e7RzpAi4-}T0Srny4#*Iozoyut&;`|DTFjM99b$J;LQ07qRcn)VOp`Uy +zW2KHCyPV0isma%Haj9_NrRlh8S%(gdZ*t(9fw(Fe3Um0<#Jfuk+>gpfc?QCg{Mc6j +z?sFgiqrl+2tEM|8=6-%z3^%;Z{$)$g@E~UQH0p_~Xj#FMGZTd#(X#G^#93N3=Cx#U +zITZ{l&kcj@_nsSeY9A;=$_0RX6o-SM)peqhC=Xe2x6C!8`HF_P +zZEt~vd`o$4Z-C9;#6jbP4CQscA8|3lakL%AS +zy<3VACz0O*Y`;+vv?peaWWF$3y1$hT;&^@p4;5)RI`&8ld6XH#g%aBd3cB1I31iAi +z2s6E3QGC-4#xKu%G^OX*Q3rvgN%+JQNvMzPRm51rig#A+Qa +z8FpofIlTS+SMIvp>O;D5t+d&e*nP%$kL#&c3e`NNlP=xVPmz@+vX~uI9u7a=9WHDF +zTZj+Obsq9mNgOZc7s6Pm1r(N)NCjKxf?3QDmAiDL@vdr`I2xSs@+NNH-N*|uYFIb- +zr>w$x&ea}|3z&X2E{D7;-~uM#XUtgU_HV067;qE3&;>LhUsaQJ#1rZYSx*@Ri{h-d +z98IZePJWos!Ud;QsNE0w1lg!^v5Ae-70|~v5TqZo@snCJ88|m4UQSQ2=-YPnWNJsI +z84aDT2`vUE;CvyS3|98xwX%Kxt +zS3P^?btD&hpr*!5aoX!__?5z +z(!0=WmIOq`W=0$>#J+^8u^|Ub<~QC{CIxMB-Y<5;8wWaNi%Q_|IR(D!lm)fR<#Y8# +zPUyAJl{t`A5f#&8YPuSHv1W_o?5da4qB_&8Klz+Ah)wr_*mT(^Z?8~98W1UN=Els{ +z`$;W@dmk!{0qG!)*S`Q=>ACDI?Xxby@YUD}21KMm7ij}A-lbDc5E(=u*_ITCs!ZYs +zU-%2C4en2h{*zHZ@2n%S=Ym+~(u%5$oi6C24nDMRMt*Wk8QzszjSjXin?K2}L&(XF +zlBj8e2HM;XRr;F&kTSJEy#rkUQX(R}XIys-xm-1@$2QzVsV3-mlQ&hp;*h +zA@n-opboJb`GN>MEQt>Ts=~jScNMIj0TBP4Xgob +zVAC6}^y4EZy3T;zm=E$--R +zKlr@@m!Pv&1QE->rt(Y)X*%Kb-cru;LI#%BFxV{X?$eCMbJ?J>2N>!ipf(R1ic6?2 +zESOX02$OiD=2X<1K7DeGfPV{yMzc`ZL1p4Ig*FeKPUOupLAvd7NB_F7+}qt^HYK?o +zn3u5GA+dbeJYm!PJuf?Ti%ED_?s7rM^#X0wZe7e~LOiog5OU-o*pV$1B{La?A&gq= +zsRl?j8-%uixh9e+cA;S+p;z&0JQ3P8d8K_fpy~~lhFe}Kze7IBE||-;MJ5<*WIf02 +z3}X?Wa*+pbCY!r=)9FJK_fIO_EHRVs;Rp+LqRjKyoX)(#A6yNh(sm=c(Co@J{RYrn +zB$pZH=Y?;{Rmp>m<`}CBf{`N+S&v@W$32=HLL**D2q&DM2R#XQW#z8O=_2eDr&Zb? +zF^EdU;-=hEb7P7le4dMU_oeOuAH1Hm-DBe7q$|}W0Bk{pj+YOyxM#*YOzq3f=j#IlilJy)luZ;t1V!=Bb +zjX*+S();sVrv};SMw7p%lLu{)!`fkir5g?EQ!3Nous4w|XEJy#NCMp#M%}tUyKjnxz_XB_;U`WnR;w(Fz)Q9!92Ck$$tv +zkQ{$tA>Z+cz|ifDr1#@p1B>kEE4~~WIXW!a&P-l3E +z$h}5Sp#G-y +z2A3nH)+L{Z?g7tS4O9WdTi9Hpyf4mx-lNL#N=t7iHFc9|rQa!bCx2VGP^--8i8Sjj +zror%gO_^)`6%NmSPpT<0Rr5wv*i&bNIrT^h_ENX_aSCgRQ?g1lF`!B^zHawBcr$Yu +z#TkMQH#sbjRz$d@94$=dJU)Y5t@cT2bgQUR{njOp^h*K+K_XzFUiyK^o&N%S3AeYh +zxih|tR9|dP?EYZSQM5LrcPqv7Fr5`G*br8yZ2`e=YwyY+dE?d7b&20eFCWo^QiA8& +z$y`-uQeLLdn#~`46i{-&U{BQ&i5Wp#p}wCkPEc +zUzptgoY(!!Ou@jJK>4nJex~X7zvcJOe|W-4RpGAye|@6jcfp^ZeV`cqr{^nv75r2{sYS#l&kt%3Gu(g|L?Vfe~9ORrpv#H|5{1-YY%=cW%~m{ +z1*G`jAbu@u`xWBXl7T-U=&}C|@#g}9U&VjTX8s{Qf%k9mUvitjBK(@$`vU^}uZt0X04!1er5iuP=&!=R5`aI13t9dx{1-a# +ntNdTX_8-y!00aA<`u^`AuBre9vQz*73G`9~8T$<9&u{++O*aK5 + +literal 0 +HcmV?d00001 + +diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +index 26e0e36..0035e7b 100644 +--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx ++++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx +@@ -1131,6 +1131,17 @@ DECLARE_OOXMLIMPORT_TEST(testToolsLineNumbering, "tools-line-numbering.docx") + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), nValue); + } + ++DECLARE_OOXMLIMPORT_TEST(testfdo78904, "fdo78904.docx") ++{ ++ uno::Reference xTextFramesSupplier(mxComponent, uno::UNO_QUERY); ++ uno::Reference xIndexAccess(xTextFramesSupplier->getTextFrames(), uno::UNO_QUERY); ++ if (xIndexAccess->getCount()) ++ { ++ uno::Reference xFrame(xIndexAccess->getByIndex(0), uno::UNO_QUERY); ++ CPPUNIT_ASSERT_EQUAL(sal_Int32(EMU_TO_MM100(0)), getProperty(xFrame, "HoriOrientPosition")); ++ } ++} ++ + DECLARE_OOXMLIMPORT_TEST(testFdo60922, "fdo60922.docx") + { + // This was 0, not 100, due to wrong import of w:position w:val="0" +diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx +index 3bbd965..1d5c199 100644 +--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx ++++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx +@@ -42,6 +42,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -775,6 +776,8 @@ void lcl_AddRangeAndStyle( + + //define some default frame width - 0cm ATM: this allow the frame to be wrapped around the text + #define DEFAULT_FRAME_MIN_WIDTH 0 ++#define DEFAULT_FRAME_MIN_HEIGHT 0 ++#define DEFAULT_VALUE 0 + + void DomainMapper_Impl::CheckUnregisteredFrameConversion( ) + { +@@ -826,7 +829,7 @@ void DomainMapper_Impl::CheckUnregisteredFrameConversion( ) + pFrameProperties[1].Value <<= + rAppendContext.pLastParagraphProperties->Geth() > 0 ? + rAppendContext.pLastParagraphProperties->Geth() : +- pStyleProperties->Geth(); ++ pStyleProperties->Geth() > 0 ? pStyleProperties->Geth() : DEFAULT_FRAME_MIN_HEIGHT; + + pFrameProperties[2].Value <<= sal_Int16( + rAppendContext.pLastParagraphProperties->GethRule() >= 0 ? +@@ -841,13 +844,17 @@ void DomainMapper_Impl::CheckUnregisteredFrameConversion( ) + pStyleProperties->GetxAlign() >= 0 ? pStyleProperties->GetxAlign() : text::HoriOrientation::NONE ); + pFrameProperties[4].Value <<= nHoriOrient; + ++ //set a non negative default value + pFrameProperties[5].Value <<= + rAppendContext.pLastParagraphProperties->IsxValid() ? +- rAppendContext.pLastParagraphProperties->Getx() : pStyleProperties->Getx(); ++ rAppendContext.pLastParagraphProperties->Getx() : ++ pStyleProperties->IsxValid() ? pStyleProperties->Getx() : DEFAULT_VALUE; ++ ++ //Default the anchor in case FramePr_hAnchor is missing ECMA 17.3.1.11 + pFrameProperties[6].Value <<= sal_Int16( + rAppendContext.pLastParagraphProperties->GethAnchor() >= 0 ? + rAppendContext.pLastParagraphProperties->GethAnchor() : +- pStyleProperties->GethAnchor() ); ++ pStyleProperties->GethAnchor() >=0 ? pStyleProperties->GethAnchor() : text::RelOrientation::FRAME ); + + sal_Int16 nVertOrient = sal_Int16( + rAppendContext.pLastParagraphProperties->GetyAlign() >= 0 ? +@@ -855,18 +862,22 @@ void DomainMapper_Impl::CheckUnregisteredFrameConversion( ) + pStyleProperties->GetyAlign() >= 0 ? pStyleProperties->GetyAlign() : text::VertOrientation::NONE ); + pFrameProperties[7].Value <<= nVertOrient; + ++ //set a non negative default value + pFrameProperties[8].Value <<= + rAppendContext.pLastParagraphProperties->IsyValid() ? +- rAppendContext.pLastParagraphProperties->Gety() : pStyleProperties->Gety(); ++ rAppendContext.pLastParagraphProperties->Gety() : ++ pStyleProperties->IsyValid() ? pStyleProperties->Gety() : DEFAULT_VALUE; ++ ++ //Default the anchor in case FramePr_vAnchor is missing ECMA 17.3.1.11 + pFrameProperties[9].Value <<= sal_Int16( + rAppendContext.pLastParagraphProperties->GetvAnchor() >= 0 ? + rAppendContext.pLastParagraphProperties->GetvAnchor() : +- pStyleProperties->GetvAnchor() ); ++ pStyleProperties->GetvAnchor() >= 0 ? pStyleProperties->GetvAnchor() : text::RelOrientation::FRAME ); + + pFrameProperties[10].Value <<= text::WrapTextMode( + rAppendContext.pLastParagraphProperties->GetWrap() >= 0 ? + rAppendContext.pLastParagraphProperties->GetWrap() : +- pStyleProperties->GetWrap()); ++ pStyleProperties->GetWrap() >= 0 ? pStyleProperties->GetWrap() : text::WrapTextMode_NONE ); + + sal_Int32 nBottomDist; + sal_Int32 nTopDist = nBottomDist = +-- +1.9.3 + diff --git a/SOURCES/0075-fdo-75380-Let-s-not-always-set-the-line-style-to-NON.patch b/SOURCES/0075-fdo-75380-Let-s-not-always-set-the-line-style-to-NON.patch new file mode 100644 index 0000000..3bc9dce --- /dev/null +++ b/SOURCES/0075-fdo-75380-Let-s-not-always-set-the-line-style-to-NON.patch @@ -0,0 +1,33 @@ +From c6d544cfc10ea37316bb510a8577358ae3b7ae83 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Thu, 31 Jul 2014 23:33:14 -0400 +Subject: [PATCH 075/137] fdo#75380: Let's not always set the line style to + NONE here. + +This one line guarantees that no matter what the real line style is, +it will be ignored. + +Change-Id: I3bceaf49ce13ddb42ceb56750d8a4ccfef54033b +(cherry picked from commit 6053491532a5d9954caaa4abf09af30850f0cb94) +Reviewed-on: https://gerrit.libreoffice.org/10672 +Reviewed-by: Markus Mohrhard +Tested-by: Markus Mohrhard +--- + chart2/source/view/main/ChartView.cxx | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx +index c519aef..c6b5878 100644 +--- a/chart2/source/view/main/ChartView.cxx ++++ b/chart2/source/view/main/ChartView.cxx +@@ -2293,7 +2293,6 @@ void formatPage( + + //format page + tPropertyNameValueMap aNameValueMap; +- aNameValueMap.insert( tPropertyNameValueMap::value_type( "LineStyle", uno::makeAny( drawing::LineStyle_NONE ))); + PropertyMapper::getValueMap( aNameValueMap, PropertyMapper::getPropertyNameMapForFillAndLineProperties(), xModelPage ); + + OUString aCID( ObjectIdentifier::createClassifiedIdentifier( OBJECTTYPE_PAGE, OUString() ) ); +-- +1.9.3 + diff --git a/SOURCES/0075-m_bHasActive-must-be-false-after-last-visible-entry-.patch b/SOURCES/0075-m_bHasActive-must-be-false-after-last-visible-entry-.patch deleted file mode 100644 index 84f16a8..0000000 --- a/SOURCES/0075-m_bHasActive-must-be-false-after-last-visible-entry-.patch +++ /dev/null @@ -1,42 +0,0 @@ -From f232b831d439bac53a662c32032c7a0abd430d5e Mon Sep 17 00:00:00 2001 -From: Stephan Bergmann -Date: Mon, 16 Dec 2013 13:53:30 +0100 -Subject: [PATCH 075/109] m_bHasActive must be false after last visible entry - is removed -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -...otherwise, ExtensionBox_Impl::RecalcAll would crash in CalcActiveHeight(-1). - -Change-Id: If399825951c79b821ed44ebefa19d1032ab4f850 -(cherry picked from commit 661f7bdefc8215f742951727b93395d47293cf0e) -Reviewed-on: https://gerrit.libreoffice.org/7097 -Reviewed-by: Norbert Thiebaud -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - desktop/source/deployment/gui/dp_gui_extlistbox.cxx | 6 ++++++ - 1 file changed, 6 insertions(+) - -diff --git a/desktop/source/deployment/gui/dp_gui_extlistbox.cxx b/desktop/source/deployment/gui/dp_gui_extlistbox.cxx -index 19d2749..0d48d55 100644 ---- a/desktop/source/deployment/gui/dp_gui_extlistbox.cxx -+++ b/desktop/source/deployment/gui/dp_gui_extlistbox.cxx -@@ -1224,7 +1224,13 @@ void ExtensionBox_Impl::checkEntries() - if ( nPos < m_nActive ) - m_nActive -= 1; - else if ( ( nPos == m_nActive ) && ( nPos == (long) m_vEntries.size() - 1 ) ) -+ { - m_nActive -= 1; -+ if (m_nActive == -1) -+ { -+ m_bHasActive = false; -+ } -+ } - m_vRemovedEntries.push_back( *iIndex ); - m_vEntries.erase( iIndex ); - iIndex = m_vEntries.begin() + nPos; --- -1.8.4.2 - diff --git a/SOURCES/0076-fdo-60705-Don-t-discard-valid-printing-options.patch b/SOURCES/0076-fdo-60705-Don-t-discard-valid-printing-options.patch deleted file mode 100644 index 20a8122..0000000 --- a/SOURCES/0076-fdo-60705-Don-t-discard-valid-printing-options.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 23e8d0417c664fcb9b3f281f60629521153d6e55 Mon Sep 17 00:00:00 2001 -From: Andrzej Hunt -Date: Fri, 6 Dec 2013 20:43:24 +0000 -Subject: [PATCH 076/109] fdo#60705 Don't discard valid printing options. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -PPDValue::m_aValue is simply an optional parameter description, whereas -m_aOption is the actual option being passed to cups. - -For example, for the key "PageSize" (which was previously passed -without problem), a typical PPDValue could be: -m_aOption = "A4" -m_aValue = "<>setpagedevice" - -However for the key "InputSlot" (which was previously not passed -to the printer), a typical PPDValue could be: -m_aOption = "RearPaperFeedSlot" -m_aValue = "" - -(cherry picked from commit 4c160e3d54ec1c6c04bc80c6cec7ee58e20af3bb) - -Conflicts: - vcl/unx/generic/printer/cupsmgr.cxx - -Change-Id: I7959317c9f9d67bfafd911e710927a70edfa8792 -Reviewed-on: https://gerrit.libreoffice.org/6963 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - vcl/unx/generic/printer/cupsmgr.cxx | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/vcl/unx/generic/printer/cupsmgr.cxx b/vcl/unx/generic/printer/cupsmgr.cxx -index fe163bb..6b06596 100644 ---- a/vcl/unx/generic/printer/cupsmgr.cxx -+++ b/vcl/unx/generic/printer/cupsmgr.cxx -@@ -618,7 +618,7 @@ void CUPSManager::getOptionsFromDocumentSetup( const JobData& rJob, bool bBanner - { - const PPDKey* pKey = aKeys[i]; - const PPDValue* pValue = rJob.m_aContext.getValue( pKey ); -- if(pValue && pValue->m_eType == eInvocation && pValue->m_aValue.Len() ) -+ if(pValue && pValue->m_eType == eInvocation && pValue->m_aOption.Len() ) - { - OString aKey = OUStringToOString( pKey->getKey(), RTL_TEXTENCODING_ASCII_US ); - OString aValue = OUStringToOString( pValue->m_aOption, RTL_TEXTENCODING_ASCII_US ); --- -1.8.4.2 - diff --git a/SOURCES/0076-fdo-80986-disable-highlight-DOCX-import.patch b/SOURCES/0076-fdo-80986-disable-highlight-DOCX-import.patch new file mode 100644 index 0000000..c78e77d --- /dev/null +++ b/SOURCES/0076-fdo-80986-disable-highlight-DOCX-import.patch @@ -0,0 +1,64 @@ +From 4336ba9770efb61d4131c005fb1d16ab2be20928 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Zolnai=20Tam=C3=A1s?= +Date: Mon, 4 Aug 2014 11:02:55 +0200 +Subject: [PATCH 076/137] fdo#80986: disable highlight DOCX import + +Highlight support is not implemented fully, so +it seems better to disable DOCX import of it until +it is finished. +Highlight can't be modified on the UI and is not +saved to ODT/DOC (regression). + +Regression from: +8b949134441056a1455d67ddfdd7e0bc5f2ee682 + +(cherry picked from commit b5e60724ac73bb0e62b249145a8931fd6166bb69) + +Conflicts: + sw/qa/extras/ooxmlexport/ooxmlexport.cxx + +Change-Id: I94891769766ae90017e8afa70e65d080d5270202 +Reviewed-on: https://gerrit.libreoffice.org/10721 +Reviewed-by: Michael Stahl +Tested-by: Michael Stahl +--- + sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 2 ++ + writerfilter/source/dmapper/DomainMapper.cxx | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +index 4db47e5..b269a11 100644 +--- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx ++++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +@@ -1540,6 +1540,7 @@ DECLARE_OOXMLEXPORT_TEST(testFdo69636, "fdo69636.docx") + CPPUNIT_ASSERT(getXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/w:pict/v:rect/v:textbox", "style").match("mso-layout-flow-alt:bottom-to-top")); + } + ++/* + DECLARE_OOXMLEXPORT_TEST(testCharHighlight, "char_highlight.docx") + { + const uno::Reference< text::XTextRange > xPara = getParagraph(1); +@@ -1586,6 +1587,7 @@ DECLARE_OOXMLEXPORT_TEST(testCharHighlight, "char_highlight.docx") + CPPUNIT_ASSERT_EQUAL(sal_Int32(0x0000ff), getProperty(xRun,"CharBackColor")); + } + } ++*/ + + DECLARE_OOXMLEXPORT_TEST(testFontNameIsEmpty, "font-name-is-empty.docx") + { +diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx +index b9b1adf..aa6067d 100644 +--- a/writerfilter/source/dmapper/DomainMapper.cxx ++++ b/writerfilter/source/dmapper/DomainMapper.cxx +@@ -2102,7 +2102,7 @@ void DomainMapper::sprmWithProps( Sprm& rSprm, PropertyMapPtr rContext, SprmType + { + sal_Int32 nColor = 0; + if( (mbIsHighlightSet = getColorFromIndex(nIntValue, nColor)) ) +- rContext->Insert(PROP_CHAR_HIGHLIGHT, uno::makeAny( nColor )); ++ rContext->Insert(PROP_CHAR_BACK_COLOR, uno::makeAny( nColor )); + else if (mnBackgroundColor) + rContext->Insert(PROP_CHAR_BACK_COLOR, uno::makeAny( mnBackgroundColor )); + } +-- +1.9.3 + diff --git a/SOURCES/0077-avoid-buffer-overflow-by-using-wrong-buffer.patch b/SOURCES/0077-avoid-buffer-overflow-by-using-wrong-buffer.patch new file mode 100644 index 0000000..4e7f3a3 --- /dev/null +++ b/SOURCES/0077-avoid-buffer-overflow-by-using-wrong-buffer.patch @@ -0,0 +1,35 @@ +From 2580f10e8cec6fd9e3356a3a26a1cb6d8192e850 Mon Sep 17 00:00:00 2001 +From: Markus Mohrhard +Date: Sun, 3 Aug 2014 22:47:27 +0200 +Subject: [PATCH 077/137] avoid buffer overflow by using wrong buffer + +Found by Asan. + +(regression from CWS mba34issues01) + +Change-Id: Ia7159c9bed9d7f823448acd02e18568a5f3f2093 +Reviewed-on: https://gerrit.libreoffice.org/10717 +Reviewed-by: Michael Stahl +Tested-by: Michael Stahl +(cherry picked from commit 955c5539a1ea5e971f111989d6c5bec11d936416) +Signed-off-by: Michael Stahl +--- + sfx2/source/appl/appuno.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sfx2/source/appl/appuno.cxx b/sfx2/source/appl/appuno.cxx +index 50f8ee6..461d74c 100644 +--- a/sfx2/source/appl/appuno.cxx ++++ b/sfx2/source/appl/appuno.cxx +@@ -1021,7 +1021,7 @@ void TransformItems( sal_uInt16 nSlotId, const SfxItemSet& rSet, uno::SequenceGetFormalArgument( nArg ); ++ const SfxFormalArgument &rArg = bIsMediaDescriptor ? aFormalArgs[nArg] : pSlot->GetFormalArgument( nArg ); + + sal_uInt16 nWhich = rSet.GetPool()->GetWhich( rArg.nSlotId ); + if ( rSet.GetItemState( nWhich ) == SFX_ITEM_SET ) //??? +-- +1.9.3 + diff --git a/SOURCES/0077-fdo-70232-sw-brown-paper-bag-fix-for-header-sharing-.patch b/SOURCES/0077-fdo-70232-sw-brown-paper-bag-fix-for-header-sharing-.patch deleted file mode 100644 index 7258f71..0000000 --- a/SOURCES/0077-fdo-70232-sw-brown-paper-bag-fix-for-header-sharing-.patch +++ /dev/null @@ -1,36 +0,0 @@ -From e839c779a1a6b5a80d5e7368c457ba9620ecd6bb Mon Sep 17 00:00:00 2001 -From: Michael Stahl -Date: Fri, 20 Dec 2013 11:24:48 +0100 -Subject: [PATCH 077/109] fdo#70232: sw: brown paper-bag fix for header sharing - mangling footers - -Stupid copy/paste error in SwDoc::CopyMasterFooter() checks -IsHeaderShared(). - -(regression from e1a9a348a519a69f898c9c1e6d87a5837b8267f9) - -Change-Id: I0c0bc16a8c581cd05ed206a0de79c7983204165b -(cherry picked from commit 94c772adc2e8d8af468f3996527c84bf7704103f) -Reviewed-on: https://gerrit.libreoffice.org/7154 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna ---- - sw/source/core/doc/docdesc.cxx | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/sw/source/core/doc/docdesc.cxx b/sw/source/core/doc/docdesc.cxx -index bb1d78f..7bbecfa 100644 ---- a/sw/source/core/doc/docdesc.cxx -+++ b/sw/source/core/doc/docdesc.cxx -@@ -259,7 +259,7 @@ void SwDoc::CopyMasterFooter(const SwPageDesc &rChged, const SwFmtFooter &rFoot, - // The CntntIdx is _always_ different when called from - // SwDocStyleSheet::SetItemSet, because it deep-copies the - // PageDesc. So check if it was previously shared. -- ((bLeft) ? pDesc->IsHeaderShared() : pDesc->IsFirstShared())) -+ ((bLeft) ? pDesc->IsFooterShared() : pDesc->IsFirstShared())) - { - SwFrmFmt *pFmt = new SwFrmFmt( GetAttrPool(), (bLeft ? "Left footer" : "First footer"), - GetDfltFrmFmt() ); --- -1.8.4.2 - diff --git a/SOURCES/0078-fdo-69065-sw-fix-mirrored-page-style-with-first-page.patch b/SOURCES/0078-fdo-69065-sw-fix-mirrored-page-style-with-first-page.patch deleted file mode 100644 index 8474448..0000000 --- a/SOURCES/0078-fdo-69065-sw-fix-mirrored-page-style-with-first-page.patch +++ /dev/null @@ -1,596 +0,0 @@ -From 283b76abeafe28c335de2d7cdc2fde04a55d4192 Mon Sep 17 00:00:00 2001 -From: Michael Stahl -Date: Fri, 20 Dec 2013 17:58:12 +0100 -Subject: [PATCH 078/109] fdo#69065: sw: fix mirrored page style with - first-page - -If a mirrored page style is used with first-page on both a right page -and a left page the current design cannot work because the margins in -the SwPageDesc::aFirst cannot be right for both cases. - -So split that up so we get a first-master and first-left format and -copy the headers/footers and margins as appropriate... which is really -adding epicycles to a flawed design; probably this would be better with -just a single SwFrmFmt that has different items for master/left/first -headers. - -(cherry picked from commit e936ecc92a7e362f57ce72a955697840920636b8) - -Conflicts: - sw/source/core/doc/docdesc.cxx - sw/source/core/doc/poolfmt.cxx - -Change-Id: I0889a4ab5959b5a71172203bb64d185960a07d73 -Reviewed-on: https://gerrit.libreoffice.org/7158 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna ---- - sw/inc/doc.hxx | 4 +- - sw/inc/pagedesc.hxx | 10 ++-- - sw/source/core/doc/docdesc.cxx | 97 ++++++++++++++++++++++++++-------- - sw/source/core/doc/docfmt.cxx | 20 +++++-- - sw/source/core/doc/poolfmt.cxx | 5 +- - sw/source/core/layout/frmtool.cxx | 13 ++--- - sw/source/core/layout/pagedesc.cxx | 23 +++++--- - sw/source/core/undo/SwUndoPageDesc.cxx | 4 +- - sw/source/core/unocore/unostyle.cxx | 4 +- - sw/source/filter/ww8/wrtw8sty.cxx | 2 +- - sw/source/filter/ww8/ww8atr.cxx | 2 +- - sw/source/filter/ww8/ww8par.cxx | 8 +-- - sw/source/filter/ww8/ww8par6.cxx | 8 +-- - 13 files changed, 142 insertions(+), 58 deletions(-) - -diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx -index 12ab476..ff372aa 100644 ---- a/sw/inc/doc.hxx -+++ b/sw/inc/doc.hxx -@@ -2080,9 +2080,9 @@ private: - /// method to set new graphics pool defaults, must only be called by SetDrawDefaults! - void UpdateDrawDefaults(); - /// Copies master header to left / first one, if necessary - used by ChgPageDesc(). -- void CopyMasterHeader(const SwPageDesc &rChged, const SwFmtHeader &rHead, SwPageDesc *pDesc, bool bLeft); -+ void CopyMasterHeader(const SwPageDesc &rChged, const SwFmtHeader &rHead, SwPageDesc *pDesc, bool bLeft, bool bFirst); - /// Copies master footer to left / first one, if necessary - used by ChgPageDesc(). -- void CopyMasterFooter(const SwPageDesc &rChged, const SwFmtFooter &rFoot, SwPageDesc *pDesc, bool bLeft); -+ void CopyMasterFooter(const SwPageDesc &rChged, const SwFmtFooter &rFoot, SwPageDesc *pDesc, bool bLeft, bool bFirst); - - /** continue computing a chunk of document statistics - * \param nChars number of characters to count before exiting -diff --git a/sw/inc/pagedesc.hxx b/sw/inc/pagedesc.hxx -index 45ca5df..a4a74a2 100644 ---- a/sw/inc/pagedesc.hxx -+++ b/sw/inc/pagedesc.hxx -@@ -136,7 +136,9 @@ class SW_DLLPUBLIC SwPageDesc : public SwModify - SvxNumberType aNumType; - SwFrmFmt aMaster; - SwFrmFmt aLeft; -- SwFrmFmt aFirst; -+ // FIXME epicycles growing here - page margins need to be stored differently -+ SwFrmFmt m_FirstMaster; -+ SwFrmFmt m_FirstLeft; - SwDepend aDepend; ///< Because of grid alignment (Registerhaltigkeit). - SwPageDesc *pFollow; - sal_uInt16 nRegHeight; ///< Sentence spacing and fontascent of style. -@@ -191,10 +193,12 @@ public: - - SwFrmFmt &GetMaster() { return aMaster; } - SwFrmFmt &GetLeft() { return aLeft; } -- SwFrmFmt &GetFirst() { return aFirst; } -+ SwFrmFmt &GetFirstMaster() { return m_FirstMaster; } -+ SwFrmFmt &GetFirstLeft() { return m_FirstLeft; } - const SwFrmFmt &GetMaster() const { return aMaster; } - const SwFrmFmt &GetLeft() const { return aLeft; } -- const SwFrmFmt &GetFirst() const { return aFirst; } -+ const SwFrmFmt &GetFirstMaster() const { return m_FirstMaster; } -+ const SwFrmFmt &GetFirstLeft() const { return m_FirstLeft; } - - /** Reset all attrs of the format but keep the ones a pagedesc - cannot live without. */ -diff --git a/sw/source/core/doc/docdesc.cxx b/sw/source/core/doc/docdesc.cxx -index 7bbecfa..9694337 100644 ---- a/sw/source/core/doc/docdesc.cxx -+++ b/sw/source/core/doc/docdesc.cxx -@@ -59,7 +59,8 @@ using namespace com::sun::star; - static void lcl_DefaultPageFmt( sal_uInt16 nPoolFmtId, - SwFrmFmt &rFmt1, - SwFrmFmt &rFmt2, -- SwFrmFmt &rFmt3 ) -+ SwFrmFmt &rFmt3, -+ SwFrmFmt &rFmt4) - { - // --> #i41075# Printer on demand - // This function does not require a printer anymore. -@@ -115,6 +116,10 @@ static void lcl_DefaultPageFmt( sal_uInt16 nPoolFmtId, - rFmt3.SetFmtAttr( aFrmSize ); - rFmt3.SetFmtAttr( aLR ); - rFmt3.SetFmtAttr( aUL ); -+ -+ rFmt4.SetFmtAttr( aFrmSize ); -+ rFmt4.SetFmtAttr( aLR ); -+ rFmt4.SetFmtAttr( aUL ); - } - - static void lcl_DescSetAttr( const SwFrmFmt &rSource, SwFrmFmt &rDest, -@@ -163,10 +168,21 @@ static void lcl_DescSetAttr( const SwFrmFmt &rSource, SwFrmFmt &rDest, - rDest.SetPoolHlpFileId( rSource.GetPoolHlpFileId() ); - } - --void SwDoc::CopyMasterHeader(const SwPageDesc &rChged, const SwFmtHeader &rHead, SwPageDesc *pDesc, bool bLeft) -+void SwDoc::CopyMasterHeader(const SwPageDesc &rChged, const SwFmtHeader &rHead, SwPageDesc *pDesc, bool bLeft, bool bFirst) - { -- SwFrmFmt& rDescFrmFmt = (bLeft ? pDesc->GetLeft() : pDesc->GetFirst()); -- if ( (bLeft ? rChged.IsHeaderShared() : rChged.IsFirstShared() ) || !rHead.IsActive() ) -+ assert(bLeft || bFirst); -+ SwFrmFmt& rDescFrmFmt = (bFirst) -+ ? (bLeft) ? pDesc->GetFirstLeft() : pDesc->GetFirstMaster() -+ : pDesc->GetLeft(); -+ if (bFirst && bLeft) -+ { -+ // special case: always shared with something -+ rDescFrmFmt.SetFmtAttr( rChged.IsFirstShared() -+ ? pDesc->GetLeft().GetHeader() -+ : pDesc->GetFirstMaster().GetHeader()); -+ } -+ else if ((bFirst ? rChged.IsFirstShared() : rChged.IsHeaderShared()) -+ || !rHead.IsActive()) - { - // Left or first shares the header with the Master. - rDescFrmFmt.SetFmtAttr( pDesc->GetMaster().GetHeader() ); -@@ -191,16 +207,19 @@ void SwDoc::CopyMasterHeader(const SwPageDesc &rChged, const SwFmtHeader &rHead, - const SwFmtCntnt &aCnt = rFmtHead.GetHeaderFmt()->GetCntnt(); - if( !aCnt.GetCntntIdx() ) - { -- const SwFrmFmt& rChgedFrmFmt = (bLeft ? rChged.GetLeft() : rChged.GetFirst()); -+ const SwFrmFmt& rChgedFrmFmt = (bFirst) -+ ? (bLeft) ? rChged.GetFirstLeft() : rChged.GetFirstMaster() -+ : rChged.GetLeft(); - rDescFrmFmt.SetFmtAttr( rChgedFrmFmt.GetHeader() ); - } - else if ((*aRCnt.GetCntntIdx() == *aCnt.GetCntntIdx()) || - // The CntntIdx is _always_ different when called from - // SwDocStyleSheet::SetItemSet, because it deep-copies the - // PageDesc. So check if it was previously shared. -- ((bLeft) ? pDesc->IsHeaderShared() : pDesc->IsFirstShared())) -+ ((bFirst) ? pDesc->IsFirstShared() : pDesc->IsHeaderShared())) - { -- SwFrmFmt *pFmt = new SwFrmFmt( GetAttrPool(), (bLeft ? "Left header" : "First header"), -+ SwFrmFmt *pFmt = new SwFrmFmt( GetAttrPool(), -+ (bFirst) ? "First header" : "Left header", - GetDfltFrmFmt() ); - ::lcl_DescSetAttr( *pRight, *pFmt, false ); - // The section which the right header attribute is pointing -@@ -226,12 +245,25 @@ void SwDoc::CopyMasterHeader(const SwPageDesc &rChged, const SwFmtHeader &rHead, - } - } - --void SwDoc::CopyMasterFooter(const SwPageDesc &rChged, const SwFmtFooter &rFoot, SwPageDesc *pDesc, bool bLeft) -+void SwDoc::CopyMasterFooter(const SwPageDesc &rChged, const SwFmtFooter &rFoot, SwPageDesc *pDesc, bool bLeft, bool bFirst) - { -- SwFrmFmt& rDescFrmFmt = (bLeft ? pDesc->GetLeft() : pDesc->GetFirst()); -- if ( (bLeft ? rChged.IsFooterShared() : rChged.IsFirstShared() ) || !rFoot.IsActive() ) -+ assert(bLeft || bFirst); -+ SwFrmFmt& rDescFrmFmt = (bFirst) -+ ? (bLeft) ? pDesc->GetFirstLeft() : pDesc->GetFirstMaster() -+ : pDesc->GetLeft(); -+ if (bFirst && bLeft) -+ { -+ // special case: always shared with something -+ rDescFrmFmt.SetFmtAttr( rChged.IsFirstShared() -+ ? pDesc->GetLeft().GetFooter() -+ : pDesc->GetFirstMaster().GetFooter()); -+ } -+ else if ((bFirst ? rChged.IsFirstShared() : rChged.IsFooterShared()) -+ || !rFoot.IsActive()) -+ { - // Left or first shares the Header with the Master. - rDescFrmFmt.SetFmtAttr( pDesc->GetMaster().GetFooter() ); -+ } - else if ( rFoot.IsActive() ) - { // Left or first gets its own Footer if the Format does not already have one. - // If the Format already has a Footer and it points to the same section as the Right one, -@@ -252,16 +284,19 @@ void SwDoc::CopyMasterFooter(const SwPageDesc &rChged, const SwFmtFooter &rFoot, - const SwFmtCntnt &aLCnt = rFmtFoot.GetFooterFmt()->GetCntnt(); - if( !aLCnt.GetCntntIdx() ) - { -- const SwFrmFmt& rChgedFrmFmt = (bLeft ? rChged.GetLeft() : rChged.GetFirst()); -+ const SwFrmFmt& rChgedFrmFmt = (bFirst) -+ ? (bLeft) ? rChged.GetFirstLeft() : rChged.GetFirstMaster() -+ : rChged.GetLeft(); - rDescFrmFmt.SetFmtAttr( rChgedFrmFmt.GetFooter() ); - } - else if ((*aRCnt.GetCntntIdx() == *aLCnt.GetCntntIdx()) || - // The CntntIdx is _always_ different when called from - // SwDocStyleSheet::SetItemSet, because it deep-copies the - // PageDesc. So check if it was previously shared. -- ((bLeft) ? pDesc->IsFooterShared() : pDesc->IsFirstShared())) -+ ((bFirst) ? pDesc->IsFirstShared() : pDesc->IsFooterShared())) - { -- SwFrmFmt *pFmt = new SwFrmFmt( GetAttrPool(), (bLeft ? "Left footer" : "First footer"), -+ SwFrmFmt *pFmt = new SwFrmFmt( GetAttrPool(), -+ (bFirst) ? "First footer" : "Left footer", - GetDfltFrmFmt() ); - ::lcl_DescSetAttr( *pRight, *pFmt, false ); - // The section to which the right footer attribute is pointing -@@ -310,7 +345,9 @@ void SwDoc::ChgPageDesc( sal_uInt16 i, const SwPageDesc &rChged ) - const_cast(rChged).GetLeft()); - } - ::lcl_DescSetAttr(rChged.GetMaster(), -- const_cast(rChged).GetFirst()); -+ const_cast(rChged).GetFirstMaster()); -+ ::lcl_DescSetAttr(rChged.GetLeft(), -+ const_cast(rChged).GetFirstLeft()); - - // Take over NumType. - if( rChged.GetNumType().GetNumberingType() != pDesc->GetNumType().GetNumberingType() ) -@@ -350,8 +387,9 @@ void SwDoc::ChgPageDesc( sal_uInt16 i, const SwPageDesc &rChged ) - rChged.IsFirstShared() != pDesc->IsFirstShared() ); - } - pDesc->GetMaster().SetFmtAttr( rHead ); -- CopyMasterHeader(rChged, rHead, pDesc, true); // Copy left header -- CopyMasterHeader(rChged, rHead, pDesc, false); // Copy first header -+ CopyMasterHeader(rChged, rHead, pDesc, true, false); // Copy left header -+ CopyMasterHeader(rChged, rHead, pDesc, false, true); // Copy first master -+ CopyMasterHeader(rChged, rHead, pDesc, true, true); // Copy first left - pDesc->ChgHeaderShare( rChged.IsHeaderShared() ); - - // Synch Footer. -@@ -366,8 +404,9 @@ void SwDoc::ChgPageDesc( sal_uInt16 i, const SwPageDesc &rChged ) - rChged.IsFooterShared() != pDesc->IsFooterShared() ); - } - pDesc->GetMaster().SetFmtAttr( rFoot ); -- CopyMasterFooter(rChged, rFoot, pDesc, true); // Copy left footer -- CopyMasterFooter(rChged, rFoot, pDesc, false); // Copy first footer -+ CopyMasterFooter(rChged, rFoot, pDesc, true, false); // Copy left footer -+ CopyMasterFooter(rChged, rFoot, pDesc, false, true); // Copy first master -+ CopyMasterFooter(rChged, rFoot, pDesc, true, true); // Copy first left - pDesc->ChgFooterShare( rChged.IsFooterShared() ); - // there is just one first shared flag for both header and footer? - pDesc->ChgFirstShare( rChged.IsFirstShared() ); -@@ -408,7 +447,8 @@ void SwDoc::ChgPageDesc( sal_uInt16 i, const SwPageDesc &rChged ) - // Take over the page attributes. - ::lcl_DescSetAttr( rChged.GetMaster(), pDesc->GetMaster() ); - ::lcl_DescSetAttr( rChged.GetLeft(), pDesc->GetLeft() ); -- ::lcl_DescSetAttr( rChged.GetFirst(), pDesc->GetFirst() ); -+ ::lcl_DescSetAttr( rChged.GetFirstMaster(), pDesc->GetFirstMaster() ); -+ ::lcl_DescSetAttr( rChged.GetFirstLeft(), pDesc->GetFirstLeft() ); - - // If the FootnoteInfo changes, the pages are triggered. - if( !(pDesc->GetFtnInfo() == rChged.GetFtnInfo()) ) -@@ -422,7 +462,10 @@ void SwDoc::ChgPageDesc( sal_uInt16 i, const SwPageDesc &rChged ) - pDesc->GetLeft().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) ); - } - { -- pDesc->GetFirst().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) ); -+ pDesc->GetFirstMaster().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) ); -+ } -+ { -+ pDesc->GetFirstLeft().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) ); - } - } - SetModified(); -@@ -444,6 +487,13 @@ void SwDoc::ChgPageDesc( sal_uInt16 i, const SwPageDesc &rChged ) - pBindings->Invalidate( SID_ATTR_PAGE_LRSPACE ); - } - -+ //h/f of first-left page must not be unique but same as first master or left -+ assert((pDesc->IsFirstShared()) -+ ? pDesc->GetFirstLeft().GetHeader().GetHeaderFmt() == pDesc->GetLeft().GetHeader().GetHeaderFmt() -+ : pDesc->GetFirstLeft().GetHeader().GetHeaderFmt() == pDesc->GetFirstMaster().GetHeader().GetHeaderFmt()); -+ assert((pDesc->IsFirstShared()) -+ ? pDesc->GetFirstLeft().GetFooter().GetFooterFmt() == pDesc->GetLeft().GetFooter().GetFooterFmt() -+ : pDesc->GetFirstLeft().GetFooter().GetFooterFmt() == pDesc->GetFirstMaster().GetFooter().GetFooterFmt()); - } - - /// All descriptors whose Follow point to the to-be-deleted have to be adapted. -@@ -554,7 +604,7 @@ sal_uInt16 SwDoc::MakePageDesc( const String &rName, const SwPageDesc *pCpy, - { - pNew = new SwPageDesc( rName, GetDfltFrmFmt(), this ); - // Set the default page format. -- lcl_DefaultPageFmt( USHRT_MAX, pNew->GetMaster(), pNew->GetLeft(), pNew->GetFirst() ); -+ lcl_DefaultPageFmt( USHRT_MAX, pNew->GetMaster(), pNew->GetLeft(), pNew->GetFirstMaster(), pNew->GetFirstLeft() ); - - SvxFrameDirection aFrameDirection = bRegardLanguage ? - GetDefaultFrameDirection(GetAppLanguage()) -@@ -562,7 +612,8 @@ sal_uInt16 SwDoc::MakePageDesc( const String &rName, const SwPageDesc *pCpy, - - pNew->GetMaster().SetFmtAttr( SvxFrameDirectionItem(aFrameDirection, RES_FRAMEDIR) ); - pNew->GetLeft().SetFmtAttr( SvxFrameDirectionItem(aFrameDirection, RES_FRAMEDIR) ); -- pNew->GetFirst().SetFmtAttr( SvxFrameDirectionItem(aFrameDirection, RES_FRAMEDIR) ); -+ pNew->GetFirstMaster().SetFmtAttr( SvxFrameDirectionItem(aFrameDirection, RES_FRAMEDIR) ); -+ pNew->GetFirstLeft().SetFmtAttr( SvxFrameDirectionItem(aFrameDirection, RES_FRAMEDIR) ); - } - maPageDescs.push_back( pNew ); - -@@ -855,7 +906,7 @@ void SwDoc::CheckDefaultPageFmt() - LONG_MAX == rLeftSize.GetHeight(); - - if ( bSetSize ) -- lcl_DefaultPageFmt( rDesc.GetPoolFmtId(), rDesc.GetMaster(), rDesc.GetLeft(), rDesc.GetFirst() ); -+ lcl_DefaultPageFmt( rDesc.GetPoolFmtId(), rDesc.GetMaster(), rDesc.GetLeft(), rDesc.GetFirstMaster(), rDesc.GetFirstLeft() ); - } - } - -diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx -index c94b913..78e347b 100644 ---- a/sw/source/core/doc/docfmt.cxx -+++ b/sw/source/core/doc/docfmt.cxx -@@ -2156,18 +2156,30 @@ void SwDoc::CopyPageDesc( const SwPageDesc& rSrcDesc, SwPageDesc& rDstDesc, - else - rDstDesc.GetLeft().SetFmtAttr( rDstDesc.GetMaster().GetHeader() ); - if( !rDstDesc.IsFirstShared() ) -- CopyHeader( rSrcDesc.GetFirst(), rDstDesc.GetFirst() ); -+ { -+ CopyHeader( rSrcDesc.GetFirstMaster(), rDstDesc.GetFirstMaster() ); -+ rDstDesc.GetFirstLeft().SetFmtAttr(rDstDesc.GetFirstMaster().GetHeader()); -+ } - else -- rDstDesc.GetFirst().SetFmtAttr( rDstDesc.GetMaster().GetHeader() ); -+ { -+ rDstDesc.GetFirstMaster().SetFmtAttr( rDstDesc.GetMaster().GetHeader() ); -+ rDstDesc.GetFirstLeft().SetFmtAttr(rDstDesc.GetLeft().GetHeader()); -+ } - - if( !rDstDesc.IsFooterShared() ) - CopyFooter( rSrcDesc.GetLeft(), rDstDesc.GetLeft() ); - else - rDstDesc.GetLeft().SetFmtAttr( rDstDesc.GetMaster().GetFooter() ); - if( !rDstDesc.IsFirstShared() ) -- CopyFooter( rSrcDesc.GetFirst(), rDstDesc.GetFirst() ); -+ { -+ CopyFooter( rSrcDesc.GetFirstMaster(), rDstDesc.GetFirstMaster() ); -+ rDstDesc.GetFirstLeft().SetFmtAttr(rDstDesc.GetFirstMaster().GetFooter()); -+ } - else -- rDstDesc.GetFirst().SetFmtAttr( rDstDesc.GetMaster().GetFooter() ); -+ { -+ rDstDesc.GetFirstMaster().SetFmtAttr( rDstDesc.GetMaster().GetFooter() ); -+ rDstDesc.GetFirstLeft().SetFmtAttr(rDstDesc.GetLeft().GetFooter()); -+ } - - if( bNotifyLayout && pTmpRoot ) - { -diff --git a/sw/source/core/doc/poolfmt.cxx b/sw/source/core/doc/poolfmt.cxx -index f0ee570..b6494f5 100644 ---- a/sw/source/core/doc/poolfmt.cxx -+++ b/sw/source/core/doc/poolfmt.cxx -@@ -1591,9 +1591,12 @@ SwPageDesc* SwDoc::GetPageDescFromPool( sal_uInt16 nId, bool bRegardLanguage ) - { - { - if( bSetLeft ) -+ { - pNewPgDsc->GetLeft().SetFmtAttr( aSet ); -+ pNewPgDsc->GetFirstLeft().SetFmtAttr( aSet ); -+ } - pNewPgDsc->GetMaster().SetFmtAttr( aSet ); -- pNewPgDsc->GetFirst().SetFmtAttr( aSet ); -+ pNewPgDsc->GetFirstMaster().SetFmtAttr( aSet ); - } - } - return pNewPgDsc; -diff --git a/sw/source/core/layout/frmtool.cxx b/sw/source/core/layout/frmtool.cxx -index 06dc22c..8245f14 100644 ---- a/sw/source/core/layout/frmtool.cxx -+++ b/sw/source/core/layout/frmtool.cxx -@@ -2719,18 +2719,19 @@ SwPageFrm * InsertNewPage( SwPageDesc &rDesc, SwFrm *pUpper, - if (rDesc.IsFirstShared()) - { - // We need to fallback to left or right page format, decide it now. -+ // FIXME: is this still needed? - if (bOdd) - { -- rDesc.GetFirst().SetFmtAttr( rDesc.GetMaster().GetHeader() ); -- rDesc.GetFirst().SetFmtAttr( rDesc.GetMaster().GetFooter() ); -+ rDesc.GetFirstMaster().SetFmtAttr( rDesc.GetMaster().GetHeader() ); -+ rDesc.GetFirstMaster().SetFmtAttr( rDesc.GetMaster().GetFooter() ); - // fdo#60250 copy margins for mirrored pages -- rDesc.GetFirst().SetFmtAttr( rDesc.GetMaster().GetLRSpace() ); -+ rDesc.GetFirstMaster().SetFmtAttr( rDesc.GetMaster().GetLRSpace() ); - } - else - { -- rDesc.GetFirst().SetFmtAttr( rDesc.GetLeft().GetHeader() ); -- rDesc.GetFirst().SetFmtAttr( rDesc.GetLeft().GetFooter() ); -- rDesc.GetFirst().SetFmtAttr( rDesc.GetLeft().GetLRSpace() ); -+ rDesc.GetFirstLeft().SetFmtAttr( rDesc.GetLeft().GetHeader() ); -+ rDesc.GetFirstLeft().SetFmtAttr( rDesc.GetLeft().GetFooter() ); -+ rDesc.GetFirstLeft().SetFmtAttr( rDesc.GetLeft().GetLRSpace() ); - } - } - } -diff --git a/sw/source/core/layout/pagedesc.cxx b/sw/source/core/layout/pagedesc.cxx -index 1b248f1..05a24d1 100644 ---- a/sw/source/core/layout/pagedesc.cxx -+++ b/sw/source/core/layout/pagedesc.cxx -@@ -49,7 +49,8 @@ SwPageDesc::SwPageDesc( const String& rName, SwFrmFmt *pFmt, SwDoc *pDc ) : - aDescName( rName ), - aMaster( pDc->GetAttrPool(), rName, pFmt ), - aLeft( pDc->GetAttrPool(), rName, pFmt ), -- aFirst( pDc->GetAttrPool(), rName, pFmt ), -+ m_FirstMaster( pDc->GetAttrPool(), rName, pFmt ), -+ m_FirstLeft( pDc->GetAttrPool(), rName, pFmt ), - aDepend( this, 0 ), - pFollow( this ), - nRegHeight( 0 ), -@@ -67,7 +68,8 @@ SwPageDesc::SwPageDesc( const SwPageDesc &rCpy ) : - aNumType( rCpy.GetNumType() ), - aMaster( rCpy.GetMaster() ), - aLeft( rCpy.GetLeft() ), -- aFirst( rCpy.GetFirst() ), -+ m_FirstMaster( rCpy.GetFirstMaster() ), -+ m_FirstLeft( rCpy.GetFirstLeft() ), - aDepend( this, (SwModify*)rCpy.aDepend.GetRegisteredIn() ), - pFollow( rCpy.pFollow ), - nRegHeight( rCpy.GetRegHeight() ), -@@ -85,7 +87,8 @@ SwPageDesc & SwPageDesc::operator = (const SwPageDesc & rSrc) - aNumType = rSrc.aNumType; - aMaster = rSrc.aMaster; - aLeft = rSrc.aLeft; -- aFirst = rSrc.aFirst; -+ m_FirstMaster = rSrc.m_FirstMaster; -+ m_FirstLeft = rSrc.m_FirstLeft; - - if (rSrc.pFollow == &rSrc) - pFollow = this; -@@ -243,7 +246,15 @@ void SwPageDesc::RegisterChange() - } - } - { -- SwIterator aIter( GetFirst() ); -+ SwIterator aIter( GetFirstMaster() ); -+ for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() ) -+ { -+ if( pLast->IsPageFrm() ) -+ ((SwPageFrm*)pLast)->PrepareRegisterChg(); -+ } -+ } -+ { -+ SwIterator aIter( GetFirstLeft() ); - for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() ) - { - if( pLast->IsPageFrm() ) -@@ -348,14 +359,14 @@ sal_Bool SwPageDesc::IsFollowNextPageOfNode( const SwNode& rNd ) const - SwFrmFmt *SwPageDesc::GetLeftFmt(bool const bFirst) - { - return (nsUseOnPage::PD_LEFT & eUse) -- ? ((bFirst) ? &aFirst : &aLeft) -+ ? ((bFirst) ? &m_FirstLeft : &aLeft) - : 0; - } - - SwFrmFmt *SwPageDesc::GetRightFmt(bool const bFirst) - { - return (nsUseOnPage::PD_RIGHT & eUse) -- ? ((bFirst) ? &aFirst : &aMaster) -+ ? ((bFirst) ? &m_FirstMaster : &aMaster) - : 0; - } - -diff --git a/sw/source/core/undo/SwUndoPageDesc.cxx b/sw/source/core/undo/SwUndoPageDesc.cxx -index 6962684..b60c18b 100644 ---- a/sw/source/core/undo/SwUndoPageDesc.cxx -+++ b/sw/source/core/undo/SwUndoPageDesc.cxx -@@ -157,7 +157,7 @@ SwUndoPageDesc::SwUndoPageDesc(const SwPageDesc & _aOld, - } - if( !rNewDesc.IsFirstShared() ) - { -- pFormat = new SwFrmFmt( *rNewDesc.GetFirst().GetHeader().GetHeaderFmt() ); -+ pFormat = new SwFrmFmt( *rNewDesc.GetFirstMaster().GetHeader().GetHeaderFmt() ); - // The Ctor of this object will remove the duplicate! - SwFmtHeader aFormatHeader( pFormat ); - } -@@ -176,7 +176,7 @@ SwUndoPageDesc::SwUndoPageDesc(const SwPageDesc & _aOld, - } - if( !rNewDesc.IsFirstShared() ) - { -- pFormat = new SwFrmFmt( *rNewDesc.GetFirst().GetFooter().GetFooterFmt() ); -+ pFormat = new SwFrmFmt( *rNewDesc.GetFirstMaster().GetFooter().GetFooterFmt() ); - // The Ctor of this object will remove the duplicate! - SwFmtFooter aFormatFooter( pFormat ); - } -diff --git a/sw/source/core/unocore/unostyle.cxx b/sw/source/core/unocore/unostyle.cxx -index a7d3b17..0e090be 100644 ---- a/sw/source/core/unocore/unostyle.cxx -+++ b/sw/source/core/unocore/unostyle.cxx -@@ -3411,7 +3411,9 @@ MakeObject: - } - else if (bFirst && !bShareFirst) - { -- pFrmFmt = &rDesc.GetFirst(); -+ pFrmFmt = &rDesc.GetFirstMaster(); -+ // no need to make GetFirstLeft() accessible -+ // since it is always shared - } - else - { -diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx -index 097a8a7..bc08a72 100644 ---- a/sw/source/filter/ww8/wrtw8sty.cxx -+++ b/sw/source/filter/ww8/wrtw8sty.cxx -@@ -1614,7 +1614,7 @@ void MSWordExportBase::SectionProperties( const WW8_SepInfo& rSepInfo, WW8_PdAtt - // The latter method was previously used by the doc/docx import filter. - // In both of these cases, we emit a single Word section with different - // first page header/footer. -- const SwFrmFmt* pPdFirstPgFmt = &pPd->GetFirst(); -+ const SwFrmFmt* pPdFirstPgFmt = &pPd->GetFirstMaster(); - bool titlePage = !pPd->IsFirstShared(); - if ( bOutPgDscSet ) - { -diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx -index d2dae7c..d211344 100644 ---- a/sw/source/filter/ww8/ww8atr.cxx -+++ b/sw/source/filter/ww8/ww8atr.cxx -@@ -371,7 +371,7 @@ bool MSWordExportBase::SetAktPageDescFromNode(const SwNode &rNd) - bNewPageDesc = true; - else - { -- const SwFrmFmt& rTitleFmt = pAktPageDesc->GetFirst(); -+ const SwFrmFmt& rTitleFmt = pAktPageDesc->GetFirstMaster(); - const SwFrmFmt& rFollowFmt = pCurrent->GetMaster(); - - bNewPageDesc = !IsPlausableSingleWordSection(rTitleFmt, -diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx -index 223de68..b34b966 100644 ---- a/sw/source/filter/ww8/ww8par.cxx -+++ b/sw/source/filter/ww8/ww8par.cxx -@@ -2001,7 +2001,7 @@ void SwWW8ImplReader::Read_HdFt(int nSect, const SwPageDesc *pPrev, - = (nI & ( WW8_FOOTER_EVEN | WW8_FOOTER_ODD | WW8_FOOTER_FIRST )) ? true: false; - - SwFrmFmt& rFmt = bUseLeft ? pPD->GetLeft() -- : bUseFirst ? pPD->GetFirst() -+ : bUseFirst ? pPD->GetFirstMaster() - : pPD->GetMaster(); - - SwFrmFmt* pHdFtFmt; -@@ -2016,7 +2016,7 @@ void SwWW8ImplReader::Read_HdFt(int nSect, const SwPageDesc *pPrev, - if (bUseLeft) - pPD->GetLeft().SetFmtAttr(SwFmtFooter(true)); - if (bUseFirst || (rSection.maSep.fTitlePage && bNoFirst)) -- pPD->GetFirst().SetFmtAttr(SwFmtFooter(true)); -+ pPD->GetFirstMaster().SetFmtAttr(SwFmtFooter(true)); - pHdFtFmt = const_cast(rFmt.GetFooter().GetFooterFmt()); - } - else -@@ -2028,7 +2028,7 @@ void SwWW8ImplReader::Read_HdFt(int nSect, const SwPageDesc *pPrev, - if (bUseLeft) - pPD->GetLeft().SetFmtAttr(SwFmtHeader(true)); - if (bUseFirst || (rSection.maSep.fTitlePage && bNoFirst)) -- pPD->GetFirst().SetFmtAttr(SwFmtHeader(true)); -+ pPD->GetFirstMaster().SetFmtAttr(SwFmtHeader(true)); - pHdFtFmt = const_cast(rFmt.GetHeader().GetHeaderFmt()); - } - -@@ -3853,7 +3853,7 @@ void wwSectionManager::SetSegmentToPageDesc(const wwSection &rSection, - if (!(rSection.maSep.pgbApplyTo & 1)) - mrReader.SetPageBorder(rFmt, rSection); - if (!(rSection.maSep.pgbApplyTo & 2)) -- mrReader.SetPageBorder(rPage.GetFirst(), rSection); -+ mrReader.SetPageBorder(rPage.GetFirstMaster(), rSection); - - mrReader.SetDocumentGrid(rFmt, rSection); - } -diff --git a/sw/source/filter/ww8/ww8par6.cxx b/sw/source/filter/ww8/ww8par6.cxx -index 0d9a638..49fd40e 100644 ---- a/sw/source/filter/ww8/ww8par6.cxx -+++ b/sw/source/filter/ww8/ww8par6.cxx -@@ -1183,14 +1183,14 @@ void SwWW8ImplReader::CopyPageDescHdFt(const SwPageDesc* pOrgPageDesc, - // copy first page header content section - if( nCode & WW8_HEADER_FIRST ) - { -- rDoc.CopyHeader(pOrgPageDesc->GetFirst(), -- pNewPageDesc->GetFirst()); -+ rDoc.CopyHeader(pOrgPageDesc->GetFirstMaster(), -+ pNewPageDesc->GetFirstMaster()); - } - // copy first page footer content section - if( nCode & WW8_FOOTER_FIRST ) - { -- rDoc.CopyFooter(pOrgPageDesc->GetFirst(), -- pNewPageDesc->GetFirst()); -+ rDoc.CopyFooter(pOrgPageDesc->GetFirstMaster(), -+ pNewPageDesc->GetFirstMaster()); - } - } - --- -1.8.4.2 - diff --git a/SOURCES/0078-fdo-81993-Revert-Resolves-i119464-Update-default-ali.patch b/SOURCES/0078-fdo-81993-Revert-Resolves-i119464-Update-default-ali.patch new file mode 100644 index 0000000..7bb4710 --- /dev/null +++ b/SOURCES/0078-fdo-81993-Revert-Resolves-i119464-Update-default-ali.patch @@ -0,0 +1,59 @@ +From 11ad475ec81353ddf87834e22e2db02c23d172d7 Mon Sep 17 00:00:00 2001 +From: Michael Stahl +Date: Mon, 4 Aug 2014 17:00:50 +0200 +Subject: [PATCH 078/137] fdo#81993: Revert "Resolves: #i119464# Update default + alignment ... + +... value for docx [Sub]Title" + +This reverts commit acc671ec74c874ffd22803bb2ee54a1f2c027155. + +The commit is clearly unnecessary: + +1) commit 3f9e7e72c53ecbe8ee1ab060f811cb41eadfc7e1 + appears to be a better fix for alignment + +2) commit b95d203bc17c83ec0fe5139f519d53ed1d842d3a + should have disabled the Center default in Writer already + +Change-Id: Ib0cc60af037f12be0a1ab94ab32c743f7fca2b1d +(cherry picked from commit d4b96b45727314585d02394bb5a084393b647729) +Reviewed-on: https://gerrit.libreoffice.org/10734 +Reviewed-by: Miklos Vajna +Tested-by: Miklos Vajna +--- + writerfilter/source/dmapper/StyleSheetTable.cxx | 18 +----------------- + 1 file changed, 1 insertion(+), 17 deletions(-) + +diff --git a/writerfilter/source/dmapper/StyleSheetTable.cxx b/writerfilter/source/dmapper/StyleSheetTable.cxx +index 329cc63..2f48513 100644 +--- a/writerfilter/source/dmapper/StyleSheetTable.cxx ++++ b/writerfilter/source/dmapper/StyleSheetTable.cxx +@@ -1118,23 +1118,7 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable ) + xState->setPropertyToDefault(rPropNameSupplier.GetName( PROP_CHAR_PROP_HEIGHT )); + xState->setPropertyToDefault(rPropNameSupplier.GetName( PROP_CHAR_PROP_HEIGHT_ASIAN )); + xState->setPropertyToDefault(rPropNameSupplier.GetName( PROP_CHAR_PROP_HEIGHT_COMPLEX)); +- } +- else if (sConvertedStyleName == "Title" || sConvertedStyleName == "Subtitle") +- { +- //set the default adjust for ParaStyle Title and Subtitle to left +- try +- { +- uno::Reference< beans::XPropertySet > xProp( xStyle, uno::UNO_QUERY ); +- if( xProp.is() ) +- { +- uno::Any aMSDefaultVal = uno::makeAny( (sal_Int16)style::ParagraphAdjust_LEFT ); +- xProp->setPropertyValue( rPropNameSupplier.GetName( PROP_PARA_ADJUST), aMSDefaultVal ); +- } +- } +- catch(...) +- { +- OSL_ENSURE( false, "Default ParaAdjust style property could not be set"); +- } ++ + } + } + +-- +1.9.3 + diff --git a/SOURCES/0079-fdo-71429-sw-fix-crashes-when-changing-header-first-.patch b/SOURCES/0079-fdo-71429-sw-fix-crashes-when-changing-header-first-.patch deleted file mode 100644 index 61d76a2..0000000 --- a/SOURCES/0079-fdo-71429-sw-fix-crashes-when-changing-header-first-.patch +++ /dev/null @@ -1,83 +0,0 @@ -From e94ab5aad124b888d524033abeaf212696779067 Mon Sep 17 00:00:00 2001 -From: Michael Stahl -Date: Fri, 20 Dec 2013 21:24:37 +0100 -Subject: [PATCH 079/109] fdo#71429: sw: fix crashes when changing header first - sharing - -Copy some nutso code in SwUndoPageDesc::ExchangeContentNodes() to -work on the un-shared First header/footer too, which apparently avoids -the crash. It's not like Undo of header/footer isn't already a -house of cards anyway. - -Change-Id: Ie6593c4784ce9d368a5098ffb3aa4dec536d250e -(cherry picked from commit 899538a155b0d58f3a864dbc26d0dc7c37386807) -Reviewed-on: https://gerrit.libreoffice.org/7159 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna ---- - sw/source/core/undo/SwUndoPageDesc.cxx | 42 ++++++++++++++++++++++++++++++++++ - 1 file changed, 42 insertions(+) - -diff --git a/sw/source/core/undo/SwUndoPageDesc.cxx b/sw/source/core/undo/SwUndoPageDesc.cxx -index b60c18b..5246c6f 100644 ---- a/sw/source/core/undo/SwUndoPageDesc.cxx -+++ b/sw/source/core/undo/SwUndoPageDesc.cxx -@@ -248,6 +248,27 @@ void SwUndoPageDesc::ExchangeContentNodes( SwPageDesc& rSource, SwPageDesc &rDes - pNewFmt->SetFmtAttr( SwFmtCntnt() ); - delete pNewItem; - } -+ if (!rDest.IsFirstShared()) -+ { -+ // Same procedure for unshared header.. -+ const SwFmtHeader& rSourceFirstMasterHead = rSource.GetFirstMaster().GetHeader(); -+ rDest.GetFirstMaster().GetAttrSet().GetItemState( RES_HEADER, sal_False, &pItem ); -+ pNewItem = pItem->Clone(); -+ pNewFmt = ((SwFmtHeader*)pNewItem)->GetHeaderFmt(); -+#if OSL_DEBUG_LEVEL > 1 -+ const SwFmtCntnt& rSourceCntnt1 = rSourceFirstMasterHead.GetHeaderFmt()->GetCntnt(); -+ (void)rSourceCntnt1; -+ const SwFmtCntnt& rDestCntnt1 = rDest.GetFirstMaster().GetHeader().GetHeaderFmt()->GetCntnt(); -+ (void)rDestCntnt1; -+#endif -+ pNewFmt->SetFmtAttr( rSourceFirstMasterHead.GetHeaderFmt()->GetCntnt() ); -+ delete pNewItem; -+ rSource.GetFirstMaster().GetAttrSet().GetItemState( RES_HEADER, sal_False, &pItem ); -+ pNewItem = pItem->Clone(); -+ pNewFmt = ((SwFmtHeader*)pNewItem)->GetHeaderFmt(); -+ pNewFmt->SetFmtAttr( SwFmtCntnt() ); -+ delete pNewItem; -+ } - } - // Same procedure for footers... - const SwFmtFooter& rDestFoot = rDest.GetMaster().GetFooter(); -@@ -294,6 +315,27 @@ void SwUndoPageDesc::ExchangeContentNodes( SwPageDesc& rSource, SwPageDesc &rDes - pNewFmt->SetFmtAttr( SwFmtCntnt() ); - delete pNewItem; - } -+ if (!rDest.IsFirstShared()) -+ { -+ const SwFmtFooter& rSourceFirstMasterFoot = rSource.GetFirstMaster().GetFooter(); -+#if OSL_DEBUG_LEVEL > 1 -+ const SwFmtCntnt& rFooterSourceCntnt2 = rSourceFirstMasterFoot.GetFooterFmt()->GetCntnt(); -+ const SwFmtCntnt& rFooterDestCntnt2 = -+ rDest.GetFirstMaster().GetFooter().GetFooterFmt()->GetCntnt(); -+ (void)rFooterSourceCntnt2; -+ (void)rFooterDestCntnt2; -+#endif -+ rDest.GetFirstMaster().GetAttrSet().GetItemState( RES_FOOTER, sal_False, &pItem ); -+ pNewItem = pItem->Clone(); -+ pNewFmt = ((SwFmtFooter*)pNewItem)->GetFooterFmt(); -+ pNewFmt->SetFmtAttr( rSourceFirstMasterFoot.GetFooterFmt()->GetCntnt() ); -+ delete pNewItem; -+ rSource.GetFirstMaster().GetAttrSet().GetItemState( RES_FOOTER, sal_False, &pItem ); -+ pNewItem = pItem->Clone(); -+ pNewFmt = ((SwFmtFooter*)pNewItem)->GetFooterFmt(); -+ pNewFmt->SetFmtAttr( SwFmtCntnt() ); -+ delete pNewItem; -+ } - } - } - --- -1.8.4.2 - diff --git a/SOURCES/0079-fdo-81516-Support-fonts-like-Source-Han-Sans-with-16.patch b/SOURCES/0079-fdo-81516-Support-fonts-like-Source-Han-Sans-with-16.patch new file mode 100644 index 0000000..a6687bf --- /dev/null +++ b/SOURCES/0079-fdo-81516-Support-fonts-like-Source-Han-Sans-with-16.patch @@ -0,0 +1,31 @@ +From c1a53308423ebf45c7209ca1359b205b6f0ac236 Mon Sep 17 00:00:00 2001 +From: Audrey Tang +Date: Tue, 5 Aug 2014 09:56:53 +0200 +Subject: [PATCH 079/137] fdo#81516 Support fonts like Source Han Sans with > + 16 FDArray elements + +Change-Id: I3f82574f434060d62dc3faeb730341c5b169ce9f +(cherry picked from commit 3b38a2342e48a2aec3c2e4f5aebf883db4b84101) +Reviewed-on: https://gerrit.libreoffice.org/10746 +Reviewed-by: David Tardon +Tested-by: David Tardon +--- + vcl/source/fontsubset/cff.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/vcl/source/fontsubset/cff.cxx b/vcl/source/fontsubset/cff.cxx +index e2241a1..35b6679 100644 +--- a/vcl/source/fontsubset/cff.cxx ++++ b/vcl/source/fontsubset/cff.cxx +@@ -405,7 +405,7 @@ private: + const char** mpCharStringOps; + const char** mpCharStringEscs; + +- CffLocal maCffLocal[16]; ++ CffLocal maCffLocal[256]; + CffLocal* mpCffLocal; + + void readDictOp( void); +-- +1.9.3 + diff --git a/SOURCES/0080-XMLPropertyMapEntry-mbImportOnly-and-XMLPropertySetM.patch b/SOURCES/0080-XMLPropertyMapEntry-mbImportOnly-and-XMLPropertySetM.patch deleted file mode 100644 index 2005705..0000000 --- a/SOURCES/0080-XMLPropertyMapEntry-mbImportOnly-and-XMLPropertySetM.patch +++ /dev/null @@ -1,1271 +0,0 @@ -From 7b44c5e95b07cde11b8b03f940f97e71ea9c7df4 Mon Sep 17 00:00:00 2001 -From: Eike Rathke -Date: Fri, 20 Dec 2013 12:57:15 +0100 -Subject: [PATCH 080/109] XMLPropertyMapEntry::mbImportOnly and - XMLPropertySetMapper bForExport - -Although a rather large change this does not change the property -mappings or import/export behavior yet, but prepares for further -changes that add mappings for generating correct ODF and consuming -both old and new namespace/element/attribute names. - -This is a combination of 4 commits: - -added bool bForExport parameter to XMLPropertySetMapper ctor - -Set to true for export, false for import. If export true, an -XMLPropertyMapEntry with mbImportOnly==true is not added to the -mappings. This to be able to have more than one mappings for import -(for example a current extension namespace and the future namespace -proposed to the ODF-TC, or corrected typos in element or attribute -names), but map only to one entry on export, of course. - -(cherry picked from commit ebc1b2fe50c7ed1002ed8431410b8e2ac6e795b9) - -Conflicts: - dbaccess/source/filter/xml/xmlHelper.cxx - xmloff/source/chart/PropertyMaps.cxx - xmloff/source/draw/sdpropls.cxx - xmloff/source/style/PageMasterPropMapper.cxx - xmloff/source/table/XMLTableImport.cxx - -prepared XMLPropertyMapEntry with mbImportOnly flag - -(cherry picked from commit 9dd7ee88bd9835ae2bae36093100fcd651fd3aeb) - -Conflicts: - dbaccess/source/filter/xml/xmlHelper.cxx - xmloff/source/table/XMLTableExport.cxx - xmloff/source/text/txtprmap.cxx - -just beautify this a little - -(cherry picked from commit 44b4973fbd0f190906f36321b31215d80b363d52) - -reordered member variables for 4 byte alignment - -(cherry picked from commit dd902b8e256867b5d5fed06b52995f14d969f67d) - -Change-Id: I15b03870fd14f110833037b6c0ff934624d72de1 -Reviewed-on: https://gerrit.libreoffice.org/7144 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna ---- - dbaccess/source/filter/xml/xmlExport.cxx | 8 ++--- - dbaccess/source/filter/xml/xmlHelper.cxx | 27 ++++++++-------- - dbaccess/source/filter/xml/xmlHelper.hxx | 8 ++--- - dbaccess/source/filter/xml/xmlfilter.cxx | 6 ++-- - include/xmloff/maptype.hxx | 8 +++++ - include/xmloff/txtprmap.hxx | 2 +- - include/xmloff/xmlprmap.hxx | 26 ++++++++++------ - reportdesign/source/filter/xml/xmlExport.cxx | 12 +++---- - reportdesign/source/filter/xml/xmlHelper.cxx | 16 +++++----- - reportdesign/source/filter/xml/xmlHelper.hxx | 2 +- - reportdesign/source/filter/xml/xmlStyleImport.cxx | 2 +- - reportdesign/source/filter/xml/xmlfilter.cxx | 8 ++--- - sc/source/filter/xml/xmlexprt.cxx | 10 +++--- - sc/source/filter/xml/xmlimprt.cxx | 8 ++--- - sc/source/filter/xml/xmlstyle.cxx | 6 ++-- - xmloff/inc/XMLChartPropertySetMapper.hxx | 4 +-- - xmloff/qa/unit/uxmloff.cxx | 2 +- - xmloff/source/chart/PropertyMap.hxx | 16 +++++----- - xmloff/source/chart/PropertyMaps.cxx | 4 +-- - xmloff/source/chart/SchXMLExport.cxx | 2 +- - xmloff/source/draw/sdpropls.cxx | 11 ++++--- - xmloff/source/draw/sdpropls.hxx | 2 +- - xmloff/source/draw/sdxmlexp.cxx | 4 +-- - xmloff/source/draw/shapeexport.cxx | 4 +-- - xmloff/source/draw/shapeimport.cxx | 8 ++--- - xmloff/source/forms/controlpropertymap.cxx | 8 ++--- - xmloff/source/forms/layerexport.cxx | 2 +- - xmloff/source/style/PageMasterPropMapper.cxx | 9 +++--- - xmloff/source/style/PageMasterPropMapper.hxx | 5 +-- - xmloff/source/style/PageMasterStyleMap.cxx | 4 +-- - xmloff/source/style/XMLPageExport.cxx | 2 +- - xmloff/source/style/xmlprmap.cxx | 38 +++++++++++++++++------ - xmloff/source/style/xmlstyle.cxx | 4 +-- - xmloff/source/table/XMLTableExport.cxx | 8 ++--- - xmloff/source/table/XMLTableImport.cxx | 5 ++- - xmloff/source/text/txtimp.cxx | 22 ++++++------- - xmloff/source/text/txtparae.cxx | 20 ++++++------ - xmloff/source/text/txtprmap.cxx | 22 ++++++------- - xmloff/source/text/txtstyle.cxx | 4 +-- - 39 files changed, 198 insertions(+), 161 deletions(-) - -diff --git a/dbaccess/source/filter/xml/xmlExport.cxx b/dbaccess/source/filter/xml/xmlExport.cxx -index 135ef75..538cfd3 100644 ---- a/dbaccess/source/filter/xml/xmlExport.cxx -+++ b/dbaccess/source/filter/xml/xmlExport.cxx -@@ -232,7 +232,7 @@ ODBExport::ODBExport(const Reference< XComponentContext >& _rxContext,sal_uInt16 - m_xColumnExportHelper = new OSpecialHanldeXMLExportPropertyMapper(GetColumnStylesPropertySetMapper()); - - m_xCellExportHelper = new OSpecialHanldeXMLExportPropertyMapper(GetCellStylesPropertySetMapper()); -- m_xRowExportHelper = new OSpecialHanldeXMLExportPropertyMapper(OXMLHelper::GetRowStylesPropertySetMapper()); -+ m_xRowExportHelper = new OSpecialHanldeXMLExportPropertyMapper(OXMLHelper::GetRowStylesPropertySetMapper( true)); - - GetAutoStylePool()->AddFamily( - XML_STYLE_FAMILY_TABLE_TABLE, -@@ -1401,7 +1401,7 @@ UniReference < XMLPropertySetMapper > ODBExport::GetTableStylesPropertySetMapper - { - if ( !m_xTableStylesPropertySetMapper.is() ) - { -- m_xTableStylesPropertySetMapper = OXMLHelper::GetTableStylesPropertySetMapper(); -+ m_xTableStylesPropertySetMapper = OXMLHelper::GetTableStylesPropertySetMapper( true); - } - return m_xTableStylesPropertySetMapper; - } -@@ -1410,7 +1410,7 @@ UniReference < XMLPropertySetMapper > ODBExport::GetCellStylesPropertySetMapper( - { - if ( !m_xCellStylesPropertySetMapper.is() ) - { -- m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylesPropertySetMapper(); -+ m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylesPropertySetMapper( true); - } - return m_xCellStylesPropertySetMapper; - } -@@ -1419,7 +1419,7 @@ UniReference < XMLPropertySetMapper > ODBExport::GetColumnStylesPropertySetMappe - { - if ( !m_xColumnStylesPropertySetMapper.is() ) - { -- m_xColumnStylesPropertySetMapper = OXMLHelper::GetColumnStylesPropertySetMapper(); -+ m_xColumnStylesPropertySetMapper = OXMLHelper::GetColumnStylesPropertySetMapper( true); - } - return m_xColumnStylesPropertySetMapper; - } -diff --git a/dbaccess/source/filter/xml/xmlHelper.cxx b/dbaccess/source/filter/xml/xmlHelper.cxx -index a410f08..921581d 100644 ---- a/dbaccess/source/filter/xml/xmlHelper.cxx -+++ b/dbaccess/source/filter/xml/xmlHelper.cxx -@@ -71,21 +71,20 @@ const XMLPropertyHandler* OPropertyHandlerFactory::GetPropertyHandler(sal_Int32 - return pHandler; - } - // ----------------------------------------------------------------------------- --#define MAP_END() { NULL, 0, 0, XML_TOKEN_INVALID, 0 , 0, SvtSaveOptions::ODFVER_010} --// ----------------------------------------------------------------------------- --UniReference < XMLPropertySetMapper > OXMLHelper::GetTableStylesPropertySetMapper() -+#define MAP_END() { NULL, 0, 0, XML_TOKEN_INVALID, 0 , 0, SvtSaveOptions::ODFVER_010, false} -+UniReference < XMLPropertySetMapper > OXMLHelper::GetTableStylesPropertySetMapper( bool bForExport ) - { - static const XMLPropertyMapEntry s_aTableStylesProperties[] = - { - MAP_END() - }; - UniReference < XMLPropertyHandlerFactory> xFac = new ::xmloff::OControlPropertyHandlerFactory(); -- return new XMLPropertySetMapper((XMLPropertyMapEntry*)s_aTableStylesProperties, xFac); -+ return new XMLPropertySetMapper((XMLPropertyMapEntry*)s_aTableStylesProperties, xFac, bForExport); - } - // ----------------------------------------------------------------------------- --UniReference < XMLPropertySetMapper > OXMLHelper::GetColumnStylesPropertySetMapper() -+UniReference < XMLPropertySetMapper > OXMLHelper::GetColumnStylesPropertySetMapper( bool bForExport ) - { --#define MAP_CONST_COLUMN( name, prefix, token, type, context ) { name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_TABLE_COLUMN, context, SvtSaveOptions::ODFVER_010 } -+#define MAP_CONST_COLUMN( name, prefix, token, type, context ) { name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_TABLE_COLUMN, context, SvtSaveOptions::ODFVER_010, false } - static const XMLPropertyMapEntry s_aColumnStylesProperties[] = - { - MAP_CONST_COLUMN( PROPERTY_WIDTH, XML_NAMESPACE_STYLE, XML_COLUMN_WIDTH, XML_TYPE_MEASURE, 0), -@@ -94,13 +93,13 @@ UniReference < XMLPropertySetMapper > OXMLHelper::GetColumnStylesPropertySetMapp - MAP_END() - }; - UniReference < XMLPropertyHandlerFactory> xFac = new OPropertyHandlerFactory(); -- return new XMLPropertySetMapper((XMLPropertyMapEntry*)s_aColumnStylesProperties, xFac); -+ return new XMLPropertySetMapper((XMLPropertyMapEntry*)s_aColumnStylesProperties, xFac, bForExport); - } - // ----------------------------------------------------------------------------- --UniReference < XMLPropertySetMapper > OXMLHelper::GetCellStylesPropertySetMapper() -+UniReference < XMLPropertySetMapper > OXMLHelper::GetCellStylesPropertySetMapper( bool bForExport ) - { --#define MAP_CONST_CELL( name, prefix, token, type, context ) { name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_PARAGRAPH, context, SvtSaveOptions::ODFVER_010 } --#define MAP_CONST_TEXT( name, prefix, token, type, context ) { name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_TEXT, context, SvtSaveOptions::ODFVER_010 } -+#define MAP_CONST_CELL( name, prefix, token, type, context ) { name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_PARAGRAPH, context, SvtSaveOptions::ODFVER_010, false } -+#define MAP_CONST_TEXT( name, prefix, token, type, context ) { name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_TEXT, context, SvtSaveOptions::ODFVER_010, false } - static const XMLPropertyMapEntry s_aCellStylesProperties[] = - { - MAP_CONST_CELL( PROPERTY_ALIGN, XML_NAMESPACE_FO, XML_TEXT_ALIGN, XML_TYPE_TEXT_ALIGN, CTF_DB_COLUMN_TEXT_ALIGN), -@@ -135,19 +134,19 @@ UniReference < XMLPropertySetMapper > OXMLHelper::GetCellStylesPropertySetMapper - MAP_END() - }; - UniReference < XMLPropertyHandlerFactory> xFac = new /*OPropertyHandlerFactory*/::xmloff::OControlPropertyHandlerFactory(); -- return new XMLPropertySetMapper((XMLPropertyMapEntry*)s_aCellStylesProperties, xFac); -+ return new XMLPropertySetMapper((XMLPropertyMapEntry*)s_aCellStylesProperties, xFac, bForExport); - } - // ----------------------------------------------------------------------------- --UniReference < XMLPropertySetMapper > OXMLHelper::GetRowStylesPropertySetMapper() -+UniReference < XMLPropertySetMapper > OXMLHelper::GetRowStylesPropertySetMapper( bool bForExport ) - { --#define MAP_CONST_ROW( name, prefix, token, type, context ) { name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_TABLE_ROW, context, SvtSaveOptions::ODFVER_010 } -+#define MAP_CONST_ROW( name, prefix, token, type, context ) { name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_TABLE_ROW, context, SvtSaveOptions::ODFVER_010, false } - static const XMLPropertyMapEntry s_aStylesProperties[] = - { - MAP_CONST_ROW( PROPERTY_ROW_HEIGHT, XML_NAMESPACE_STYLE, XML_ROW_HEIGHT, XML_TYPE_MEASURE, 0), - MAP_END() - }; - UniReference < XMLPropertyHandlerFactory> xFac = new OPropertyHandlerFactory(); -- return new XMLPropertySetMapper((XMLPropertyMapEntry*)s_aStylesProperties, xFac); -+ return new XMLPropertySetMapper((XMLPropertyMapEntry*)s_aStylesProperties, xFac, bForExport); - } - // ----------------------------------------------------------------------------- - } -diff --git a/dbaccess/source/filter/xml/xmlHelper.hxx b/dbaccess/source/filter/xml/xmlHelper.hxx -index aa7a76e..a9ec5fd 100644 ---- a/dbaccess/source/filter/xml/xmlHelper.hxx -+++ b/dbaccess/source/filter/xml/xmlHelper.hxx -@@ -50,10 +50,10 @@ namespace dbaxml - class OXMLHelper - { - public: -- static UniReference < XMLPropertySetMapper > GetTableStylesPropertySetMapper(); -- static UniReference < XMLPropertySetMapper > GetColumnStylesPropertySetMapper(); -- static UniReference < XMLPropertySetMapper > GetCellStylesPropertySetMapper(); -- static UniReference < XMLPropertySetMapper > GetRowStylesPropertySetMapper(); -+ static UniReference < XMLPropertySetMapper > GetTableStylesPropertySetMapper( bool bForExport ); -+ static UniReference < XMLPropertySetMapper > GetColumnStylesPropertySetMapper( bool bForExport ); -+ static UniReference < XMLPropertySetMapper > GetCellStylesPropertySetMapper( bool bForExport ); -+ static UniReference < XMLPropertySetMapper > GetRowStylesPropertySetMapper( bool bForExport ); - }; - // ----------------------------------------------------------------------------- - } // dbaxml -diff --git a/dbaccess/source/filter/xml/xmlfilter.cxx b/dbaccess/source/filter/xml/xmlfilter.cxx -index 96ea9ed..d8186fb 100644 ---- a/dbaccess/source/filter/xml/xmlfilter.cxx -+++ b/dbaccess/source/filter/xml/xmlfilter.cxx -@@ -858,7 +858,7 @@ UniReference < XMLPropertySetMapper > ODBFilter::GetTableStylesPropertySetMapper - { - if ( !m_xTableStylesPropertySetMapper.is() ) - { -- m_xTableStylesPropertySetMapper = OXMLHelper::GetTableStylesPropertySetMapper(); -+ m_xTableStylesPropertySetMapper = OXMLHelper::GetTableStylesPropertySetMapper( false); - } - return m_xTableStylesPropertySetMapper; - } -@@ -867,7 +867,7 @@ UniReference < XMLPropertySetMapper > ODBFilter::GetColumnStylesPropertySetMappe - { - if ( !m_xColumnStylesPropertySetMapper.is() ) - { -- m_xColumnStylesPropertySetMapper = OXMLHelper::GetColumnStylesPropertySetMapper(); -+ m_xColumnStylesPropertySetMapper = OXMLHelper::GetColumnStylesPropertySetMapper( false); - } - return m_xColumnStylesPropertySetMapper; - } -@@ -876,7 +876,7 @@ UniReference < XMLPropertySetMapper > ODBFilter::GetCellStylesPropertySetMapper( - { - if ( !m_xCellStylesPropertySetMapper.is() ) - { -- m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylesPropertySetMapper(); -+ m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylesPropertySetMapper( false); - } - return m_xCellStylesPropertySetMapper; - } -diff --git a/include/xmloff/maptype.hxx b/include/xmloff/maptype.hxx -index bfd0463..756238f 100644 ---- a/include/xmloff/maptype.hxx -+++ b/include/xmloff/maptype.hxx -@@ -43,6 +43,14 @@ struct XMLPropertyMapEntry - to im/export the porperty */ - sal_Int16 mnContextId; /// User defined id for context filtering - SvtSaveOptions::ODFDefaultVersion mnEarliestODFVersionForExport;// no export when the used ODF version is lower than this -+ -+ /** Flag to specify whether entry is only used during import. -+ -+ Allows to handle more than one Namespace/XML-Name to Property-Name -+ mapping, i.e. for extensions. If several entries for the same -+ Property-Name exist, all except one must have this flag set. -+ */ -+ bool mbImportOnly; - }; - - /////////////////////////////////////////////////////////////////////////// -diff --git a/include/xmloff/txtprmap.hxx b/include/xmloff/txtprmap.hxx -index 92285911..fe5f80d 100644 ---- a/include/xmloff/txtprmap.hxx -+++ b/include/xmloff/txtprmap.hxx -@@ -193,7 +193,7 @@ - class XMLOFF_DLLPUBLIC XMLTextPropertySetMapper : public XMLPropertySetMapper - { - public: -- XMLTextPropertySetMapper( sal_uInt16 nType ); -+ XMLTextPropertySetMapper( sal_uInt16 nType, bool bForExport ); - virtual ~XMLTextPropertySetMapper(); - - static const XMLPropertyMapEntry* getPropertyMapForType( sal_uInt16 _nType ); -diff --git a/include/xmloff/xmlprmap.hxx b/include/xmloff/xmlprmap.hxx -index 2105d6f..ad04bce 100644 ---- a/include/xmloff/xmlprmap.hxx -+++ b/include/xmloff/xmlprmap.hxx -@@ -53,13 +53,14 @@ class XMLPropertyHandler; - */ - struct XMLPropertySetMapperEntry_Impl - { -- OUString sXMLAttributeName; -- OUString sAPIPropertyName; -- sal_uInt16 nXMLNameSpace; -- sal_Int32 nType; -- sal_Int16 nContextId; -- SvtSaveOptions::ODFDefaultVersion nEarliestODFVersionForExport; -- const XMLPropertyHandler *pHdl; -+ OUString sXMLAttributeName; -+ OUString sAPIPropertyName; -+ sal_Int32 nType; -+ sal_uInt16 nXMLNameSpace; -+ sal_Int16 nContextId; -+ SvtSaveOptions::ODFDefaultVersion nEarliestODFVersionForExport; -+ bool bImportOnly; -+ const XMLPropertyHandler *pHdl; - - XMLPropertySetMapperEntry_Impl( - const XMLPropertyMapEntry& rMapEntry, -@@ -75,12 +76,19 @@ class XMLOFF_DLLPUBLIC XMLPropertySetMapper : public UniRefBase - { - ::std::vector< XMLPropertySetMapperEntry_Impl > aMapEntries; - ::std::vector< UniReference < XMLPropertyHandlerFactory > > aHdlFactories; -+ bool mbOnlyExportMappings; - - public: -- /** The last element of the XMLPropertyMapEntry-array must contain NULL-values */ -+ /** The last element of the XMLPropertyMapEntry-array must contain NULL-values. -+ -+ @param bForExport -+ If TRUE, only entries that have the mbImportOnly flag not set -+ will be in the mappings. -+ */ - XMLPropertySetMapper( - const XMLPropertyMapEntry* pEntries, -- const UniReference< XMLPropertyHandlerFactory >& rFactory ); -+ const UniReference< XMLPropertyHandlerFactory >& rFactory, -+ bool bForExport ); - virtual ~XMLPropertySetMapper(); - - void AddMapperEntry( const UniReference < XMLPropertySetMapper >& rMapper ); -diff --git a/reportdesign/source/filter/xml/xmlExport.cxx b/reportdesign/source/filter/xml/xmlExport.cxx -index 1b17eec..96efbf3 100644 ---- a/reportdesign/source/filter/xml/xmlExport.cxx -+++ b/reportdesign/source/filter/xml/xmlExport.cxx -@@ -270,23 +270,23 @@ ORptExport::ORptExport(const Reference< XComponentContext >& _rxContext,sal_uInt - - m_xPropHdlFactory = new OXMLRptPropHdlFactory(); - UniReference < XMLPropertyHandlerFactory> xFac = new ::xmloff::OControlPropertyHandlerFactory(); -- UniReference < XMLPropertySetMapper > xTableStylesPropertySetMapper1 = new XMLPropertySetMapper(OXMLHelper::GetTableStyleProps(),xFac); -- UniReference < XMLPropertySetMapper > xTableStylesPropertySetMapper2 = new XMLTextPropertySetMapper(TEXT_PROP_MAP_TABLE_DEFAULTS ); -+ UniReference < XMLPropertySetMapper > xTableStylesPropertySetMapper1 = new XMLPropertySetMapper(OXMLHelper::GetTableStyleProps(),xFac, true); -+ UniReference < XMLPropertySetMapper > xTableStylesPropertySetMapper2 = new XMLTextPropertySetMapper(TEXT_PROP_MAP_TABLE_DEFAULTS, true ); - xTableStylesPropertySetMapper1->AddMapperEntry(xTableStylesPropertySetMapper2); - - m_xTableStylesExportPropertySetMapper = new SvXMLExportPropertyMapper(xTableStylesPropertySetMapper1); - -- m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylePropertyMap(); -+ m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylePropertyMap( false, true); - m_xCellStylesExportPropertySetMapper = new OSpecialHanldeXMLExportPropertyMapper(m_xCellStylesPropertySetMapper); - m_xCellStylesExportPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(*this)); - -- UniReference < XMLPropertySetMapper > xColumnStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetColumnStyleProps(), m_xPropHdlFactory); -+ UniReference < XMLPropertySetMapper > xColumnStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetColumnStyleProps(), m_xPropHdlFactory, true); - m_xColumnStylesExportPropertySetMapper = new OSpecialHanldeXMLExportPropertyMapper(xColumnStylesPropertySetMapper); - -- UniReference < XMLPropertySetMapper > xRowStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetRowStyleProps(), m_xPropHdlFactory); -+ UniReference < XMLPropertySetMapper > xRowStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetRowStyleProps(), m_xPropHdlFactory, true); - m_xRowStylesExportPropertySetMapper = new OSpecialHanldeXMLExportPropertyMapper(xRowStylesPropertySetMapper); - -- UniReference < XMLPropertySetMapper > xPropMapper(new XMLTextPropertySetMapper( TEXT_PROP_MAP_PARA )); -+ UniReference < XMLPropertySetMapper > xPropMapper(new XMLTextPropertySetMapper( TEXT_PROP_MAP_PARA, true )); - m_xParaPropMapper = new OSpecialHanldeXMLExportPropertyMapper( xPropMapper); - - OUString sFamily( GetXMLToken(XML_PARAGRAPH) ); -diff --git a/reportdesign/source/filter/xml/xmlHelper.cxx b/reportdesign/source/filter/xml/xmlHelper.cxx -index 8537f94..1b1ada3 100644 ---- a/reportdesign/source/filter/xml/xmlHelper.cxx -+++ b/reportdesign/source/filter/xml/xmlHelper.cxx -@@ -104,13 +104,13 @@ const XMLPropertyHandler* OPropertyHandlerFactory::GetPropertyHandler(sal_Int32 - return pHandler; - } - // ----------------------------------------------------------------------------- --#define MAP_CONST_T_ASCII( name, prefix, token, type, context ) { name, sizeof(name)-1, XML_NAMESPACE_##prefix, XML_##token, type|XML_TYPE_PROP_TABLE, context, SvtSaveOptions::ODFVER_010 } --#define MAP_CONST_P_ASCII( name, prefix, token, type, context ) { name, sizeof(name)-1, XML_NAMESPACE_##prefix, XML_##token, type|XML_TYPE_PROP_PARAGRAPH, context, SvtSaveOptions::ODFVER_010 } --#define MAP_CONST_S( name, prefix, token, type, context ) { name, sizeof(name)-1, XML_NAMESPACE_##prefix, XML_##token, type|XML_TYPE_PROP_SECTION, context, SvtSaveOptions::ODFVER_010 } --#define MAP_CONST_C_ASCII( name, prefix, token, type, context ) { name, sizeof(name)-1, XML_NAMESPACE_##prefix, XML_##token, type|XML_TYPE_PROP_TABLE_CELL, context, SvtSaveOptions::ODFVER_010 } --#define MAP_END() { NULL, 0, 0, XML_TOKEN_INVALID, 0 ,0, SvtSaveOptions::ODFVER_010} -+#define MAP_CONST_T_ASCII( name, prefix, token, type, context ) { name, sizeof(name)-1, XML_NAMESPACE_##prefix, XML_##token, type|XML_TYPE_PROP_TABLE, context, SvtSaveOptions::ODFVER_010, false } -+#define MAP_CONST_P_ASCII( name, prefix, token, type, context ) { name, sizeof(name)-1, XML_NAMESPACE_##prefix, XML_##token, type|XML_TYPE_PROP_PARAGRAPH, context, SvtSaveOptions::ODFVER_010, false } -+#define MAP_CONST_S( name, prefix, token, type, context ) { name, sizeof(name)-1, XML_NAMESPACE_##prefix, XML_##token, type|XML_TYPE_PROP_SECTION, context, SvtSaveOptions::ODFVER_010, false } -+#define MAP_CONST_C_ASCII( name, prefix, token, type, context ) { name, sizeof(name)-1, XML_NAMESPACE_##prefix, XML_##token, type|XML_TYPE_PROP_TABLE_CELL, context, SvtSaveOptions::ODFVER_010, false } -+#define MAP_END() { NULL, 0, 0, XML_TOKEN_INVALID, 0 ,0, SvtSaveOptions::ODFVER_010, false} - // ----------------------------------------------------------------------------- --UniReference < XMLPropertySetMapper > OXMLHelper::GetCellStylePropertyMap(bool _bOldFormat) -+UniReference < XMLPropertySetMapper > OXMLHelper::GetCellStylePropertyMap(bool _bOldFormat, bool bForExport) - { - if ( _bOldFormat ) - { -@@ -133,7 +133,7 @@ UniReference < XMLPropertySetMapper > OXMLHelper::GetCellStylePropertyMap(bool _ - MAP_CONST_C_ASCII( "BorderBottom", FO, BORDER_BOTTOM, XML_TYPE_BORDER, 0 ), - MAP_END() - }; -- return new XMLPropertySetMapper((XMLPropertyMapEntry*)s_aXMLCellStylesProperties,new OPropertyHandlerFactory()); -+ return new XMLPropertySetMapper((XMLPropertyMapEntry*)s_aXMLCellStylesProperties,new OPropertyHandlerFactory(), bForExport); - } - else - { -@@ -153,7 +153,7 @@ UniReference < XMLPropertySetMapper > OXMLHelper::GetCellStylePropertyMap(bool _ - MAP_CONST_C_ASCII( "BorderBottom", FO, BORDER_BOTTOM, XML_TYPE_BORDER, 0 ), - MAP_END() - }; -- return new XMLPropertySetMapper((XMLPropertyMapEntry*)s_aXMLCellStylesProperties,new OPropertyHandlerFactory()); -+ return new XMLPropertySetMapper((XMLPropertyMapEntry*)s_aXMLCellStylesProperties,new OPropertyHandlerFactory(), bForExport); - } - } - // ----------------------------------------------------------------------------- -diff --git a/reportdesign/source/filter/xml/xmlHelper.hxx b/reportdesign/source/filter/xml/xmlHelper.hxx -index 6cc32dc..d3fbac9 100644 ---- a/reportdesign/source/filter/xml/xmlHelper.hxx -+++ b/reportdesign/source/filter/xml/xmlHelper.hxx -@@ -56,7 +56,7 @@ namespace rptxml - class OXMLHelper - { - public: -- static UniReference < XMLPropertySetMapper > GetCellStylePropertyMap(bool _bOldFormat = false); -+ static UniReference < XMLPropertySetMapper > GetCellStylePropertyMap(bool _bOldFormat, bool bForExport); - - static const SvXMLEnumMapEntry* GetReportPrintOptions(); - static const SvXMLEnumMapEntry* GetForceNewPageOptions(); -diff --git a/reportdesign/source/filter/xml/xmlStyleImport.cxx b/reportdesign/source/filter/xml/xmlStyleImport.cxx -index a79a9c2..eb19a01 100644 ---- a/reportdesign/source/filter/xml/xmlStyleImport.cxx -+++ b/reportdesign/source/filter/xml/xmlStyleImport.cxx -@@ -241,7 +241,7 @@ UniReference < SvXMLImportPropertyMapper > - if( !m_xTableImpPropMapper.is() ) - { - UniReference < XMLPropertyHandlerFactory> xFac = new ::xmloff::OControlPropertyHandlerFactory(); -- m_xTableImpPropMapper = new SvXMLImportPropertyMapper( new XMLPropertySetMapper(OXMLHelper::GetTableStyleProps(), xFac), m_rImport ); -+ m_xTableImpPropMapper = new SvXMLImportPropertyMapper( new XMLPropertySetMapper(OXMLHelper::GetTableStyleProps(), xFac, false), m_rImport ); - } - xMapper = m_xTableImpPropMapper; - } -diff --git a/reportdesign/source/filter/xml/xmlfilter.cxx b/reportdesign/source/filter/xml/xmlfilter.cxx -index fa83c16..23115e8 100644 ---- a/reportdesign/source/filter/xml/xmlfilter.cxx -+++ b/reportdesign/source/filter/xml/xmlfilter.cxx -@@ -387,10 +387,10 @@ ORptFilter::ORptFilter( const uno::Reference< XComponentContext >& _rxContext,sa - XML_NAMESPACE_REPORT ); - - m_xPropHdlFactory = new OXMLRptPropHdlFactory; -- m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylePropertyMap(true); -- m_xColumnStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetColumnStyleProps(), m_xPropHdlFactory); -- m_xRowStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetRowStyleProps(), m_xPropHdlFactory); -- m_xTableStylesPropertySetMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_TABLE_DEFAULTS ); -+ m_xCellStylesPropertySetMapper = OXMLHelper::GetCellStylePropertyMap(true, false); -+ m_xColumnStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetColumnStyleProps(), m_xPropHdlFactory, false); -+ m_xRowStylesPropertySetMapper = new XMLPropertySetMapper(OXMLHelper::GetRowStyleProps(), m_xPropHdlFactory, false); -+ m_xTableStylesPropertySetMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_TABLE_DEFAULTS, false ); - } - - // ----------------------------------------------------------------------------- -diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx -index 73b3aec..0fbc692 100644 ---- a/sc/source/filter/xml/xmlexprt.cxx -+++ b/sc/source/filter/xml/xmlexprt.cxx -@@ -476,10 +476,10 @@ ScXMLExport::ScXMLExport( - // document is not set here - create ScChangeTrackingExportHelper later - - xScPropHdlFactory = new XMLScPropHdlFactory; -- xCellStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScCellStylesProperties, xScPropHdlFactory); -- xColumnStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScColumnStylesProperties, xScPropHdlFactory); -- xRowStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScRowStylesProperties, xScPropHdlFactory); -- xTableStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScTableStylesProperties, xScPropHdlFactory); -+ xCellStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScCellStylesProperties, xScPropHdlFactory, true); -+ xColumnStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScColumnStylesProperties, xScPropHdlFactory, true); -+ xRowStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScRowStylesProperties, xScPropHdlFactory, true); -+ xTableStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScTableStylesProperties, xScPropHdlFactory, true); - xCellStylesExportPropertySetMapper = new ScXMLCellExportPropertyMapper(xCellStylesPropertySetMapper); - xCellStylesExportPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(*this)); - xColumnStylesExportPropertySetMapper = new ScXMLColumnExportPropertyMapper(xColumnStylesPropertySetMapper); -@@ -4638,7 +4638,7 @@ sal_uInt32 ScXMLExport::exportDoc( enum XMLTokenEnum eClass ) - SfxObjectShell* pFoundShell = reinterpret_cast( xObjShellTunnel.is() ? xObjShellTunnel->getSomething(SfxObjectShell::getUnoTunnelId()) : 0 ); - if ( pFoundShell && ooo::vba::isAlienExcelDoc( *pFoundShell ) ) - { -- xRowStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScFromXLSRowStylesProperties, xScPropHdlFactory); -+ xRowStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScFromXLSRowStylesProperties, xScPropHdlFactory, true); - xRowStylesExportPropertySetMapper = new ScXMLRowExportPropertyMapper(xRowStylesPropertySetMapper); - GetAutoStylePool()->SetFamilyPropSetMapper( XML_STYLE_FAMILY_TABLE_ROW, - xRowStylesExportPropertySetMapper ); -diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx -index fd40dc7..28c3ace 100644 ---- a/sc/source/filter/xml/xmlimprt.cxx -+++ b/sc/source/filter/xml/xmlimprt.cxx -@@ -2078,10 +2078,10 @@ ScXMLImport::ScXMLImport( - pStylesImportHelper = new ScMyStylesImportHelper(*this); - - xScPropHdlFactory = new XMLScPropHdlFactory; -- xCellStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScCellStylesProperties, xScPropHdlFactory); -- xColumnStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScColumnStylesProperties, xScPropHdlFactory); -- xRowStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScRowStylesImportProperties, xScPropHdlFactory); -- xTableStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScTableStylesImportProperties, xScPropHdlFactory); -+ xCellStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScCellStylesProperties, xScPropHdlFactory, false); -+ xColumnStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScColumnStylesProperties, xScPropHdlFactory, false); -+ xRowStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScRowStylesImportProperties, xScPropHdlFactory, false); -+ xTableStylesPropertySetMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLScTableStylesImportProperties, xScPropHdlFactory, false); - - // #i66550# needed for 'presentation:event-listener' element for URLs in shapes - GetNamespaceMap().Add( -diff --git a/sc/source/filter/xml/xmlstyle.cxx b/sc/source/filter/xml/xmlstyle.cxx -index 3a5fe2b..88fdef7 100644 ---- a/sc/source/filter/xml/xmlstyle.cxx -+++ b/sc/source/filter/xml/xmlstyle.cxx -@@ -54,9 +54,9 @@ using namespace com::sun::star; - using namespace ::xmloff::token; - using namespace ::formula; - --#define MAP(name,prefix,token,type,context) { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_010 } --#define MAP_EXT(name,prefix,token,type,context) { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_012_EXT_COMPAT } --#define MAP_END() { NULL, 0, 0, XML_TOKEN_INVALID, 0, 0, SvtSaveOptions::ODFVER_010 } -+#define MAP(name,prefix,token,type,context) { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_010, false } -+#define MAP_EXT(name,prefix,token,type,context) { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_012_EXT_COMPAT, false } -+#define MAP_END() { NULL, 0, 0, XML_TOKEN_INVALID, 0, 0, SvtSaveOptions::ODFVER_010, false } - - const XMLPropertyMapEntry aXMLScCellStylesProperties[] = - { -diff --git a/xmloff/inc/XMLChartPropertySetMapper.hxx b/xmloff/inc/XMLChartPropertySetMapper.hxx -index e2463e2..051910e 100644 ---- a/xmloff/inc/XMLChartPropertySetMapper.hxx -+++ b/xmloff/inc/XMLChartPropertySetMapper.hxx -@@ -47,8 +47,8 @@ public: - class XMLChartPropertySetMapper : public XMLPropertySetMapper - { - public: -- XMLChartPropertySetMapper(); -- ~XMLChartPropertySetMapper(); -+ explicit XMLChartPropertySetMapper( bool bForExport ); -+ ~XMLChartPropertySetMapper(); - }; - - // ---------------------------------------- -diff --git a/xmloff/qa/unit/uxmloff.cxx b/xmloff/qa/unit/uxmloff.cxx -index a0bd430..4380a9e 100644 ---- a/xmloff/qa/unit/uxmloff.cxx -+++ b/xmloff/qa/unit/uxmloff.cxx -@@ -62,7 +62,7 @@ void Test::testAutoStylePool() - UniReference< SvXMLAutoStylePoolP > xPool( - new SvXMLAutoStylePoolP( *pExport ) ); - UniReference< XMLPropertySetMapper > xSetMapper( -- new XMLChartPropertySetMapper ); -+ new XMLChartPropertySetMapper( true) ); - UniReference< XMLChartExportPropertyMapper > xExportPropMapper( - new XMLChartExportPropertyMapper( xSetMapper, *pExport ) ); - -diff --git a/xmloff/source/chart/PropertyMap.hxx b/xmloff/source/chart/PropertyMap.hxx -index f19b365..809c043 100644 ---- a/xmloff/source/chart/PropertyMap.hxx -+++ b/xmloff/source/chart/PropertyMap.hxx -@@ -84,14 +84,14 @@ - - #define XML_SCH_CONTEXT_SPECIAL_ERRORBAR_RANGE ( XML_SCH_CTF_START + 25 ) - --#define MAP_FULL( ApiName, NameSpace, XMLTokenName, XMLType, ContextId, EarliestODFVersionForExport ) { ApiName, sizeof(ApiName)-1, XML_NAMESPACE_##NameSpace, xmloff::token::XMLTokenName, XMLType|XML_TYPE_PROP_CHART, ContextId, EarliestODFVersionForExport } --#define MAP_ENTRY( a, ns, nm, t ) { a, sizeof(a)-1, XML_NAMESPACE_##ns, xmloff::token::nm, t|XML_TYPE_PROP_CHART, 0, SvtSaveOptions::ODFVER_010 } --#define MAP_ENTRY_ODF12( a, ns, nm, t ) { a, sizeof(a)-1, XML_NAMESPACE_##ns, xmloff::token::nm, t|XML_TYPE_PROP_CHART, 0, SvtSaveOptions::ODFVER_012 } --#define MAP_ENTRY_ODF_EXT( a, ns, nm, t ) { a, sizeof(a)-1, XML_NAMESPACE_##ns, xmloff::token::nm, t|XML_TYPE_PROP_CHART, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT } --#define MAP_CONTEXT( a, ns, nm, t, c ) { a, sizeof(a)-1, XML_NAMESPACE_##ns, xmloff::token::nm, t|XML_TYPE_PROP_CHART, c, SvtSaveOptions::ODFVER_010 } --#define MAP_SPECIAL( a, ns, nm, t, c ) { a, sizeof(a)-1, XML_NAMESPACE_##ns, xmloff::token::nm, t|XML_TYPE_PROP_CHART | MID_FLAG_SPECIAL_ITEM, c, SvtSaveOptions::ODFVER_010 } --#define MAP_SPECIAL_ODF12( a, ns, nm, t, c ) { a, sizeof(a)-1, XML_NAMESPACE_##ns, xmloff::token::nm, t|XML_TYPE_PROP_CHART | MID_FLAG_SPECIAL_ITEM, c, SvtSaveOptions::ODFVER_012 } --#define MAP_ENTRY_END { 0,0,0,xmloff::token::XML_TOKEN_INVALID,0,0,SvtSaveOptions::ODFVER_010 } -+#define MAP_FULL( ApiName, NameSpace, XMLTokenName, XMLType, ContextId, EarliestODFVersionForExport ) { ApiName, sizeof(ApiName)-1, XML_NAMESPACE_##NameSpace, xmloff::token::XMLTokenName, XMLType|XML_TYPE_PROP_CHART, ContextId, EarliestODFVersionForExport, false } -+#define MAP_ENTRY( a, ns, nm, t ) { a, sizeof(a)-1, XML_NAMESPACE_##ns, xmloff::token::nm, t|XML_TYPE_PROP_CHART, 0, SvtSaveOptions::ODFVER_010, false } -+#define MAP_ENTRY_ODF12( a, ns, nm, t ) { a, sizeof(a)-1, XML_NAMESPACE_##ns, xmloff::token::nm, t|XML_TYPE_PROP_CHART, 0, SvtSaveOptions::ODFVER_012, false } -+#define MAP_ENTRY_ODF_EXT( a, ns, nm, t ) { a, sizeof(a)-1, XML_NAMESPACE_##ns, xmloff::token::nm, t|XML_TYPE_PROP_CHART, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT, false } -+#define MAP_CONTEXT( a, ns, nm, t, c ) { a, sizeof(a)-1, XML_NAMESPACE_##ns, xmloff::token::nm, t|XML_TYPE_PROP_CHART, c, SvtSaveOptions::ODFVER_010, false } -+#define MAP_SPECIAL( a, ns, nm, t, c ) { a, sizeof(a)-1, XML_NAMESPACE_##ns, xmloff::token::nm, t|XML_TYPE_PROP_CHART | MID_FLAG_SPECIAL_ITEM, c, SvtSaveOptions::ODFVER_010, false } -+#define MAP_SPECIAL_ODF12( a, ns, nm, t, c ) { a, sizeof(a)-1, XML_NAMESPACE_##ns, xmloff::token::nm, t|XML_TYPE_PROP_CHART | MID_FLAG_SPECIAL_ITEM, c, SvtSaveOptions::ODFVER_012, false } -+#define MAP_ENTRY_END { 0,0,0,xmloff::token::XML_TOKEN_INVALID,0,0,SvtSaveOptions::ODFVER_010, false } - - // --------------------------------------------------------- - // PropertyMap for Chart properties drawing- and -diff --git a/xmloff/source/chart/PropertyMaps.cxx b/xmloff/source/chart/PropertyMaps.cxx -index da81152..dd7b59a 100644 ---- a/xmloff/source/chart/PropertyMaps.cxx -+++ b/xmloff/source/chart/PropertyMaps.cxx -@@ -171,8 +171,8 @@ const XMLPropertyHandler* XMLChartPropHdlFactory::GetPropertyHandler( sal_Int32 - - // ---------------------------------------- - --XMLChartPropertySetMapper::XMLChartPropertySetMapper() : -- XMLPropertySetMapper( aXMLChartPropMap, new XMLChartPropHdlFactory ) -+XMLChartPropertySetMapper::XMLChartPropertySetMapper( bool bForExport ) : -+ XMLPropertySetMapper( aXMLChartPropMap, new XMLChartPropHdlFactory, bForExport ) - { - } - -diff --git a/xmloff/source/chart/SchXMLExport.cxx b/xmloff/source/chart/SchXMLExport.cxx -index 89a8dae..8cd6416 100644 ---- a/xmloff/source/chart/SchXMLExport.cxx -+++ b/xmloff/source/chart/SchXMLExport.cxx -@@ -1064,7 +1064,7 @@ SchXMLExportHelper_Impl::SchXMLExportHelper_Impl( - msTableName = OUString( "local-table" ); - - // create property set mapper -- mxPropertySetMapper = new XMLChartPropertySetMapper; -+ mxPropertySetMapper = new XMLChartPropertySetMapper( true); - mxExpPropMapper = new XMLChartExportPropertyMapper( mxPropertySetMapper, rExport ); - - // register chart auto-style family -diff --git a/xmloff/source/draw/sdpropls.cxx b/xmloff/source/draw/sdpropls.cxx -index 8e243fa..5486a18 100644 ---- a/xmloff/source/draw/sdpropls.cxx -+++ b/xmloff/source/draw/sdpropls.cxx -@@ -72,14 +72,14 @@ using ::com::sun::star::uno::Reference; - using namespace ::com::sun::star; - using namespace ::xmloff::token; - --#define _MAP(name,prefix,token,type,context) { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_010 } --#define _MAPV(name,prefix,token,type,context,version) { name, sizeof(name)-1, prefix, token, type, context, version } -+#define _MAP(name,prefix,token,type,context) { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_010, false } -+#define _MAPV(name,prefix,token,type,context,version) { name, sizeof(name)-1, prefix, token, type, context, version, false } - #define GMAP(name,prefix,token,type,context) _MAP(name,prefix,token,type|XML_TYPE_PROP_GRAPHIC,context) - #define GMAPV(name,prefix,token,type,context,version) _MAPV(name,prefix,token,type|XML_TYPE_PROP_GRAPHIC,context,version) - #define DPMAP(name,prefix,token,type,context) _MAP(name,prefix,token,type|XML_TYPE_PROP_DRAWING_PAGE,context) - #define TMAP(name,prefix,token,type,context) _MAP(name,prefix,token,type|XML_TYPE_PROP_TEXT,context) - #define PMAP(name,prefix,token,type,context) _MAP(name,prefix,token,type|XML_TYPE_PROP_PARAGRAPH,context) --#define MAP_END() { 0L, 0, 0, XML_EMPTY, 0 ,0, SvtSaveOptions::ODFVER_010} -+#define MAP_END() { 0L, 0, 0, XML_EMPTY, 0 ,0, SvtSaveOptions::ODFVER_010, false } - - ////////////////////////////////////////////////////////////////////////////// - // entry list for graphic properties -@@ -1180,8 +1180,9 @@ const XMLPropertyHandler* XMLSdPropHdlFactory::GetPropertyHandler( sal_Int32 nTy - - ////////////////////////////////////////////////////////////////////////////// - --XMLShapePropertySetMapper::XMLShapePropertySetMapper(const UniReference< XMLPropertyHandlerFactory >& rFactoryRef) --: XMLPropertySetMapper( aXMLSDProperties, rFactoryRef ) -+XMLShapePropertySetMapper::XMLShapePropertySetMapper(const UniReference< XMLPropertyHandlerFactory >& rFactoryRef, -+ bool bForExport) -+: XMLPropertySetMapper( aXMLSDProperties, rFactoryRef, bForExport ) - { - } - -diff --git a/xmloff/source/draw/sdpropls.hxx b/xmloff/source/draw/sdpropls.hxx -index 70ac1b7..e10199c 100644 ---- a/xmloff/source/draw/sdpropls.hxx -+++ b/xmloff/source/draw/sdpropls.hxx -@@ -244,7 +244,7 @@ public: - class XMLShapePropertySetMapper : public XMLPropertySetMapper - { - public: -- XMLShapePropertySetMapper(const UniReference< XMLPropertyHandlerFactory >& rFactoryRef); -+ XMLShapePropertySetMapper(const UniReference< XMLPropertyHandlerFactory >& rFactoryRef, bool bForExport); - ~XMLShapePropertySetMapper(); - }; - -diff --git a/xmloff/source/draw/sdxmlexp.cxx b/xmloff/source/draw/sdxmlexp.cxx -index c9149b9..5bbdce5 100644 ---- a/xmloff/source/draw/sdxmlexp.cxx -+++ b/xmloff/source/draw/sdxmlexp.cxx -@@ -444,7 +444,7 @@ void SAL_CALL SdXMLExport::setSourceDocument( const Reference< lang::XComponent - const UniReference< XMLPropertyHandlerFactory > aFactoryRef = mpSdPropHdlFactory; - - // construct PropertySetMapper -- UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper( aFactoryRef); -+ UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper( aFactoryRef, true); - - // get or create text paragraph export - GetTextParagraphExport(); -@@ -456,7 +456,7 @@ void SAL_CALL SdXMLExport::setSourceDocument( const Reference< lang::XComponent - mpPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(*this)); - - // construct PresPagePropsMapper -- xMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLSDPresPageProps, aFactoryRef); -+ xMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLSDPresPageProps, aFactoryRef, true); - - mpPresPagePropsMapper = new XMLPageExportPropertyMapper( xMapper, *this ); - if(mpPresPagePropsMapper) -diff --git a/xmloff/source/draw/shapeexport.cxx b/xmloff/source/draw/shapeexport.cxx -index 14ec5c8..30c0230 100644 ---- a/xmloff/source/draw/shapeexport.cxx -+++ b/xmloff/source/draw/shapeexport.cxx -@@ -1014,7 +1014,7 @@ SvXMLExportPropertyMapper* XMLShapeExport::CreateShapePropMapper( - SvXMLExport& rExport ) - { - UniReference< XMLPropertyHandlerFactory > xFactory = new XMLSdPropHdlFactory( rExport.GetModel(), rExport ); -- UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper( xFactory ); -+ UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper( xFactory, true ); - rExport.GetTextParagraphExport(); // get or create text paragraph export - SvXMLExportPropertyMapper* pResult = - new XMLShapeExportPropertyMapper( xMapper, rExport ); -@@ -1259,7 +1259,7 @@ const rtl::Reference< XMLTableExport >& XMLShapeExport::GetShapeTableExport() - if( !mxShapeTableExport.is() ) - { - rtl::Reference< XMLPropertyHandlerFactory > xFactory( new XMLSdPropHdlFactory( mrExport.GetModel(), mrExport ) ); -- UniReference < XMLPropertySetMapper > xMapper( new XMLShapePropertySetMapper( xFactory.get() ) ); -+ UniReference < XMLPropertySetMapper > xMapper( new XMLShapePropertySetMapper( xFactory.get(), true ) ); - mrExport.GetTextParagraphExport(); // get or create text paragraph export - rtl::Reference< SvXMLExportPropertyMapper > xPropertySetMapper( new XMLShapeExportPropertyMapper( xMapper, mrExport ) ); - mxShapeTableExport = new XMLTableExport( mrExport, xPropertySetMapper, xFactory ); -diff --git a/xmloff/source/draw/shapeimport.cxx b/xmloff/source/draw/shapeimport.cxx -index fb41110..7a4619ae 100644 ---- a/xmloff/source/draw/shapeimport.cxx -+++ b/xmloff/source/draw/shapeimport.cxx -@@ -154,7 +154,7 @@ XMLShapeImportHelper::XMLShapeImportHelper( - mpSdPropHdlFactory->acquire(); - - // construct PropertySetMapper -- UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper(mpSdPropHdlFactory); -+ UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper(mpSdPropHdlFactory, false); - mpPropertySetMapper = new SvXMLImportPropertyMapper( xMapper, rImporter ); - // set lock to avoid deletion - mpPropertySetMapper->acquire(); -@@ -170,7 +170,7 @@ XMLShapeImportHelper::XMLShapeImportHelper( - mpPropertySetMapper->ChainImportMapper(XMLTextImportHelper::CreateParaDefaultExtPropMapper(rImporter)); - - // construct PresPagePropsMapper -- xMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLSDPresPageProps, mpSdPropHdlFactory); -+ xMapper = new XMLPropertySetMapper((XMLPropertyMapEntry*)aXMLSDPresPageProps, mpSdPropHdlFactory, false); - mpPresPagePropsMapper = new SvXMLImportPropertyMapper( xMapper, rImporter ); - if(mpPresPagePropsMapper) - { -@@ -1055,7 +1055,7 @@ void XMLShapeImportHelper::restoreConnections() - SvXMLImportPropertyMapper* XMLShapeImportHelper::CreateShapePropMapper( const uno::Reference< frame::XModel>& rModel, SvXMLImport& rImport ) - { - UniReference< XMLPropertyHandlerFactory > xFactory = new XMLSdPropHdlFactory( rModel, rImport ); -- UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper( xFactory ); -+ UniReference < XMLPropertySetMapper > xMapper = new XMLShapePropertySetMapper( xFactory, false ); - SvXMLImportPropertyMapper* pResult = new SvXMLImportPropertyMapper( xMapper, rImport ); - - // chain text attributes -@@ -1160,7 +1160,7 @@ const rtl::Reference< XMLTableImport >& XMLShapeImportHelper::GetShapeTableImpor - if( !mxShapeTableImport.is() ) - { - rtl::Reference< XMLPropertyHandlerFactory > xFactory( new XMLSdPropHdlFactory( mrImporter.GetModel(), mrImporter ) ); -- rtl::Reference< XMLPropertySetMapper > xPropertySetMapper( new XMLShapePropertySetMapper( xFactory.get() ) ); -+ rtl::Reference< XMLPropertySetMapper > xPropertySetMapper( new XMLShapePropertySetMapper( xFactory.get(), false ) ); - mxShapeTableImport = new XMLTableImport( mrImporter, xPropertySetMapper, xFactory ); - } - -diff --git a/xmloff/source/forms/controlpropertymap.cxx b/xmloff/source/forms/controlpropertymap.cxx -index 2f0dc04..59e5986 100644 ---- a/xmloff/source/forms/controlpropertymap.cxx -+++ b/xmloff/source/forms/controlpropertymap.cxx -@@ -35,10 +35,10 @@ namespace xmloff - { - //......................................................................... - --#define MAP_ASCII( name, prefix, token, type, context ) { name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_TEXT, context, SvtSaveOptions::ODFVER_010 } --#define MAP_CONST( name, prefix, token, type, context ) { name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_TEXT, context, SvtSaveOptions::ODFVER_010 } --#define MAP_CONST_P( name, prefix, token, type, context ){ name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_PARAGRAPH, context, SvtSaveOptions::ODFVER_010 } --#define MAP_END() { NULL, 0, 0, XML_TOKEN_INVALID, 0, 0, SvtSaveOptions::ODFVER_010 } -+#define MAP_ASCII( name, prefix, token, type, context ) { name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_TEXT, context, SvtSaveOptions::ODFVER_010, false } -+#define MAP_CONST( name, prefix, token, type, context ) { name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_TEXT, context, SvtSaveOptions::ODFVER_010, false } -+#define MAP_CONST_P( name, prefix, token, type, context ){ name, sizeof(name)-1, prefix, token, type|XML_TYPE_PROP_PARAGRAPH, context, SvtSaveOptions::ODFVER_010, false } -+#define MAP_END() { NULL, 0, 0, XML_TOKEN_INVALID, 0, 0, SvtSaveOptions::ODFVER_010, false } - - XMLPropertyMapEntry* getControlStylePropertyMap_Access( ) - { -diff --git a/xmloff/source/forms/layerexport.cxx b/xmloff/source/forms/layerexport.cxx -index c880662..663609a 100644 ---- a/xmloff/source/forms/layerexport.cxx -+++ b/xmloff/source/forms/layerexport.cxx -@@ -89,7 +89,7 @@ namespace xmloff - - // add our style family to the export context's style pool - m_xPropertyHandlerFactory = new OControlPropertyHandlerFactory(); -- ::rtl::Reference< XMLPropertySetMapper > xStylePropertiesMapper = new XMLPropertySetMapper( getControlStylePropertyMap(), m_xPropertyHandlerFactory.get() ); -+ ::rtl::Reference< XMLPropertySetMapper > xStylePropertiesMapper = new XMLPropertySetMapper( getControlStylePropertyMap(), m_xPropertyHandlerFactory.get(), true ); - m_xStyleExportMapper = new OFormComponentStyleExportMapper( xStylePropertiesMapper.get() ); - - // our style family -diff --git a/xmloff/source/style/PageMasterPropMapper.cxx b/xmloff/source/style/PageMasterPropMapper.cxx -index 273e1c3..639fbb0 100644 ---- a/xmloff/source/style/PageMasterPropMapper.cxx -+++ b/xmloff/source/style/PageMasterPropMapper.cxx -@@ -31,15 +31,16 @@ using namespace ::com::sun::star::beans; - - //______________________________________________________________________________ - --XMLPageMasterPropSetMapper::XMLPageMasterPropSetMapper(): -- XMLPropertySetMapper( aXMLPageMasterStyleMap, new XMLPageMasterPropHdlFactory()) -+XMLPageMasterPropSetMapper::XMLPageMasterPropSetMapper( bool bForExport ): -+ XMLPropertySetMapper( aXMLPageMasterStyleMap, new XMLPageMasterPropHdlFactory(), bForExport) - { - } - - XMLPageMasterPropSetMapper::XMLPageMasterPropSetMapper( - const XMLPropertyMapEntry* pEntries, -- const UniReference< XMLPropertyHandlerFactory >& rFactory ) : -- XMLPropertySetMapper( pEntries, rFactory ) -+ const UniReference< XMLPropertyHandlerFactory >& rFactory, -+ bool bForExport ) : -+ XMLPropertySetMapper( pEntries, rFactory, bForExport ) - { - } - -diff --git a/xmloff/source/style/PageMasterPropMapper.hxx b/xmloff/source/style/PageMasterPropMapper.hxx -index 231a359..392fe17 100644 ---- a/xmloff/source/style/PageMasterPropMapper.hxx -+++ b/xmloff/source/style/PageMasterPropMapper.hxx -@@ -28,10 +28,11 @@ - class XMLPageMasterPropSetMapper : public XMLPropertySetMapper - { - public: -- XMLPageMasterPropSetMapper(); -+ XMLPageMasterPropSetMapper( bool bForExport ); - XMLPageMasterPropSetMapper( - const XMLPropertyMapEntry* pEntries, -- const UniReference< XMLPropertyHandlerFactory >& rFactory ); -+ const UniReference< XMLPropertyHandlerFactory >& rFactory, -+ bool bForExport ); - virtual ~XMLPageMasterPropSetMapper(); - }; - -diff --git a/xmloff/source/style/PageMasterStyleMap.cxx b/xmloff/source/style/PageMasterStyleMap.cxx -index 8726729..18d6ea2 100644 ---- a/xmloff/source/style/PageMasterStyleMap.cxx -+++ b/xmloff/source/style/PageMasterStyleMap.cxx -@@ -24,7 +24,7 @@ - - using namespace ::xmloff::token; - --#define MAP(name,prefix,token,type,context,version) { name, sizeof(name)-1, prefix, token, type, context, version } -+#define MAP(name,prefix,token,type,context,version) { name, sizeof(name)-1, prefix, token, type, context, version, false } - #define PLMAP(name,prefix,token,type,context) \ - MAP(name,prefix,token,type|XML_TYPE_PROP_PAGE_LAYOUT,context, SvtSaveOptions::ODFVER_010) - #define PLMAP_12(name,prefix,token,type,context) \ -@@ -186,7 +186,7 @@ const XMLPropertyMapEntry aXMLPageMasterStyleMap[] = - HFMAP( "FooterBackGraphicURL", XML_NAMESPACE_STYLE, XML_BACKGROUND_IMAGE, XML_TYPE_STRING | MID_FLAG_ELEMENT_ITEM, CTF_PM_FOOTERGRAPHICURL ), - HFMAP( "FooterDynamicSpacing", XML_NAMESPACE_STYLE, XML_DYNAMIC_SPACING, XML_TYPE_BOOL, CTF_PM_FOOTERFLAG ), - -- { 0L, 0, 0, XML_EMPTY, 0, 0, SvtSaveOptions::ODFVER_010 } -+ { 0L, 0, 0, XML_EMPTY, 0, 0, SvtSaveOptions::ODFVER_010, false } - }; - - /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -diff --git a/xmloff/source/style/XMLPageExport.cxx b/xmloff/source/style/XMLPageExport.cxx -index 48e4295..7278eb9 100644 ---- a/xmloff/source/style/XMLPageExport.cxx -+++ b/xmloff/source/style/XMLPageExport.cxx -@@ -161,7 +161,7 @@ XMLPageExport::XMLPageExport( SvXMLExport& rExp ) : - xPageMasterPropHdlFactory = new XMLPageMasterPropHdlFactory; - xPageMasterPropSetMapper = new XMLPageMasterPropSetMapper( - (XMLPropertyMapEntry*) aXMLPageMasterStyleMap, -- xPageMasterPropHdlFactory ); -+ xPageMasterPropHdlFactory, true ); - xPageMasterExportPropMapper = new XMLPageMasterExportPropMapper( - xPageMasterPropSetMapper, rExp); - -diff --git a/xmloff/source/style/xmlprmap.cxx b/xmloff/source/style/xmlprmap.cxx -index 351c912..1ea9a6f 100644 ---- a/xmloff/source/style/xmlprmap.cxx -+++ b/xmloff/source/style/xmlprmap.cxx -@@ -40,10 +40,11 @@ XMLPropertySetMapperEntry_Impl::XMLPropertySetMapperEntry_Impl( - sXMLAttributeName( GetXMLToken(rMapEntry.meXMLName) ), - sAPIPropertyName( OUString(rMapEntry.msApiName, rMapEntry.nApiNameLength, - RTL_TEXTENCODING_ASCII_US ) ), -- nXMLNameSpace( rMapEntry.mnNameSpace ), - nType( rMapEntry.mnType ), -+ nXMLNameSpace( rMapEntry.mnNameSpace ), - nContextId( rMapEntry.mnContextId ), - nEarliestODFVersionForExport( rMapEntry.mnEarliestODFVersionForExport ), -+ bImportOnly( rMapEntry.mbImportOnly), - pHdl( rFactory->GetPropertyHandler( rMapEntry.mnType & MID_FLAG_MASK ) ) - { - } -@@ -52,10 +53,11 @@ XMLPropertySetMapperEntry_Impl::XMLPropertySetMapperEntry_Impl( - const XMLPropertySetMapperEntry_Impl& rEntry ) : - sXMLAttributeName( rEntry.sXMLAttributeName), - sAPIPropertyName( rEntry.sAPIPropertyName), -- nXMLNameSpace( rEntry.nXMLNameSpace), - nType( rEntry.nType), -+ nXMLNameSpace( rEntry.nXMLNameSpace), - nContextId( rEntry.nContextId), - nEarliestODFVersionForExport( rEntry.nEarliestODFVersionForExport ), -+ bImportOnly( rEntry.bImportOnly), - pHdl( rEntry.pHdl) - { - DBG_ASSERT( pHdl, "Unknown XML property type handler!" ); -@@ -67,19 +69,36 @@ XMLPropertySetMapperEntry_Impl::XMLPropertySetMapperEntry_Impl( - // - XMLPropertySetMapper::XMLPropertySetMapper( - const XMLPropertyMapEntry* pEntries, -- const UniReference< XMLPropertyHandlerFactory >& rFactory ) -+ const UniReference< XMLPropertyHandlerFactory >& rFactory, -+ bool bForExport ) -+ : -+ mbOnlyExportMappings( bForExport) - { - aHdlFactories.push_back( rFactory ); - if( pEntries ) - { - const XMLPropertyMapEntry* pIter = pEntries; - -- // count entries -- while( pIter->msApiName ) -+ if (mbOnlyExportMappings) -+ { -+ while( pIter->msApiName ) -+ { -+ if (!pIter->mbImportOnly) -+ { -+ XMLPropertySetMapperEntry_Impl aEntry( *pIter, rFactory ); -+ aMapEntries.push_back( aEntry ); -+ } -+ pIter++; -+ } -+ } -+ else - { -- XMLPropertySetMapperEntry_Impl aEntry( *pIter, rFactory ); -- aMapEntries.push_back( aEntry ); -- pIter++; -+ while( pIter->msApiName ) -+ { -+ XMLPropertySetMapperEntry_Impl aEntry( *pIter, rFactory ); -+ aMapEntries.push_back( aEntry ); -+ pIter++; -+ } - } - } - } -@@ -104,7 +123,8 @@ void XMLPropertySetMapper::AddMapperEntry( - aEIter != rMapper->aMapEntries.end(); - ++aEIter ) - { -- aMapEntries.push_back( *aEIter ); -+ if (!mbOnlyExportMappings || !(*aEIter).bImportOnly) -+ aMapEntries.push_back( *aEIter ); - } - } - -diff --git a/xmloff/source/style/xmlstyle.cxx b/xmloff/source/style/xmlstyle.cxx -index c54d7ff..7ca0b20 100644 ---- a/xmloff/source/style/xmlstyle.cxx -+++ b/xmloff/source/style/xmlstyle.cxx -@@ -677,7 +677,7 @@ UniReference < SvXMLImportPropertyMapper > SvXMLStylesContext::GetImportProperty - case XML_STYLE_FAMILY_SCH_CHART_ID: - if( ! mxChartImpPropMapper.is() ) - { -- XMLPropertySetMapper *pPropMapper = new XMLChartPropertySetMapper(); -+ XMLPropertySetMapper *pPropMapper = new XMLChartPropertySetMapper( false ); - mxChartImpPropMapper = new XMLChartImportPropertyMapper( pPropMapper, GetImport() ); - } - xMapper = mxChartImpPropMapper; -@@ -686,7 +686,7 @@ UniReference < SvXMLImportPropertyMapper > SvXMLStylesContext::GetImportProperty - if( ! mxPageImpPropMapper.is() ) - { - XMLPropertySetMapper *pPropMapper = -- new XMLPageMasterPropSetMapper(); -+ new XMLPageMasterPropSetMapper( false ); - mxPageImpPropMapper = - new PageMasterImportPropertyMapper( pPropMapper, - ((SvXMLStylesContext*)this)->GetImport() ); -diff --git a/xmloff/source/table/XMLTableExport.cxx b/xmloff/source/table/XMLTableExport.cxx -index b710ade..611273d 100644 ---- a/xmloff/source/table/XMLTableExport.cxx -+++ b/xmloff/source/table/XMLTableExport.cxx -@@ -54,10 +54,10 @@ using namespace ::com::sun::star::style; - - // -------------------------------------------------------------------- - --#define _MAP(name,prefix,token,type,context) { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_010 } -+#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 MAP_END { 0L, 0, 0, XML_EMPTY, 0, 0, SvtSaveOptions::ODFVER_010 } -+#define MAP_END { 0L, 0, 0, XML_EMPTY, 0, 0, SvtSaveOptions::ODFVER_010, false } - - // -------------------------------------------------------------------- - -@@ -163,8 +163,8 @@ XMLTableExport::XMLTableExport(SvXMLExport& rExp, const rtl::Reference< SvXMLExp - mxCellExportPropertySetMapper = xExportPropertyMapper; - mxCellExportPropertySetMapper->ChainExportMapper(XMLTextParagraphExport::CreateParaExtPropMapper(rExp)); - -- mxRowExportPropertySetMapper = new SvXMLExportPropertyMapper( new XMLPropertySetMapper( getRowPropertiesMap(), xFactoryRef.get() ) ); -- mxColumnExportPropertySetMapper = new SvXMLExportPropertyMapper( new XMLPropertySetMapper( getColumnPropertiesMap(), xFactoryRef.get() ) ); -+ mxRowExportPropertySetMapper = new SvXMLExportPropertyMapper( new XMLPropertySetMapper( getRowPropertiesMap(), xFactoryRef.get(), true ) ); -+ mxColumnExportPropertySetMapper = new SvXMLExportPropertyMapper( new XMLPropertySetMapper( getColumnPropertiesMap(), xFactoryRef.get(), true ) ); - - mrExport.GetAutoStylePool()->AddFamily(XML_STYLE_FAMILY_TABLE_COLUMN, - OUString(XML_STYLE_FAMILY_TABLE_COLUMN_STYLES_NAME), -diff --git a/xmloff/source/table/XMLTableImport.cxx b/xmloff/source/table/XMLTableImport.cxx -index 5925490..1f84765 100644 ---- a/xmloff/source/table/XMLTableImport.cxx -+++ b/xmloff/source/table/XMLTableImport.cxx -@@ -205,11 +205,10 @@ XMLTableImport::XMLTableImport( SvXMLImport& rImport, const rtl::Reference< XMLP - mxCellImportPropertySetMapper = new SvXMLImportPropertyMapper( xCellPropertySetMapper.get(), rImport ); - mxCellImportPropertySetMapper->ChainImportMapper(XMLTextImportHelper::CreateParaExtPropMapper(rImport)); - -- -- UniReference < XMLPropertySetMapper > xRowMapper( new XMLPropertySetMapper( getRowPropertiesMap(), xFactoryRef.get() ) ); -+ UniReference < XMLPropertySetMapper > xRowMapper( new XMLPropertySetMapper( getRowPropertiesMap(), xFactoryRef.get(), false ) ); - mxRowImportPropertySetMapper = new SvXMLImportPropertyMapper( xRowMapper, rImport ); - -- UniReference < XMLPropertySetMapper > xColMapper( new XMLPropertySetMapper( getColumnPropertiesMap(), xFactoryRef.get() ) ); -+ UniReference < XMLPropertySetMapper > xColMapper( new XMLPropertySetMapper( getColumnPropertiesMap(), xFactoryRef.get(), false ) ); - mxColumnImportPropertySetMapper = new SvXMLImportPropertyMapper( xColMapper, rImport ); - } - -diff --git a/xmloff/source/text/txtimp.cxx b/xmloff/source/text/txtimp.cxx -index 24221a6..42e0576 100644 ---- a/xmloff/source/text/txtimp.cxx -+++ b/xmloff/source/text/txtimp.cxx -@@ -1001,23 +1001,23 @@ XMLTextImportHelper::XMLTextImportHelper( - } - - XMLPropertySetMapper *pPropMapper = -- new XMLTextPropertySetMapper( TEXT_PROP_MAP_PARA ); -+ new XMLTextPropertySetMapper( TEXT_PROP_MAP_PARA, false ); - m_pImpl->m_xParaImpPrMap = - new XMLTextImportPropertyMapper( pPropMapper, rImport ); - -- pPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_TEXT ); -+ pPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_TEXT, false ); - m_pImpl->m_xTextImpPrMap = - new XMLTextImportPropertyMapper( pPropMapper, rImport ); - -- pPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_FRAME ); -+ pPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_FRAME, false ); - m_pImpl->m_xFrameImpPrMap = - new XMLTextImportPropertyMapper( pPropMapper, rImport ); - -- pPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_SECTION ); -+ pPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_SECTION, false ); - m_pImpl->m_xSectionImpPrMap = - new XMLTextImportPropertyMapper( pPropMapper, rImport ); - -- pPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_RUBY ); -+ pPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_RUBY, false ); - m_pImpl->m_xRubyImpPrMap = - new SvXMLImportPropertyMapper( pPropMapper, rImport ); - } -@@ -1029,25 +1029,25 @@ XMLTextImportHelper::~XMLTextImportHelper() - SvXMLImportPropertyMapper *XMLTextImportHelper::CreateShapeExtPropMapper(SvXMLImport& rImport) - { - XMLPropertySetMapper *pPropMapper = -- new XMLTextPropertySetMapper( TEXT_PROP_MAP_FRAME ); -+ new XMLTextPropertySetMapper( TEXT_PROP_MAP_FRAME, false ); - return new XMLTextImportPropertyMapper( pPropMapper, rImport ); - } - - SvXMLImportPropertyMapper *XMLTextImportHelper::CreateParaExtPropMapper(SvXMLImport& rImport) - { - XMLPropertySetMapper *pPropMapper = -- new XMLTextPropertySetMapper( TEXT_PROP_MAP_SHAPE_PARA ); -+ new XMLTextPropertySetMapper( TEXT_PROP_MAP_SHAPE_PARA, false ); - return new XMLTextImportPropertyMapper( pPropMapper, rImport ); - } - - SvXMLImportPropertyMapper *XMLTextImportHelper::CreateParaDefaultExtPropMapper(SvXMLImport& rImport) - { - XMLPropertySetMapper* pPropMapper = -- new XMLTextPropertySetMapper( TEXT_PROP_MAP_SHAPE_PARA ); -+ new XMLTextPropertySetMapper( TEXT_PROP_MAP_SHAPE_PARA, false ); - SvXMLImportPropertyMapper* pImportMapper = new XMLTextImportPropertyMapper( pPropMapper, rImport ); - - pPropMapper = -- new XMLTextPropertySetMapper( TEXT_PROP_MAP_TEXT_ADDITIONAL_DEFAULTS ); -+ new XMLTextPropertySetMapper( TEXT_PROP_MAP_TEXT_ADDITIONAL_DEFAULTS, false ); - pImportMapper->ChainImportMapper( new XMLTextImportPropertyMapper( pPropMapper, rImport ) ); - - return pImportMapper; -@@ -1058,7 +1058,7 @@ SvXMLImportPropertyMapper* - SvXMLImport& rImport ) - { - XMLPropertySetMapper *pPropMapper = -- new XMLTextPropertySetMapper( TEXT_PROP_MAP_TABLE_DEFAULTS ); -+ new XMLTextPropertySetMapper( TEXT_PROP_MAP_TABLE_DEFAULTS, false ); - return new SvXMLImportPropertyMapper( pPropMapper, rImport ); - } - -@@ -1067,7 +1067,7 @@ SvXMLImportPropertyMapper* - SvXMLImport& rImport ) - { - XMLPropertySetMapper *pPropMapper = -- new XMLTextPropertySetMapper( TEXT_PROP_MAP_TABLE_ROW_DEFAULTS ); -+ new XMLTextPropertySetMapper( TEXT_PROP_MAP_TABLE_ROW_DEFAULTS, false ); - return new SvXMLImportPropertyMapper( pPropMapper, rImport ); - } - -diff --git a/xmloff/source/text/txtparae.cxx b/xmloff/source/text/txtparae.cxx -index 3b5933b..e09b6a2 100644 ---- a/xmloff/source/text/txtparae.cxx -+++ b/xmloff/source/text/txtparae.cxx -@@ -1273,7 +1273,7 @@ XMLTextParagraphExport::XMLTextParagraphExport( - sTextFieldStartEnd( "TextFieldStartEnd" ), - aCharStyleNamesPropInfoCache( sCharStyleNames ) - { -- UniReference < XMLPropertySetMapper > xPropMapper(new XMLTextPropertySetMapper( TEXT_PROP_MAP_PARA )); -+ UniReference < XMLPropertySetMapper > xPropMapper(new XMLTextPropertySetMapper( TEXT_PROP_MAP_PARA, true )); - xParaPropMapper = new XMLTextExportPropertySetMapper( xPropMapper, - GetExport() ); - -@@ -1282,7 +1282,7 @@ XMLTextParagraphExport::XMLTextParagraphExport( - rAutoStylePool.AddFamily( XML_STYLE_FAMILY_TEXT_PARAGRAPH, sFamily, - xParaPropMapper, aPrefix ); - -- xPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_TEXT ); -+ xPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_TEXT, true ); - xTextPropMapper = new XMLTextExportPropertySetMapper( xPropMapper, - GetExport() ); - sFamily = OUString( GetXMLToken(XML_TEXT) ); -@@ -1290,7 +1290,7 @@ XMLTextParagraphExport::XMLTextParagraphExport( - rAutoStylePool.AddFamily( XML_STYLE_FAMILY_TEXT_TEXT, sFamily, - xTextPropMapper, aPrefix ); - -- xPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_AUTO_FRAME ); -+ xPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_AUTO_FRAME, true ); - xAutoFramePropMapper = new XMLTextExportPropertySetMapper( xPropMapper, - GetExport() ); - sFamily = OUString( XML_STYLE_FAMILY_SD_GRAPHICS_NAME ); -@@ -1298,7 +1298,7 @@ XMLTextParagraphExport::XMLTextParagraphExport( - rAutoStylePool.AddFamily( XML_STYLE_FAMILY_TEXT_FRAME, sFamily, - xAutoFramePropMapper, aPrefix ); - -- xPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_SECTION ); -+ xPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_SECTION, true ); - xSectionPropMapper = new XMLTextExportPropertySetMapper( xPropMapper, - GetExport() ); - sFamily = OUString( GetXMLToken( XML_SECTION ) ); -@@ -1306,14 +1306,14 @@ XMLTextParagraphExport::XMLTextParagraphExport( - rAutoStylePool.AddFamily( XML_STYLE_FAMILY_TEXT_SECTION, sFamily, - xSectionPropMapper, aPrefix ); - -- xPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_RUBY ); -+ xPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_RUBY, true ); - xRubyPropMapper = new SvXMLExportPropertyMapper( xPropMapper ); - sFamily = OUString( GetXMLToken( XML_RUBY ) ); - aPrefix = OUString( "Ru" ); - rAutoStylePool.AddFamily( XML_STYLE_FAMILY_TEXT_RUBY, sFamily, - xRubyPropMapper, aPrefix ); - -- xPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_FRAME ); -+ xPropMapper = new XMLTextPropertySetMapper( TEXT_PROP_MAP_FRAME, true ); - xFramePropMapper = new XMLTextExportPropertySetMapper( xPropMapper, - GetExport() ); - -@@ -1357,7 +1357,7 @@ SvXMLExportPropertyMapper *XMLTextParagraphExport::CreateShapeExtPropMapper( - SvXMLExport& rExport ) - { - UniReference < XMLPropertySetMapper > xPropMapper = -- new XMLTextPropertySetMapper( TEXT_PROP_MAP_SHAPE ); -+ new XMLTextPropertySetMapper( TEXT_PROP_MAP_SHAPE, true ); - return new XMLTextExportPropertySetMapper( xPropMapper, rExport ); - } - -@@ -1365,7 +1365,7 @@ SvXMLExportPropertyMapper *XMLTextParagraphExport::CreateCharExtPropMapper( - SvXMLExport& rExport) - { - XMLPropertySetMapper *pPropMapper = -- new XMLTextPropertySetMapper( TEXT_PROP_MAP_TEXT ); -+ new XMLTextPropertySetMapper( TEXT_PROP_MAP_TEXT, true ); - return new XMLTextExportPropertySetMapper( pPropMapper, rExport ); - } - -@@ -1373,7 +1373,7 @@ SvXMLExportPropertyMapper *XMLTextParagraphExport::CreateParaExtPropMapper( - SvXMLExport& rExport) - { - XMLPropertySetMapper *pPropMapper = -- new XMLTextPropertySetMapper( TEXT_PROP_MAP_SHAPE_PARA ); -+ new XMLTextPropertySetMapper( TEXT_PROP_MAP_SHAPE_PARA, true ); - return new XMLTextExportPropertySetMapper( pPropMapper, rExport ); - } - -@@ -1381,7 +1381,7 @@ SvXMLExportPropertyMapper *XMLTextParagraphExport::CreateParaDefaultExtPropMappe - SvXMLExport& rExport) - { - XMLPropertySetMapper *pPropMapper = -- new XMLTextPropertySetMapper( TEXT_PROP_MAP_TEXT_ADDITIONAL_DEFAULTS ); -+ new XMLTextPropertySetMapper( TEXT_PROP_MAP_TEXT_ADDITIONAL_DEFAULTS, true ); - return new XMLTextExportPropertySetMapper( pPropMapper, rExport ); - } - -diff --git a/xmloff/source/text/txtprmap.cxx b/xmloff/source/text/txtprmap.cxx -index def8335..26d04d8 100644 ---- a/xmloff/source/text/txtprmap.cxx -+++ b/xmloff/source/text/txtprmap.cxx -@@ -31,13 +31,13 @@ using namespace ::com::sun::star::uno; - using namespace ::xmloff::token; - - #define _M_E( a, p, l, t, c ) \ -- { a, sizeof(a)-1, XML_NAMESPACE_##p, XML_##l, t, c, SvtSaveOptions::ODFVER_010 } -+ { a, sizeof(a)-1, XML_NAMESPACE_##p, XML_##l, t, c, SvtSaveOptions::ODFVER_010, false } - - #define _M_EV( a, p, l, t, c, v ) \ -- { a, sizeof(a)-1, XML_NAMESPACE_##p, XML_##l, t, c, v } -+ { a, sizeof(a)-1, XML_NAMESPACE_##p, XML_##l, t, c, v, false } - - #define _M_ED( a, p, l, t, c ) \ -- { a, sizeof(a)-1, XML_NAMESPACE_##p, XML_##l, (t) | MID_FLAG_DEFAULT_ITEM_EXPORT, c, SvtSaveOptions::ODFVER_010 } -+ { a, sizeof(a)-1, XML_NAMESPACE_##p, XML_##l, (t) | MID_FLAG_DEFAULT_ITEM_EXPORT, c, SvtSaveOptions::ODFVER_010, false } - - // text properties - #define MT_E( a, p, l, t, c ) \ -@@ -68,7 +68,7 @@ using namespace ::xmloff::token; - _M_E( a, p, l, (t|XML_TYPE_PROP_RUBY), c ) - - #define M_END() \ -- { NULL, 0, 0, XML_TOKEN_INVALID, 0, 0, SvtSaveOptions::ODFVER_010 } -+ { NULL, 0, 0, XML_TOKEN_INVALID, 0, 0, SvtSaveOptions::ODFVER_010, false } - - - XMLPropertyMapEntry aXMLParaPropMap[] = -@@ -88,7 +88,7 @@ XMLPropertyMapEntry aXMLParaPropMap[] = - MP_E( "ParaTopMarginRelative", FO, MARGIN_TOP, XML_TYPE_PERCENT16, CTF_PARATOPMARGIN_REL ), - MP_E( "ParaBottomMargin", FO, MARGIN_BOTTOM, XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, CTF_PARABOTTOMMARGIN ), - MP_E( "ParaBottomMarginRelative",FO, MARGIN_BOTTOM, XML_TYPE_PERCENT16, CTF_PARABOTTOMMARGIN_REL ), -- { "ParaContextMargin", sizeof("ParaContextMargin")-1, XML_NAMESPACE_STYLE, XML_CONTEXTUAL_SPACING, XML_TYPE_BOOL|XML_TYPE_PROP_PARAGRAPH, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT }, -+ { "ParaContextMargin", sizeof("ParaContextMargin")-1, XML_NAMESPACE_STYLE, XML_CONTEXTUAL_SPACING, XML_TYPE_BOOL|XML_TYPE_PROP_PARAGRAPH, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT, false }, - // RES_CHRATR_CASEMAP - MT_E( "CharCaseMap", FO, FONT_VARIANT, XML_TYPE_TEXT_CASEMAP_VAR, 0 ), - MT_E( "CharCaseMap", FO, TEXT_TRANSFORM, XML_TYPE_TEXT_CASEMAP, 0 ), -@@ -136,9 +136,9 @@ XMLPropertyMapEntry aXMLParaPropMap[] = - // RES_CHRATR_WEIGHT - MT_E( "CharWeight", FO, FONT_WEIGHT, XML_TYPE_TEXT_WEIGHT, 0 ), - // RES_CHRATR_RSID -- { "Rsid", sizeof("Rsid")-1, XML_NAMESPACE_OFFICE_EXT, XML_RSID, XML_TYPE_HEX|XML_TYPE_PROP_TEXT, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT }, -+ { "Rsid", sizeof("Rsid")-1, XML_NAMESPACE_OFFICE_EXT, XML_RSID, XML_TYPE_HEX|XML_TYPE_PROP_TEXT, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT, false }, - // RES_PARATR_RSID -- { "ParRsid", sizeof("ParRsid")-1, XML_NAMESPACE_OFFICE_EXT, XML_PARRSID, XML_TYPE_HEX|XML_TYPE_PROP_TEXT, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT }, -+ { "ParRsid", sizeof("ParRsid")-1, XML_NAMESPACE_OFFICE_EXT, XML_PARRSID, XML_TYPE_HEX|XML_TYPE_PROP_TEXT, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT, false }, - // RES_CHRATR_WORDLINEMODE - MT_E( "CharWordMode", STYLE, TEXT_UNDERLINE_MODE, XML_TYPE_TEXT_LINE_MODE|MID_FLAG_MERGE_PROPERTY, 0 ), - MT_E( "CharWordMode", STYLE, TEXT_OVERLINE_MODE, XML_TYPE_TEXT_LINE_MODE|MID_FLAG_MERGE_PROPERTY, 0 ), -@@ -434,9 +434,9 @@ XMLPropertyMapEntry aXMLTextPropMap[] = - // RES_CHRATR_WEIGHT - MT_E( "CharWeight", FO, FONT_WEIGHT, XML_TYPE_TEXT_WEIGHT, 0 ), - // RES_CHRATR_RSID -- { "Rsid", sizeof("Rsid")-1, XML_NAMESPACE_OFFICE_EXT, XML_RSID, XML_TYPE_HEX|XML_TYPE_PROP_TEXT, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT }, -+ { "Rsid", sizeof("Rsid")-1, XML_NAMESPACE_OFFICE_EXT, XML_RSID, XML_TYPE_HEX|XML_TYPE_PROP_TEXT, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT, false }, - // RES_PARATR_RSID -- { "ParRsid", sizeof("ParRsid")-1, XML_NAMESPACE_OFFICE_EXT, XML_PARRSID, XML_TYPE_HEX|XML_TYPE_PROP_TEXT, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT }, -+ { "ParRsid", sizeof("ParRsid")-1, XML_NAMESPACE_OFFICE_EXT, XML_PARRSID, XML_TYPE_HEX|XML_TYPE_PROP_TEXT, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT, false }, - // RES_CHRATR_WORDLINEMODE - MT_E( "CharWordMode", STYLE, TEXT_UNDERLINE_MODE, XML_TYPE_TEXT_LINE_MODE|MID_FLAG_MERGE_PROPERTY, 0 ), - MT_E( "CharWordMode", STYLE, TEXT_OVERLINE_MODE, XML_TYPE_TEXT_LINE_MODE|MID_FLAG_MERGE_PROPERTY, 0 ), -@@ -890,9 +890,9 @@ const XMLPropertyMapEntry* XMLTextPropertySetMapper::getPropertyMapForType( sal_ - return lcl_txtprmap_getMap( _nType ); - } - --XMLTextPropertySetMapper::XMLTextPropertySetMapper( sal_uInt16 nType ) : -+XMLTextPropertySetMapper::XMLTextPropertySetMapper( sal_uInt16 nType, bool bForExport ) : - XMLPropertySetMapper( lcl_txtprmap_getMap( nType ), -- new XMLTextPropertyHandlerFactory ) -+ new XMLTextPropertyHandlerFactory, bForExport ) - { - } - -diff --git a/xmloff/source/text/txtstyle.cxx b/xmloff/source/text/txtstyle.cxx -index b507b09..c3dd060 100644 ---- a/xmloff/source/text/txtstyle.cxx -+++ b/xmloff/source/text/txtstyle.cxx -@@ -128,7 +128,7 @@ void XMLTextParagraphExport::exportTextStyles( sal_Bool bUsed, sal_Bool bProg ) - GetXMLToken(XML_TABLE), - new XMLTextExportPropertySetMapper( - new XMLTextPropertySetMapper( -- TEXT_PROP_MAP_TABLE_DEFAULTS ), -+ TEXT_PROP_MAP_TABLE_DEFAULTS, true ), - GetExport() ) ); - - exportDefaultStyle( -@@ -136,7 +136,7 @@ void XMLTextParagraphExport::exportTextStyles( sal_Bool bUsed, sal_Bool bProg ) - GetXMLToken(XML_TABLE_ROW), - new XMLTextExportPropertySetMapper( - new XMLTextPropertySetMapper( -- TEXT_PROP_MAP_TABLE_ROW_DEFAULTS ), -+ TEXT_PROP_MAP_TABLE_ROW_DEFAULTS, true ), - GetExport() ) ); - } - } --- -1.8.4.2 - diff --git a/SOURCES/0080-bnc-886540-Default-chart-background-for-pptx-docs-sh.patch b/SOURCES/0080-bnc-886540-Default-chart-background-for-pptx-docs-sh.patch new file mode 100644 index 0000000..a9f861f --- /dev/null +++ b/SOURCES/0080-bnc-886540-Default-chart-background-for-pptx-docs-sh.patch @@ -0,0 +1,126 @@ +From feed03c590232659e6278ed7eb4137c479543b86 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Fri, 1 Aug 2014 21:39:49 -0400 +Subject: [PATCH 080/137] bnc#886540: Default chart background for pptx docs + should be transparent. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Charts in docx and xlsx OTOH use solid white as the default fill style. + +(cherry picked from commit 4a8f2431718f99de6fd9ee3461d703d007261c03) + +Conflicts: + oox/source/drawingml/chart/chartspaceconverter.cxx + oox/source/ppt/pptimport.cxx + +Change-Id: Ic4351fe65cabc12d60214b67c7026a317841f2c7 +Reviewed-on: https://gerrit.libreoffice.org/10737 +Reviewed-by: Matúš Kukan +Tested-by: Matúš Kukan +--- + include/oox/helper/graphichelper.hxx | 3 +++ + oox/source/drawingml/chart/chartspaceconverter.cxx | 9 ++++++++- + oox/source/helper/graphichelper.cxx | 5 +++++ + oox/source/ppt/pptimport.cxx | 6 ++++++ + 4 files changed, 22 insertions(+), 1 deletion(-) + +diff --git a/include/oox/helper/graphichelper.hxx b/include/oox/helper/graphichelper.hxx +index b96e993..9e90531 100644 +--- a/include/oox/helper/graphichelper.hxx ++++ b/include/oox/helper/graphichelper.hxx +@@ -24,6 +24,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -75,6 +76,8 @@ public: + /** Derived classes may implement to resolve a palette index to an RGB color. */ + virtual sal_Int32 getPaletteColor( sal_Int32 nPaletteIdx ) const; + ++ virtual css::drawing::FillStyle getDefaultChartAreaFillStyle() const; ++ + // Device info and device dependent unit conversion ----------------------- + + /** Returns information about the output device. */ +diff --git a/oox/source/drawingml/chart/chartspaceconverter.cxx b/oox/source/drawingml/chart/chartspaceconverter.cxx +index db04215..eeba446 100644 +--- a/oox/source/drawingml/chart/chartspaceconverter.cxx ++++ b/oox/source/drawingml/chart/chartspaceconverter.cxx +@@ -25,12 +25,14 @@ + #include + #include + #include ++#include + #include "oox/core/xmlfilterbase.hxx" + #include "oox/drawingml/chart/chartconverter.hxx" + #include "oox/drawingml/chart/chartdrawingfragment.hxx" + #include "oox/drawingml/chart/chartspacemodel.hxx" + #include "oox/drawingml/chart/plotareaconverter.hxx" + #include "oox/drawingml/chart/titleconverter.hxx" ++#include + + using namespace ::com::sun::star; + using ::com::sun::star::uno::Reference; +@@ -90,8 +92,13 @@ void ChartSpaceConverter::convertFromModel( const Reference< XShapes >& rxExtern + { + } + +- // formatting of the chart background ++ // formatting of the chart background. The default fill style varies with applications. + PropertySet aBackPropSet( getChartDocument()->getPageBackground() ); ++ ++ aBackPropSet.setProperty( ++ PROP_FillStyle, ++ uno::makeAny(getFilter().getGraphicHelper().getDefaultChartAreaFillStyle())); ++ + getFormatter().convertFrameFormatting( aBackPropSet, mrModel.mxShapeProp, OBJECTTYPE_CHARTSPACE ); + + // convert plot area (container of all chart type groups) +diff --git a/oox/source/helper/graphichelper.cxx b/oox/source/helper/graphichelper.cxx +index 5cb2b69..e40f019 100644 +--- a/oox/source/helper/graphichelper.cxx ++++ b/oox/source/helper/graphichelper.cxx +@@ -158,6 +158,11 @@ sal_Int32 GraphicHelper::getPaletteColor( sal_Int32 /*nPaletteIdx*/ ) const + return API_RGB_TRANSPARENT; + } + ++drawing::FillStyle GraphicHelper::getDefaultChartAreaFillStyle() const ++{ ++ return drawing::FillStyle_SOLID; ++} ++ + // Device info and device dependent unit conversion --------------------------- + + const awt::DeviceInfo& GraphicHelper::getDeviceInfo() const +diff --git a/oox/source/ppt/pptimport.cxx b/oox/source/ppt/pptimport.cxx +index fc9dadf..d294b79 100644 +--- a/oox/source/ppt/pptimport.cxx ++++ b/oox/source/ppt/pptimport.cxx +@@ -185,6 +185,7 @@ class PptGraphicHelper : public GraphicHelper + public: + explicit PptGraphicHelper( const PowerPointImport& rFilter ); + virtual sal_Int32 getSchemeColor( sal_Int32 nToken ) const; ++ virtual drawing::FillStyle getDefaultChartAreaFillStyle() const; + private: + const PowerPointImport& mrFilter; + }; +@@ -200,6 +201,11 @@ sal_Int32 PptGraphicHelper::getSchemeColor( sal_Int32 nToken ) const + return mrFilter.getSchemeColor( nToken ); + } + ++drawing::FillStyle PptGraphicHelper::getDefaultChartAreaFillStyle() const ++{ ++ return drawing::FillStyle_NONE; ++} ++ + } // namespace + + GraphicHelper* PowerPointImport::implCreateGraphicHelper() const +-- +1.9.3 + diff --git a/SOURCES/0081-bnc-886540-Let-s-not-push-the-available-area-down-wh.patch b/SOURCES/0081-bnc-886540-Let-s-not-push-the-available-area-down-wh.patch new file mode 100644 index 0000000..73f1665 --- /dev/null +++ b/SOURCES/0081-bnc-886540-Let-s-not-push-the-available-area-down-wh.patch @@ -0,0 +1,66 @@ +From a3438ee890b360dda9201f03a78e1c5b98193c36 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Tue, 5 Aug 2014 14:57:18 -0400 +Subject: [PATCH 081/137] bnc#886540: Let's not push the available area down + when no titles are there. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This improves visual layout compability with MS Office chart & looks better. + +Change-Id: I348ea81152eca4e3bba9e0d9460448d9314738ad +(cherry picked from commit b398ed8e3f95b75705bb2e53d49589ef7fdbb1c7) +Reviewed-on: https://gerrit.libreoffice.org/10771 +Reviewed-by: Matúš Kukan +Tested-by: Matúš Kukan +--- + chart2/source/view/main/ChartView.cxx | 32 +------------------------------- + 1 file changed, 1 insertion(+), 31 deletions(-) + +diff --git a/chart2/source/view/main/ChartView.cxx b/chart2/source/view/main/ChartView.cxx +index c6b5878..1965f05 100644 +--- a/chart2/source/view/main/ChartView.cxx ++++ b/chart2/source/view/main/ChartView.cxx +@@ -2217,37 +2217,7 @@ boost::shared_ptr lcl_createTitle( TitleHelper::eTitleType eType + break; + } + } +- else +- { +- // #i109336# Improve auto positioning in chart +- switch ( eAlignment ) +- { +- case ALIGN_TOP: +- { +- rRemainingSpace.Y += nYDistance; +- rRemainingSpace.Height -= nYDistance; +- } +- break; +- case ALIGN_BOTTOM: +- { +- rRemainingSpace.Height -= nYDistance; +- } +- break; +- case ALIGN_LEFT: +- { +- rRemainingSpace.X += nXDistance; +- rRemainingSpace.Width -= nXDistance; +- } +- break; +- case ALIGN_RIGHT: +- { +- rRemainingSpace.Width -= nXDistance; +- } +- break; +- default: +- break; +- } +- } ++ + return apVTitle; + } + +-- +1.9.3 + diff --git a/SOURCES/0081-prepare-to-read-loext-vertical-justify-fdo-72922.patch b/SOURCES/0081-prepare-to-read-loext-vertical-justify-fdo-72922.patch deleted file mode 100644 index 7d9377d..0000000 --- a/SOURCES/0081-prepare-to-read-loext-vertical-justify-fdo-72922.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 494e4accc0634befb6ed7534faf3e2519bf5cca1 Mon Sep 17 00:00:00 2001 -From: Eike Rathke -Date: Fri, 20 Dec 2013 17:12:00 +0100 -Subject: [PATCH 081/109] prepare to read loext:vertical-justify, fdo#72922 - -Change-Id: I56d72d5cb8ea95aa63d4659899cba2f295ce9bea -(cherry picked from commit 11a73705d9dd10ebefa2bcdefa560f55e7024a1b) -Reviewed-on: https://gerrit.libreoffice.org/7150 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna ---- - sc/source/filter/xml/xmlstyle.cxx | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/sc/source/filter/xml/xmlstyle.cxx b/sc/source/filter/xml/xmlstyle.cxx -index 88fdef7..3264a5d 100644 ---- a/sc/source/filter/xml/xmlstyle.cxx -+++ b/sc/source/filter/xml/xmlstyle.cxx -@@ -55,7 +55,10 @@ using namespace ::xmloff::token; - using namespace ::formula; - - #define MAP(name,prefix,token,type,context) { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_010, false } -+// extensions import/export - #define MAP_EXT(name,prefix,token,type,context) { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_012_EXT_COMPAT, false } -+// extensions import only -+#define MAP_EXT_I(name,prefix,token,type,context) { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_012_EXT_COMPAT, true } - #define MAP_END() { NULL, 0, 0, XML_TOKEN_INVALID, 0, 0, SvtSaveOptions::ODFVER_010, false } - - const XMLPropertyMapEntry aXMLScCellStylesProperties[] = -@@ -106,7 +109,8 @@ const XMLPropertyMapEntry aXMLScCellStylesProperties[] = - MAP( "UserDefinedAttributes", XML_NAMESPACE_TEXT, XML_XMLNS, XML_TYPE_PROP_TABLE_CELL|XML_TYPE_ATTRIBUTE_CONTAINER | MID_FLAG_SPECIAL_ITEM, 0 ), - MAP( "ValidationXML", XML_NAMESPACE_TABLE, XML_CONTENT_VALIDATION, XML_TYPE_PROP_TABLE_CELL|XML_TYPE_BUILDIN_CMP_ONLY, CTF_SC_VALIDATION ), - MAP( "VertJustify", XML_NAMESPACE_STYLE, XML_VERTICAL_ALIGN, XML_TYPE_PROP_TABLE_CELL|XML_SC_TYPE_VERTJUSTIFY, 0), -- MAP_EXT( SC_UNONAME_CELLVJUS_METHOD, XML_NAMESPACE_STYLE, XML_VERTICAL_JUSTIFY, XML_TYPE_PROP_TABLE_CELL|XML_SC_TYPE_VERTJUSTIFY_METHOD, 0 ), -+ MAP_EXT( SC_UNONAME_CELLVJUS_METHOD, XML_NAMESPACE_STYLE, XML_VERTICAL_JUSTIFY, XML_TYPE_PROP_TABLE_CELL|XML_SC_TYPE_VERTJUSTIFY_METHOD, 0 ), // proposed ODF 1.2+ -+ MAP_EXT_I( SC_UNONAME_CELLVJUS_METHOD, XML_NAMESPACE_LO_EXT, XML_VERTICAL_JUSTIFY, XML_TYPE_PROP_TABLE_CELL|XML_SC_TYPE_VERTJUSTIFY_METHOD, 0 ), // extension namespace - MAP_END() - }; - --- -1.8.4.2 - diff --git a/SOURCES/0082-bnc-862514-Handle-corner-case-in-slide-sorter-correc.patch b/SOURCES/0082-bnc-862514-Handle-corner-case-in-slide-sorter-correc.patch new file mode 100644 index 0000000..a169e74 --- /dev/null +++ b/SOURCES/0082-bnc-862514-Handle-corner-case-in-slide-sorter-correc.patch @@ -0,0 +1,81 @@ +From a4a5fe4c66fe35c432127c28be7d52dc52fb4f58 Mon Sep 17 00:00:00 2001 +From: Jan Holesovsky +Date: Fri, 1 Aug 2014 21:10:22 +0200 +Subject: [PATCH 082/137] bnc#862514: Handle corner case in slide sorter + correctly. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We should never return -1 when bIncludeBordersAndGaps is true; but that could +have happened in a corner case: + +* export SAL_USE_VCLPLUGIN=gen +* start LibreOffice +* open a presentation with many slides +* resize the window so that it shows the slides _exactly_, no slide is cut + off in the slide sorter +* point the mouse pointer into the left "Slides" sidebar (slide sorter) so + that it does not cause any mouse-over effect (somehow between the left + border, and the slides - there is space that can do this) +* turn the mouse wheel all the way down so that the last slide is at the + bottom +* turn the mouse wheel up _once_ +* turn the mouse wheel down _once_ - it will look like the view does not + change (the last but one is still at the bottom), but you can see the + scrollbar jump to the top +* and now you can again start turning the wheel all the way down to repeat + the procedure :-) + +Reviewed-on: https://gerrit.libreoffice.org/10683 +Reviewed-by: David Tardon +Tested-by: David Tardon +(cherry picked from commit 48272a9a720039e79c6a684f1f037811ea42ed0c) + +Change-Id: I0253c89513222a1f2eb3263068997d10eea0f130 +Signed-off-by: Matúš Kukan +--- + sd/source/ui/slidesorter/view/SlsLayouter.cxx | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/sd/source/ui/slidesorter/view/SlsLayouter.cxx b/sd/source/ui/slidesorter/view/SlsLayouter.cxx +index c4b6ae2..5c9ec8e 100644 +--- a/sd/source/ui/slidesorter/view/SlsLayouter.cxx ++++ b/sd/source/ui/slidesorter/view/SlsLayouter.cxx +@@ -627,11 +627,15 @@ sal_Int32 Layouter::Implementation::GetRowAtPosition ( + // When inside the gap below then nYPosition is not over a page + // object. + if (nDistanceIntoGap > 0) +- nRow = ResolvePositionInGap ( ++ { ++ sal_Int32 nResolvedRow = ResolvePositionInGap( + nDistanceIntoGap, + eGapMembership, + nRow, + mnVerticalGap); ++ if (!bIncludeBordersAndGaps || nResolvedRow != -1) ++ nRow = nResolvedRow; ++ } + } + else if (bIncludeBordersAndGaps) + { +@@ -670,11 +674,15 @@ sal_Int32 Layouter::Implementation::GetColumnAtPosition ( + // When inside the gap at the right then nXPosition is not over a + // page object. + if (nDistanceIntoGap > 0) +- nColumn = ResolvePositionInGap ( ++ { ++ sal_Int32 nResolvedColumn = ResolvePositionInGap( + nDistanceIntoGap, + eGapMembership, + nColumn, + mnHorizontalGap); ++ if (!bIncludeBordersAndGaps || nResolvedColumn != -1) ++ nColumn = nResolvedColumn; ++ } + } + else if (bIncludeBordersAndGaps) + { +-- +1.9.3 + diff --git a/SOURCES/0082-prepare-to-accept-loext-contextual-spacing-fdo-58112.patch b/SOURCES/0082-prepare-to-accept-loext-contextual-spacing-fdo-58112.patch deleted file mode 100644 index 57c5635..0000000 --- a/SOURCES/0082-prepare-to-accept-loext-contextual-spacing-fdo-58112.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 6c90074b8dcfbb10ab03acfa082ac746ea38df6e Mon Sep 17 00:00:00 2001 -From: Eike Rathke -Date: Fri, 20 Dec 2013 21:15:03 +0100 -Subject: [PATCH 082/109] prepare to accept loext:contextual-spacing, fdo#58112 - -Change-Id: I58e151743bf910b8b51f1b453e0bfcb4ed767d9d -(cherry picked from commit ef5e7b69440baa9f222d1ec870668d31d08268f0) -Reviewed-on: https://gerrit.libreoffice.org/7151 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna ---- - xmloff/source/text/txtprmap.cxx | 8 +++++++- - 1 file changed, 7 insertions(+), 1 deletion(-) - -diff --git a/xmloff/source/text/txtprmap.cxx b/xmloff/source/text/txtprmap.cxx -index 26d04d8..abdba43 100644 ---- a/xmloff/source/text/txtprmap.cxx -+++ b/xmloff/source/text/txtprmap.cxx -@@ -67,6 +67,11 @@ using namespace ::xmloff::token; - #define MR_E( a, p, l, t, c ) \ - _M_E( a, p, l, (t|XML_TYPE_PROP_RUBY), c ) - -+// extensions import/export -+#define MAP_EXT(name,prefix,token,type,context) { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_012_EXT_COMPAT, false } -+// extensions import only -+#define MAP_EXT_I(name,prefix,token,type,context) { name, sizeof(name)-1, prefix, token, type, context, SvtSaveOptions::ODFVER_012_EXT_COMPAT, true } -+ - #define M_END() \ - { NULL, 0, 0, XML_TOKEN_INVALID, 0, 0, SvtSaveOptions::ODFVER_010, false } - -@@ -88,7 +93,8 @@ XMLPropertyMapEntry aXMLParaPropMap[] = - MP_E( "ParaTopMarginRelative", FO, MARGIN_TOP, XML_TYPE_PERCENT16, CTF_PARATOPMARGIN_REL ), - MP_E( "ParaBottomMargin", FO, MARGIN_BOTTOM, XML_TYPE_MEASURE|MID_FLAG_MULTI_PROPERTY, CTF_PARABOTTOMMARGIN ), - MP_E( "ParaBottomMarginRelative",FO, MARGIN_BOTTOM, XML_TYPE_PERCENT16, CTF_PARABOTTOMMARGIN_REL ), -- { "ParaContextMargin", sizeof("ParaContextMargin")-1, XML_NAMESPACE_STYLE, XML_CONTEXTUAL_SPACING, XML_TYPE_BOOL|XML_TYPE_PROP_PARAGRAPH, 0, SvtSaveOptions::ODFVER_012_EXT_COMPAT, false }, -+ MAP_EXT( "ParaContextMargin", XML_NAMESPACE_STYLE, XML_CONTEXTUAL_SPACING, XML_TYPE_BOOL|XML_TYPE_PROP_PARAGRAPH, 0 ), // proposed ODF 1.2+ -+ MAP_EXT_I( "ParaContextMargin", XML_NAMESPACE_LO_EXT, XML_CONTEXTUAL_SPACING, XML_TYPE_BOOL|XML_TYPE_PROP_PARAGRAPH, 0 ), // extension namespace - // RES_CHRATR_CASEMAP - MT_E( "CharCaseMap", FO, FONT_VARIANT, XML_TYPE_TEXT_CASEMAP_VAR, 0 ), - MT_E( "CharCaseMap", FO, TEXT_TRANSFORM, XML_TYPE_TEXT_CASEMAP, 0 ), --- -1.8.4.2 - diff --git a/SOURCES/0083-fdo-67370-Hyphens-are-not-visible-in-tagged-PDF.patch b/SOURCES/0083-fdo-67370-Hyphens-are-not-visible-in-tagged-PDF.patch deleted file mode 100644 index 0b07456..0000000 --- a/SOURCES/0083-fdo-67370-Hyphens-are-not-visible-in-tagged-PDF.patch +++ /dev/null @@ -1,109 +0,0 @@ -From 158027cd7fe1ea2faeb5d2220547b36c9cbfb9d3 Mon Sep 17 00:00:00 2001 -From: Khaled Hosny -Date: Sun, 22 Dec 2013 01:02:19 +0200 -Subject: [PATCH 083/109] fdo#67370: Hyphens are not visible in tagged PDF -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -One requirement of tagged PDF is to represent automatically inserted -hyphens using the soft hyphen (U+00AD) character, so we were doing this -by simply passing that character to text layout code when exporting a -tagged PDF (which is the literal suggestion of old PDF specification). - -This is wrong, though, since the soft hyphen is a control character and -should not have a visible output by itself (and fonts might not even -have a visible glyph there), but this happened to work because non of -the layout engines we are using treated soft hyphen specially and was -just showing whatever glyph the font had there. This broke with the -switch to HarfBuzz since it will not show any visible glyph for Unicode -control characters (by default), which is the right thing to do. - -Latest versions of PDF spec suggest using either ToUnicode mapping or an -ActualText text entry to encode the soft hyphen instead, I found it -easier to use ActualText since we already have code that handles -non-standard hyphenation using it already. - -Conflicts: - sw/source/core/text/EnhancedPDFExportHelper.cxx - sw/source/core/text/txthyph.cxx - -Change-Id: I88deadf3a806f69775b2e0ccff2f9b2f61a0f2e2 -Reviewed-on: https://gerrit.libreoffice.org/7177 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - sw/source/core/text/EnhancedPDFExportHelper.cxx | 11 +++++++++-- - sw/source/core/text/txthyph.cxx | 12 ++---------- - 2 files changed, 11 insertions(+), 12 deletions(-) - -diff --git a/sw/source/core/text/EnhancedPDFExportHelper.cxx b/sw/source/core/text/EnhancedPDFExportHelper.cxx -index 3933837..9538de6 100644 ---- a/sw/source/core/text/EnhancedPDFExportHelper.cxx -+++ b/sw/source/core/text/EnhancedPDFExportHelper.cxx -@@ -766,7 +766,8 @@ void SwTaggedPDFHelper::SetAttributes( vcl::PDFWriter::StructElement eType ) - case vcl::PDFWriter::Span : - case vcl::PDFWriter::Quote : - case vcl::PDFWriter::Code : -- if( POR_HYPHSTR == pPor->GetWhichPor() || POR_SOFTHYPHSTR == pPor->GetWhichPor() ) -+ if( POR_HYPHSTR == pPor->GetWhichPor() || POR_SOFTHYPHSTR == pPor->GetWhichPor() || -+ POR_HYPH == pPor->GetWhichPor() || POR_SOFTHYPH == pPor->GetWhichPor() ) - bActualText = true; - else - { -@@ -789,7 +790,11 @@ void SwTaggedPDFHelper::SetAttributes( vcl::PDFWriter::StructElement eType ) - - if ( bActualText ) - { -- const String aActualTxt( rInf.GetTxt(), rInf.GetIdx(), pPor->GetLen() ); -+ String aActualTxt; -+ if (pPor->GetWhichPor() == POR_SOFTHYPH || pPor->GetWhichPor() == POR_HYPH) -+ aActualTxt = (sal_Unicode)0xad; // soft hyphen -+ else -+ aActualTxt = String(rInf.GetTxt(), rInf.GetIdx(), pPor->GetLen()); - mpPDFExtOutDevData->SetActualText( aActualTxt ); - } - -@@ -1373,6 +1378,8 @@ void SwTaggedPDFHelper::BeginInlineStructureElements() - - switch ( pPor->GetWhichPor() ) - { -+ case POR_HYPH : -+ case POR_SOFTHYPH : - // Check for alternative spelling: - case POR_HYPHSTR : - case POR_SOFTHYPHSTR : -diff --git a/sw/source/core/text/txthyph.cxx b/sw/source/core/text/txthyph.cxx -index 62b3ad4..6b32a9f 100644 ---- a/sw/source/core/text/txthyph.cxx -+++ b/sw/source/core/text/txthyph.cxx -@@ -20,7 +20,6 @@ - #include - #include - #include --#include - #include // SwViewOptions - #include - #include -@@ -370,16 +369,9 @@ sal_Bool SwTxtPortion::CreateHyphen( SwTxtFormatInfo &rInf, SwTxtGuess &rGuess ) - * virtual SwHyphPortion::GetExpTxt() - *************************************************************************/ - --sal_Bool SwHyphPortion::GetExpTxt( const SwTxtSizeInfo &rInf, OUString &rTxt ) const -+sal_Bool SwHyphPortion::GetExpTxt( const SwTxtSizeInfo &/*rInf*/, OUString &rTxt ) const - { -- // #i16816# tagged pdf support -- const sal_Unicode cChar = rInf.GetVsh() && -- rInf.GetVsh()->GetViewOptions()->IsPDFExport() && -- SwTaggedPDFHelper::IsExportTaggedPDF( *rInf.GetOut() ) ? -- 0xad : -- '-'; -- -- rTxt = OUString(cChar); -+ rTxt = "-"; - return sal_True; - } - --- -1.8.4.2 - diff --git a/SOURCES/0083-fdo-81835-Don-t-prefer-GDI-Metafiles-to-RTF-HTML-cor.patch b/SOURCES/0083-fdo-81835-Don-t-prefer-GDI-Metafiles-to-RTF-HTML-cor.patch new file mode 100644 index 0000000..5dd8681 --- /dev/null +++ b/SOURCES/0083-fdo-81835-Don-t-prefer-GDI-Metafiles-to-RTF-HTML-cor.patch @@ -0,0 +1,48 @@ +From 0650c251422b8b4f2485a33d0d5e39955981bf2d Mon Sep 17 00:00:00 2001 +From: Andrzej Hunt +Date: Wed, 6 Aug 2014 16:00:28 +0200 +Subject: [PATCH 083/137] fdo#81835 Don't prefer GDI Metafiles to RTF/HTML -- + correctly. + +Was first introduced by 538c13f3d1756f2d105115f64ab1bc0b7426eebc + +We should process clipboard formats in order of descriptive-/ +usefulness -- however png/bmp are special cases (as browsers +will add an html equivalent to their clipboard when copying raw +images, with the raw image being the preferred target format) +and were therefore moved up in the paste-preference list, +mistakenly it was assumed that GDI Metafiles should be subject +to the same treatment, but it appears that Word (and Wordpad?) +will provide both RTF (preferred) and GDI for formatted text. + +Change-Id: I731986fc9d70e7aeb64e53764e32cfec3e27eca1 +Reviewed-on: https://gerrit.libreoffice.org/10769 +Reviewed-by: Michael Stahl +Tested-by: Michael Stahl +--- + sot/source/base/formats.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sot/source/base/formats.cxx b/sot/source/base/formats.cxx +index 1f20c24..fc985e2 100644 +--- a/sot/source/base/formats.cxx ++++ b/sot/source/base/formats.cxx +@@ -857,7 +857,6 @@ static SotAction_Impl const aEXCHG_DEST_SWDOC_FREE_AREA_Copy[] = \ + { SOT_FORMATSTR_ID_SD_OLE, EXCHG_OUT_ACTION_INSERT_OLE | EXCHG_OUT_ACTION_FLAG_INSERT_IMAGEMAP | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, 0 },\ + { SOT_FORMATSTR_ID_EMBED_SOURCE, EXCHG_OUT_ACTION_INSERT_OLE | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, 0 }, \ + { SOT_FORMATSTR_ID_EMBEDDED_OBJ, EXCHG_OUT_ACTION_INSERT_OLE | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, 0 }, \ +- { SOT_FORMAT_GDIMETAFILE, EXCHG_OUT_ACTION_INSERT_GDIMETAFILE | EXCHG_OUT_ACTION_FLAG_INSERT_IMAGEMAP | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, 0 },\ + { SOT_FORMATSTR_ID_PNG, EXCHG_OUT_ACTION_INSERT_BITMAP | EXCHG_OUT_ACTION_FLAG_INSERT_IMAGEMAP | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, 0 },\ + { SOT_FORMAT_BITMAP, EXCHG_OUT_ACTION_INSERT_BITMAP | EXCHG_OUT_ACTION_FLAG_INSERT_IMAGEMAP | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, 0 },\ + { SOT_FORMATSTR_ID_HTML, EXCHG_OUT_ACTION_INSERT_HTML | EXCHG_OUT_ACTION_FLAG_INSERT_IMAGEMAP | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, 0 },\ +@@ -869,6 +868,7 @@ static SotAction_Impl const aEXCHG_DEST_SWDOC_FREE_AREA_Copy[] = \ + { SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK, EXCHG_OUT_ACTION_INSERT_HYPERLINK | EXCHG_OUT_ACTION_FLAG_INSERT_IMAGEMAP | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, 0 },\ + { SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR, EXCHG_OUT_ACTION_INSERT_HYPERLINK | EXCHG_OUT_ACTION_FLAG_INSERT_IMAGEMAP | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, FILEGRPDSC_ONLY_URL },\ + { SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR, EXCHG_OUT_ACTION_INSERT_HYPERLINK | EXCHG_OUT_ACTION_FLAG_INSERT_IMAGEMAP | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, 0 },\ ++ { SOT_FORMAT_GDIMETAFILE, EXCHG_OUT_ACTION_INSERT_GDIMETAFILE | EXCHG_OUT_ACTION_FLAG_INSERT_IMAGEMAP | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, 0 },\ + { SOT_FORMATSTR_ID_EMBED_SOURCE_OLE, EXCHG_OUT_ACTION_INSERT_OLE | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, 0 }, \ + { SOT_FORMATSTR_ID_EMBEDDED_OBJ_OLE, EXCHG_OUT_ACTION_INSERT_OLE | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, 0 }, \ + { SOT_FORMATSTR_ID_LINK, EXCHG_OUT_ACTION_INSERT_DDE | EXCHG_OUT_ACTION_FLAG_INSERT_TARGETURL, 0 }, \ +-- +1.9.3 + diff --git a/SOURCES/0084-fdo-72916-correct-rounding-of-time-part-of-DateTime.patch b/SOURCES/0084-fdo-72916-correct-rounding-of-time-part-of-DateTime.patch deleted file mode 100644 index 6b64c6e..0000000 --- a/SOURCES/0084-fdo-72916-correct-rounding-of-time-part-of-DateTime.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 56381a9b28dbe4caf6e3d0a92dfddcddcebe3494 Mon Sep 17 00:00:00 2001 -From: Lionel Elie Mamane -Date: Sat, 21 Dec 2013 10:37:11 +0100 -Subject: [PATCH 084/109] fdo#72916 correct rounding of time part of DateTime - -Change-Id: I135478755f9e5a844119129b470fef8de2cd0409 ---- - connectivity/source/commontools/dbconversion.cxx | 16 +++++++++++++--- - include/connectivity/dbconversion.hxx | 2 +- - 2 files changed, 14 insertions(+), 4 deletions(-) - -diff --git a/connectivity/source/commontools/dbconversion.cxx b/connectivity/source/commontools/dbconversion.cxx -index 847f45f..15276a6 100644 ---- a/connectivity/source/commontools/dbconversion.cxx -+++ b/connectivity/source/commontools/dbconversion.cxx -@@ -28,6 +28,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -355,10 +356,15 @@ namespace dbtools - return aRet; - } - // ------------------------------------------------------------------------- -- utl::Time DBTypeConversion::toTime(double dVal) -+ utl::Time DBTypeConversion::toTime(double dVal, short nDigits) - { - sal_Int32 nDays = (sal_Int32)dVal; -- sal_Int64 nNS = static_cast((dVal - (double)nDays) * fNanoSecondsPerDay + 0.5); -+ sal_Int64 nNS; -+ { -+ double fSeconds((dVal - (double)nDays) * (fNanoSecondsPerDay / nanoSecInSec)); -+ fSeconds = ::rtl::math::round( fSeconds, nDigits ); -+ nNS = fSeconds * nanoSecInSec; -+ } - - sal_Int16 nSign; - if ( nNS < 0 ) -@@ -401,7 +407,11 @@ namespace dbtools - utl::DateTime DBTypeConversion::toDateTime(double dVal, const utl::Date& _rNullDate) - { - utl::Date aDate = toDate(dVal, _rNullDate); -- utl::Time aTime = toTime(dVal); -+ // there is not enough precision in a double to have both a date -+ // and a time up to nanoseconds -> limit to microseconds to have -+ // correct rounding, that is e.g. 13:00:00.000000000 instead of -+ // 12:59:59.999999790 -+ utl::Time aTime = toTime(dVal, 6); - - utl::DateTime xRet; - -diff --git a/include/connectivity/dbconversion.hxx b/include/connectivity/dbconversion.hxx -index 9536c79..b11442b 100644 ---- a/include/connectivity/dbconversion.hxx -+++ b/include/connectivity/dbconversion.hxx -@@ -105,7 +105,7 @@ namespace dbtools - - static ::com::sun::star::util::Date toDate(double dVal, const ::com::sun::star::util::Date& _rNullDate = getStandardDate()); - static ::com::sun::star::util::Date toDate(const OUString& _sSQLDate); -- static ::com::sun::star::util::Time toTime(double dVal); -+ static ::com::sun::star::util::Time toTime(double dVal, short nDigits = 9); - static ::com::sun::star::util::Time toTime(const OUString& _sSQLDate); - static ::com::sun::star::util::DateTime toDateTime(double dVal, const ::com::sun::star::util::Date& _rNullDate = getStandardDate()); - static ::com::sun::star::util::DateTime toDateTime(const OUString& _sSQLDate); --- -1.8.4.2 - diff --git a/SOURCES/0084-fdo-82137-don-t-include-working-directory-in-tarball.patch b/SOURCES/0084-fdo-82137-don-t-include-working-directory-in-tarball.patch new file mode 100644 index 0000000..8f406bb --- /dev/null +++ b/SOURCES/0084-fdo-82137-don-t-include-working-directory-in-tarball.patch @@ -0,0 +1,46 @@ +From 3f37f7b8b0d99b274e2eadc4eff232ea670cb6fd Mon Sep 17 00:00:00 2001 +From: Christian Lohmaier +Date: Wed, 6 Aug 2014 20:11:00 +0200 +Subject: [PATCH 084/137] fdo#82137 don't include working directory in tarballs + +as this changes permissions when extracting, and those are restrictive, +since it is a temporary directory + +Change-Id: I41b28fe405e5915faeea944eb3cfdbed518ac55d +(cherry picked from commit 5ca2b6fca9eb975886f6796e6086ddf79be387d5) +--- + bin/lo-pack-sources | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/bin/lo-pack-sources b/bin/lo-pack-sources +index de6a4be..3571638 100755 +--- a/bin/lo-pack-sources ++++ b/bin/lo-pack-sources +@@ -13,6 +13,7 @@ my %module_dirname = ( + "help" => "helpcontent2", + "translations" => "translations" + ); ++my $lo_topdir_name; + + # get libreoffice-build version from the given libreoffice-build sources + sub get_config_version($) +@@ -159,7 +160,7 @@ sub generate_tarball($$$) + + print "Creating $tarball..."; + # generate the tarball in the current directory; avoid "./" prefix in the stored paths; show progress +- system ("tar -c $tar_compress_option -f $tarball -C $dir --checkpoint=500 --checkpoint-action=exec=\"echo -n .\" --transform=\"s|^\./||\" .") && ++ system ("tar -c $tar_compress_option -f $tarball -C $dir --checkpoint=500 --checkpoint-action=exec=\"echo -n .\" $lo_topdir_name") && + die "Error: releasing failed: $!\n"; + print "\n"; + } +@@ -351,7 +352,6 @@ my $state_release_version; + my $lo_core_tempdir; + my $force; + my $verbose=1; +-my $lo_topdir_name; + my %module_tarball_name; + + ################### +-- +1.9.3 + diff --git a/SOURCES/0085-Fix-stepping-to-the-next-change.patch b/SOURCES/0085-Fix-stepping-to-the-next-change.patch deleted file mode 100644 index 52cd06d..0000000 --- a/SOURCES/0085-Fix-stepping-to-the-next-change.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 70f90c08592ef3e50840afda20428078c25c463a Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Zolnai=20Tam=C3=A1s?= -Date: Fri, 27 Dec 2013 09:45:05 +0100 -Subject: [PATCH 085/109] Fix stepping to the next change -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Bug description: -In the "Accept or Reject Changes" dialog, when select a change -(it should be after the first few ones) and clicking "Accept" -or "Reject" button, acception/rejection is made but after it -not the next change is selected for futher work, -but a random one. This bug doesn't appear in all case, -just if changes are complex enough. - -Solution: -The nPos means absolute position so we have to get the next entry -with the corresponding GetEntryAtAbsPos() method. It seems simple -position can differ from absolute positions if changes are -complex enough. - -Change-Id: I7996f81c2a09c492f9334f071591291d200d533f -(cherry picked from commit dbd8a631bb23c588f52102e5dd2a61c9cd854bc3) -Reviewed-on: https://gerrit.libreoffice.org/7209 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - sw/source/ui/misc/redlndlg.cxx | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/sw/source/ui/misc/redlndlg.cxx b/sw/source/ui/misc/redlndlg.cxx -index 7885bb4..f1cc96d 100644 ---- a/sw/source/ui/misc/redlndlg.cxx -+++ b/sw/source/ui/misc/redlndlg.cxx -@@ -830,9 +830,9 @@ void SwRedlineAcceptDlg::CallAcceptReject( sal_Bool bSelect, sal_Bool bAccept ) - { - if( nPos >= pTable->GetEntryCount() ) - nPos = pTable->GetEntryCount() - 1; -- pEntry = pTable->GetEntry( nPos ); -+ pEntry = pTable->GetEntryAtAbsPos( nPos ); - if( !pEntry && nPos-- ) -- pEntry = pTable->GetEntry( nPos ); -+ pEntry = pTable->GetEntryAtAbsPos( nPos ); - if( pEntry ) - { - pTable->Select( pEntry ); --- -1.8.4.2 - diff --git a/SOURCES/0085-fdo-81516-vcl-limit-number-of-CFFs-read-from-font.patch b/SOURCES/0085-fdo-81516-vcl-limit-number-of-CFFs-read-from-font.patch new file mode 100644 index 0000000..3e6fc0d --- /dev/null +++ b/SOURCES/0085-fdo-81516-vcl-limit-number-of-CFFs-read-from-font.patch @@ -0,0 +1,86 @@ +From 5591c9c2ab77d32a923200f980e8fe7af61ffd5b Mon Sep 17 00:00:00 2001 +From: Michael Stahl +Date: Tue, 5 Aug 2014 12:50:05 +0200 +Subject: [PATCH 085/137] fdo#81516: vcl: limit number of CFFs read from font + +(cherry picked from commit 45b0b47d114437198c9e0872d427576e6e7e6cc6) + +Conflicts: + vcl/source/fontsubset/cff.cxx + +Change-Id: I9928b9805169a2dbb41be669dc37617b30bc672b +Reviewed-on: https://gerrit.libreoffice.org/10752 +Reviewed-by: Miklos Vajna +Tested-by: Miklos Vajna +--- + vcl/source/fontsubset/cff.cxx | 20 +++++++++++++------- + 1 file changed, 13 insertions(+), 7 deletions(-) + +diff --git a/vcl/source/fontsubset/cff.cxx b/vcl/source/fontsubset/cff.cxx +index 35b6679..476e458 100644 +--- a/vcl/source/fontsubset/cff.cxx ++++ b/vcl/source/fontsubset/cff.cxx +@@ -369,7 +369,7 @@ public: + explicit CffSubsetterContext( const U8* pBasePtr, int nBaseLen); + virtual ~CffSubsetterContext( void); + +- void initialCffRead( void); ++ bool initialCffRead(); + bool emitAsType1( class Type1Emitter&, + const long* pGlyphIDs, const U8* pEncoding, + GlyphWidth* pGlyphWidths, int nGlyphCount, FontSubsetInfo& ); +@@ -1569,9 +1569,7 @@ CffGlobal::CffGlobal( void) + // TODO; maFontMatrix.clear(); + } + +-// -------------------------------------------------------------------- +- +-void CffSubsetterContext::initialCffRead( void) ++bool CffSubsetterContext::initialCffRead() + { + // get the CFFHeader + mpReadPtr = mpBasePtr; +@@ -1629,7 +1627,11 @@ void CffSubsetterContext::initialCffRead( void) + // assert( mnFontDictBase == tellRel()); + mpReadPtr = mpBasePtr + mnFontDictBase; + mnFDAryCount = (mpReadPtr[0]<<8) + mpReadPtr[1]; +- assert( mnFDAryCount < (int)(sizeof(maCffLocal)/sizeof(*maCffLocal))); ++ if (static_cast(mnFDAryCount) >= SAL_N_ELEMENTS(maCffLocal)) ++ { ++ SAL_INFO("vcl.fonts", "CffSubsetterContext: too many CFF in font"); ++ return false; ++ } + + // read FDArray details to get access to the PRIVDICTs + for( int i = 0; i < mnFDAryCount; ++i) { +@@ -1670,6 +1672,8 @@ void CffSubsetterContext::initialCffRead( void) + } + + // ignore the Notices info ++ ++ return true; + } + + // -------------------------------------------------------------------- +@@ -2340,14 +2344,16 @@ bool CffSubsetterContext::emitAsType1( Type1Emitter& rEmitter, + bool FontSubsetInfo::CreateFontSubsetFromCff( GlyphWidth* pOutGlyphWidths ) + { + CffSubsetterContext aCff( mpInFontBytes, mnInByteLength); +- aCff.initialCffRead(); ++ bool bRC = aCff.initialCffRead(); ++ if (!bRC) ++ return bRC; + + // emit Type1 subset from the CFF input + // TODO: also support CFF->CFF subsetting (when PDF-export and PS-printing need it) + const bool bPfbSubset = (0 != (mnReqFontTypeMask & FontSubsetInfo::TYPE1_PFB)); + Type1Emitter aType1Emitter( mpOutFile, bPfbSubset); + aType1Emitter.setSubsetName( mpReqFontName); +- bool bRC = aCff.emitAsType1( aType1Emitter, ++ bRC = aCff.emitAsType1( aType1Emitter, + mpReqGlyphIds, mpReqEncodedIds, + pOutGlyphWidths, mnReqGlyphCount, *this); + return bRC; +-- +1.9.3 + diff --git a/SOURCES/0086-DOCX-import-close-rPrChange-properly.patch b/SOURCES/0086-DOCX-import-close-rPrChange-properly.patch deleted file mode 100644 index c6665be..0000000 --- a/SOURCES/0086-DOCX-import-close-rPrChange-properly.patch +++ /dev/null @@ -1,56 +0,0 @@ -From a5d5aa022c2ae04e1d230050a773b3983a410cde Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Zolnai=20Tam=C3=A1s?= -Date: Tue, 24 Dec 2013 08:05:58 +0100 -Subject: [PATCH 086/109] DOCX import: close rPrChange properly. - -Call endtrackchanges when rPrChange ends so the -corresponding redline will be removed. - -Conflicts: - sw/qa/extras/ooxmlimport/ooxmlimport.cxx -Reviewed on: - https://gerrit.libreoffice.org/7194 - -Change-Id: I4091d7b54e0a74f3158cc979f210577a2dc29783 ---- - sw/qa/extras/inc/swmodeltestbase.hxx | 6 ++++++ - sw/qa/extras/ooxmlimport/data/rprchange_closed.docx | Bin 0 -> 24695 bytes - sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 9 +++++++++ - writerfilter/source/ooxml/model.xml | 3 +++ - 4 files changed, 18 insertions(+) - create mode 100644 sw/qa/extras/ooxmlimport/data/rprchange_closed.docx - -diff --git a/sw/qa/extras/inc/swmodeltestbase.hxx b/sw/qa/extras/inc/swmodeltestbase.hxx -index a9b2368..727580d 100644 ---- a/sw/qa/extras/inc/swmodeltestbase.hxx -+++ b/sw/qa/extras/inc/swmodeltestbase.hxx -@@ -166,6 +166,12 @@ protected: - return data; - } - -+ bool hasProperty(const uno::Reference& obj, const OUString& name) const -+ { -+ uno::Reference properties(obj, uno::UNO_QUERY_THROW); -+ return properties->getPropertySetInfo()->hasPropertyByName(name); -+ } -+ - /// Get number of paragraphs of the document. - int getParagraphs() - { -diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml -index 4fad4ba..d368dab 100644 ---- a/writerfilter/source/ooxml/model.xml -+++ b/writerfilter/source/ooxml/model.xml -@@ -22077,6 +22077,9 @@ - - - -+ -+ -+ - - - --- -1.8.4.2 - diff --git a/SOURCES/0086-fdo-69282-sw-fix-updating-of-page-styles-via-SwDocSh.patch b/SOURCES/0086-fdo-69282-sw-fix-updating-of-page-styles-via-SwDocSh.patch new file mode 100644 index 0000000..4a959cc --- /dev/null +++ b/SOURCES/0086-fdo-69282-sw-fix-updating-of-page-styles-via-SwDocSh.patch @@ -0,0 +1,53 @@ +From f23d6a124dc413bcbb98f5145d230de707ca85db Mon Sep 17 00:00:00 2001 +From: Michael Stahl +Date: Tue, 5 Aug 2014 22:50:23 +0200 +Subject: [PATCH 086/137] fdo#69282: sw: fix updating of page styles via + SwDocShell::_LoadStyles() + +SwDoc::CopyPageDesc() only copies master and left SwFrmFmt attributes, +but not first-master and first-left. They will contain exactly the same +attributes as master and left but they still need to be copied... + +(see also: that FIXME in pagedesc.hxx) + +(regression from 75084f6c42c27dc95418df9cefed2fddfb26000e) + +Change-Id: I3dcc3627708b5d6a477eb7fef76cf6c42c95c004 +(cherry picked from commit 5c1cc92ee09f9fcc99077cacd3fc55640f03b7b2) +Reviewed-on: https://gerrit.libreoffice.org/10774 +Reviewed-by: Miklos Vajna +Tested-by: Miklos Vajna +--- + sw/source/core/doc/docfmt.cxx | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx +index 561cb0f..b987918 100644 +--- a/sw/source/core/doc/docfmt.cxx ++++ b/sw/source/core/doc/docfmt.cxx +@@ -2148,6 +2148,22 @@ void SwDoc::CopyPageDesc( const SwPageDesc& rSrcDesc, SwPageDesc& rDstDesc, + + rDstDesc.GetLeft().DelDiffs( aAttrSet ); + rDstDesc.GetLeft().SetFmtAttr( aAttrSet ); ++ ++ aAttrSet.ClearItem(); ++ aAttrSet.Put( rSrcDesc.GetFirstMaster().GetAttrSet() ); ++ aAttrSet.ClearItem( RES_HEADER ); ++ aAttrSet.ClearItem( RES_FOOTER ); ++ ++ rDstDesc.GetFirstMaster().DelDiffs( aAttrSet ); ++ rDstDesc.GetFirstMaster().SetFmtAttr( aAttrSet ); ++ ++ aAttrSet.ClearItem(); ++ aAttrSet.Put( rSrcDesc.GetFirstLeft().GetAttrSet() ); ++ aAttrSet.ClearItem( RES_HEADER ); ++ aAttrSet.ClearItem( RES_FOOTER ); ++ ++ rDstDesc.GetFirstLeft().DelDiffs( aAttrSet ); ++ rDstDesc.GetFirstLeft().SetFmtAttr( aAttrSet ); + } + + CopyHeader( rSrcDesc.GetMaster(), rDstDesc.GetMaster() ); +-- +1.9.3 + diff --git a/SOURCES/0087-SwDoc-CopyPageDesc-probably-sending-Modify-for-first.patch b/SOURCES/0087-SwDoc-CopyPageDesc-probably-sending-Modify-for-first.patch new file mode 100644 index 0000000..cf3c2bd --- /dev/null +++ b/SOURCES/0087-SwDoc-CopyPageDesc-probably-sending-Modify-for-first.patch @@ -0,0 +1,35 @@ +From 01db6d0f9b3cfa88eaedd3b9ac98f76c2a90571b Mon Sep 17 00:00:00 2001 +From: Michael Stahl +Date: Tue, 5 Aug 2014 22:56:17 +0200 +Subject: [PATCH 087/137] SwDoc::CopyPageDesc(): probably sending Modify for + first too cannot hurt + +Change-Id: I2056bee7555d3f6723ac374863187d82e4ad9edd +(cherry picked from commit 2e9840d18c09ce5552eec2f9d489d952da1034ae) +Reviewed-on: https://gerrit.libreoffice.org/10775 +Reviewed-by: Miklos Vajna +Tested-by: Miklos Vajna +--- + sw/source/core/doc/docfmt.cxx | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx +index b987918..43cfe77 100644 +--- a/sw/source/core/doc/docfmt.cxx ++++ b/sw/source/core/doc/docfmt.cxx +@@ -2215,6 +2215,12 @@ void SwDoc::CopyPageDesc( const SwPageDesc& rSrcDesc, SwPageDesc& rDstDesc, + { + rDstDesc.GetLeft().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) ); + } ++ { ++ rDstDesc.GetFirstMaster().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) ); ++ } ++ { ++ rDstDesc.GetFirstLeft().ModifyBroadcast( &aInfo, 0, TYPE(SwFrm) ); ++ } + } + } + +-- +1.9.3 + diff --git a/SOURCES/0088-fdo-65090-RTF-filter-import-RTF_CLMGF-and-RTF_CLMRG.patch b/SOURCES/0088-fdo-65090-RTF-filter-import-RTF_CLMGF-and-RTF_CLMRG.patch deleted file mode 100644 index 34624bb..0000000 --- a/SOURCES/0088-fdo-65090-RTF-filter-import-RTF_CLMGF-and-RTF_CLMRG.patch +++ /dev/null @@ -1,284 +0,0 @@ -From 8b8152b8fbfb39f44fe0441decd3a746684f4382 Mon Sep 17 00:00:00 2001 -From: Miklos Vajna -Date: Fri, 27 Dec 2013 20:46:50 +0100 -Subject: [PATCH 088/109] fdo#65090 RTF filter: import RTF_CLMGF and RTF_CLMRG -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -These describe an explicit horizontal merge, that is not something Word -itself creates, but it turns out the Calc RTF export does. - -(cherry picked from commits bb562304c1e1c61a882e6db65806cfdf8601bcbf, -97dcf77841d19d344d58d5bdacdab141cdea4817 and -6eb02ac8a77f9f89f256b190281029f6cbd60d95) - -Conflicts: - sw/qa/extras/ooxmlimport/ooxmlimport.cxx - writerfilter/source/dmapper/PropertyIds.cxx - writerfilter/source/dmapper/PropertyIds.hxx - writerfilter/source/rtftok/rtfdocumentimpl.cxx - -Change-Id: I1b6ec10bb8e8bd40e24791ccc96f2f066dd0d5d5 -Reviewed-on: https://gerrit.libreoffice.org/7220 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - sw/qa/extras/ooxmlimport/data/fdo65090.docx | Bin 0 -> 10409 bytes - sw/qa/extras/ooxmlimport/ooxmlimport.cxx | 12 ++++++ - sw/qa/extras/rtfimport/data/fdo65090.rtf | 6 +++ - sw/qa/extras/rtfimport/rtfimport.cxx | 12 ++++++ - sw/source/core/unocore/unotbl.cxx | 2 +- - .../source/dmapper/DomainMapperTableHandler.cxx | 43 ++++++++++++++++++++- - .../source/dmapper/DomainMapperTableHandler.hxx | 17 +++++++- - .../source/dmapper/DomainMapperTableManager.cxx | 8 ++++ - writerfilter/source/dmapper/PropertyIds.cxx | 1 + - writerfilter/source/dmapper/PropertyIds.hxx | 1 + - writerfilter/source/rtftok/rtfdocumentimpl.cxx | 12 ++++++ - 11 files changed, 110 insertions(+), 4 deletions(-) - create mode 100644 sw/qa/extras/ooxmlimport/data/fdo65090.docx - create mode 100644 sw/qa/extras/rtfimport/data/fdo65090.rtf - -diff --git a/sw/qa/extras/rtfimport/data/fdo65090.rtf b/sw/qa/extras/rtfimport/data/fdo65090.rtf -new file mode 100644 -index 0000000..8a3eabd ---- /dev/null -+++ b/sw/qa/extras/rtfimport/data/fdo65090.rtf -@@ -0,0 +1,6 @@ -+{\rtf\ansi -+{ -+\trowd\trgaph30\trleft-30\trrh242\clmgf\clvertalc\cellx1280\clmrg\clvertalb\cellx2560\clvertalb\cellx3840\pard\plain\intbl -+\qc a\cell\cell\ql b\cell\row -+} -+} -diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx -index 687baac..eca16e3 100644 ---- a/sw/qa/extras/rtfimport/rtfimport.cxx -+++ b/sw/qa/extras/rtfimport/rtfimport.cxx -@@ -161,6 +161,7 @@ public: - void testFdo68291(); - void testFdo69384(); - void testFdo70221(); -+ void testFdo65090(); - - CPPUNIT_TEST_SUITE(Test); - #if !defined(MACOSX) && !defined(WNT) -@@ -306,6 +307,7 @@ void Test::run() - {"fdo68291.odt", &Test::testFdo68291}, - {"hello.rtf", &Test::testFdo69384}, - {"fdo70221.rtf", &Test::testFdo70221}, -+ {"fdo65090.rtf", &Test::testFdo65090}, - }; - header(); - for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) -@@ -1488,6 +1490,16 @@ void Test::testFdo70221() - CPPUNIT_ASSERT_EQUAL(sal_Int32(1), xDraws->getCount()); - } - -+void Test::testFdo65090() -+{ -+ uno::Reference xTablesSupplier(mxComponent, uno::UNO_QUERY); -+ uno::Reference xTables(xTablesSupplier->getTextTables( ), uno::UNO_QUERY); -+ uno::Reference xTextTable(xTables->getByIndex(0), uno::UNO_QUERY); -+ uno::Reference xTableRows(xTextTable->getRows(), uno::UNO_QUERY); -+ // The first row had 3 cells, instead of a horizontally merged one and a normal one (2 -> 1 separator). -+ CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getProperty< uno::Sequence >(xTableRows->getByIndex(0), "TableColumnSeparators").getLength()); -+} -+ - CPPUNIT_TEST_SUITE_REGISTRATION(Test); - - CPPUNIT_PLUGIN_IMPLEMENT(); -diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx -index 49fc1a3..3fd2350 100644 ---- a/sw/source/core/unocore/unotbl.cxx -+++ b/sw/source/core/unocore/unotbl.cxx -@@ -1709,7 +1709,7 @@ sal_Bool SwXTextTableCursor::mergeRange(void) throw( uno::RuntimeException ) - if(bRet) - { - size_t nCount = pTblCrsr->GetSelectedBoxesCount(); -- while (--nCount) -+ while (nCount--) - { - pTblCrsr->DeleteBox(nCount); - } -diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx -index b613c07..28be09c 100644 ---- a/writerfilter/source/dmapper/DomainMapperTableHandler.cxx -+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.cxx -@@ -536,7 +536,7 @@ TableStyleSheetEntry * DomainMapperTableHandler::endTableGetTableStyle(TableInfo - #define CNF_LAST_ROW_LAST_COLUMN 0x002 - #define CNF_LAST_ROW_FIRST_COLUMN 0x001 - --CellPropertyValuesSeq_t DomainMapperTableHandler::endTableGetCellProperties(TableInfo & rInfo) -+CellPropertyValuesSeq_t DomainMapperTableHandler::endTableGetCellProperties(TableInfo & rInfo, std::vector& rMerges) - { - #ifdef DEBUG_DMAPPER_TABLE_HANDLER - dmapper_logger->startElement("getCellProperties"); -@@ -692,6 +692,25 @@ CellPropertyValuesSeq_t DomainMapperTableHandler::endTableGetCellProperties(Tabl - aCellIterator->get()->Insert( PROP_BOTTOM_BORDER_DISTANCE, false, - uno::makeAny((sal_Int32) rInfo.nBottomBorderDistance ) ); - -+ // Horizontal merge is not an UNO property, extract that info here to rMerges, and then remove it from the map. -+ const PropertyMap::const_iterator aHorizontalMergeIter = aCellIterator->get()->find(PropertyDefinition(PROP_HORIZONTAL_MERGE, false)); -+ if (aHorizontalMergeIter != aCellIterator->get()->end()) -+ { -+ if (aHorizontalMergeIter->second.get()) -+ { -+ // first cell in a merge -+ HorizontallyMergedCell aMerge(nRow, nCell); -+ rMerges.push_back(aMerge); -+ } -+ else if (!rMerges.empty()) -+ { -+ // resuming an earlier merge -+ HorizontallyMergedCell& rMerge = rMerges.back(); -+ rMerge.m_nLastRow = nRow; -+ rMerge.m_nLastCol = nCell; -+ } -+ aCellIterator->get()->erase(PropertyDefinition(PROP_HORIZONTAL_MERGE, false)); -+ } - pSingleCellProperties[nCell] = aCellIterator->get()->GetPropertyValues(); - #ifdef DEBUG_DMAPPER_TABLE_HANDLER - dmapper_logger->endElement(); -@@ -804,7 +823,8 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) - aTableInfo.pTableStyle = endTableGetTableStyle(aTableInfo, aFrameProperties); - // expands to uno::Sequence< Sequence< beans::PropertyValues > > - -- CellPropertyValuesSeq_t aCellProperties = endTableGetCellProperties(aTableInfo); -+ std::vector aMerges; -+ CellPropertyValuesSeq_t aCellProperties = endTableGetCellProperties(aTableInfo, aMerges); - - RowPropertyValuesSeq_t aRowProperties = endTableGetRowProperties(); - -@@ -837,8 +857,27 @@ void DomainMapperTableHandler::endTable(unsigned int nestedTableLevel) - aTableInfo.aTableProperties); - - if (xTable.is()) -+ { - m_xTableRange = xTable->getAnchor( ); - -+ if (!aMerges.empty()) -+ { -+ // Perform horizontal merges in reverse order, so the fact that merging changes the position of cells won't cause a problem for us. -+ for (std::vector::reverse_iterator it = aMerges.rbegin(); it != aMerges.rend(); ++it) -+ { -+ uno::Reference xCellRange(xTable, uno::UNO_QUERY_THROW); -+ uno::Reference xCell(xCellRange->getCellByPosition(it->m_nFirstCol, it->m_nFirstRow), uno::UNO_QUERY_THROW); -+ OUString aFirst = xCell->getPropertyValue("CellName").get(); -+ xCell.set(xCellRange->getCellByPosition(it->m_nLastCol, it->m_nLastRow), uno::UNO_QUERY_THROW); -+ OUString aLast = xCell->getPropertyValue("CellName").get(); -+ -+ uno::Reference xCursor = xTable->createCursorByCellName(aFirst); -+ xCursor->gotoCellByName(aLast, true); -+ xCursor->mergeRange(); -+ } -+ } -+ } -+ - // OOXML table style may container paragraph properties, apply these now. - for (int i = 0; i < aTableInfo.aTableProperties.getLength(); ++i) - { -diff --git a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx -index 792b978..6b284f7 100644 ---- a/writerfilter/source/dmapper/DomainMapperTableHandler.hxx -+++ b/writerfilter/source/dmapper/DomainMapperTableHandler.hxx -@@ -50,6 +50,21 @@ typedef std::vector PropertyMapVector2; - class DomainMapper_Impl; - class TableStyleSheetEntry; - struct TableInfo; -+ -+/// A horizontally merged cell is in fact a range of cells till its merge is performed. -+struct HorizontallyMergedCell -+{ -+ sal_Int32 m_nFirstRow; -+ sal_Int32 m_nFirstCol; -+ sal_Int32 m_nLastRow; -+ sal_Int32 m_nLastCol; -+ HorizontallyMergedCell(sal_Int32 nFirstRow, sal_Int32 nFirstCol) -+ : m_nFirstRow(nFirstRow), -+ m_nFirstCol(nFirstCol) -+ { -+ } -+}; -+ - class WRITERFILTER_DLLPRIVATE DomainMapperTableHandler : public TableDataHandler - { - TextReference_t m_xText; -@@ -69,7 +84,7 @@ class WRITERFILTER_DLLPRIVATE DomainMapperTableHandler : public TableDataHandler - sal_Int32 m_nRowIndex; - - TableStyleSheetEntry * endTableGetTableStyle(TableInfo & rInfo, uno::Sequence& rFrameProperties); -- CellPropertyValuesSeq_t endTableGetCellProperties(TableInfo & rInfo); -+ CellPropertyValuesSeq_t endTableGetCellProperties(TableInfo & rInfo, std::vector& rMerges); - RowPropertyValuesSeq_t endTableGetRowProperties(); - - public: -diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx -index c3f4c5b..59afbb3 100644 ---- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx -+++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx -@@ -298,6 +298,14 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) - cellProps( pMergeProps); - } - break; -+ case NS_ooxml::LN_CT_TcPrBase_hMerge: -+ { -+ // values can be: LN_Value_ST_Merge_restart, LN_Value_ST_Merge_continue, in reality the second one is a 0 -+ TablePropertyMapPtr pMergeProps(new TablePropertyMap()); -+ pMergeProps->Insert(PROP_HORIZONTAL_MERGE, false, uno::makeAny(bool(sal::static_int_cast(nIntValue) == NS_ooxml::LN_Value_ST_Merge_restart))); -+ cellProps(pMergeProps); -+ } -+ break; - case NS_ooxml::LN_CT_TcPrBase_gridSpan: //number of grid positions spanned by this cell - { - #ifdef DEBUG_DOMAINMAPPER -diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx -index 46a316c..f305c03 100644 ---- a/writerfilter/source/dmapper/PropertyIds.cxx -+++ b/writerfilter/source/dmapper/PropertyIds.cxx -@@ -325,6 +325,7 @@ const OUString& PropertyNameSupplier::GetName( PropertyIds eId ) const - case PROP_GRAPHIC_URL: sName = "GraphicURL"; break; - case PROP_GRAPHIC_BITMAP: sName = "GraphicBitmap"; break; - case PROP_LABEL_CATEGORY: sName = "LabelCategory"; break; -+ case PROP_HORIZONTAL_MERGE: sName = "HorizontalMerge"; break; - } - ::std::pair aInsertIt = - m_pImpl->aNameMap.insert( PropertyNameMap_t::value_type( eId, sName )); -diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx -index 92d3928d..194d7c5 100644 ---- a/writerfilter/source/dmapper/PropertyIds.hxx -+++ b/writerfilter/source/dmapper/PropertyIds.hxx -@@ -296,6 +296,7 @@ enum PropertyIds - ,PROP_IS_WIDTH_RELATIVE - ,PROP_GRAPHIC_URL - ,PROP_GRAPHIC_BITMAP -+ ,PROP_HORIZONTAL_MERGE - }; - struct PropertyNameSupplier_Impl; - class PropertyNameSupplier -diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx -index 5e7ea2a..2deb1ef 100644 ---- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx -+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx -@@ -2394,6 +2394,18 @@ int RTFDocumentImpl::dispatchFlag(RTFKeyword nKeyword) - m_aStates.top().nBorderState = BORDER_PARAGRAPH; - } - break; -+ case RTF_CLMGF: -+ { -+ RTFValue::Pointer_t pValue(new RTFValue(NS_ooxml::LN_Value_ST_Merge_restart)); -+ m_aStates.top().aTableCellSprms.set(NS_ooxml::LN_CT_TcPrBase_hMerge, pValue); -+ } -+ break; -+ case RTF_CLMRG: -+ { -+ RTFValue::Pointer_t pValue(new RTFValue(NS_ooxml::LN_Value_ST_Merge_continue)); -+ m_aStates.top().aTableCellSprms.set(NS_ooxml::LN_CT_TcPrBase_hMerge, pValue); -+ } -+ break; - case RTF_CLVMGF: - { - RTFValue::Pointer_t pValue(new RTFValue(NS_ooxml::LN_Value_ST_Merge_restart)); --- -1.8.4.2 - diff --git a/SOURCES/0089-Resolves-fdo-72961-Crash-when-you-open-ODFver.1.0-1..patch b/SOURCES/0089-Resolves-fdo-72961-Crash-when-you-open-ODFver.1.0-1..patch deleted file mode 100644 index 828a175..0000000 --- a/SOURCES/0089-Resolves-fdo-72961-Crash-when-you-open-ODFver.1.0-1..patch +++ /dev/null @@ -1,48 +0,0 @@ -From 7be4941f5f8e4936e058c5530df6fad6448cac8e Mon Sep 17 00:00:00 2001 -From: Julien Nabet -Date: Sun, 29 Dec 2013 19:06:11 +0100 -Subject: [PATCH 089/109] Resolves: fdo#72961 Crash when you open - ODFver.1.0/1.1 created by LibO-3.5/3.6 - -It seems pAction may be NULL so let's keep on to check it. - -Change-Id: Ie1a48c96bfa930364053c7c3ad0c940559544e33 -Reviewed-on: https://gerrit.libreoffice.org/7228 -Reviewed-by: Andrzej Hunt -Tested-by: Andrzej Hunt -(cherry picked from commit 6cc888babdc3e6414e55f57c0df65135f2ef4804) ---- - vcl/source/gdi/gdimtf.cxx | 14 ++++++++------ - 1 file changed, 8 insertions(+), 6 deletions(-) - -diff --git a/vcl/source/gdi/gdimtf.cxx b/vcl/source/gdi/gdimtf.cxx -index 1240500..90e691b 100644 ---- a/vcl/source/gdi/gdimtf.cxx -+++ b/vcl/source/gdi/gdimtf.cxx -@@ -2765,15 +2765,17 @@ SvStream& operator>>( SvStream& rIStm, GDIMetaFile& rGDIMetaFile ) - { - pAction = MetaAction::ReadMetaAction( rIStm, &aReadData ); - -- if (pAction->GetType() == META_COMMENT_ACTION) -- { -- MetaCommentAction* pCommentAct = static_cast(pAction); -- if ( pCommentAct->GetComment() == "EMF_PLUS" ) -- rGDIMetaFile.UseCanvas( sal_True ); -- } - - if( pAction ) -+ { -+ if (pAction->GetType() == META_COMMENT_ACTION) -+ { -+ MetaCommentAction* pCommentAct = static_cast(pAction); -+ if ( pCommentAct->GetComment() == "EMF_PLUS" ) -+ rGDIMetaFile.UseCanvas( sal_True ); -+ } - rGDIMetaFile.AddAction( pAction ); -+ } - } - } - else --- -1.8.4.2 - diff --git a/SOURCES/0089-bnc-885548-Set-the-date-time-mode-to-non-fixed-after.patch b/SOURCES/0089-bnc-885548-Set-the-date-time-mode-to-non-fixed-after.patch new file mode 100644 index 0000000..47c8350 --- /dev/null +++ b/SOURCES/0089-bnc-885548-Set-the-date-time-mode-to-non-fixed-after.patch @@ -0,0 +1,32 @@ +From 79b9cd12ca9e465d5782c007c80c4aab854d13d1 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Fri, 8 Aug 2014 10:01:49 -0400 +Subject: [PATCH 089/137] bnc#885548: Set the date time mode to non-fixed after + the import is done. + +So that the new revisions will correctly record time stamps. + +Change-Id: I7d9b26bed04a95ce2652224faa0f214562818970 +(cherry picked from commit 2a6843cb6c44305ac62c9cd1098a3eec4abaeb7e) +Reviewed-on: https://gerrit.libreoffice.org/10830 +Reviewed-by: Eike Rathke +Tested-by: Eike Rathke +--- + sc/source/filter/oox/revisionfragment.cxx | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sc/source/filter/oox/revisionfragment.cxx b/sc/source/filter/oox/revisionfragment.cxx +index 463b663..c8c1f14 100644 +--- a/sc/source/filter/oox/revisionfragment.cxx ++++ b/sc/source/filter/oox/revisionfragment.cxx +@@ -270,6 +270,7 @@ void RevisionHeadersFragment::finalizeImport() + } + + pCT->SetUser(aSelfUser); // set the default user to the document owner. ++ pCT->SetUseFixDateTime(false); + rDoc.SetChangeTrack(pCT.release()); + + // Turn on visibility of tracked changes. +-- +1.9.3 + diff --git a/SOURCES/0090-fdo-39206-Add-support-for-image-transformation-in-SV.patch b/SOURCES/0090-fdo-39206-Add-support-for-image-transformation-in-SV.patch deleted file mode 100644 index b9e44f9..0000000 --- a/SOURCES/0090-fdo-39206-Add-support-for-image-transformation-in-SV.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 050e42346bd2d7ce8ab454df400b48f52c2aeecf Mon Sep 17 00:00:00 2001 -From: Samuel Mehrbrodt -Date: Sat, 7 Dec 2013 12:14:40 +0100 -Subject: [PATCH 090/109] fdo#39206 Add support for image transformation in SVG - Import - -Change-Id: I268599b0c13bbacf5db526fed79453a5443145a5 -Reviewed-on: https://gerrit.libreoffice.org/6968 -Reviewed-by: Miklos Vajna -Tested-by: Miklos Vajna -(cherry picked from commit fb978b8123a47123d184daf390ce17eaacbc05d9) ---- - filter/source/svg/svgreader.cxx | 17 ++++++++++++++++- - 1 file changed, 16 insertions(+), 1 deletion(-) - -diff --git a/filter/source/svg/svgreader.cxx b/filter/source/svg/svgreader.cxx -index e74f669..e3f1af3 100644 ---- a/filter/source/svg/svgreader.cxx -+++ b/filter/source/svg/svgreader.cxx -@@ -1421,7 +1421,7 @@ struct ShapeWritingVisitor - // collect attributes - const sal_Int32 nNumAttrs( xAttributes->getLength() ); - OUString sAttributeValue; -- double x=0.0,y=0.0,width=0.0,height=0.0; -+ double x=0.0, y=0.0, width=0.0, height=0.0; - for( sal_Int32 i=0; iitem(i)->getNodeValue(); -@@ -1446,6 +1446,20 @@ struct ShapeWritingVisitor - break; - } - } -+ // extract basic transformations out of CTM -+ basegfx::B2DTuple aScale, aTranslate; -+ double fRotate, fShearX; -+ if (maCurrState.maCTM.decompose(aScale, aTranslate, fRotate, fShearX)) -+ { -+ // apply transform -+ x *= aScale.getX(); -+ width *= aScale.getX(); -+ y *= aScale.getY(); -+ height *= aScale.getY(); -+ x += aTranslate.getX(); -+ y += aTranslate.getY(); -+ //TODO: Rotate -+ } - - OUString sValue = xElem->hasAttribute("href") ? xElem->getAttribute("href") : ""; - OString aValueUtf8( sValue.getStr(), sValue.getLength(), RTL_TEXTENCODING_UTF8 ); -@@ -1508,6 +1522,7 @@ struct ShapeWritingVisitor - y *= aScale.getY(); - x += aTranslate.getX(); - y += aTranslate.getY(); -+ //TODO: Rotate - } - else { - // some heuristic attempts to have text output --- -1.8.4.2 - diff --git a/SOURCES/0090-fdo-81552-Fail-nicely-if-avahi-doesn-t-let-libreoffi.patch b/SOURCES/0090-fdo-81552-Fail-nicely-if-avahi-doesn-t-let-libreoffi.patch new file mode 100644 index 0000000..f0332ae --- /dev/null +++ b/SOURCES/0090-fdo-81552-Fail-nicely-if-avahi-doesn-t-let-libreoffi.patch @@ -0,0 +1,111 @@ +From 8de2e9b4bc53e6c097897142bad223c100d36292 Mon Sep 17 00:00:00 2001 +From: Bryan Quigley +Date: Mon, 4 Aug 2014 12:26:00 -0400 +Subject: [PATCH 090/137] fdo#81552 Fail nicely if avahi doesn't let + libreoffice publish items + +Needed some minor changes for 4-2. + +Reviewed-on: https://gerrit.libreoffice.org/10735 +Reviewed-by: Michael Stahl +Tested-by: Michael Stahl +(cherry picked from commit 3c57701cf0a169bd8d1893d1b2271d48b8072147) + +Change-Id: Ie264a032a71bda336158e18bd2b14c569f23f42d +Reviewed-on: https://gerrit.libreoffice.org/10822 +Reviewed-by: Michael Stahl +Tested-by: Michael Stahl +--- + sd/source/ui/remotecontrol/AvahiNetworkService.cxx | 28 ++++++++++++++-------- + 1 file changed, 18 insertions(+), 10 deletions(-) + +diff --git a/sd/source/ui/remotecontrol/AvahiNetworkService.cxx b/sd/source/ui/remotecontrol/AvahiNetworkService.cxx +index 04d8e57..43ee31b 100644 +--- a/sd/source/ui/remotecontrol/AvahiNetworkService.cxx ++++ b/sd/source/ui/remotecontrol/AvahiNetworkService.cxx +@@ -35,7 +35,7 @@ static AvahiThreadedPoll *threaded_poll = NULL; + static AvahiEntryGroup *group = NULL; + static AvahiNetworkService *avahiService = NULL; + +-static void create_services(AvahiClient *c); ++static bool create_services(AvahiClient *c); + + static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state, AVAHI_GCC_UNUSED void *userdata) { + assert(g == group || group == NULL); +@@ -78,16 +78,19 @@ static void entry_group_callback(AvahiEntryGroup *g, AvahiEntryGroupState state, + } + } + +-static void create_services(AvahiClient *c) { ++static bool create_services(AvahiClient *c) { + assert(c); + + /* If this is the first time we're called, let's create a new + * entry group if necessary */ ++ if(!client) ++ return false; + + if (!group) + if (!(group = avahi_entry_group_new(c, entry_group_callback, NULL))) { + fprintf(stderr, "avahi_entry_group_new() failed: %s\n", avahi_strerror(avahi_client_errno(c))); + avahiService->clear(); ++ return false; + } + + /* If the group is empty (either because it was just created, or +@@ -113,22 +116,23 @@ static void create_services(AvahiClient *c) { + + avahi_entry_group_reset(group); + +- create_services(c); +- return; ++ return create_services(c); + } + + fprintf(stderr, "Failed to add _impressremote._tcp service: %s\n", avahi_strerror(ret)); + avahiService->clear(); ++ return false; + } + + /* Tell the server to register the service */ + if ((ret = avahi_entry_group_commit(group)) < 0) { + fprintf(stderr, "Failed to commit entry group: %s\n", avahi_strerror(ret)); + avahiService->clear(); ++ return false; + } + } + +- return; ++ return true; //Services we're already created + } + + static void client_callback(AvahiClient *c, AvahiClientState state, AVAHI_GCC_UNUSED void * userdata) { +@@ -174,7 +178,8 @@ void AvahiNetworkService::setup() { + return; + } + +- create_services(client); ++ if(!create_services(client)) ++ return; + + /* Finally, start the event loop thread */ + if (avahi_threaded_poll_start(threaded_poll) < 0) { +@@ -184,8 +189,11 @@ void AvahiNetworkService::setup() { + } + + void AvahiNetworkService::clear() { +- /* Call this when the app shuts down */ +- avahi_threaded_poll_stop(threaded_poll); +- avahi_client_free(client); +- avahi_threaded_poll_free(threaded_poll); ++ /* Call this when the app shuts down */ ++ if(threaded_poll) ++ avahi_threaded_poll_stop(threaded_poll); ++ if(client) ++ avahi_client_free(client); ++ if(threaded_poll) ++ avahi_threaded_poll_free(threaded_poll); + } +-- +1.9.3 + diff --git a/SOURCES/0091-EMF-Integer-coordinate-values-are-signed.patch b/SOURCES/0091-EMF-Integer-coordinate-values-are-signed.patch deleted file mode 100644 index fd9f250..0000000 --- a/SOURCES/0091-EMF-Integer-coordinate-values-are-signed.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 215499e74fccb1809105d458b6076992be9d049c Mon Sep 17 00:00:00 2001 -From: Andrzej Hunt -Date: Thu, 26 Dec 2013 18:57:28 +0000 -Subject: [PATCH 091/109] EMF+: Integer coordinate values are signed. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Previously any coordinates with negative values would not be rendered -(as they would incorrectly appear to be outside the visible area). - -(cherry picked from commit d8dedc775cedf0e9daf9284bc7e3a0331ccd2963) - -Change-Id: I5babcec50d48dc2a6288a01685db61fbb7058680 -Reviewed-on: https://gerrit.libreoffice.org/7247 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - cppcanvas/source/mtfrenderer/emfplus.cxx | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx -index a11dc8b..01a77d6 100644 ---- a/cppcanvas/source/mtfrenderer/emfplus.cxx -+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx -@@ -169,8 +169,8 @@ namespace cppcanvas - { - for (int i = 0; i < nPoints; i ++) { - if (pathFlags & 0x4000) { -- // points are stored in short 16bit integer format -- sal_uInt16 x, y; -+ // points are stored in signed short 16bit integer format -+ sal_Int16 x, y; - - s >> x >> y; - SAL_INFO ("cppcanvas.emf", "EMF+\tpoint [x,y]: " << x << "," << y); --- -1.8.4.2 - diff --git a/SOURCES/0091-bnc-862510-PPTX-import-Properly-show-data-labels-in-.patch b/SOURCES/0091-bnc-862510-PPTX-import-Properly-show-data-labels-in-.patch new file mode 100644 index 0000000..800d6b1 --- /dev/null +++ b/SOURCES/0091-bnc-862510-PPTX-import-Properly-show-data-labels-in-.patch @@ -0,0 +1,40 @@ +From c76daf9b5f1efc44eaf6541314f122d641c791cc Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Mat=C3=BA=C5=A1=20Kukan?= +Date: Tue, 29 Jul 2014 07:53:22 +0200 +Subject: [PATCH 091/137] bnc#862510: PPTX import: Properly show data labels in + percent format. + +Usually, "General" is "0.00" number format, but in this case, when we +want to show percent value, MSO writes that instead of "0%". + +Change-Id: I748719765f58e66f9f3fb43c2b527c6823ef6fa1 +(cherry picked from commit 5f47e319428a703ea53ce49d166e7628aaa60789) +Reviewed-on: https://gerrit.libreoffice.org/10781 +Reviewed-by: Tor Lillqvist +Tested-by: Tor Lillqvist +--- + oox/source/drawingml/chart/objectformatter.cxx | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/oox/source/drawingml/chart/objectformatter.cxx b/oox/source/drawingml/chart/objectformatter.cxx +index b5b0a5b..8e91941 100644 +--- a/oox/source/drawingml/chart/objectformatter.cxx ++++ b/oox/source/drawingml/chart/objectformatter.cxx +@@ -1113,9 +1113,12 @@ void ObjectFormatter::convertNumberFormat( PropertySet& rPropSet, const NumberFo + sal_Int32 nPropId = bPercentFormat ? PROP_PercentageNumberFormat : PROP_NumberFormat; + try + { +- sal_Int32 nIndex = rNumberFormat.maFormatCode.equalsIgnoreAsciiCase("general") ? ++ bool bGeneral = rNumberFormat.maFormatCode.equalsIgnoreAsciiCase("general"); ++ sal_Int32 nIndex = bGeneral && !bPercentFormat ? + mxData->mxNumTypes->getStandardIndex( mxData->maFromLocale ) : +- mxData->mxNumFmts->addNewConverted( rNumberFormat.maFormatCode, mxData->maEnUsLocale, mxData->maFromLocale ); ++ mxData->mxNumFmts->addNewConverted( ++ bGeneral ? OUString("0%") : rNumberFormat.maFormatCode, ++ mxData->maEnUsLocale, mxData->maFromLocale ); + if( nIndex >= 0 ) + rPropSet.setProperty( nPropId, nIndex ); + } +-- +1.9.3 + diff --git a/SOURCES/0092-EMF-actually-use-lineJoin-attribute-for-polygons.patch b/SOURCES/0092-EMF-actually-use-lineJoin-attribute-for-polygons.patch deleted file mode 100644 index 440ff98..0000000 --- a/SOURCES/0092-EMF-actually-use-lineJoin-attribute-for-polygons.patch +++ /dev/null @@ -1,81 +0,0 @@ -From f5b984e416a05df220e339da2e9cda95ab660d85 Mon Sep 17 00:00:00 2001 -From: Andrzej Hunt -Date: Wed, 1 Jan 2014 17:36:54 +0000 -Subject: [PATCH 092/109] EMF+: actually use lineJoin attribute for polygons. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Change-Id: I5b369703333332598353d9817f0253bbe5fc3601 -(cherry picked from commit 9b1ceabd5f696500d4fe2acb89170bd987966a9b) -Reviewed-on: https://gerrit.libreoffice.org/7248 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - cppcanvas/source/mtfrenderer/emfplus.cxx | 28 ++++++++++++++++++---------- - 1 file changed, 18 insertions(+), 10 deletions(-) - -diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx -index 01a77d6..5eefdf6 100644 ---- a/cppcanvas/source/mtfrenderer/emfplus.cxx -+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx -@@ -620,6 +620,19 @@ namespace cppcanvas - return rendering::PathCapType::BUTT; - } - -+ sal_Int8 lcl_convertLineJoinType(sal_uInt32 nEmfLineJoin) -+ { -+ switch (nEmfLineJoin) -+ { -+ case EmfPlusLineJoinTypeMiter: // fall-through -+ case EmfPlusLineJoinTypeMiterClipped: return rendering::PathJoinType::MITER; -+ case EmfPlusLineJoinTypeBevel: return rendering::PathJoinType::BEVEL; -+ case EmfPlusLineJoinTypeRound: return rendering::PathJoinType::ROUND; -+ } -+ assert(false); // Line Join type isn't in specification. -+ return 0; -+ } -+ - struct EMFPCustomLineCap : public EMFPObject - { - sal_uInt32 type; -@@ -641,14 +654,7 @@ namespace cppcanvas - { - aAttributes.StartCapType = lcl_convertStrokeCap(strokeStartCap); - aAttributes.EndCapType = lcl_convertStrokeCap(strokeEndCap); -- -- switch (strokeJoin) -- { -- case EmfPlusLineJoinTypeMiter: // fall-through -- case EmfPlusLineJoinTypeMiterClipped: aAttributes.JoinType = rendering::PathJoinType::MITER; break; -- case EmfPlusLineJoinTypeBevel: aAttributes.JoinType = rendering::PathJoinType::BEVEL; break; -- case EmfPlusLineJoinTypeRound: aAttributes.JoinType = rendering::PathJoinType::ROUND; break; -- } -+ aAttributes.JoinType = lcl_convertLineJoinType(strokeJoin); - - aAttributes.MiterLimit = miterLimit; - } -@@ -786,8 +792,10 @@ namespace cppcanvas - rStrokeAttributes.StrokeWidth = fabs((rState.mapModeTransform * rR.MapSize (width == 0.0 ? 0.05 : width, 0)).getX()); - } - -- void SetStrokeDashing(rendering::StrokeAttributes& rStrokeAttributes) -+ void SetStrokeAttributes(rendering::StrokeAttributes& rStrokeAttributes) - { -+ rStrokeAttributes.JoinType = lcl_convertLineJoinType(lineJoin); -+ - if (dashStyle != EmfPlusLineStyleSolid) - { - const float dash[] = {3, 3}; -@@ -1393,7 +1401,7 @@ namespace cppcanvas - // but eg. dashing has to be additionally set only on the - // polygon - rendering::StrokeAttributes aPolygonAttributes(aCommonAttributes); -- pen->SetStrokeDashing(aPolygonAttributes); -+ pen->SetStrokeAttributes(aPolygonAttributes); - - basegfx::B2DPolyPolygon aFinalPolyPolygon; - --- -1.8.4.2 - diff --git a/SOURCES/0092-Fix-some-number-format-issues-bnc-862510.patch b/SOURCES/0092-Fix-some-number-format-issues-bnc-862510.patch new file mode 100644 index 0000000..92c6f2d --- /dev/null +++ b/SOURCES/0092-Fix-some-number-format-issues-bnc-862510.patch @@ -0,0 +1,69 @@ +From 2772bb0a1997c76be47d81d67678c907b28df650 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Mat=C3=BA=C5=A1=20Kukan?= +Date: Tue, 29 Jul 2014 21:10:22 +0200 +Subject: [PATCH 092/137] Fix some number format issues, bnc#862510 + +Set "LinkNumberFormatToSource" to false, so that format code is not +ignored. +Also, do not inherit format code common for all labels, if there is +specific format code for a data label. + +Change-Id: I505311d5df641d61e616e354734bd332609fa122 +(cherry picked from commit c8cc89ff802d86b1f3a69afe1b4835b7df7f70c7) +Reviewed-on: https://gerrit.libreoffice.org/10782 +Reviewed-by: Tor Lillqvist +Tested-by: Tor Lillqvist +--- + oox/source/drawingml/chart/modelbase.cxx | 3 +-- + oox/source/drawingml/chart/objectformatter.cxx | 4 +++- + oox/source/drawingml/chart/seriesconverter.cxx | 5 ++--- + 3 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/oox/source/drawingml/chart/modelbase.cxx b/oox/source/drawingml/chart/modelbase.cxx +index b349945..eadde2b 100644 +--- a/oox/source/drawingml/chart/modelbase.cxx ++++ b/oox/source/drawingml/chart/modelbase.cxx +@@ -34,8 +34,7 @@ NumberFormat::NumberFormat() : + void NumberFormat::setAttributes( const AttributeList& rAttribs ) + { + maFormatCode = rAttribs.getString( XML_formatCode, OUString() ); +- // default is 'false', not 'true' as specified +- mbSourceLinked = rAttribs.getBool( XML_sourceLinked, false ); ++ // TODO: if XML_sourceLinked is true, should be used instead. + } + + // ============================================================================ +diff --git a/oox/source/drawingml/chart/objectformatter.cxx b/oox/source/drawingml/chart/objectformatter.cxx +index 8e91941..a9911e7 100644 +--- a/oox/source/drawingml/chart/objectformatter.cxx ++++ b/oox/source/drawingml/chart/objectformatter.cxx +@@ -1128,7 +1128,9 @@ void ObjectFormatter::convertNumberFormat( PropertySet& rPropSet, const NumberFo + append( OUStringToOString( rNumberFormat.maFormatCode, osl_getThreadTextEncoding() ) ).append( '\'' ).getStr() ); + } + +- rPropSet.setProperty(PROP_LinkNumberFormatToSource, makeAny(rNumberFormat.mbSourceLinked)); ++ // Format code is ignored if "LinkNumberFormatToSource" is set to "true" :-/ ++ // See AxisHelper::getExplicitNumberFormatKeyForAxis() ++ rPropSet.setProperty(PROP_LinkNumberFormatToSource, makeAny(rNumberFormat.maFormatCode.isEmpty())); + } + } + +diff --git a/oox/source/drawingml/chart/seriesconverter.cxx b/oox/source/drawingml/chart/seriesconverter.cxx +index dbd3201..2cccd3a 100644 +--- a/oox/source/drawingml/chart/seriesconverter.cxx ++++ b/oox/source/drawingml/chart/seriesconverter.cxx +@@ -234,9 +234,8 @@ void DataLabelsConverter::convertFromModel( const Reference< XDataSeries >& rxDa + // data point label settings + for( DataLabelsModel::DataLabelVector::iterator aIt = mrModel.maPointLabels.begin(), aEnd = mrModel.maPointLabels.end(); aIt != aEnd; ++aIt ) + { +- (*aIt)->maNumberFormat.maFormatCode = mrModel.maNumberFormat.maFormatCode; +- if( !mrModel.maNumberFormat.maFormatCode.isEmpty() ) +- (*aIt)->maNumberFormat.mbSourceLinked = false; ++ if ((*aIt)->maNumberFormat.maFormatCode.isEmpty()) ++ (*aIt)->maNumberFormat = mrModel.maNumberFormat; + + DataLabelConverter aLabelConv( *this, **aIt ); + aLabelConv.convertFromModel( rxDataSeries, rTypeGroup ); +-- +1.9.3 + diff --git a/SOURCES/0093-EMF-mapping-can-rotate-the-width-vector-so-use-resul.patch b/SOURCES/0093-EMF-mapping-can-rotate-the-width-vector-so-use-resul.patch deleted file mode 100644 index aaa13f8..0000000 --- a/SOURCES/0093-EMF-mapping-can-rotate-the-width-vector-so-use-resul.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 2bbcd06df60f4e7ab76e908a1173eeb343b22868 Mon Sep 17 00:00:00 2001 -From: Andrzej Hunt -Date: Wed, 1 Jan 2014 17:07:56 +0000 -Subject: [PATCH 093/109] EMF+: mapping can rotate the width vector, so use - resulting length. -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Otherwise (i.e. with non-vertical lines) the width will be incorrect, -and can result in lines disappearing as the resulting X component -can be tiny/approaching zero. - -Change-Id: Icf3b7c10c627594600b517b8ff445f8df87c56f8 -(cherry picked from commit 83f2b3c590120a60b5e94fb1a15054ebe0745dbb) -Reviewed-on: https://gerrit.libreoffice.org/7249 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - cppcanvas/source/mtfrenderer/emfplus.cxx | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx -index 5eefdf6..7614bbb 100644 ---- a/cppcanvas/source/mtfrenderer/emfplus.cxx -+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx -@@ -789,7 +789,7 @@ namespace cppcanvas - SAL_INFO ("cppcanvas.emf", "TODO: pen with zero width - using minimal which might not be correct\n"); - } - #endif -- rStrokeAttributes.StrokeWidth = fabs((rState.mapModeTransform * rR.MapSize (width == 0.0 ? 0.05 : width, 0)).getX()); -+ rStrokeAttributes.StrokeWidth = fabs((rState.mapModeTransform * rR.MapSize (width == 0.0 ? 0.05 : width, 0)).getLength()); - } - - void SetStrokeAttributes(rendering::StrokeAttributes& rStrokeAttributes) --- -1.8.4.2 - diff --git a/SOURCES/0093-fdo-81995-fix-Outline-numbering-tab-page.patch b/SOURCES/0093-fdo-81995-fix-Outline-numbering-tab-page.patch new file mode 100644 index 0000000..e68ebe0 --- /dev/null +++ b/SOURCES/0093-fdo-81995-fix-Outline-numbering-tab-page.patch @@ -0,0 +1,34 @@ +From 48cbe9d301e3c7f94ca8cc682b5c67a4fe6f378c Mon Sep 17 00:00:00 2001 +From: Michael Stahl +Date: Mon, 11 Aug 2014 22:24:54 +0200 +Subject: [PATCH 093/137] fdo#81995: fix Outline numbering tab page + +The "ParentNumbering" property is not a string. + +(regression from 97eb8a6e0eb830f37dcba64a51d725aab4c5ff53) + +Change-Id: Ib33e95847b388bb1126a63812e128c96a0c00730 +(cherry picked from commit 4d3c9ed257e51af55f358d2b44d5fc2e341c7202) +Reviewed-on: https://gerrit.libreoffice.org/10875 +Reviewed-by: Eike Rathke +Tested-by: Eike Rathke +--- + i18npool/source/localedata/localedata.cxx | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/i18npool/source/localedata/localedata.cxx b/i18npool/source/localedata/localedata.cxx +index 5d70251..9aafd2b 100644 +--- a/i18npool/source/localedata/localedata.cxx ++++ b/i18npool/source/localedata/localedata.cxx +@@ -1589,7 +1589,7 @@ Any OutlineNumbering::getByIndex( sal_Int32 nIndex ) + pValues[4].Name = "BulletFontName"; + pValues[4].Value <<= OUString::createFromAscii(pTemp->sBulletFontName); + pValues[5].Name = "ParentNumbering"; +- pValues[5].Value <<= OUString::number(pTemp->nParentNumbering); ++ pValues[5].Value <<= pTemp->nParentNumbering; + pValues[6].Name = "LeftMargin"; + pValues[6].Value <<= pTemp->nLeftMargin; + pValues[7].Name = "SymbolTextDistance"; +-- +1.9.3 + diff --git a/SOURCES/0095-Resolves-fdo-72464-Character-line-break-is-set-to-0-.patch b/SOURCES/0095-Resolves-fdo-72464-Character-line-break-is-set-to-0-.patch deleted file mode 100644 index 2dcb139..0000000 --- a/SOURCES/0095-Resolves-fdo-72464-Character-line-break-is-set-to-0-.patch +++ /dev/null @@ -1,33 +0,0 @@ -From b8303a3e58f0b8d50574126998228d7d71c94728 Mon Sep 17 00:00:00 2001 -From: Julien Nabet -Date: Wed, 1 Jan 2014 21:39:13 +0100 -Subject: [PATCH 095/109] Resolves: fdo#72464 Character line break is set to 0 - Options/.../Writing Aids -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Change-Id: I9f3d1c64fde064fc7ba9bdfcb9e35032a0c40255 -Reviewed-on: https://gerrit.libreoffice.org/7253 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - linguistic/source/lngopt.hxx | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/linguistic/source/lngopt.hxx b/linguistic/source/lngopt.hxx -index c4bbc6c..c6d0bc6 100644 ---- a/linguistic/source/lngopt.hxx -+++ b/linguistic/source/lngopt.hxx -@@ -149,7 +149,7 @@ public: - virtual void SAL_CALL setIsSpellCapitalization(sal_Bool p1) throw (css::uno::RuntimeException) - { setProperty(UPN_IS_SPELL_CAPITALIZATION, p1); } - virtual sal_Int16 SAL_CALL getHyphMinLeading() throw (css::uno::RuntimeException) -- { return getPropertyBool(UPN_HYPH_MIN_LEADING); } -+ { return getPropertyInt16(UPN_HYPH_MIN_LEADING); } - virtual void SAL_CALL setHyphMinLeading(sal_Int16 p1) throw (css::uno::RuntimeException) - { setProperty(UPN_HYPH_MIN_LEADING, p1); } - virtual sal_Int16 SAL_CALL getHyphMinTrailing() throw (css::uno::RuntimeException) --- -1.8.4.2 - diff --git a/SOURCES/0095-bnc-887227-Do-not-set-TextAutoGrowHeight-for-vertica.patch b/SOURCES/0095-bnc-887227-Do-not-set-TextAutoGrowHeight-for-vertica.patch new file mode 100644 index 0000000..e8ba79d --- /dev/null +++ b/SOURCES/0095-bnc-887227-Do-not-set-TextAutoGrowHeight-for-vertica.patch @@ -0,0 +1,39 @@ +From ca51beb73336b3a19364df02aab82d56a2a63e74 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Mat=C3=BA=C5=A1=20Kukan?= +Date: Thu, 24 Jul 2014 20:03:43 +0200 +Subject: [PATCH 095/137] bnc#887227: Do not set TextAutoGrowHeight for + vertical text. + +It's horribly broken and it would resize text box +horizontally which is not supposed to happen. + +(cherry picked from commit d068f13596f6d1023a70d98ec2059d38ad6fd777) + +Change-Id: I201ec8dbcddca56d21bf46ea8ee838d01923c442 +Reviewed-on: https://gerrit.libreoffice.org/10585 +Reviewed-by: David Tardon +Tested-by: David Tardon +--- + oox/source/drawingml/textbodypropertiescontext.cxx | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/oox/source/drawingml/textbodypropertiescontext.cxx b/oox/source/drawingml/textbodypropertiescontext.cxx +index b580be3..166ecd0 100644 +--- a/oox/source/drawingml/textbodypropertiescontext.cxx ++++ b/oox/source/drawingml/textbodypropertiescontext.cxx +@@ -132,7 +132,11 @@ ContextHandlerRef TextBodyPropertiesContext::onCreateContext( sal_Int32 aElement + mrTextBodyProp.maPropertyMap[ PROP_TextAutoGrowHeight ] <<= false; + break; + case A_TOKEN( spAutoFit ): +- mrTextBodyProp.maPropertyMap[ PROP_TextAutoGrowHeight ] <<= true; ++ { ++ const sal_Int32 tVert = mrTextBodyProp.moVert.get( XML_horz ); ++ if( tVert != XML_vert && tVert != XML_eaVert && tVert != XML_vert270 && tVert != XML_mongolianVert ) ++ mrTextBodyProp.maPropertyMap[ PROP_TextAutoGrowHeight ] <<= true; ++ } + break; + + case A_TOKEN( scene3d ): // CT_Scene3D +-- +1.9.3 + diff --git a/SOURCES/0096-Make-CalcFocusRect-look-right.patch b/SOURCES/0096-Make-CalcFocusRect-look-right.patch deleted file mode 100644 index 3102121..0000000 --- a/SOURCES/0096-Make-CalcFocusRect-look-right.patch +++ /dev/null @@ -1,55 +0,0 @@ -From bfb51322f2bee76d7e70588050c38655a432aef0 Mon Sep 17 00:00:00 2001 -From: Stephan Bergmann -Date: Wed, 9 Oct 2013 12:06:41 +0200 -Subject: [PATCH 096/109] Make CalcFocusRect look right - -...at least for its (only, it appears) uses at the left of the "Insert - -Hyperlink" dialog and at the left of a Database window. As aBmpRect and -aTextRect never extend aBoundRect (and aTextRect always leaving a gap left and -right towards aBoundRect, it appears, with the text abbreviated with an ellipsis -if it would be too wide), there should be no need to eventually adjust "the -focus rectangle [to] not touch the text," and for calculating the top of the -focus rect aBoundRect can be used just as well as aBmpRect. (Though for -calculating the bottom, aBoundRect apparently stretches "too far" compareed to -aTextRect; whatever... The offsets look somewhat "magic" anyway, but appear to -produce the desired visual results.) - -Change-Id: Ic324561294fb6172c0d02a697fc261717e01c87c -Reviewed-on: https://gerrit.libreoffice.org/6165 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke -(cherry picked from commit 143bb92761f54cb7b8e41e5ac83bd274d4f7079b) -Signed-off-by: Eike Rathke ---- - svtools/source/contnr/imivctl1.cxx | 13 +++---------- - 1 file changed, 3 insertions(+), 10 deletions(-) - -diff --git a/svtools/source/contnr/imivctl1.cxx b/svtools/source/contnr/imivctl1.cxx -index 01f733d..b0ea082 100644 ---- a/svtools/source/contnr/imivctl1.cxx -+++ b/svtools/source/contnr/imivctl1.cxx -@@ -2703,18 +2703,11 @@ const Size& SvxIconChoiceCtrl_Impl::GetItemSize( SvxIconChoiceCtrlEntry*, - - Rectangle SvxIconChoiceCtrl_Impl::CalcFocusRect( SvxIconChoiceCtrlEntry* pEntry ) - { -- Rectangle aBmpRect( CalcBmpRect( pEntry ) ); - Rectangle aTextRect( CalcTextRect( pEntry ) ); - Rectangle aBoundRect( GetEntryBoundRect( pEntry ) ); -- Rectangle aFocusRect( aBoundRect.Left(), aBmpRect.Top() - 1, -- aBoundRect.Right() - 4, aTextRect.Bottom() + 1 ); -- // the focus rectangle should not touch the text -- if( aFocusRect.Left() > ::std::numeric_limits::min() && aFocusRect.Left() - 1 >= pEntry->aRect.Left() ) -- aFocusRect.Left()--; -- if( aFocusRect.Right() < ::std::numeric_limits::max() && aFocusRect.Right() + 1 <= pEntry->aRect.Right() ) -- aFocusRect.Right()++; -- -- return aFocusRect; -+ return Rectangle( -+ aBoundRect.Left(), aBoundRect.Top() - 1, aBoundRect.Right() - 1, -+ aTextRect.Bottom() + 1); - } - - // the hot spot is the inner 50 % of the rectangle --- -1.8.4.2 - diff --git a/SOURCES/0097-die-binfilter-die-die-die.patch b/SOURCES/0097-die-binfilter-die-die-die.patch deleted file mode 100644 index e7833b5..0000000 --- a/SOURCES/0097-die-binfilter-die-die-die.patch +++ /dev/null @@ -1,114 +0,0 @@ -From 29439609d6023c8c7e14cafa5171b2bedc600ab4 Mon Sep 17 00:00:00 2001 -From: Eike Rathke -Date: Fri, 3 Jan 2014 00:34:06 +0100 -Subject: [PATCH 097/109] die binfilter die die die - -Euro Converter tried to obtain filters for names of binary filters that -don't exist anymore and can't be resolved hence the TypeDetection -GetByName() bailed out with an exception when calling the file picker -(e.g. when attempting to select a document), stopping in Basic -environment and effectively rendering the wizard useless. - -Change-Id: Ifdef6f59abdc16bedd0f54ec317dc44af8f1e628 -(cherry picked from commit e625d00439f725b01f3818859e95e431e6173d57) -Reviewed-on: https://gerrit.libreoffice.org/7264 -Reviewed-by: Andras Timar -Tested-by: Andras Timar ---- - wizards/source/euro/AutoPilotRun.xba | 60 +++++++++++++----------------------- - 1 file changed, 22 insertions(+), 38 deletions(-) - -diff --git a/wizards/source/euro/AutoPilotRun.xba b/wizards/source/euro/AutoPilotRun.xba -index 47d7959..fe2bed7 100644 ---- a/wizards/source/euro/AutoPilotRun.xba -+++ b/wizards/source/euro/AutoPilotRun.xba -@@ -28,7 +28,7 @@ Public Source as String - Public SubstFile as String - Public SubstDir as String - Public NoArgs() --Public TypeList(14) as String -+Public TypeList(6) as String - Public GoOn as Boolean - Public DoUnprotect as Integer - Public Password as String -@@ -74,21 +74,13 @@ Dim bDisposable as Boolean - TargetStemDir = TargetDir - TypeList(0) = "calc8" - TypeList(1) = "calc_StarOffice_XML_Calc" -- TypeList(2) = "calc_StarCalc_30" -- TypeList(3) = "calc_StarCalc_40" -- TypeList(4) = "calc_StarCalc_50" - If DialogModel.chkTextDocuments.State = 1 Then -- ReDim Preserve TypeList(13) as String -- -- TypeList(5) = "writer8" -- TypeList(6) = "writerglobal8" -- TypeList(7) = "writer_StarOffice_XML_Writer" -- TypeList(8) = "writer_globaldocument_StarOffice_XML_Writer_GlobalDocument" -- TypeList(9) = "writer_StarWriter_30" -- TypeList(10) = "writer_StarWriter_40" -- TypeList(11) = "writer_globaldocument_StarWriter_40GlobalDocument" -- TypeList(12) = "writer_StarWriter_50" -- TypeList(13) = "writer_globaldocument_StarWriter_50GlobalDocument" -+ ReDim Preserve TypeList(5) as String -+ -+ TypeList(2) = "writer8" -+ TypeList(3) = "writerglobal8" -+ TypeList(4) = "writer_StarOffice_XML_Writer" -+ TypeList(5) = "writer_globaldocument_StarOffice_XML_Writer_GlobalDocument" - End If - FilesList() = ReadDirectories(SourceDir, bRecursive, True, False, TypeList()) - TotDocCount = Ubound(FilesList(),1) + 1 -@@ -387,34 +379,26 @@ Sub CallFilePicker() - oTypes() = oMasterKey.Types - oUIKey = GetRegistryKeyContent("org.openoffice.Office.UI/FilterClassification/LocalFilters") - If DialogModel.chkTextDocuments.State = 1 Then -- Dim FilterNames(11,1) as String -- FilterNames(6,0) = oTypes.GetByName("writer_StarOffice_XML_Writer").UIName -- FilterNames(6,1) = "*.sxw" -- FilterNames(7,0) = oTypes.GetByName("writer_StarOffice_XML_Writer_Template").UIName -- FilterNames(7,1) = "*.stw" -- FilterNames(8,0) = oUIKey.Classes.GetByName("sw3to5").DisplayName -- FilterNames(8,1) = "*.sdw" -- FilterNames(9,0) = oUIKey.Classes.GetByName("sw3to5templ").DisplayName -- Filternames(9,1) = "*.vor" -- FilterNames(10,0) = oTypes.GetByName("writer8").UIName -- FilterNames(10,1) = "*.odt" -- FilterNames(11,0) = oTypes.GetByName("writer8_template").UIName -- FilterNames(11,1) = "*.ott" -+ Dim FilterNames(7,1) as String -+ FilterNames(4,0) = oTypes.GetByName("writer_StarOffice_XML_Writer").UIName -+ FilterNames(4,1) = "*.sxw" -+ FilterNames(5,0) = oTypes.GetByName("writer_StarOffice_XML_Writer_Template").UIName -+ FilterNames(5,1) = "*.stw" -+ FilterNames(6,0) = oTypes.GetByName("writer8").UIName -+ FilterNames(6,1) = "*.odt" -+ FilterNames(7,0) = oTypes.GetByName("writer8_template").UIName -+ FilterNames(7,1) = "*.ott" - Else -- ReDim FilterNames(5,1) as String -+ ReDim FilterNames(3,1) as String - End If -- FilterNames(0,0) = oTypes.GetByName("calc_StarOffice_XML_Calc").UIName -+ FilterNames(0,0) = oTypes.GetByName("calc_StarOffice_XML_Calc").UIName - Filternames(0,1) = "*.sxc" - FilterNames(1,0) = oTypes.GetByName("calc_StarOffice_XML_Calc_Template").UIName - Filternames(1,1) = "*.stc" -- FilterNames(2,0) = oUIKey.Classes.GetByName("sc345").DisplayName -- FilterNames(2,1) = "*.sdc" -- FilterNames(3,0) = oUIKey.Classes.GetByName("sc345templ").DisplayName -- Filternames(3,1) = "*.vor" -- FilterNames(4,0) = oTypes.GetByName("calc8").UIName -- Filternames(4,1) = "*.ods" -- FilterNames(5,0) = oTypes.GetByName("calc8_template").UIName -- Filternames(5,1) = "*.ots" -+ FilterNames(2,0) = oTypes.GetByName("calc8").UIName -+ Filternames(2,1) = "*.ods" -+ FilterNames(3,0) = oTypes.GetByName("calc8_template").UIName -+ Filternames(3,1) = "*.ots" - GetFileName(DialogModel.txtSource, Filternames()) - Else - GetFolderName(DialogModel.txtSource) --- -1.8.4.2 - diff --git a/SOURCES/0097-fdo-80501-Ensure-that-we-notify-each-listener-only-o.patch b/SOURCES/0097-fdo-80501-Ensure-that-we-notify-each-listener-only-o.patch new file mode 100644 index 0000000..2903b81 --- /dev/null +++ b/SOURCES/0097-fdo-80501-Ensure-that-we-notify-each-listener-only-o.patch @@ -0,0 +1,206 @@ +From 5f9e7ee1cc330f3b08596db0d13ad01e4dea7880 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Wed, 30 Jul 2014 11:02:31 -0400 +Subject: [PATCH 097/137] fdo#80501: Ensure that we notify each listener only + once. + +Change-Id: If2ce4643ff58c7c2ba326d749698dd5196a108dc +(cherry picked from commit b2ee0235e88dc4da715b5766295ed88f27974fbd) +Reviewed-on: https://gerrit.libreoffice.org/10647 +Reviewed-by: Eike Rathke +Tested-by: Eike Rathke +--- + sc/inc/column.hxx | 1 - + sc/inc/table.hxx | 5 +---- + sc/source/core/data/column.cxx | 27 --------------------------- + sc/source/core/data/column4.cxx | 3 +++ + sc/source/core/data/documen7.cxx | 40 ++++++++++++++++++++++++++++++++++++++-- + sc/source/core/data/table2.cxx | 7 ------- + sc/source/core/data/table7.cxx | 10 ++++++++++ + 7 files changed, 52 insertions(+), 41 deletions(-) + +diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx +index 8962422..66cd524 100644 +--- a/sc/inc/column.hxx ++++ b/sc/inc/column.hxx +@@ -478,7 +478,6 @@ public: + void StartNeededListeners(); // only for cells where NeedsListening()==true + void SetDirtyIfPostponed(); + void BroadcastRecalcOnRefMove(); +- void BroadcastRefMoved( const sc::RefMovedHint& rHint ); + void TransferListeners( ScColumn& rDestCol, SCROW nRow1, SCROW nRow2, SCROW nRowDelta ); + void CollectListeners( std::vector& rListeners, SCROW nRow1, SCROW nRow2 ); + +diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx +index 9d36a1e..191a360 100644 +--- a/sc/inc/table.hxx ++++ b/sc/inc/table.hxx +@@ -927,10 +927,7 @@ public: + */ + void BroadcastRecalcOnRefMove(); + +- /** +- * Broadcast all listeners of specified range that the range have moved. +- */ +- void BroadcastRefMoved( const sc::RefMovedHint& rHint ); ++ void CollectListeners( std::vector& rListeners, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ); + + void TransferListeners( + ScTable& rDestTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, +diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx +index 2d0a018..10da725 100644 +--- a/sc/source/core/data/column.cxx ++++ b/sc/source/core/data/column.cxx +@@ -3119,33 +3119,6 @@ void ScColumn::BroadcastRecalcOnRefMove() + + namespace { + +-class BroadcastRefMovedHandler +-{ +- const sc::RefMovedHint& mrHint; +-public: +- BroadcastRefMovedHandler( const sc::RefMovedHint& rHint ) : mrHint(rHint) {} +- +- void operator() ( size_t, SvtBroadcaster* p ) +- { +- p->Broadcast(mrHint); +- } +-}; +- +-} +- +-void ScColumn::BroadcastRefMoved( const sc::RefMovedHint& rHint ) +-{ +- const ScRange& rRange = rHint.getRange(); +- SCROW nRow1 = rRange.aStart.Row(); +- SCROW nRow2 = rRange.aEnd.Row(); +- +- // Notify all listeners within specified rows. +- BroadcastRefMovedHandler aFunc(rHint); +- sc::ProcessBroadcaster(maBroadcasters.begin(), maBroadcasters, nRow1, nRow2, aFunc); +-} +- +-namespace { +- + class TransferListenersHandler + { + public: +diff --git a/sc/source/core/data/column4.cxx b/sc/source/core/data/column4.cxx +index bf3b817..d1aacdd 100644 +--- a/sc/source/core/data/column4.cxx ++++ b/sc/source/core/data/column4.cxx +@@ -533,6 +533,9 @@ public: + + void ScColumn::CollectListeners( std::vector& rListeners, SCROW nRow1, SCROW nRow2 ) + { ++ if (nRow2 < nRow1 || !ValidRow(nRow1) || !ValidRow(nRow2)) ++ return; ++ + ListenerCollector aFunc(rListeners); + sc::ProcessBroadcaster(maBroadcasters.begin(), maBroadcasters, nRow1, nRow2, aFunc); + } +diff --git a/sc/source/core/data/documen7.cxx b/sc/source/core/data/documen7.cxx +index 02a75fb..a960c5a 100644 +--- a/sc/source/core/data/documen7.cxx ++++ b/sc/source/core/data/documen7.cxx +@@ -130,6 +130,22 @@ void ScDocument::BroadcastCells( const ScRange& rRange, sal_uLong nHint ) + BroadcastUno(SfxSimpleHint(SC_HINT_DATACHANGED)); + } + ++namespace { ++ ++class RefMovedNotifier : std::unary_function ++{ ++ const sc::RefMovedHint& mrHint; ++public: ++ RefMovedNotifier( const sc::RefMovedHint& rHint ) : mrHint(rHint) {} ++ ++ void operator() ( SvtListener* p ) ++ { ++ p->Notify(mrHint); ++ } ++}; ++ ++} ++ + void ScDocument::BroadcastRefMoved( const sc::RefMovedHint& rHint ) + { + if (!pBASM) +@@ -150,6 +166,28 @@ void ScDocument::BroadcastRefMoved( const sc::RefMovedHint& rHint ) + } + } + ++ // Collect all listeners listening into the range. ++ std::vector aListeners; ++ for (SCTAB nTab = rSrcRange.aStart.Tab(); nTab <= rSrcRange.aEnd.Tab(); ++nTab) ++ { ++ ScTable* pTab = FetchTable(nTab); ++ if (!pTab) ++ continue; ++ ++ pTab->CollectListeners( ++ aListeners, ++ rSrcRange.aStart.Col(), rSrcRange.aStart.Row(), ++ rSrcRange.aEnd.Col(), rSrcRange.aEnd.Row()); ++ } ++ ++ // Remove any duplicate listener entries. We must ensure that we notify ++ // each unique listener only once. ++ std::sort(aListeners.begin(), aListeners.end()); ++ aListeners.erase(std::unique(aListeners.begin(), aListeners.end()), aListeners.end()); ++ ++ // Notify the listeners. ++ std::for_each(aListeners.begin(), aListeners.end(), RefMovedNotifier(rHint)); ++ + for (SCTAB nTab = rSrcRange.aStart.Tab(); nTab <= rSrcRange.aEnd.Tab(); ++nTab) + { + ScTable* pTab = FetchTable(nTab); +@@ -161,8 +199,6 @@ void ScDocument::BroadcastRefMoved( const sc::RefMovedHint& rHint ) + if (!pDestTab) + continue; + +- // Adjust the references. +- pTab->BroadcastRefMoved(rHint); + // Move the listeners from the old location to the new. + pTab->TransferListeners( + *pDestTab, rSrcRange.aStart.Col(), rSrcRange.aStart.Row(), +diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx +index 3f0d190..1a37801 100644 +--- a/sc/source/core/data/table2.cxx ++++ b/sc/source/core/data/table2.cxx +@@ -1739,13 +1739,6 @@ void ScTable::BroadcastRecalcOnRefMove() + aCol[i].BroadcastRecalcOnRefMove(); + } + +-void ScTable::BroadcastRefMoved( const sc::RefMovedHint& rHint ) +-{ +- const ScRange& rRange = rHint.getRange(); +- for (SCCOL nCol = rRange.aStart.Col(); nCol <= rRange.aEnd.Col(); ++nCol) +- aCol[nCol].BroadcastRefMoved(rHint); +-} +- + void ScTable::TransferListeners( + ScTable& rDestTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, + SCCOL nColDelta, SCROW nRowDelta ) +diff --git a/sc/source/core/data/table7.cxx b/sc/source/core/data/table7.cxx +index 1ede729..ff976a2 100644 +--- a/sc/source/core/data/table7.cxx ++++ b/sc/source/core/data/table7.cxx +@@ -110,4 +110,14 @@ void ScTable::RegroupFormulaCells( SCCOL nCol ) + aCol[nCol].RegroupFormulaCells(); + } + ++void ScTable::CollectListeners( ++ std::vector& rListeners, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 ) ++{ ++ if (nCol2 < nCol1 || !ValidCol(nCol1) || !ValidCol(nCol2)) ++ return; ++ ++ for (SCCOL nCol = nCol1; nCol <= nCol2; ++nCol) ++ aCol[nCol].CollectListeners(rListeners, nRow1, nRow2); ++} ++ + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ +-- +1.9.3 + diff --git a/SOURCES/0098-bnc-822170-Let-s-not-even-try-to-export-invalid-char.patch b/SOURCES/0098-bnc-822170-Let-s-not-even-try-to-export-invalid-char.patch new file mode 100644 index 0000000..e2a2bdb --- /dev/null +++ b/SOURCES/0098-bnc-822170-Let-s-not-even-try-to-export-invalid-char.patch @@ -0,0 +1,168 @@ +From f1d36a5eaaff6404fee0865947040e92026c7996 Mon Sep 17 00:00:00 2001 +From: Kohei Yoshida +Date: Tue, 12 Aug 2014 21:24:17 -0400 +Subject: [PATCH 098/137] bnc#822170: Let's not even try to export invalid + chart objects. + +If we do, at best, Excel will complain about the document needing +repair. At worst Excel will skip some of the other valid drawing +objects from being loaded. + +(cherry picked from commit 692878e3bb83c0fc104c5cca946c25ccf2d84ab2) + +Conflicts: + sc/source/filter/xcl97/xcl97rec.cxx + sc/source/filter/excel/xeescher.cxx + +Change-Id: If3794d0ae9d8b44b124020bb12b5369dfebc95ae +Reviewed-on: https://gerrit.libreoffice.org/10900 +Reviewed-by: Eike Rathke +Tested-by: Eike Rathke +--- + sc/source/filter/excel/xeescher.cxx | 5 ++- + sc/source/filter/inc/xeescher.hxx | 2 ++ + sc/source/filter/xcl97/xcl97rec.cxx | 68 ++++++++++++++++++++++++++++++++----- + 3 files changed, 65 insertions(+), 10 deletions(-) + +diff --git a/sc/source/filter/excel/xeescher.cxx b/sc/source/filter/excel/xeescher.cxx +index 241182c..bb3a2a5 100644 +--- a/sc/source/filter/excel/xeescher.cxx ++++ b/sc/source/filter/excel/xeescher.cxx +@@ -1207,7 +1207,10 @@ void XclExpChartObj::WriteShapeTransformation( sax_fastparser::FSHelperPtr pFS, + pFS->endElementNS( XML_xdr, XML_xfrm ); + } + +-// ============================================================================ ++const css::uno::Reference& XclExpChartObj::GetChartDoc() const ++{ ++ return mxChartDoc; ++} + + XclExpNote::XclExpNote( const XclExpRoot& rRoot, const ScAddress& rScPos, + const ScPostIt* pScNote, const OUString& rAddText ) : +diff --git a/sc/source/filter/inc/xeescher.hxx b/sc/source/filter/inc/xeescher.hxx +index 4d7be77..cce4c66 100644 +--- a/sc/source/filter/inc/xeescher.hxx ++++ b/sc/source/filter/inc/xeescher.hxx +@@ -324,6 +324,8 @@ public: + virtual void WriteChartObj( sax_fastparser::FSHelperPtr pDrawing, XclExpXmlStream& rStrm ); + void WriteShapeTransformation( sax_fastparser::FSHelperPtr pFS, const XShapeRef& rXShape, sal_Bool bFlipH = false, sal_Bool bFlipV = false, sal_Int32 nRotation = 0 ); + ++ const css::uno::Reference& GetChartDoc() const; ++ + private: + typedef boost::shared_ptr< XclExpChart > XclExpChartRef; + XclExpChartRef mxChart; /// The chart itself (BOF/EOF substream data). +diff --git a/sc/source/filter/xcl97/xcl97rec.cxx b/sc/source/filter/xcl97/xcl97rec.cxx +index d61383a..24624cb 100644 +--- a/sc/source/filter/xcl97/xcl97rec.cxx ++++ b/sc/source/filter/xcl97/xcl97rec.cxx +@@ -71,6 +71,8 @@ + #include + #include + #include ++#include ++#include + #include + #include + #include +@@ -162,6 +164,8 @@ void XclExpObjList::Save( XclExpStream& rStrm ) + pSolverContainer->Save( rStrm ); + } + ++namespace { ++ + static bool IsVmlObject( const XclObj *rObj ) + { + switch( rObj->GetObjType() ) +@@ -186,11 +190,61 @@ static sal_Int32 GetVmlObjectCount( XclExpObjList& rList ) + return nNumVml; + } + ++bool IsValidObject( const XclObj& rObj ) ++{ ++ if (rObj.GetObjType() == EXC_OBJTYPE_CHART) ++ { ++ // Chart object. Make sure it's a valid chart object. We skip ++ // invalid chart objects from exporting to prevent Excel from ++ // complaining on load. ++ ++ const XclExpChartObj& rChartObj = static_cast(rObj); ++ uno::Reference xChartDoc(rChartObj.GetChartDoc(), uno::UNO_QUERY); ++ if (!xChartDoc.is()) ++ return false; ++ ++ uno::Reference xDiagram = xChartDoc->getFirstDiagram(); ++ if (!xDiagram.is()) ++ return false; ++ ++ uno::Reference xCooSysContainer(xDiagram, uno::UNO_QUERY); ++ if (!xCooSysContainer.is()) ++ return false; ++ ++ uno::Sequence > xCooSysSeq = xCooSysContainer->getCoordinateSystems(); ++ if (!xCooSysSeq.getLength()) ++ return false; ++ ++ for (sal_Int32 nCooSys = 0; nCooSys < xCooSysSeq.getLength(); ++nCooSys) ++ { ++ Reference xChartTypeCont(xCooSysSeq[nCooSys], uno::UNO_QUERY); ++ if (!xChartTypeCont.is()) ++ return false; ++ ++ uno::Sequence > xChartTypeSeq = xChartTypeCont->getChartTypes(); ++ if (!xChartTypeSeq.getLength()) ++ // No chart type. Not good. ++ return false; ++ } ++ } ++ ++ return true; ++} + + static void SaveDrawingMLObjects( XclExpObjList& rList, XclExpXmlStream& rStrm, sal_Int32& nDrawingMLCount ) + { +- sal_Int32 nVmlObjects = GetVmlObjectCount( rList ); +- if( (rList.size() - nVmlObjects) == 0 ) ++ std::vector aList; ++ aList.reserve(rList.size()); ++ std::vector::iterator it = rList.begin(), itEnd = rList.end(); ++ for (; it != itEnd; ++it) ++ { ++ if (IsVmlObject(*it) || !IsValidObject(**it)) ++ continue; ++ ++ aList.push_back(*it); ++ } ++ ++ if (aList.empty()) + return; + + sal_Int32 nDrawing = ++nDrawingMLCount; +@@ -214,13 +268,8 @@ static void SaveDrawingMLObjects( XclExpObjList& rList, XclExpXmlStream& rStrm, + FSNS( XML_xmlns, XML_r ), "http://schemas.openxmlformats.org/officeDocument/2006/relationships", + FSEND ); + +- std::vector::iterator pIter; +- for ( pIter = rList.begin(); pIter != rList.end(); ++pIter ) +- { +- if( IsVmlObject( *pIter ) ) +- continue; +- (*pIter)->SaveXml( rStrm ); +- } ++ for (it = aList.begin(), itEnd = aList.end(); it != itEnd; ++it) ++ (*it)->SaveXml(rStrm); + + pDrawing->endElement( FSNS( XML_xdr, XML_wsDr ) ); + +@@ -267,6 +316,7 @@ static void SaveVmlObjects( XclExpObjList& rList, XclExpXmlStream& rStrm, sal_In + rStrm.PopStream(); + } + ++} + + void XclExpObjList::SaveXml( XclExpXmlStream& rStrm ) + { +-- +1.9.3 + diff --git a/SOURCES/0099-added-EEK-and-LVL-to-EUROCONVERT-EUR-to-LV-locale-da.patch b/SOURCES/0099-added-EEK-and-LVL-to-EUROCONVERT-EUR-to-LV-locale-da.patch deleted file mode 100644 index 9a6551f..0000000 --- a/SOURCES/0099-added-EEK-and-LVL-to-EUROCONVERT-EUR-to-LV-locale-da.patch +++ /dev/null @@ -1,108 +0,0 @@ -From 9ac100fc1eaea06ebd80c4009ac7ebc3aee6fd50 Mon Sep 17 00:00:00 2001 -From: Eike Rathke -Date: Thu, 2 Jan 2014 21:53:36 +0100 -Subject: [PATCH 099/109] added "EEK" and "LVL" to EUROCONVERT(), "EUR" to - [*-LV] locale data fdo#73239 -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -This is a combination of 3 commits. - -added Estonian "EEK" to EUROCONVERT(), fdo#73239 - -(cherry picked from commit 127f863c727c07f1da40005fe638d97e89baaccf) - -Conflicts: - sc/source/core/tool/interpr2.cxx - -added EUR as default currency to Latvia [*-LV] locale data, fdo#73239 - -(cherry picked from commit c32996987354d045523beaa98b5d227d161f72fb) - -added Latvian "LVL" to EUROCONVERT(), fdo#73239 - -(cherry picked from commit cc1b6535e01db62688a7bee50852d33e4ee50761) - -Change-Id: I82085b6661c954b2afbf22b8b8ed5bd8c48cc50e -Reviewed-on: https://gerrit.libreoffice.org/7263 -Reviewed-by: Caolán McNamara -Tested-by: Caolán McNamara ---- - i18npool/source/localedata/data/ltg_LV.xml | 9 ++++++++- - i18npool/source/localedata/data/lv_LV.xml | 9 ++++++++- - sc/source/core/tool/interpr2.cxx | 11 ++++++++--- - 3 files changed, 24 insertions(+), 5 deletions(-) - -diff --git a/i18npool/source/localedata/data/ltg_LV.xml b/i18npool/source/localedata/data/ltg_LV.xml -index 12fe4b0..6765077 100644 ---- a/i18npool/source/localedata/data/ltg_LV.xml -+++ b/i18npool/source/localedata/data/ltg_LV.xml -@@ -331,7 +331,14 @@ - - - -- -+ -+ EUR -+ -+ EUR -+ Euro -+ 2 -+ -+ - LVL - Ls - LVL -diff --git a/i18npool/source/localedata/data/lv_LV.xml b/i18npool/source/localedata/data/lv_LV.xml -index 456214d..68483e5 100644 ---- a/i18npool/source/localedata/data/lv_LV.xml -+++ b/i18npool/source/localedata/data/lv_LV.xml -@@ -331,7 +331,14 @@ - - - -- -+ -+ EUR -+ -+ EUR -+ Euro -+ 2 -+ -+ - LVL - Ls - LVL -diff --git a/sc/source/core/tool/interpr2.cxx b/sc/source/core/tool/interpr2.cxx -index a0f270d..14bba4f 100644 ---- a/sc/source/core/tool/interpr2.cxx -+++ b/sc/source/core/tool/interpr2.cxx -@@ -2625,8 +2625,11 @@ void ScInterpreter::ScHyperLink() - } - } - -- --bool lclConvertMoney( const String& aSearchUnit, double& rfRate, int& rnDec ) -+/** Resources at the website of the European Commission: -+ http://ec.europa.eu/economy_finance/euro/adoption/conversion/ -+ http://ec.europa.eu/economy_finance/euro/countries/ -+ */ -+static bool lclConvertMoney( const String& aSearchUnit, double& rfRate, int& rnDec ) - { - struct ConvertInfo - { -@@ -2651,7 +2654,9 @@ bool lclConvertMoney( const String& aSearchUnit, double& rfRate, int& rnDec ) - { "SIT", 239.640, 2 }, - { "MTL", 0.429300, 2 }, - { "CYP", 0.585274, 2 }, -- { "SKK", 30.1260, 2 } -+ { "SKK", 30.1260, 2 }, -+ { "EEK", 15.6466, 2 }, -+ { "LVL", 0.702804, 2 } - }; - - const size_t nConversionCount = sizeof( aConvertTable ) / sizeof( aConvertTable[0] ); --- -1.8.4.2 - diff --git a/SOURCES/0099-valgrind-bff-don-t-add-0xffff-oldcode.patch b/SOURCES/0099-valgrind-bff-don-t-add-0xffff-oldcode.patch new file mode 100644 index 0000000..665a447 --- /dev/null +++ b/SOURCES/0099-valgrind-bff-don-t-add-0xffff-oldcode.patch @@ -0,0 +1,826 @@ +From 902436078cb8df65d06617d5980cd8834ec8f8c9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +Date: Wed, 13 Aug 2014 09:12:26 +0100 +Subject: [PATCH 099/137] valgrind + bff: don't add 0xffff oldcode + +Invalid read of size 1 + at 0x9DC6247: GIFLZWDecompressor::AddToTable(unsigned short, unsigned short) (decode.cxx:117) + +Change-Id: I9cea8dcd4a5eeaa1e793b9be96f82854b9d088af +Reviewed-on: https://gerrit.libreoffice.org/10906 +Reviewed-by: David Tardon +Tested-by: David Tardon +--- + ...3e0068c9b19bb548826bed0599f65745-15940-minimized.gif | Bin 0 -> 47778 bytes + vcl/source/filter/igif/decode.cxx | 11 +++++++---- + 2 files changed, 7 insertions(+), 4 deletions(-) + create mode 100644 vcl/qa/cppunit/graphicfilter/data/gif/pass/sf_3e0068c9b19bb548826bed0599f65745-15940-minimized.gif + +diff --git a/vcl/qa/cppunit/graphicfilter/data/gif/pass/sf_3e0068c9b19bb548826bed0599f65745-15940-minimized.gif b/vcl/qa/cppunit/graphicfilter/data/gif/pass/sf_3e0068c9b19bb548826bed0599f65745-15940-minimized.gif +new file mode 100644 +index 0000000000000000000000000000000000000000..47f5d4341ba6f04e499c2031df0faeb6fb57ec46 +GIT binary patch +literal 47778 +zcmd43cU05q_b!@*kPyHadguu)^j;EbLa(9sV(1;|T_A-qos>#x_Jg@6C!yp4^GzrTM{Qc`$$_|()CD4q%Y6Y$@#fANuRygaQ) +zZZ^7_+FW4PkG?{=KY@`Tb>Mpt5%>Z@|8hI$FmVbWAAI7kZ5${fJisn)(#mOpU+SXc +zse2AJuf0kCS;QoJ8E1HuHZu*f1;VQQ`-bN=Qp=_Laj#+JAWyELu;Uorjy)rf-SZ!O +zi6UQKeEemh;4d}%xB0n3)Vu;n5hGZTON~+VzQmd~_kEfg2FZ_LBDVC2?w +z*M1T?b8+(a=9S#_oblW0w_1g6i_YE8I|7F~EG(^3m;yCh3T=Bq4)9br8 +zoMdEj)p|&Gjle;gg@S|9mN%XIg(!dgwfLseZ$CyPxsy5(@y(;n_*eCUuuVX8R1Q*G~I!|1i +zi%+BGg75zRvm@^)QHfqH!y6W=Lr-{4uJo>DURYUm@f&->Kjt9+G-x(;@Zixqb#Jei +zYCSt^o3rldu0C{LH2%)Htv!{qF9RD|MKShudV;U!)U8HroUhIKZf@=>xlIyc&978O +ze;R(-bpPUZz0Xa9lj+Bw-<%Eac-DUGBji#pvvb2CFDEM#uF-T>rYNOoXX&z*mX_&n +zzUTjVRuK0m?)k@GK6g*tc$+u-*tcY3`_5mvr5}8KvQEUVH5sT=6c&?yVd9E&1TPVH +za>d9`h2vBeqcMAa-x2FCIA5*Q4TS{x%4W$%*-=0|GNTkqJvT9=BxA>~rRF8ms6FP% +zQ{UFQNP*agWmgOow`Da%zl2q(n-k=-7D8`5NHryAN7e+sjd?7qh%Aq&50?>FYLAw2 +zkg0N+Q+e76mCFuqH47M%X-SXEi3agQ{f9GRA$R)gX+N)nAY7}rm6|kF1AO@dyvm>V +zgm?rzA3Q}GKZ~Uxf5R0~X}e>o9Vb$5Vs)2~%M6fPymv*T{}d=L&bb;l)*~`^?D>Sv +zFCR)Fx+vB0GA3C-Zsv-$rHzEU@oqvpxx)~ohS~!XCiF&=6y}z%7R^Jp4N0GZQ|@<$fA?=PkXA8 +z8y5{m@4h{_)A5_t@}7O_)SpHi`%_MQIm(-O_8M<}vY7a_lUJ-z@lNmg&zTRF9YL;N +znOm7Wn^18a`|0(^%S5!R+UQ +z4M-LM#1G;H4$<6nh+ZYE@PLbEFA;;F&-c)+1R2*5q34fI8;O59?6MFMWA=bsw5hD@ +ztgJ2?43Y<4AodYh_7Oo6o}FL0O@iuIg%#qfX9E>Vhr;HBW;nucWH +z$b~?od!u6|530|=gqhEO7pPh3-zjr`(BkYacxUjqxx1X>q3irJr>Ek@IPMt=f&+qQ +zfwWlb7Ci*`vJVmn!iaWvx@Ab3PYgZ4e#m!8-Ie;xN#AN&m*4C^@`o*>ZEBlIyU +z+cI&U>rn1l8H25-pVZuJIn;m!@c>Wo|FudPhKC>DM!a~_+T}5|^7Eh0jDWeAdkU>G +z!S{wV?x;$9Nn1dgyOwy^W+IxNAyvP>jzAE9Xpw53AW50os=ings5R +z2Jsr5mUG+w@MjB$3>85zK&Sk`T@5xJfKzTshhN%Q1up6iF2Wdd=?Fr`krEE5nu}MB +zdPaokuKgD%s;ldZO-*Iy>!|C1YFWXBty&!WBoW{wC$`k&_&TeNIDoqBsvci94z4ARgX!{e +z4(Znw%OT#E#uN~HkB=BA@A2-GZ#!xwQfNY(^+hz$dY-&0Kg)YQ)W8b*?^RSle85Ku +z0w3k_?W4Gs^o&*)5!a0X!x9`+=vpH#Cj5>}9;H35?#Br8on89V1A601w7t@Pmtjvr +znMCKMdXdrtf|d7PzL6~WjnXS|t4x%Kn?vj>pgq7R0LB1S-&|K&SrEd9kDmfz_}7*M +zdc9J(a{3x}suWLV&=QUu@f18J{EmAih~LJ61ELym06+Tx#Z3qJ;=&xS=`Y(27<4OE +z;#soPRY&|Q!%_GLW3Gb^s~epd&fnAkKA0cG(v$OdJ)Jo8byX?nOsEV)xoK@%u=m+q +zZ~L^K(`$cow24d-jQ`hE8>Uu{s@US)}HAO2W?jL?LPcy*y4bAIk$}Ub8d&4NS-NUdq;= +z&zDu&{3_h$u@SvdGW1(bP_xhOA35%;bMpaSy`DFlveK(s^KSiy9n#}`+O$AI-<9RL +z=|CJ?xaD10&PT;0bb~77RG1|?eO>bC2PpzmUAK`s?`c&Gqhx)4Ip$QPJXDYVkojEL +zHugI1nJU(c$u;Slw-YrLx|=2WD}Egv;E~<#B=@gTXaO?Y!rv4MRJql{*bw@pG-({6_=c +zJ=fm!GVgQ8JBZe*J`(&Y>6};d@W{)sR7EXsQFRnr@ +zo9p6nZGLyUr3Jhjk}thS;LH3Pu>2*ZHCqb!(&%|g(OVtbP92v<(u(vIQMV@8JQw&{ +z9%&Cl<(h9Qgzt@EwlZOSf4`q)P38~!-5&tJQd%5fYL(Ev&Qqqz0h +zDt)-E-YL^}2XQTVM(7sfaXY7Zv3{G6t#<6DgTw9u8I@m-Y85EB3MlQR_#=u; +zOEP&?2|?dLByhMV7WhO_5Ec+;K42`n3;2_v&LSOA32UTuialyM8NW)LFCChCv)wdX +zHH^MMv47R%*Dh3NA1Gigb8&Nr-#_&7MCOGzxj${sW;?%4^`S^-y!kW#PPe<_s>plt +zl|;MLN3ns5wptm!c8Q*_m|%jRKf}1ZCa|i$)T+6X(3S`(4>uI!5VkyELc$<<0MG#d +z(0CjEap-Sb9XtGX{#4`+&tNz|bmsuteGlC;b7)TwK1i#?*dbX(&fdBa?WKHEwc=;D +znOl>81N!4$15(6aG&<#3e@l(aCW-sSjMaJGcTf2hZL(D~smal%xxVTIGyf`0$4Yxw +zw?=$ZZB=`KNMx|B1P3BTK&*lwMF0_%9eMB{Vh~i%(p}k-54C>-gV@oF6nG1Nu%39u8I~W)44lbuLLiYbe8V +zgF6$6qoqpdNXx{Ci%26)%T?7CrHirII_^eX_73$%T>(|yUMh|psBi!(6kBmcz-vNX +z$oA=YC)&3dDf|LGdW!%t#;;)~Jzg)2gih;72p!s@P~<_eR`eD0YlT+moy5L$?Ru{m +zy^s1b#a=U?!azx}ClBUsB%OTte%?gikl7z|^WAmupD?H+oM?s7q-w)`7+er*xH&z{ +z#HuzVTOAA*w5n_qgmj=I!+!w9iWagUkaYp@*sHd+1$0J=V2rrIcr;AetFZ`qiPWc- +zDOF;{e{AzCycBHv(I#nBa;Z%GJq@~ix&4}kiI+nYVcm8{eD~(khWZ8Z&HZdpUjnL= +znEY2|UnmKM5w*DVbezZ#R|mIZZL;e=k2pcHPfmmqIy<&C5yAsbf*`;@K-vq)Nrr9U +z4)EQDwj15_y_WM}G=!HP$|J8dN>4*E?a6DQ_?4dNV@~8q^b_4>`oR1>tfG}w&974E +zW~l1b6Bpw2f*@L-nqHraL>RLmJ?#j@RsS@73a4s>y6mPS=HqLs??cfELB@;2!s29- +zAoYn51froS0m8@A4*uJ~Q9!n=2*43!D{dcP;Kf7uz2TGRnsxwlN|qI68+cBTP$*#F +zC$u~I<-4jp=NufzFw^#!>s7*C123VG{NDd~T*Cc`ld^$iNxvLF50vGi!2KJTrMK7D +zui1FQOmeJf@W5narJ!=ZXhu#=l}AHalS?DMIUuXEEWNhMA%H_j@<4L>&FQF{>kdQn +z{kz6hmjfg5XF@|lQ9MI{(|w>eok!NZY=@fN9;DWZ@i7%F?W$0_UxO~zJyq$>AOF|s +z)V*`OUnDMP>a_Zb)n1$O&k4}wYL?sH;a9SS$T(_JJ=Beh;QmGgxVv8s%%<9*sovX2 +zy14<@7L?K+Xy?y?3JchhDBJOh0aOzJssmMo+e#8=Qc$ak9+ofp84ipv)M2{3(2DBq +zc2dpFj|4$P2Qwxe)F~%&Sl8ZVtWT}j`r5a*Nwf2EbRcm8iAmfvgfV|zH`4>>bFIv~ +z`54G$BNd93Ty$k*;pSp8NV6&z4JDZ}H@q><7w>J_jdybPtQ`#S@cb{x&}38b +zy<*6=((~!f=fbrB*^nN8KW<9!^KCofLsMa2thE=8{h3Rp(G_wP)Z!A=xGYU<)9=Op5`a{+d-&m3V>d~oR;NGC=PQQ6Ba-f(YU#a?#Q#pN?fei{kai%IZk-$)lAmoqfWDN1(l5nCe<1L1J+AXJ#lw&t +zODmIKV$7H4RK*p#p&D6_o=Ts6{CrXBLF$Eu%zzEs+MUqf^IY&A&)qGPXoZAgW4K?D +z-acX)WFMEA1w=k?Uo_ybS#CL&EwQizg3aI};o(tZ1Y%-{InmKIGw#d*Qx-^+q}j5i +zvtVXe-rERHE~$@|ZdF)Lmco)+d_)GV(L((*-f)1RNRy;N*qRBsh7q@7B>?A;tqXXAQ($m>MvPuHyx3froEkG%!2-{+0c +zhci_~w#g+DUK&|X65Sydy1AY-9NxRMfK*{#<(Og4#g@Xnh$9#YLgUErXN=+w+&!bk6FDoko)IN4k>S^0r(p>PscSE +zGL!m)Ipin_LIc1h06F%vfKOpd@0#4`!1*xh6cPAbE0qN$!Ram_-+VkQejiaozeLeX +z%x@CYvD21f40G#>o1%J!8p9mL`NtU%wXfz6>|rElUgYk%_9*=B2j51GB>0_zne1PZ +z4~Rq+<NLzz7muo0NPOGI?g8)}dFmE09HXifvG;;MF +zjSUTmsO~)$pXyn7DuvcrDfk0yNkH0S0PK3U`d7~-pKM)CK`qnrUnmGpq85U3_t3BL +zYN}sGYNEvN#TN?Tb-Auwu|JG%Hi&GLI~P-QHP)tSJx)b`ZTA(wq~DW@#VWGvjU#&C +zr{S5~Yroz%{=5iJEr7_$+hrwF$=)!1VweI#$IJUbWDpi^s9LZp5(>TFtfj&GvY`Bu7d$A0|bp`qm+BN5h+?iN>@SNxPG?zMugCTYnUEQ%99Arb9HE`!+S?#{ST3sR^la(=%{#gx@t% +zT#oysk+R*!EF~aGwz*V#VQh&+VIHkACXcJMDzC9DnNb#-RLB8F49HEsSy?j+%+MKB +z>d6`UO3J=iL`>YY&@OrwHP;I&UBhlhy}fu)`f?-vDbMmwr1ty721hqrMwRAB&B)fW +zz8kZl2*3EsL*udjg@rM);G^q)p}R+eYw)}!!e#yv*`bCo7k?dnnlQu;3o{SQ3z4dY +z2Wq&$ZChH~@Nk80LERe3{vNI25#*rw_=s{Qb0Y81!~mt611alOQ38nrV(VrhJymjV +z<97nBPds>iPmD5pm2%n}KfBwv^z4o?oYaWFR%?yUhm!8C9UQyUn3=7w2c24Rj>jfN~nidZ{ic>prvTy&v9}vrdl!2-n +z1TAADe%^NBWY!r_)atL@LCTX{<)=MRvqPw;_i9a#NRw(1Y*wm(A^lFB-}U#&&ge^+ +zaYVmz1NP&Yo+Nnb`#5ke$>BpAL|x+`mj2!@^Yv&@DMD@ELGB8*SSDQ&6JK0 +z2lGV>8U_TVWrBGd1hE?Ct&OFfF>(8u-~pl3F{vNG$phe6+zn890pj$Cxfm#0!bF6u +zi(g8XvbOJtLh+1;^D}Z2W=k*9so{}ligSBb)J3ir`!K|=$~78hFkTCLPC=#pX^{%| +zefS@x@Fc#C^-&KzIe_2}JTsaaa&W2#PI1@G4EtQTi%{|%wID> +zuhzczi;~^i+{=p&{1?x!^75(Ai!EX8_b4xlQ?WS%9TAfqRw~=aNp?(^S>nA99)`#a +zaG|uH5TgWFQ7H@L$ThW@jnerAE$HeR4lqJMcBR5Lwkkk6m8X1TE}pa~Ny(0g1rp_^ +z1OtA^F2D7i2Xvw5DmxFSHZJT0f}N;ElrU|X`t#5A>irr-9T?Z^4`)Iuxa9=uDo(Xd +z+txYDm`F1)5t|3a0&5p-d6*xCC9r}A42#5-F>>;yXcMGawN$MOxk04KqE)oLrBkrG +zw@r(yxu0q>JTmGsAzs+e0TB2Wq{fa8?QHek+7mwaSGx|tyYNa;oze#n7m3 +zk@>C0ps^V|R4r=121N+0CvOF_h^-biR`hia6)u!kvW7RK?G>ClySiQ775l~GN=68S +z`4b|^(=!C0xkHEjj*ZryKyskn3slq^Y;k@=>nEXS|DSE(r3G}UwGMhz#Ab)OXFK)VM>`Zd{pTh5kkc1_ycUk@-yK~j-2num6VH%fIM +z>68R)>Bh&PpJ>(eqWE7TjxC%a3MSXsAq74&hW+Mu=HgBzA+M9OL=_y?)#G#OOsFCF +z&-IFNKczfuBx$%6_<3+yBjLuTX0hUa&U9BL2$(M%O_B;#(y8NZM9X`$3DtqSx)u6_ +z`v=7f#xWe|_5ysiCP)Wx+%o{Wp?QN>8=tjT71Ja9S&j?EcO-LzXuD`Gri|a~%SWi; +z85fR+oEFqJh?yp;L3D5XJ9dyosYC;RoXc9vT@5Gxh(q5i?|kyi-FHB9^76ai{{nhO +zbVhNBv|K(K6Ppdem;@u3r%!RTOJfX +zG+&+=qf}c}0Z~&os`<&KR~>>lJmdQ29y~coYYa>tEwk;=u0NiV`^`#F8Gg<=>_W09Lrh99=V{C4Hus?mB;;OJp;I6{6A-x790Dw6Xk9(mXGH3p=y8U30BL&4 +z2zfkhYG5XFGYf`5WZ&4jaQAuw$A$I)Z5MTrKA@-*EHe`JyS2f3Lt;W=Jy?wcYByU^ +z{40)iDW*5MN^6KO#0!sM4#vF3D#D_!Idlf#W?t!^zxJzNu-2rA=zqBoTTyG#=l5ge +zQqd~LuoMF|yrqeI5?8$%(i&1*=V*=ePj2l5gEJw0{Ro5zUms8608>~TF&zitn-Jo{ +zYWB@VPZg_J$`9~Os$!ZnG?R!+NICfai-L{GSJQ8#-D1@D8)R}^hmU<7KtIrXz;)EP +z(YH48F1O=qgp|7=w$qZC#T?550!zmwvty)q-ra# +zTXguI6&i&Rj_9`XnlrBfmvf*@<2LUbZST}O+=LFF$$8aGnmAZ+NO-dFYYDTAv#*Hw +z$IJF$6&PII +z)LMaP(rYT|RMyGurh^HtA?CUz5MMVJdY=siHp74f`-GGpGx1eu3s@k>D?nNYjFw?5 +zGH$DDq=j^f=)qID%IDOyu8AG`}FMH_w$@jO97acLZczX +z>EXp-Bc5WPN*$OHq}-Th1o5{}gSb_xMY$kh4#8e(LvSB?*Z$#2f4kY>4n42rqpE?& +zk2Xf7Of9DE=Ojoaf##kRkjsFe08hi>kY52DazGh7je%EmP>ffJZKY>JwzTm$^$E3> +z@xg%%GNbQ>u=-V=%}(gJf^i>o?0VhSKRgZR!!cs<%yq;>G`&YVOvK*8)Bz0k5GhnK +zh5MHBRoKGp{aDXmfK7|LV0&4YNh`jL5~R-IGSYxN(Lf&Y51AZKsQM}J1^QBQS92TU +z86LF)F9E3AOE0@u7PeZco9RUYUJb(VXlvu#(^syvS9#!i|KZx4Sx?#m>q*n_8D9)< +zOHvzo^djH`PdLF00ajHvhT&Yz4D78;T_9D}&f3Bab)UC<`$3 +z!a(8xg64fAlOMClkL=NeZb;2YfcRN{cb}Kdja#`S1vt_Kcp#lf3=<@zknEsV8&m@hf!MY-`jwOg +zH*-jc)#ycGv;aJv{|{;8cQsL895o(u2D3MnL=Y3HEXsob>*r!2xw+Cj8p`UWd}&_p56rL`;FRI|5G!rCdtZO#Q2mIl2UBZwYGO=!I`mNU^lWs?v8h1L>J|&w8VU%% +zAZQz#Va~qOog&h=#SPYGG0g33hB-d#8^i2k#A2BLWHHRQ#NQ*0mt7xSv}tc2XUulR +z9lyU%}EzthLP`iU&s`)?1K!PP$~pn4({R10{~#Tez-LLo&hH$4?;h@&-0sFL6T +zYe%!V=XkP?ZX(k-cXR{dchc`Prcm$e?BH3k{U$LdB}lWikfJeyTBom`W!d4@b18wOyQ6uv3p%opHOX +zvW{oOn2P`8SQIn?8?`^)^#`DP0H7=n&SQHpkj##sYhX&lmkxMh_)7u)H_tE0fFJpC +zdBm;Ym}I$?9FMcI%d9esiebdB$z{3(8%Wtz-9Jz@8Dw4!B``D6FhHGVkTdhcyFNCMQ<-m^?$7-~&JQl!0U||WrxO69i +z<*_YFb(e@uP-X5VW4tygLf`P-iD0GrI&lWmOZi&8hN9y0Yl^{!y#UR3`Fn>9@YtBO +zp$>s$Q`ZYTQGU~onn6`9U+a-bW58V{EU3nD0L3X%=?|&(gIEXFgIgFa4fX#vKV?CD +z5MiK513`O%h$ubZ7gzCNx*NlL6BpbcJ~^m@c(pB6x=lVTKVh4DO-*7cQ<6WGvEyQ- +zZQo#h^U6zm&33OBslR!Nc6z_LS*H+$i+JdNfZg=@W>ES00z8;ItRRj6I~|aR95|rK +zqpgON1M?X{?A4Xz>bzlub~`u;?gX*bgGUVxN2oMU_>AjL`VP&_PJ15Hlsi5(sC_!# +z-H1b%tez&C?XfHhS_R>7us#!rkDG6*x1mw`sAK5t6zovsLA7J42aoz^H2jp6 +z#+eIC0u7PB12K?#aNXKInv!rR6f`)YXESuorp*`EC(r`K*lfIODdfz6@ +zIjN)M?u9Y%=^|s*NbMNGxd4Rk7w*zE22;gZVET5G(cjO^_Z(kEAzcArE#(tRP1G)s +ztF??Fb$aq98gMHuNWB3p)*T6R3GmYz>Le?9_78h?IL!uV82P0g)!cXdC^I&FYB4jF +zGvSp44E3Kt?C?q$KwYZSwpd*QbeC-MJ4f7I7P?Y6S33wxBk08{JG>j(=|)|i?vfI+DTtY6#@opq6^e4;Ql}$c7Qo~1efv> +z>{|kmrRAOGts;H +zppnO0edYhesGoQANZ;gHM`-)eY@4sgD-QnaM1Q9Uczoj0OJ)|##=w+_ +z0K03O!BogZOXa=A*htii1?=>(vCv?ym-TTgpOkz(4f5`qIM^MY&4Vo_tVFA +zDbsGme(v5nblSN1g0_mDxuLO_tuh=*1RUMhwvvd1lmxm8HG`u%x}3XOBC2a6yE)st +z;vh0Wx3S{#91B)6ko*3Ay#rU!LE*jqB64^~Vssa=nlANo_TGiZ9mg+iWXSW-q#kUL +zwB@uGB(8m(v{u|0e`;(Nhr2iY`PIDP*pnCHF24$#cvJ2x)q3&vlgBwy7B`>T=BE$~ +zi%Y)ezKMKbFi-I}?@y`6LF(%xc=R=qN?^W3h!fOepGLr>(=?YAY%a&lCIeyy^QWKs +zX>4i#B3IJcGjZ!V3tXo!j_F@HN!!Qa{9=GbDge$8hW^C5#uO`s-|EAqQt&+_4A0_j +z)JWU#t8Fw?GOtV(4ZFL9y|rFZ%G?vRsd@CP&#Cc+nbaIQG9|m9v^=zgo>F67DoUtqvTkhy2$G)OK4$;G +z;E;?SxMx(a6QQrB$4j5Fz|W2qsuDve#Ex)?kJG+VBE@K>$qTmLW*N}q6ne$zS|=p9 +zKJ4bLJ3VT6Cb^5_P9gv^q0F|J!>l`Op&DMN_m7=8GT1J$imLpC +zL)V<47Nzmzsx#@@ZZh@j^ziLPaSyi!6i&hPP!Gw|@jcBVZ2M~d+d;*r`yc)sa^ZPX +zu2f-8>+Sp;E*R9wk19$mEfcM*0?Lwx#-?U~tZnaT!Zm6k5K47gIy~LfL3{|LpQ;0K +zal&V%jeC2+9H+yrgFL1!h{eZ$Dw_>lX$T`(HO$6FUb@UEZZz7e=eWrKFen7fcKtXg +zbnyRnP>4Nn^3R~q{vQT~O#c5mD5U)V*`QF`|HhzD`v04QLS&Hozk@<@-v@LyEn9P_p=(RQ9WTO1&L^BYA^m`1C}+$NAAln6oa<=k`4~pA6q5p +zUEXm%Qc6OUEJ-u^cw4=K<*>-7dHKj7+Dq+i!TZE#DWmxI7Uoc_u_A~4;{Y(<#%CQj +zNw}4Td1UzPb6~ij3&#KkQ)7zvyx%Dr+#$c;E<0rJH`7(SeSA?0`skgXzCt4|_@e`u +zT;5FV!~c#z-O;!SG;mkKOMeyoVa`+Iy=2@%$6)^CHw$}xYd~Gk{-G^gB(6X|R1rn-5kzR-5b!Hoi{Mt`n1jOsLusre +z83eUAIE3fr35Y{Q$ +zGb=a>v$dG`RdrKIuxu*By_$oAQ2gg$b3o6#?en|T%L09~?zB*2iUFd>s%<&_gl#3V +zC)P>sxj>ub8W9whi|kJs@_^M}8c;g1>s~t)2@HsEP7})m4YzNSum;lkwZ7~wdB)iq +zgY+jx^(CY_Pt0J4)gVMMVI?xbqxF2v{iR{TU^eI^)K-Oy;$ +zfmFQk8J#vez@{@1k91H-74&ONEt0e_DSz|V=+N0p4C;MXnQf?CeHW&a#@+uF%c&RE +z1OpoA3h=PXK7jExctxl>zI>EL+%Uu{kR+aAp#PLZ>F3*fN#)vjGfYqUj_JrvB}M%^ +zLD2efkA&lX>Q?EGS1K~S-zlI#)SNKJqSXn;S;)R!u6>OGFxfxaEXr^uX3B*{-T{FO +zYH5jJg>O|&Ss|se&ZM~tDHhN!g0JEblQck$NC4)?E<=I*b$QpU^lK2Cu4%&y)KF@; +zNcm&-K=Ru4FlS=QS@U@#m@eI2C87|i410DZ=gB5(3`vkDLFN8?qbp~5PTbOcmS&Pi +z1us1}&@-)t^j=C{zTlvq5BJkFr3Gjjn+KN5+m_*LJQ!B)jox^f+N#vnF3#*l5{UHQ +z22mKSNS^^TscUsgm#Z6rHcx1b!V%2!OMa;1VQo;6Ma$PJkcKSx#E)$PD8U6bqOPyPZ?X1_sPj1hZ!c>Vjy- +zw(7IpsJ)j`F6xh%;M=g*@4g5#hRpbh^A|uBuRYSY@4qlMnA;qO3xfa3C*yZEMAxX} +zKR&mkDoO3tCS?W-W+L*p-WfS)M_?VepgwR%Su?Cr837&x)b7=;aQlknCSDtITS9?g +z6WEy?Gaxh+kXFcUH-WyfT$1b&6xIv^yYZTVy|)qjp8%X=AEh9?wVfW?X4#TN1InkJ +z)sLA{FnH*Dp-;vZr8`IUWV9@9)^6wfz*gvWaYrchyK%lhH>2hsJAADoo19K4MJv5^ +ze`O%H6gSsaKyXY_GUPJGdm*rP5Py$=Xq`$sKmUZhhH$^YJi+!@ShrAbk_d#Saj2)l +z=Lg}50UdYN=)pJPsT5zx+v9}7JbKpcF~*Y++uwZ-S%NJSe~tKMTM8;#Irvx#34>!D +z4xOrK3E$AhTe|y<53HWZ94ranyddti_xwR?WlU!yBl|9vSaM&V*5D$7TXzUfkLJoH +z8o4UdgrcHjfuuh|Bq}zytWgw}8!y*x($gyiA@qy24U5(_jERhL_F=^VpHyHgmo;2A +zF$GxNS8ZFR^e4bPUJ7d4uYpw%Z|+C_e|6Uc5nz%445)eV!P|N_PPhp +zMH5-u7u8)rQ8!*6f#Mkjh$De%_2VN;|;fB&sQ7?M2&Y`o^iVvwOzwa0!q1f2{{isJYHNGP6WCVW~6!{ +zQ(dQKWUHTlvni&%*R;E%CB0`@yr7Z;oCu&{WgzZ=pfxNhp7M#gXaY2UctT!^v*rh* +zPV>nPULuaJOu&~+@pwye^rL#1#ZH}{E}7pcN~Ip-Ff*-|vUye4)8`!@yZQ5}X5{qy +zY_H6~pWnu!-em@(7 +zkAy7MzxoOz_-|!Pq4ru0$8PKM47rpVR6OMwy%T@))o8_9t5!zkD$jYY%)39g_&t9a +zeBbjG;YePrMV3)q3ROf0X73hYC>I|BAwapHFl#6TqhV2oq_?!$Sa$N&_U?0lHCbA9 +z^2T^oO$T*?6DiZ>U1^ML;U56+1!T&aEZYKP%Is4=RiHoi8?1Xw5*EfSZn?fFAFCZ3?cUB&+M@s4+vH +z&544C)$D?RVAOX_^QOZuxyup<%j!S*oqsxfy$e{%KpHqLqQU +zP#<%5>+y|9t=ZPEhA^?{2%4@QPS-meU2a|;0l_F5*2NQHE#mneu9i{|ILTGZ+}BS; +ztPE~wJ*4YCrVZD(Fk#5ej7Zv*8$gofPaG6?HOQT}u{$a4D|8^++3cd)=2pY#R{C_M +z>W$Q~rESsmP>x#(0aTnan?5`Q+=|5yZM@N0#imERL<2ry```FP^>?38cN$(-jHKCm +z5A$|z-JTD=X7HWsa18b&Uik&Y5PE;((Ds%Lk&lQ}$Eu+ZM61AYBqXJ@%u=jKn9r0a +z*v*Ak2T>Ali_XuA)5XB5GWn7qs?_jUbc6b2T#hU~smh+HHhqMv4ZRQ{Chat9NpHhx&B|U$2t746wK*+z5KlVD4o3FKz-(~uK +z>b*+$0x3ulRn$ecSTL^Q0M!F7=uD{0b9aU!A(rLYc&@f`kw&JbGI&sMm{F{)LYL(& +zkX6;oDa*qc*Fp7*JK#_gSZ5|y&qjA84^rz?SANmNdGLy^*LC+BeVgvFH%BWTZl4?E +zP|jYUR8R&Ueh~CLaH$Da%shFq?^$)Aau;Tde4Bt?Rf(8TT?DAo_dye-^d%A+%KcNo +zX6U(J>Kr^!q6)-;9_k0;;V`>9p`U-d&rpQ!Z%-pn+-#k_ODfqnnQ`*z;Je>dAmqY4 +zT@$*Hk#@Qffevvp)hVs8hB*~dJzIiGsRZv*!5-&WW_rLNR8>W705&9zMIiJQre_r~ +zx;&H8JzDdkO4`{+PWQ}=FN1a4n;Q&`&M%jbyEwNRHQq^-hP4 +z-yxL+LJY`O$jn@F%dFyMRdN0`3{>rHc$ief?{I?SkrsQLWuO8CF-Kz5Pk_fJ5 +z+WJOT2H?_t)?Plm0iI+7oVGO*)<}fp_~!<75du<}ZJ~o9!*PjBt&vG4Y-Z4CA_JL* +z{#Oy2SYRmY8&Y7d_rI*fynz0_5+eY#GZobb#`xj}1~MGyomKn>1$vG>v3Z^?=%so_ +zFDVKJ)157slxR%>(nhMD@*G}=Xmxh%{h)8=EYXu#E+tmkW +zn<`PVrQG%rx&u3D{b7dKe{reHg9L#5n3WwT0=QNd@O#f3$^s^{B7WhfYSXw#$x0>T +zbgNW_(DgC=AB3B@XKC|1viFn1h(MKtgDL&n6xkfTzLMg@-E{>lp6io3wb_w5Hn{I7 +z-Tm{#L`u9JGR!>AE()S7VL;2Mka6+gK)_mEU@^=fXfj(eU(jjLRaWg0>cS^ic8OR8 +z6@|XqUbN2NctCl6LOL;wCrl7=IXWjG1g3*al0zgQ~}kuC)m1Yted=&-VMEn5s0$*cbg +za5R}=7beTma-UPswCL)F_rNAj7tUUm-MXN9$!}lK23^%B4?oVxB{#vgFR6;_?>(b& +zQ%#|bI|zPz!D?jW&F4YYnY`Tw;j6ib_itU*aaxH*l7`L{Yi%D$0N$S>PmlB@yF&J9 +zwN{4^jQ6+KMKOC|gR%XZqd^)I&VB7E~QR`Lks67fbr?b#xJ +zF9j8%4EyF~@Zke*w%caA#+y82h=V!K&}}F;YiQu^h-EqvAy*IX{HG%zO+Ae7CMz_B +z7`~!WqMt%sJwTTSNg7(po|5Xhz?%?kF9WNP6qE5O*9xY>?V3XfCb&?7v^z!2Ixwg= +zXC&N^!eQuGK!T!dSIY#z0pTB*8+h0Wq_sIzGV0qBT6f2JB>81C)MsV@*oU#YLaRZ8 +z6@PZ&cWSz@)8rF%^)`Erv?_B(ok +zc_l0p9OJUVl9okrg7wZVoYe{zDD_0yKF5MGA#`guw~7GN=&XRPq*>->%oQrwFAROV +zeGwY`kV&0>{`-znNtjE2K!7QB^xG{mBTxC~wM*v#B +zxElFuo0J*ENX}9bXDvo&SeXgYa-HIYYa@8-Lb6*$evpa~P@1qjk6jLP-HMZ>p>7Xj +zyFXKl{1k_+7HDyZciU2S>b~>gCrd8Z(DHV8PB8ax%43=vmKHH7N~Ip-XLy5ik8dXY +zBHoj_V=DB8aq~hl@QQPpn})vJ4!&U#Ka) +zt-PZVf#`1R?ts)V+jTjBv3LwAwmY@~GJ3_ow0q#-^S;O2mS2lSeUK&YyyyVLn{6p; +zz6)D`Q!X#!wqx^=bQfQJk9-YT=F28vXLS3p@o~tJ>*Kzbw^F4a&$YkuHd%hI@<-4k +zb?q`eMOOVJ9<8b+AH<`tv0s}n-JYQ7tyoTi+1LBI`=|RF;dA$Q!6JJh%z@k?r;*Na +z=%BCqM3CCS>E4R|W5OA|9AKq^stLoEVkZDL-bLlsMxr07h!GI&I4Cz6k(0V(j4nZi +z?Z<5bv2bEb`4~Zp9|=kINfS`B?Fgmh_l$eO6CGjDpJW3g=Qkdu7{iUkz +z$*P+D@2C17W(5`qYba2~!9SaBg)|J!Eb3gYnmoC$|Qt78v%Zi +zUeiWzzpt60`nE7TV%K)5AX)rrMo2`0PnLaP8Mtl^^N=i4{O(jC96V~ +ztWL>4{FY!piDZon1gvY66&Z8Y3nqy{f8M?a4N5vBxhJ2r^WLKi-E_f8PN(8ofX~&U +zW)0?e@Fm1|SsmD*T!U<;bvuknmFT~i|4jgj00--;U{sJKh)JlOvZ@2Jf>vcu5^9J} +z6K+eW=V?qR>f>y1$^g%YEZaH0Ef@e?Q6!5i8lXgTkz|v2AnaKmU=BzO?gIfvfUZ+;izP#}2RDR|= +z9BX1g9~&d4jFm0cDilo8hVWIYVQwbTkn*F)8F9H)R2> +zp;)wVzPjHmjkT_pAd5|(D*io3QBbHi@qz4DWw}8uuF0m0|knT +z8HAj$Oo^-UFTYOJ9J}&MMjo;D(A@*FSWVsiI28jWUFk4G`nN!;Qq>!I;S~}WG|3Xsk1pJAj$x2 +zH~!VBDQ(zN_292SpeeI`ncCvWZ+((?>F3j;_IKfMYLVybAlh}Xf@DQ9bs(OYh{UZ@JYbFA?+A=Gh@^U}<%nQX!#Sr3 +z_X3N}s_en~1U6TWf3x@K&kycDqtKW^q~2g;u%7ofsWTbdqEZ1{CFJ|Ct{MX +zr*2j-hQo>X0wZSM3bAT7!wvvAtFsEo!j>I$U)EUW@-yamLGRyQ-Bv?FsLN`<(JV_b +zC}q(-M-bN>x)lVyRdrrf9hqNf<5>{uJNM$#KXcIU_@y3ZpA|aLNpg(JN|KRNhlwT? +zk+9(jVY1c9I$5d*7w5KqP_<}sLEc91%~zz +zs%Eu!!~98DV9F^)QNsV!Lwxx@P@;WXjQ)N{#uK~`ZY+w%fV`b$Nz7*nR2 +z%2q|Ui}Y5!?;v;D+LM=pZ&9uX6&V}sod;GTDwPs)!S&}gwPS3u>(yfjz`kEj +zqn2$*S&qM^U2TpN%w_CAr{_#T3(~)+B`#vVC3&HrAy~=zXD|>z$4c|>G@3vKJYu8! +z&waQWVdbu9RNX?91gw5KF_8%*s!;Xo#3GPwG8(pe26@iwSBhiQ8|Y)j)~g+FL1&`^ +z34yNySf2aHpC{u+ptQklvyYSRP9GS}u3D@Pa&+)Qra8C*i +zAUFmmC6!y`wFD0Ahp6Vam<|e0>gVhH2y-vsxU8HE7+?9HaNOkE$Dw0f_J+dURnyca +zLKlzM<_n^qBIcO?e{tM=a%l)OV?8#gc3ny%#Z1`(Y2=Y)uj)jy+PB}s!G)ZiT;}2f +zEF-J=VL$a^in>3C0!834d&B +zJ$b!hwJv2~%9UV8w4^1vISPyI_w}?+7p_kS<{=vzU7CTdduI-xMz9$p7IO)V-2z>+ +z|JJ7uee>yw|5Kk9CLXtO75+nT_T1m|NAvkL;`uL|+wLJNq;KMs4dKFtaXP9RmIo3G +z=t!(wbqR5QO?F9YYg%VVE~iHzFf1mH73#X#W48dF_@|V%97`3quoLb>I}#(R;j|R# +zwaJHT+a}XjlS=-$L7n=6s(81cJ*@hxG3J8HUfh3+0J)D73Aof&kWB| +zn!BF1|1MofxcN25JD~_2Z^<}dpI25|RzobTg@CKexQI#&4OlB2N&@FYxNOLSa78dP +zaiANn$|wSIUol}Fy}jegJ9EBEJGV(58eWZ$5?O9L!%ylmC1Ni +z--~0wCOMCmsm}y!liWJ%5wHQ-aT%jf;v+P;*C9DG$ZDNZl#WWeu_tpbGIwd`lAnpT +z@1d7u|DS70pFJ23emnj4YkEwfL?ShrjxOFuD~mAP=T5w3}Gt@Z|Hkda}oHd^@n#`PcKfyJ3q)<;h7#7^U#Q9>f{(^@R+nZ+r +zc@F`9P|&5AXIrU8Xq!rDs7v^jJ479Cb+@P|lz%Rf54N^L+$0nM8(bu`dbGpcxnVux +zz$7!NJaJDKT#0$%H`rOS`Rnr1Zm!_urpjyeW947j;0UPy)6;M^eX~t|7x^ +zT*0s-npoNRG(af-2W4*=)^^slj}mD}fTj>EK!55#tvbFOpFHD5X(ny$U~Z|%M0zVBt?Y*}5r-vw<9 +zYwgYKw+KVDl*jjnCO4$%&m54O9V|S-f9mv%EZ=!%gfe8Y45@M+10t%GtC*AARR?~M +zl@d77E*obL3P1_cUBo~Y7YadO<+D(Pdh;E_KHjiX1GytJF^^8xMJ=Zf`B7GR?Iz_K +zNsGe&5Y9WtQ}#B`zxuOABDU;E#HgeoviGCF3lr#U`e6F$Zlfo~P{nwU0|rRx{iT39 +zR1s8)q1Oi1CzMoDMce8OYFJG{5dN-sG=%TFrUmeH@F0nRn1{`%&0DhyhuG8>=1|Um8~1S5EnApJQW-yBsGs^9>+Sd3N%`e{syin{WKDm77RN?T=? +zJhwS}I2kh*m;+w$XXSOIw>2w58y9LM!l%a#1VD +zSg#5&dCMvTnuCZBUMtOY7Agkr&RsP=xYP)jIHrE!{DJle)@i4=3W#C}h`x-!QIKR_ +zm4_k1&byFeUmpwwDQmEBo1tfyM322%f4A?D`bdxV@Q85E#1Y{cZW#6+5E0_Q(ei+V +z-##1NPI?LpCL`218qe$jHCw@}ZzfQm$ju``fsK`%nyq>0Cmvk^H3y;Fuc_Sw +zxRHK^xoE_7*mP4rWPZ{09)+KPnH3Fqob;z)bUjUZdNC(e-dA@Y)YZzz4?@cKHVzCA +z5fO8C^Hb8c@@@%XTGTb{ZxrvB%pa2aVf!Ti0cYs1wWTA4NVWUME|fIU7M1OS6%p&L +zl2MhrXlLA2fL)ES^-M6dX +zWNgZFBgfgKx9GP*j6UOKp0W>FHBuUE(wpcNXEIazRf8m{V(O9Nkg=du2RZb4#vIb7 +zea$Dz<*2FTx=QM`v3mriDZ5$y4;wU_F7txqkR5;dsXV&Zk0ED@k?R?Uw!u!3oAe#v5aK`Ju +z({27q8*8gM=o`GvmG&C2r`1#^9oJb`bwNRUf!h;=_-|WhgN~3awI)~%Ru<=?9mn;O +zPn$tqcOfDC$czGPkrxz|SIQJFat&e?eu6eMO4W(Bwn>DFrge2o&;f$-2aji4rUcG_ +z2hIe@8^HN-oG)!*xcTo_#Q~NsRw(P4TX+{6CXwRXCW%JJ*~|m47F->BC`24wyisaT +z^SY_*Wy6DlLWH!UZWjq?-7`$I?{JKL6F{i?>H6(Zc}n*BM~UKev0|z?ogZ0P%EZt^ +zGho#{u%>#^#+p)Edk2-&oHy9tqo_7o +z@q=w_1UXw%lFHdV{aDk|SA7v!RvjVm1xi6E97sv15A1qOx~TQl#Wdhb<1e2O@S9F` +z3jzrB`D^uhNCyp=M{eIuD8JxQMal9=%y^;*;bdE-_yLiF9zAE;A2uhe&3MIRiMfUp +zNEeC3^Cp(y5M}1sXw!xk?c~-Dk-GZMmb%_vS?+L&4aVPw4Fd5;fYkGCbJjKsjmZhr +z7JNoQ+T#T_5XMWAa2D!drt%|$ +zcRgngTmS4iMNS;`F56gLb@>Al8C*aYL!nBG8KoIn6?s)ZUaErN-)GmX0H1_Iv)#wI +z{xF)YwbU=7V(}U@FADm^;Gpo`V}H9jFq*6(9m!})vBRYJB={9`q?0O76ax +zI8i0^=&(-H3f?bvm(1hW3G()_fj#reFR}B5l2!`Tz!FRxQ@Y%|l2H**7RCyr$(y&x +zsRaCR*xOGf54?zd*gq;PIZ*IT*T`*FDq0s!NP3h>4d299-yqVOo%1sNH*#>KH28>>c8Vm@9ptvn2GaL5()mBcA1s;r)5|-bcJI&C6^~0q +zRQ-QP1Nyua43xa~QOzkXyl@p&8o}PgA`YQyW3O#z9Ab^|Y07Bfb*K#SwhnhnO2fF= +za9M`}pAU|M=}ZOICF~}xuSWeHyhUgWjlLYs=MyK1NR7Y6Cwz!!PnqT1a}sJ$ +z`LGRbK~<#}8?RIlVdr1Yj_5koy3(EIOy-WS{c=iWxgFu8$QzRUjBp_O-Fe!#B|CIc +zzB~~ZnZl5l&IN!M1+daTV!k_0YYaz51+32V5+TOgQ9Y(7vW +zDwe6{9r-Z%M73`L&Dt*-k@eIDJB_N#QOSQgaf1-Ie~bN+SaVXLS-y8_f_;K;2_R%Q +zRlpXqn+}`)wTGE|LB;86!+f93moNsxUMN5)1^D=qjB&{b6PH-@AOXDZ+GeLak_L+URm_w+vnf96B#nmQ!q>ePDzV5 +zxP#!@+Z1rluGe01g?y4*YY_!JnB9fsfm?uh7bqT&cxis9!e`Bkmjh8b0!LJCp!`zV +zreNObqmPx?V6^jg>!VFhS8OVyqLnI^ULl=`iZd^6T;xXW +zZvPbf^EKDDJ4NUqjg{WC3c*)fh~eq|n8AxRwoYS_@dAq)wU(2Y;VnG(OyISqU7O`N +zwf6bvp{Qn$cAtLo+vhh3T#m^Pwr=OFIkKR^6Bd3(C1MOvU+SM2UQQt~)It|h1&8|` +zHDRlpozC!?k~giCmJ9}K(Vk#sa{JCPqpib3o@!rmr2bLm{OK!o^@$TEm@N`}|{ +zJ3S6};`tU+-2(AggdDmgvgWz{l*O^*EFr0p>eowrE>;@6{V_wg(HCx&iAaI&JLKaV +zAWj(cjt?hRrm%xz-}z-n@XMv(m%{`u0byj`8^O(FOvx#}2E`7hCuYB?jQ;BlqsyVZ +z0>)6t{MV*+HQLfPJz_Ad4=4@n8GiFE?S*^VAE5q-{UHdMCX}NE|&lG +zo@FVqif}gTT&i5fd~=KMa)s|~$j&!LT(duAK?W29&$Vlz)pXI6XB#-)KT)s*5}cA; +za@ly9br91FN5KDEy@>mz{J99_hfjg)tCzTKq3bG?w+1){7WeIk!^(O4)2;#e;xH1t +zaOnBm19kCBL}B}Q1;UL{_kp%Pr%Tx8A07R>N9utq=6xKN{&xbGug{Df?}J{`cfv +z{i|iVJqXesm$+6&Qz9>c%0$zNB$EeC4wPSGsmw0d2t~mZALU16t_?$dzu_2UaKcMx +z)7z4!A1=!Iv2BvvC(RUc{li_tliBXYkaA={lKB53C +z6+_QhHl#$H7`oSeWv|L3Ay1p9pX`KxJP|e~n|*mCgF4jQ*__Jm*Jz8;Bqk+gT?vc6 +zacDV3z^Z~i{OCdd>?(t@TLnpl&w-u+;X=HI);wC!CXuJQt{R7A(x}(kU~vMbt|ZLd8k)$SW@iQ1LCj8fXIIVSQPT@<@{3B{k6OXQurDua3 +zxz+Qzw{bB3`2A4@Ni_IOHfEbLCmxDy?1ufM;j8iU3z+Aj-?WwB+PRtzyy$|WQYi=B +za=fYmvrN^--*}&XnzNNP6yo1w(`eJ9ZRyOlMQkwJHfn(_ZpDt`R!dzW%El#Oe14?7 +zmw=@#t}&<}Fa-pm{U5@_uZCg&PS&dU%z%6ZNdqN_?N&hP32EAf=m)}kue;j4*N+yYqk-022?|AJ +zGJI(25|tSxc{OzNO7kXvJUIm2!A-f}NkqcI4n+a{i}K;0?{8qc#i{gA>{H5+>IiBP +z1ShmT3Ayoy9!|VeqbVKlXJt&T+gy)UQaj{;^rL6eOOs|NnvXvaHEkV_&cW-fhuj?f +zR#)OX{#aA-$WITx6;O-w_CkLQufJzfI&1c}7yoKS3c;57OfforH0iU3O} +zfmM!)aoR-pIxCLnD4iGhq)XJ%?c^e0u@kcGEOEQh?Hy}c@~UrE0x|6!qQ+<=qgN<( +zqm6loEvK5qgiG!ph~keG(Uz`RPm`b%%BrV4>$6Zl_;pHZNwf3YibjgY;AAjM|OAruO#t% +zR$a^XhHd>ax*X=gi9+%0Nrs=#!!H9JBmvDUQ3h{6$jpZ-rs0rwZPZfTEjQM~Pa9;6 +zj-2JK(4$4k3$gmB&NSa=Z|}*SmAKs|b%j4F{ZT6!Z)$f>F)teyB!#@dO6Ff4C& +zyX*-2^1}Q_n`2sA*KH+-_j6ng`KKhJ~@j?Ol>c&d?dW(eg=hFXH!&hjU*%?Mn +zhFw+ZdR|b-R7shZLt^6Rd`R->dmr=kJP`oT$v)-hUqA* +zr>6Aup;J&O^#?)swvu_7?&gJTkCjaP^UwTMb2!u;0`XckFB_ +zM@+SkQrvaC>+HJjW=m4h`ROGz@sfPa;>>b47Q>ENUyG@1jEm1|X=R0`nd)@+?9aD1 +z)gBVwZzN7WC>O}BX|_`w11`-jLA~8qdLl^0!$#F>v29mkU2aq!ZvTWs603W5QxJaZ +z{j1PixW=w!opfx6J#M^Tt%ZDOz;YwOEyz +z(4*P<7f6Vjndgh81z{gyK`qflypNh2 +zc`D2%_OMJWcAaw8VlJ8T1kDaVo|7+Phnnd +zKsBlHkWyk3vd=|F=umQg&)m;*@5Jsqy1FG6Cq-!QSA{ZcXx^1o8scFQwRKA3<`F(E +z>TMnPE)7IvzhNJ@UF>qxc3Pnas-@+>%h&Exxn^YmfADE{gZAM_CA;7k69)yQl)CQX +z6gOo$YSI^lJhYxJ8`jr2Snc8F9PZSED>y+6>6vl$bO1^8Nhpq`T;3nbo@0Wq+D!_; +zyouj`lJ>00Sg61}bj=PBhR_zjVv!_W#JHEBUl7q>Rk3gVwpAG4y$P`#mYwr)`dGkY +zVnppRGGSfRMh9V&D&dVG5KR%50lr$wHCDCz(MG%h&c5DSt?uD1nOY?O7O7V0QORL; +zhwA%WkDZ!2P+I|fOHx8mneOtj8c)UDwrUN7RCY*&cSL{rETKC60NXWc2zz2`y&oU? +z2pg>nq2Ir1T1AH+Gd|@2cdWVea+s0Zr+g*QsCd^nY*jnY2NMv#i!u0n5f;LqEV5TW +z%~}D%CuO0Eb_;UULfcg|@N1FcgM_QZJG*I+K3K*8rm=ZsY<#F=^bk5He?}tk#|jYp +zX=Jx2>entk6KE#A)m#Nq5-CGU1tJhk)LVfRhpA+giJsi;L&WQJGIiziDsEoRJ)#AP +zsZjj2T;w=>{qaae5FUtcS$A$K8TwtnOx2W~_7RTX@T*rp9T@~0EE|)w$j4eJOPdo) +zBuWd-JgOij+6uK;w+2{KGrDwddnYEOt)scSv9GIMxwnr#G1Pf@jOM^?8coB9?uW}C6i1jqpZjR9MmG{XAmm@Y2&DE{JwH+xX2))MeUheA$v=rgnEyYO?CUaVfWkkkQ +z>2pHCVk#s2bvPLFvJ^vlAIN8Uq)3hKaxeXh4{Pm{_iuuX1;x}lC+2{M_}2K<^T!t| +zPaFl4t0FukvR!KL(&rY=(Rf8NoZD|+iy(_2V`7UWKxcrVRpL=t1wmC*m!eDfMN%7! +zVx(o;S-Hx(X!W-CQgeGl8ANK+kdBJl5%Jl<9-}661m#qztcfP$&#?qN8I_dd)B5C3-TIuaD4*tB(FI}$@ +zz8PvC?;vm^mUUUxWy+ne^33OuMG;Yd&-R{1kry5CmY|Jvmwl}32i5|Ma8wASq$CAe +zT2^c?T2(Ef2|Dz3^}vsSmH}UPw^*Mfj6`cQ*EN){F4f^htH52m^Kw*T{n`{8zt3r)?P>D96g=?y{h +zR}cKBpr}~fn2z;l|armB!uGz_2AnxvP_gz)KRt5WcEM_qGuJhn7) +zveQh@t?1}J^OL6_GZBOQGfhKF+^)5QMkxH={U84lq!Qm8+O;&s>;cG~RC>buwq*8Cr}sbqnRi +zYx!vdi>W#Tx%rjR!$Td6Si=Qmi@hfQ_IMZ6XnbbUq-^D#LB|Q!ibs~ZHka=}uLnBDV$)0ipP9fBN=3~N^oki;Xvmy%9#mBgha|duW +z#HsuMQ;%um-7_O!qih|hgRgrwv?t#rL@d%B5N5~YP=rD#z(O{#2g7NWX9R81G5 +zCf>+uskJLIGTCR-L)B3mDolX6juj!JynSh?D9ac|g3*bRNC;{ +z8dCK%3N$ULZW?IE;$%a^K`Mk_&)10#;frS^2Zfa!O`#=EW}XIeO{&aTB!nr9TISyK +z9oS&`|1YPG{C{-n0A1~+n?}74O>^ECtWJLj`KxA^iD_XZ1VS}N6h)NUmdBt_HAykm +zXjU{ovLQXHxwV^F*2O68AM7hlK#z0ZI6I)qgdP93`2XtPYZ+$4!vA;vedv}LTF>kC +z+}FGwr(?AkhkbdmrgSGpoTF!Uh9#8CcXsflKwJ9%)uEwV209n$M|-RBgu`ry#)hH0 +zB)71%)Sef4G{{R5s?Od?-eaxeP} +zSC&IClp=97Jwwe{RbD-~wU&RNiB6j)F{B%WYa$UwtmY0JjC$a`&S)$X8WvoNi5# +zVYy#7?26jJPehZ$N;lSocH7x{*k2MjymqPSfv_kq;&MyngU|~GhZ(VmD%ahkb1)_!WU-VcU+r#WyYdK?1O +z&=VKghD0C%&0#F8iFdQ;O+2SuR4+STS3@s(A2M_6la7jghSJuI$E4jT0gSDTD8PUE(v>qHD +zZSPacOD>CZ$SEt2E(=m>jB9bQY|6}VFi(&)=uec#3~)1pcgQtto%00I^*2eMwGm1w +z&lxmOT-oqTv&h53|<#7>Y+&I@pvUy9UoT#f6Sj*NsDZHSK +zS2o6ya4H7zGVua%$b`E7qcYflmCr*%-o1a^f>-Rb>h~iqh0~WBj8ZYXXee)6LevS& +zLHNPpO5*;h*~pZp`B7XO=0Rv|`pvLc4_lt<rUsf +zjK|8cCRPXsIJ{Um$x_{eS?->}$Pg*374g_Xa|m)#D%r3iMZW$w@8N%U8IYLb1bZ<) +zCQ*ig=NDII_r8|Qjw*@1_~YiW6zxVP>5_E*a807srTR%Zw83}cvexy5Ss$m3s8eZf +z{yqrV-!>A*A3jN&Ln74eOnj)cAebGq42LyDD=>q_t<0-~R1+&q_OqK@-|c!U6B_by$9`i&1$Q(NDCVF +z0;VQ?;Ue9LsM1WQ($%KTW+BNh`NaZlqox(c4?`cO1e}dX3UnGpXTqx_%5CJe@|0bj +z%q@J?ArQ?3H)a*Tra@*<0KPfCx*gY9lh701)r9B;dYdWLNT6JXIvmbr;tr`7;Ko2R +z?Ie1UC<;dYHY=9{IWYMC5TMuf$j%RpnKF3mOf37zME(`4(Si^AOQHcy>3f}vA$X`Q +zS9Z&s5n08u6+XULrm?Fn6HSb_ +zMWMtR66)G)`H`(s?U3F^bEa}%t>*wf1w9edpTcFKG6!_P#$bcq7ic0r1^jC<_H!BL +z{&Z7NAr*AyuC~ICVC3NQQCDY!5BxHS!k}bp7CcX@@H0H+yL8GLus)(2R@|D3uklRjitr5H1sTDB!W28J~W! +zRUh>>5J8f_+xk)W>m<<>#`|{Tj>f(C73ya78+iC97Fyy*P>dz+8psXL~%8RuKSB!XB)Ca +z%G(>vK>Y4zFE1|;#hlher*J1@1f;6=}qN*74Oi-YH2A7*jHhNd4 +zFadXVIg!qjuoxsHVFho{v^=C_XWCCt^$1(uGvwvVTaqWby5jr8iMV +zMb~>7IC!C$E;)~mCcq=2|}oLP~6$w=dNaMJqd +z+aes^h9+sKP#P$bTLHym@MWcH^=6C;HDQ+uF`M!(#mwF=R!J5OtEP@0O;T2YX*A^P +zG!?1`6q)MkpGvdSLBr0GXb^rKQ>QKnpTgz7xdm9^Rmk<*H||}!(-+EmBI4G?wWb{n +znWJD$Z{c7~hrakLv)DoLm`kq_Y2`C2K~rFw-Pt{I!k69I^_s8vd{Xjk+f~AED%}sd +z?*9C$eVezh!Pj=FL!v|ft%TY0>`PRW-!?WNrZ!l?FM6R+C3KNBuSuj)nJ_#jvDV2E +zsNpE-Bxq)4)4~mj7FpflE*7Tnh-gC$Vl;AM_)x+`sbT^+OFb9kS;(2=3H$%1DaoUXsH*@$%+xEZH!V|J^5BE!7Vm@m!U%6ZOjp^uS%XVc8gsB +zf3LoTCr6RIsr%sZiZIi1S~QHLh@h3H)K@i2@{1!q4p^H8Lipk=#l89@@z9)h^-=FC +zNhCzYHKRcK=-5n*uC*KS6b^N4x?j>YkGE`b;8^`dDL>k^32}avn+kU{2Kl=!9~-DW +zrKgBK+Y(N`%bj3}a`-xI#?yVUJa#a!dPc-=tL7OeNSAnR47$uODNCP!ZvYS$Aa6!$ +z8xAnJ)`#f&nm7(0jcNF+%d#os!NI>=em-w&`m3XX>4wJ3+#g@|Q0IS_r`w}Y)!_i~XI@kefVvGi; +z8-WlBRDzx0($|HNYdBbm0!dFa&a7nWwLQVXJw6dkPH0#k`qR;(as?OVSFt>$_xSjW +zKgFhAH1{$}f7)7AwuU$>QgL)wOINqD@+?OaR*hr|ucN%S3tfz!<$+e~Gb$xociHG` +z$rn(DTzU)-wqOpW6)4P-+mi|kxs?=l#L3vxt+tiF#5Z2nJPz%WBOgZR07X?Q^bB7~ +zA_-1=K)^Y@)E1;EY(6h{LWep(*X8r_@V}cNILdaSB+a1yZX|xj>Qlp4fjI4p`#zmo +z32yB#s{9?9X2fe^RUGe{%nXG5ch +zJ;t@4JJN1ILSfh#yqCu=Wlc%MuM=G| +zlvRX1_1uR%S-Sa-Z09)H;80_}7dBroGL)gy(f6LdJNmT#fB#Ioh=eC$EX?;&lO(Ot +zN?_g*jo%vk~XnrY@Tb4MxDeJdTz3Zr}WHON(Hca}>Y54HO7=fW=&gN}gs7j#*Ow7JN7o4VDusRwd0=h_Lm#&~4zCA6&^23Y{Lrx+QR +zh!pD69i6H6h;k>Ym^~)6O}eW)u(wZaU{GXuq_gtJM4mm<56Cn!IEg&_367JoS+DUF +zL)&)LcXK+Xo0mf@i%4M(v4$bnHamBjSPt$HA|(sVw&QPP1oYWZ`r?N}6$6ref4Pvj +z@+1+vkJcf8{tTtOKd<&s^OMQ~uMRW?p6FGqY@&xSu+4*-!A#BaZE3^`RkTM$8v@`F +zVta)95=DoG2dlV2d^-x4+opkS`^oJQBmpJP#o9c;!lBgM+!4|Qf%UUHru>bx=0EYX^`V6l1%(Qsq(iIi=65k%P{ +zusBs!51*D-j5o}ZQ>Q8x>tr_QS(z)VWU6I!n)kJfSTzmmX8&-a-&H}`ZGJG8=;zha +zdqFC@ZN5UnUo?a9OFeZHivXw?cCAVK=-x89i=AHrFyZyT1ZH(yyFyee^~gUDhROsl +zAD_m|TS`xb7{g9&QTAlS-gk=1X$>-hp2<47>sNR4SSpx^<*&(bM3$Ko^1M)GXmdkf +zrc84H6T+_^#P-=>F(&sNxTBuRMuV|cQ1y~o_ZN3h(wjoZb^l_T{ +zJ$iF2W)p53F7K;QDeRwabx86STer&jNhLlS&q#niQeW1;z|h8p{r+xxKU~*m{o#vo +ztbtEa9+ls~A}R#J=LR#bg0Sj>X+E`KwDP7PEDDtzgT^As1E>-1x9GdhEDxBVe#u@H +zyhZzV{f#r+PE6Sk(KE`?_vZkj7K@(Wv$ru`xBPvGQF}#+lzoQXe%0G)E*XS(YD16L +z;DI0B@}RSW?Dt=}>L3}DXiKyi>m-sY`dvbwy~M>w;4c6#gvG?JYzop}G7vAYs`Ey# +zyMzfXj%NdTW2HjqHUlZ;P7mNe{E94j8)Iz%c29 +z)O6`n+#?mI>Sm{ppVad-&OiM~5>%}bt@_ozf(x&^BROoSeG$KOa83*O2zc@l$tbzVLO +zo|EcLw-Xprv-7#sa?MWg4xU+-{;Z95Eo%@C1rXq`SMYTUG)S90zSX1ld8|;@(Um#* +zk#4vMzm-IK&_A$fJ`gzpHL~xT&JOH^zR$1CStIMN9H!GSX_3ro)GqH#7u0J$UuG!` +zf^-(`umMUVNENn6*e$3*w(O&kw$QWa4-nieZx@zYkO2i)P* +z`QFf~-xYgl>0Gc`pq-7}*3PyBCtrKEF}{HH1+Q<^8_~6pf*O5*YP)4L5!d9Kon;jS +z1XSNy5bfxT)i-EMBDEH;LM484Zg+mFr{WYM@Ob^Q6qnJ;|LzG;{5E{kw%)D4SiQTJ +zDVkN!BuXw3hVD^@ERIW{iHVsb(&)v~yYr6(q%2ZB?murj&-dX}lbs^NCxd#$f)aFK +zMLDeIQo}4agm_1;91tb4ubs^iu!R5Jfk)pFhYyA!19DMs$e9Bh4$Yf_|2clSE$H1J +z{eA*E&111%-o{s3O39(ddd6x;%kOB_bRD@Pm&J{#-H}t*b1Nr4*S6uK+af)(aY1(r +zZ^a5MX)_T}j}JGRJ#=pA8(^R!wSOq^lrC1?z`~uGOhs)j!oiNbyIx9lI^!I}FYYMT +zCa17O)TPNkxrrD#AP6T&dOQen%u%}45USh=Lr|6;g_jX7i(KvB%k@J$V)KAt0`TSk +zvJK=U7=Ud+1Vg!F2^6<`+7C|%!)1B-e&vtGRWOL2rY>UTib7jW+^gHsyT^mydUN&~ +z_T94Sl41eFroBCt`fTD5no^C?xTI&u&*j$azqFg9Ft3(!F}++=j@Rg_Xq%E<9~p~i +zYwjkxDU&XKBG2L9^nChVX6#9s0)eW+_186d*mFfNARhGu-oZGkTNNfS{_vPI?+qGy +zeYeurVD$Y{OX|C?kxeq0>83JaI_n#z=j!Tp1%@?XeY%2F2TQMm^RLNX>GzzTN!&5O*qARy)c%b=()@UaqW~)dB{?)5tp8v#w%>Q{9^cKx#dh*Wkk2gTgPi1`3qkGI +z3?3ns7)&9z#1RqTdIdn;dV6JW&W2+x*)=E;MwmU&A6G~@jz +z=Tiaw3uu8{qE`A|eqzp;ld_K7mSSUdh<2i3rKBqqa?qb{lRx*);4d5x_sWPIzKII> +zcfgbaz;W`xmW*OoZrDFeLGgSlm5TH0y(AfC(B|>Ja8QKH1$SmzsDnEceiG{xkkrx~ +zCLk>aAgSe6yO3K%!PJMlbBqr^tyvimk@Nm~2g%?9w(bn~U`wPPJmVifZG_^;ewyE-x%!P@H?e2AZ@SWsslTkb2TgdW`xzl$wMC +z@s&a{&iPZmntqMOppFlXxp%(8v}Dod9O;qSIn=Bo+kjH0B(qrFtXjVM`w?}RWLD$l +z2{{sKq`k($x*BGr(cpatU1ESx*z^oU*NU1ri?%9Ck@_j;++te60t``f;quj!r>-nT +zt=+ty(72w%wG{Rxu|0f<}J<@aZi=VO!fXUxK*$zUCw +z{SVRT{Igk1cYvA4kMjwS8lOeN1s_qLDy*G`K^tkI)*HJh#t2!bT!f1yFFezUQbDTn +zu{Wv?Y6@u$Zf~jYU|9cP4;$G1@0cczJ)qHO3>u9pNx&xy3J1m8>b!Sua{-h7kv_@?{m*4u0U3X75N-+&$;#I<+NWD!Py{tLb0bz7 +zP;Iqb;qV3nSA4<;B9KY&7#DzfFSO^#?GLy5%viJc}C92t<-fu +zm&=xuO-g_&*{M4iV(oMhb`1oUj+u3U+g_C{o8JA# +zs>6=Kd(l?oZb-;pBmWfC%psYKgR@yF!7zTs9CpHxAIUxAY-cdrC@`Hp@3*k*>wP8T +zpHsT-`JrBd>MMjfq5Ft8t_vtj!g%-k+*ip7zbgqp|Xi)*5b;%ItV|tq`lfEb=5e{WNNrIS=p{v +zAwq7;D@W89b9*+eS +zrR=)_^F{3+=8H67z6=uB-AKkd8gwHyORqFY@~kytvrOivwn)D;Ee+f{*7S?U@h7)2 +zNbM8!4}YrK5tiFDJfp%r%s%`(1`=Sg0^`!8W#yd2mGso(Mfa+}(0Wy(q*_&9so=df +zcKh0!Y@OQCBt&ww#8C3UxDzO$z=r!FQ#01>d#5LYk1D2}4ao>k=CWB1*t|VR5cDdI +zXuI@W=MRmP$nmu*fpSmAy1^J|R7NNXjJ?60u5mqg{o^xBAyva??hQf7$=Aj*{*iBC +z_YLk_VFzCTf!jzC+LQZ^E`UUB9s2<5qqnMaav4z9S(AEf-YL*SJ +zQKNsGUrq538}fbXWE!WJ^qpKcr-(&>E{ci6Hn|RF44rluoVhaw$aM$4lk1eZH-uAx +z^@YW%P(T_`^Sqynq@c +z3)na*|2R`LGLGLk+)WZn;MGDXl>mu4Ln9SJ0@EL>qe^K)`>3E{ZJrVkeia>O8z2HS +z9M{>6n}kdp8J!-AJqqSrpP1U8f{Nm9^l(PZa(or2)dB6T9GM8#YGWu{5mQ8^uFSG& +zsdaaT!hg{%yM)>tU0BXt3Z+eaP?}m8{f^773aevjs|e{SU7HE6 +zp_ONQ9*HFy>qv+wXag}d4OpyF8Ah*CDG}qRjPwdWI?d$RSvN +zH)Qg#QIq<)5x*(M`Y;!(K6EPakfTUXr{8|QCTSu^^{1i1?HziF~&5ReG +zqHJ2CU+QRO!1QMM*84QpRW;#+Apa5?cBU5tk`-GvFG2O)<33$b(D4b21~rpOX-Q7a +z#9j6k?@a(K@OH3AC{)xO)r0CfKO?F>ZX3JvU4?iDl$$SJZZ#)0#tVOZ+McQq`663g +z-$*-0E)Qy8?4-rirCT||;Vd~vgnMJNsyn75w0D0KcMEoB)-%wXLjlrFg8P}jK~*@2 +zm)Z-+wQ^?_C1uJs1^?)48PyP&?1(3)`xnfilFAh>5%%6FH5f39y8At1`I5*b>_##o +zi{JW4|J1EDC3Lnx+se=+S0_iUSlwHbsZwC2sfO@^Yxx$cJNvh={CKOeT0O4*KSKJx +z56&Lt_%NH9GEP@=X$Ee*Svsi1euk&+M6;ja|4g6w;Tay}Jj2%8&oI$nZTQLA7YlFDElF9l2>Fu#I@R4HvLh?sv~afcX+~=^A2aA +zW)DkePae(62!`-0=CVDyAd;J!xHIN_lN~~2vP1O~_d}~6#`N4L;S#gXcTcgYE0L&= +zH#cNiLREdw-WR}DK1C<~(cmP{v!N%MY&d`P@)@1rN8P@_zZa&6%hg3Sy5;E)Gn^%G +zzkH1wasBz*b_lUO>XB8$Nja)Rn-qMjBs6$Q#idzhBui_Wj)sDRUzwc-dV&$HgLZQQ +zl|~)2Hh|NWI<3;|GCeDwZ#1O6G$)g-+kHuS>Qs-&v^vE=cVTZdfW*qCo^l}TuicQ1 +zPQ{@hKTYZ(23Vm0@rF#? +ztqYhV{jCEo8}Xu7C|WVz2i`(V$)u0Pvm(=D{7)G7{zh1H)%SMu>;hU-df=g%VIMRc +zMEhsN@h@v4^|51h&564PK)~OB_sN1bfD{g$2-Px3$5v7v;gu*#%~wZnPj@+#-BmVF +zzq+GV45lpqdl9zYF+d(gf7zvifX5>tcx!V+K{OTNZOaRX##-0yD~We8YfSDu&?A!H +z71<}utD+Y*Y-3zsIT+diEjIRo>ox!kvENCvm|`!YSzGixh919?ghEXfG7p@&cKOCm +z90SqV!vjE1Ji1^R$G|dF!9d^Dd{MubHP7`(%)XGQZzyJpjFrGlvO0%l|0GQDa($L= +z?_`V48-%j`9{tRgy5@;vyB_CxyZYPEe7 +zFFi)QwjIG(bBi@ +zBrWzz*g(dB7j|db_bv|(vo6x?Z$=>8-JT!0X_7e``bO?Mkn!IG`8Rl1@bJulK)^uu +zOlGwdAhmCaa@;dwaTiE|2*TgLfTHnwq?`mVD;W!;A;Hvpc8515QT~tVtNGXRrzaGP +zo~Egsl-3|-#U<7(Zp@?|-u-S1$LQ1YeJ1U&Ag3lMD1f_;r%3Q?bm=cP1$bx71WEjA +zf-m)qh&5VvXHCCci;kpMz$%vhQqaK$Bb1GtkU-#4(*U8FWrSj4(~GF)9x?Sc1X4?@ +zguZ51w`hc`yZwMzsb5s!n0Reu>S3`1p|j#nKKUoG>^u6btkZ%Rm(}2pVCE}Z;;@Hf +z^?F73nd^YLyAqSv2|CQF=Ub;_O6C{7=)E)8e5KvKw2=;Rrco1ZP0u$#d2fAnAjo^F +zd8kTbkB;nuzI~raa@qQ`N~pSg3zu=}c%t7S_rKb`PQOo9gTV=!?&LxUQCDG~xtBfG +zL>FxxD(?t7Qyy)P!$IE@j;6xDiqPUo^w(*Js~e*d#dNwbAFFb$|7Qtz3DHHp3N3gZrP( +z$fZ_PiUUT6BuhMx*4QMP=UUP(oZiVEz<x!kvYPf{v&%r)tTTz&d#Dc6IvH|Fmrg +zFd#ioK!f>8|5Rk`HTM~~P{~488+?DliqsfM_okDTfQ0hi#e=WC+(()~3e@+V83%P^|A +zOE99~YgFM>YB|{IbHCt9&iuL1C-EpIyd;A0l+rbYuNzmtvc&&?)png>O=f93&5%$s +zA+%5e2_%FfO6Y_dk*XlQ2?&Bnm8t>(OhN*oN{2`hFw#d+(NRPP5CKO-9k4Rv45NtS +zpleyn=+0hy-k@Xl-?!iHT={?Uyze>BdC$3@`@Ww8OHZm>;hr6fdqb-fy8^hfjM~yu%e1i +z>V_OUB~4)7BOx$z7UBSbnS1%n!s$Xp*_L3t4F|?jt}w5r>@yd>iPOdt`(trnf62gQ +z>lp@_?9~rbPA-gebVGYpdS{zCH#+R#D%Dz2JP3z72p(-JTbg5!_DWN3p^~w_RQiIV +zF-3S8-Eik4^L{VB +zs|k1Sgnjd{0W;A$`!;Be2>>sO^I8i|Cn1S#5)vMp77xjClOW_PEqs3MvwtDdgvp8y7bOLGP +zl?MiI`Cjf<`ftrxBpLd7-sw6an$R;p6Bdv)A##T4`F?#!l(l_>nz^4V+G3AdewGr# +zP{tc)9I~N6)waw&DkQTMhiurP1eYtd4Qp$c)$9^0Hy=X!^bPd(5t=)Xi8BEU`^<4T +zrsSjwcI>27(CVNFv1Y593k3~z0vupO&X8m%?FiTW-SnY3cS0h&=G78@*x@N5>Y7@Y +zLg|dy;D}#1O6H!Qh#?OpDEc4EqIxc8Ow-(s^y{0u>4npz*YBt`9?Ngi +zlX8$`jvS_t&*7E|@-i~3_9Z55EC;O}o0Joqq@vN3MDy7?Z=j9()3s$&5jmS`Y18FQ +zEDo)m*eySOVkFJ-tR(|~!LLd;+P1LxP?72ALZ}xOen-4{;BLx3MGSekiKDx&I~(b$ +zdTQ0VW8HT_TbjMU^6}Jk7?|DIlY$G;Iy*mHtlRUZ +zUw!>Ipl|QTb=xN6ibOo(S6AEC=_;J3lIg!zC1` +zXVMDb+66$OL#+^&!!f|27ZHu3VMSU(4Z1%$&8wm{486^gWh1mRCL8!CL=2dnwkPcL +zI^%dDyf^VovGl&YCU}83V}nrO7ohbYn1=Y=NBmSe69QY&^(T`Cxg<9LVnI`N}PEmg?ZSwH+y6@u1g2Mbbq!Lhl-eMj!~HC`MP%B5EqNm +zzs~1P*KuJdckM>2((KXu3uQHU+j2{gl&xhrVO1Wt(mNN6-Q|~yfd^vSrEOjy>H|q4 +z@mS-rz<#*a_F_}_-c~YkD!N!N@#yq;$K*=z4tuVRuw+nH5 +z4~ENOs;cvA%S!V1w1%;T^vEuF6oLJjm4T6TVEW8ssfS*cGI8S;GuUm&a;-`$UH>T*{%4>@|$V<9&byPTAH3$R` +zO{5st?Fvo@ZxPwnVr|bBo1PBMjZh`?uAYaUIu(020vF +z&d6p$cct>cV87GxfS$@@$Bjdz(jMydts!}bk^`es=-mq^elMP?tYSctH!83>A}i_K +z_Bmdmfg5>H+q(LQtjtvsxg=5tVVv!IcBV7e`S$ty?~Mu-8{T1KQR0n8VbN~>Bdp1L +z4pvcwtjwEpbMtpn^VlqIUKCMqK-<1B&y<&DUk%z1h1TKX6!d=W*-86ECi-1x3QG3 +z?t;rA_01t(YA0R&+k-pT1ZRFDfmRoEP9(axw5&KfKcF(&%DWnl5av175Di?&JeA5u +zRwR>RRI6NL%I|iuq;{E+GYIy*Dj7$WEx*wi2FpQ;IgSIRT^fiNYRF{_u5~6K0NO+p +za|B9&)w{H-(-e}@(4Ni!DUBnL(kwhf8$U$%Ey%aj(*wWvT$9p3&~UoDDX9)aI_i9D +zLj8LNi_J-{vrR^}O^zt;G?%e-EOhfo6;R-CGhHidH%x_x-T^Ocg|41&c~FaYIb4op +z831K=c)2u2s|VPu%HX87COM;l;Ed8AfNL7i*hoCx_R*~)0POTSrm)_0=yXFl>VtQJ +z-lHjcmjMf>m;GzYC+0u<+n-H`Cslgo`6;Eh{k;PQxaDs6j?Cw(6oo&Q_pr%uc#tkT +zpC`8!nGgb(-RERg#rLZSEvjj%r`0w?!r$;B3_KFs0~q&zqI8fVf*_e^KyESwjUwc( +znv;M<94DUmGYhloAz=`+zFG-orZW#S8p^F}K-{Dmv +z!VE-}D!329x8uv4-=PqurCgup2W*>y-~%{Uix4a}zBrU$5h8~vx2en#)Q22!C@I>X +zgJ>1CNA3@kii!?i7#^H?V5pq`4%D8w{;uzY`pgY;2y3{hNnJFb3`8P){$4sJS7^gf +z$~AF7v-Ub#mRN4x=0pfctxc&?tFAt_dB2wg7KIoQtJa@RqdDxycSD9IXvFwcGJ +zWI&hHVW7n1{MUFiS#HDz`C4$~)2;vT{P&Na_qUFJaJ4Uh$5D41goNt4Y)T~Q3yp!Z +z@P_RH3G{jg27$JzoygeL!IGLU8VHIY$-bgB(0R-Fz->?*y1gOPujr0?>JH=uAU$_6P4I-A8nl34?93b@dBUlA9somiw|% +z=uM)CWY60@cdiEoxa{5NUhX{f&up7~Ivj3}qvRL(!{yAK5<}s#Tanf^f|7pADD0p#m_PwbOI4D6pe_vI(RP04L44_?7pc4$KER_NtqI;7dc`7z +z^(|$$%VOdwo~g~6iBVTPy)7IH`u`N)<%|lj7kA&BI^VxMGTD(V7pM4qS-j+P1C8*o +zE7*Qux3hHw7F%o=DZrIP%3&&md`@*`gutT_IBXm4=z#A$AYDZGLORmO5zxK;6`Ugs*clLD +zpZb4rj@E-UI5z5UL+Nj8jggOdXZtV%uiKeg#l#nlB;LpC=y5e@ZJTK)WAxqJrTB;& +z!G-@bTg;QyHwr3{!WkWFt&(?<6FEfWxO$_-EY&^l&R`#ZK6XT*^WD`a!ggo!!zc1} +zS1V4@ea+gG2C|zYBhFRz|MGFbjS*U=nksv|(i^E{@~t!z&IEiC*4Sb(Yx}V5rE8a) +z7=SI7Uu&xEvL!v}{;^`0_E+{ylv5wl{i?eS95z`94AOZiJtK`eH}L +z%#I-hxznud%?4N(Tm07|_$r>gTjut@dkuYrsoUm?{!)9lA=ta6r>_YYD;&dJR+wHY +zPzS=+arI!ESz1Wmoz)xNMJq*-B|jrQvp4f(V5YbRM0bE^g%#^ksq#Q;$Jt3=vZ;dH +z)bb6{?CHTucNv*N(GDq2FC9GDC$b;jgWTWT3{4;4#7a+}R_=GNy;ct&(zMgwgO-1r +zS=7bh1wOF&_UF35L|Z45r*36!e&>RIDFwtQF5=`po|P>Aal`WP%gIwE)f-kF($O2y +zU!E+54xs+EsSA-z9k7B0QwLcqc|&BsCEH8siYWcd=x1kPoMnslzaa*(c}{H)ZR%lk +zkFHwLpve&*(z@Sff_l%~d?h#`i-0fg;RS21E9K{H-H;adT0z=ejwbmp$WwbGm;_@y +z5ZYGUAv{)aFBLojh3%IaE>9a!T0N;IKb)xfZFKJXZO!L77bDQN($3O)0MK6}W1D@N +zNJhmtm`DKeL>XjsGw{nb@E`DXPfG6PCpYs+$M@@^k}p-=#CRDs@uWzAYZYrO2!#QL +z0lK{?MunmV2O1{S3K~W%+47evpKW_6k~wdgT#q89VW=qD`K76Z1zIlpF+Qe5MG0qpy`f~21fNByBobrHg`r2v$hpNlKJvwe(6}Y(Z-=!k&*Gy{uWRd)n*1(pb +zmhlketGtVC)$e6>4;=DJ={?nex>UVH80}B+*Y;d6lintvk>$bIFqFM7#(a+Ah9Eyx +z=euIITjy-{%3O&SC*8aFB5CA>!Qt%LSGJ4m&tAIa)!kmKC#pE)eGuishznOWzD$t% +zu<1w!lm!DC0$y~53Ry0u#BRDg;a@II=%XzPb?UdlLS3ZP^=v +zDAtoC4+_o3M)06dM^EBn`_HcNGwy-iu`_&uT-S9k@ztmXmAk^^y^yiMlx!BgG!VjI +GcK-red%TAL + +literal 0 +HcmV?d00001 + +diff --git a/vcl/source/filter/igif/decode.cxx b/vcl/source/filter/igif/decode.cxx +index bf29328..5900b4c 100644 +--- a/vcl/source/filter/igif/decode.cxx ++++ b/vcl/source/filter/igif/decode.cxx +@@ -166,10 +166,13 @@ bool GIFLZWDecompressor::ProcessOneCode() + } + else if ( ( nCode > nEOICode ) && ( nCode <= nTableSize ) ) + { +- if ( nCode == nTableSize ) +- AddToTable( nOldCode, nOldCode ); +- else +- AddToTable( nOldCode, nCode ); ++ if ( nOldCode != 0xffff ) ++ { ++ if ( nCode == nTableSize ) ++ AddToTable( nOldCode, nOldCode ); ++ else ++ AddToTable( nOldCode, nCode ); ++ } + } + else + { +-- +1.9.3 + diff --git a/SOURCES/0100-cp-2013101510000026-wrong-highlight-of-commented-tex.patch b/SOURCES/0100-cp-2013101510000026-wrong-highlight-of-commented-tex.patch deleted file mode 100644 index bf26d90..0000000 --- a/SOURCES/0100-cp-2013101510000026-wrong-highlight-of-commented-tex.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 28d59a1a48d633f438e344f247362af0858d8911 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Zolnai=20Tam=C3=A1s?= -Date: Fri, 3 Jan 2014 11:38:05 +0100 -Subject: [PATCH 100/109] cp#2013101510000026: wrong highlight of commented - text range imported from doc - -When makeFieldBookmark() method is called with -ODF_COMMENTRANGE it will ignore the added field name and -generate an own one. We have to set the name of the -SwPostItField to this generated name so these two names will match. - -Note: lTagBkmk is only an identifier but not the exported name -of the fieldmark so we don't need to stick to use it as -a name. - -(cherry picked from commit 12e287220ebaf3a8f5eaf7bf526dce2c47f45a20) - -Conflicts: - sw/source/filter/ww8/ww8par.cxx - -(cherry picked from commit d6fc6624e1319257945f49388d635c36685108d5) - -Change-Id: I499abdcce1be0563c308bcf9f5c0a959a07f858b ---- - sw/qa/extras/ww8import/ww8import.cxx | 1 - - sw/source/filter/ww8/ww8par.cxx | 7 +++---- - 2 files changed, 3 insertions(+), 5 deletions(-) - -diff --git a/sw/qa/extras/ww8import/ww8import.cxx b/sw/qa/extras/ww8import/ww8import.cxx -index ef68da6..50ef934 100644 ---- a/sw/qa/extras/ww8import/ww8import.cxx -+++ b/sw/qa/extras/ww8import/ww8import.cxx -@@ -242,7 +242,6 @@ void Test::testFdo59530() - uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); - uno::Reference xFields(xFieldsAccess->createEnumeration()); - xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); -- CPPUNIT_ASSERT_EQUAL(OUString("346376201"), getProperty(xPropertySet, "Name")); - CPPUNIT_ASSERT_EQUAL(OUString("M"), getProperty(xPropertySet, "Initials")); - } - -diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx -index b34b966..56040b7 100644 ---- a/sw/source/filter/ww8/ww8par.cxx -+++ b/sw/source/filter/ww8/ww8par.cxx -@@ -1790,7 +1790,6 @@ long SwWW8ImplReader::Read_And(WW8PLCFManResult* pRes) - - String sAuthor; - String sInitials; -- String sName; - if( bVer67 ) - { - const WW67_ATRD* pDescri = (const WW67_ATRD*)pSD->GetData(); -@@ -1820,7 +1819,6 @@ long SwWW8ImplReader::Read_And(WW8PLCFManResult* pRes) - sal_uInt32 nTagBkmk = SVBT32ToUInt32(pDescri->ITagBkmk); - if (nTagBkmk != 0xFFFFFFFF) - { -- sName = OUString::valueOf(sal_Int32(nTagBkmk)); - int nAtnIndex = GetAnnotationIndex(nTagBkmk); - if (nAtnIndex != -1) - { -@@ -1855,14 +1853,15 @@ long SwWW8ImplReader::Read_And(WW8PLCFManResult* pRes) - this->pFmtOfJustInsertedApo = 0; - SwPostItField aPostIt( - (SwPostItFieldType*)rDoc.GetSysFldType(RES_POSTITFLD), sAuthor, -- sTxt, sInitials, sName, aDate ); -+ sTxt, sInitials, String(), aDate ); - aPostIt.SetTextObject(pOutliner); - - // If this is a range, create the associated fieldmark. - if (pPaM->HasMark()) - { - IDocumentMarkAccess* pMarksAccess = rDoc.getIDocumentMarkAccess(); -- pMarksAccess->makeFieldBookmark(*pPaM, aPostIt.GetName(), ODF_COMMENTRANGE); -+ sw::mark::IFieldmark* pFieldmark = pMarksAccess->makeFieldBookmark(*pPaM, OUString(), ODF_COMMENTRANGE); -+ aPostIt.SetName(pFieldmark->GetName()); - pPaM->Exchange(); - pPaM->DeleteMark(); - } --- -1.8.4.2 - diff --git a/SOURCES/0101-cp-2013101510000026-fix-doc-export-of-comments-initi.patch b/SOURCES/0101-cp-2013101510000026-fix-doc-export-of-comments-initi.patch deleted file mode 100644 index ed6ef75..0000000 --- a/SOURCES/0101-cp-2013101510000026-fix-doc-export-of-comments-initi.patch +++ /dev/null @@ -1,167 +0,0 @@ -From e3f729cbe49baccc9d40c41af183529e494dd1d9 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Zolnai=20Tam=C3=A1s?= -Date: Fri, 3 Jan 2014 15:26:21 +0100 -Subject: [PATCH 101/109] cp#2013101510000026: fix doc export of comments - initials - -It seems comments' authers were exported twice. Once istead -of initials. - -(cherry picked from commit 0127e3dbabaf24c6c0d828e6d26357ff0b63c3fb) - -Conflicts: - sw/source/filter/ww8/wrtw8sty.cxx - sw/source/filter/ww8/wrtww8.hxx - -Change-Id: I082fb5caea99df013922e16c5d8d4ef29e866665 -(cherry picked from commit 7d12ed75718fcee74a731113928a12af0bb0e2f5) ---- - sw/source/filter/ww8/wrtw8sty.cxx | 55 ++++++++++++++++++++++----------------- - sw/source/filter/ww8/wrtww8.hxx | 1 + - 2 files changed, 32 insertions(+), 24 deletions(-) - -diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx -index bc08a72..17aad68 100644 ---- a/sw/source/filter/ww8/wrtw8sty.cxx -+++ b/sw/source/filter/ww8/wrtw8sty.cxx -@@ -1953,6 +1953,7 @@ WW8_Annotation::WW8_Annotation(const SwPostItField* pPostIt) - if (!mpRichText) - msSimpleText = pPostIt->GetTxt(); - msOwner = pPostIt->GetPar1(); -+ m_sInitials = pPostIt->GetInitials(); - maDateTime = DateTime(pPostIt->GetDate(), pPostIt->GetTime()); - } - -@@ -2118,11 +2119,14 @@ bool WW8_WrPlcSubDoc::WriteGenericTxt( WW8Export& rWrt, sal_uInt8 nTTyp, - return ( rCount != 0 ); - } - -+static bool lcl_AuthorComp( const std::pair& aFirst, const std::pair& aSecond) -+{ -+ return aFirst.first < aSecond.first; -+} -+ - void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, - WW8_FC& rTxtStart, sal_Int32& rTxtCount, WW8_FC& rRefStart, sal_Int32& rRefCount ) const - { -- typedef ::std::vector::iterator myiter; -- - sal_uLong nFcStart = rWrt.pTableStrm->Tell(); - sal_uInt16 nLen = aCps.size(); - if ( !nLen ) -@@ -2130,7 +2134,8 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, - - OSL_ENSURE( aCps.size() + 2 == pTxtPos->Count(), "WritePlc: DeSync" ); - -- ::std::vector aStrArr; -+ ::std::vector > aStrArr; -+ typedef ::std::vector >::iterator myiter; - WW8Fib& rFib = *rWrt.pFib; // n+1-te CP-Pos nach Handbuch - sal_uInt16 i; - bool bWriteCP = true; -@@ -2143,11 +2148,11 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, - for ( i = 0; i < nLen; ++i ) - { - const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i]; -- aStrArr.push_back(rAtn.msOwner); -+ aStrArr.push_back(std::pair(rAtn.msOwner,rAtn.m_sInitials)); - } - - //sort and remove duplicates -- ::std::sort(aStrArr.begin(), aStrArr.end()); -+ ::std::sort(aStrArr.begin(), aStrArr.end(),&lcl_AuthorComp); - myiter aIter = ::std::unique(aStrArr.begin(), aStrArr.end()); - aStrArr.erase(aIter, aStrArr.end()); - -@@ -2155,9 +2160,9 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, - { - for ( i = 0; i < aStrArr.size(); ++i ) - { -- const String& rStr = aStrArr[i]; -- SwWW8Writer::WriteShort(*rWrt.pTableStrm, rStr.Len()); -- SwWW8Writer::WriteString16(*rWrt.pTableStrm, rStr, -+ const String& sAuthor = aStrArr[i].first; -+ SwWW8Writer::WriteShort(*rWrt.pTableStrm, sAuthor.Len()); -+ SwWW8Writer::WriteString16(*rWrt.pTableStrm, sAuthor, - false); - } - } -@@ -2165,9 +2170,9 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, - { - for ( i = 0; i < aStrArr.size(); ++i ) - { -- const String& rStr = aStrArr[i]; -- *rWrt.pTableStrm << (sal_uInt8)rStr.Len(); -- SwWW8Writer::WriteString8(*rWrt.pTableStrm, rStr, false, -+ const String& sAuthor = aStrArr[i].first; -+ *rWrt.pTableStrm << (sal_uInt8)sAuthor.Len(); -+ SwWW8Writer::WriteString8(*rWrt.pTableStrm, sAuthor, false, - RTL_TEXTENCODING_MS_1252); - } - } -@@ -2266,35 +2271,37 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, - - //aStrArr is sorted - myiter aIter = ::std::lower_bound(aStrArr.begin(), -- aStrArr.end(), rAtn.msOwner); -- OSL_ENSURE(aIter != aStrArr.end() && *aIter == rAtn.msOwner, -+ aStrArr.end(), std::pair(rAtn.msOwner,String()), -+ &lcl_AuthorComp); -+ OSL_ENSURE(aIter != aStrArr.end() && aIter->first == rAtn.msOwner, - "Impossible"); - sal_uInt16 nFndPos = static_cast< sal_uInt16 >(aIter - aStrArr.begin()); -- String sAuthor(*aIter); -- sal_uInt8 nNameLen = (sal_uInt8)sAuthor.Len(); -- if ( nNameLen > 9 ) -+ -+ String sInitials( aIter->second ); -+ sal_uInt8 nInitialsLen = (sal_uInt8)sInitials.Len(); -+ if ( nInitialsLen > 9 ) - { -- sAuthor.Erase( 9 ); -- nNameLen = 9; -+ sInitials.Erase( 9 ); -+ nInitialsLen = 9; - } - - // xstUsrInitl[ 10 ] pascal-style String holding initials - // of annotation author - if ( rWrt.bWrtWW8 ) - { -- SwWW8Writer::WriteShort(*rWrt.pTableStrm, nNameLen); -- SwWW8Writer::WriteString16(*rWrt.pTableStrm, sAuthor, -+ SwWW8Writer::WriteShort(*rWrt.pTableStrm, nInitialsLen); -+ SwWW8Writer::WriteString16(*rWrt.pTableStrm, sInitials, - false); - SwWW8Writer::FillCount( *rWrt.pTableStrm, -- (9 - nNameLen) * 2 ); -+ (9 - nInitialsLen) * 2 ); - - } - else - { -- *rWrt.pTableStrm << nNameLen; -- SwWW8Writer::WriteString8(*rWrt.pTableStrm, sAuthor, -+ *rWrt.pTableStrm << nInitialsLen; -+ SwWW8Writer::WriteString8(*rWrt.pTableStrm, sInitials, - false, RTL_TEXTENCODING_MS_1252); -- SwWW8Writer::FillCount(*rWrt.pTableStrm, 9 - nNameLen); -+ SwWW8Writer::FillCount(*rWrt.pTableStrm, 9 - nInitialsLen); - } - - // documents layout of WriteShort's below: -diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx -index c48e101..bfbbe03 100644 ---- a/sw/source/filter/ww8/wrtww8.hxx -+++ b/sw/source/filter/ww8/wrtww8.hxx -@@ -1187,6 +1187,7 @@ struct WW8_Annotation - const OutlinerParaObject* mpRichText; - String msSimpleText; - String msOwner; -+ String m_sInitials; - DateTime maDateTime; - WW8_Annotation(const SwPostItField* pPostIt); - WW8_Annotation(const SwRedlineData* pRedline); --- -1.8.4.2 - diff --git a/SOURCES/0102-cp-2013101510000026-doc-export-of-commented-text-ran.patch b/SOURCES/0102-cp-2013101510000026-doc-export-of-commented-text-ran.patch deleted file mode 100644 index 0a7a79f..0000000 --- a/SOURCES/0102-cp-2013101510000026-doc-export-of-commented-text-ran.patch +++ /dev/null @@ -1,307 +0,0 @@ -From d3a5776b00ee07ac371dd180a6d962d50da4baf5 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Zolnai=20Tam=C3=A1s?= -Date: Fri, 3 Jan 2014 15:21:32 +0100 -Subject: [PATCH 102/109] cp#2013101510000026: doc export of commented text - ranges - -(cherry picked from commit 5969eec0e998804eba77338b17de90737e2acb43) - -Conflicts: - sw/qa/extras/ww8export/ww8export.cxx - sw/qa/extras/ww8import/ww8import.cxx - sw/source/filter/ww8/wrtw8sty.cxx - sw/source/filter/ww8/ww8attributeoutput.hxx - -(cherry picked from commit 765d89aa149e9afc78382e24bf7c86f70b1584ff) - -Change-Id: I2d31da5d659edcbebc682d5604d2db24b5e341fb ---- - sw/qa/extras/ww8export/data/fdo59530.doc | Bin 0 -> 9728 bytes - sw/qa/extras/ww8export/ww8export.cxx | 27 ++++++++ - sw/qa/extras/ww8import/data/fdo59530.doc | Bin 22528 -> 0 bytes - sw/qa/extras/ww8import/ww8import.cxx | 26 ------- - sw/source/filter/ww8/wrtw8sty.cxx | 104 ++++++++++++++++++++++++++-- - sw/source/filter/ww8/wrtww8.hxx | 8 ++- - sw/source/filter/ww8/ww8atr.cxx | 5 ++ - sw/source/filter/ww8/ww8attributeoutput.hxx | 2 + - 8 files changed, 139 insertions(+), 33 deletions(-) - create mode 100644 sw/qa/extras/ww8export/data/fdo59530.doc - delete mode 100755 sw/qa/extras/ww8import/data/fdo59530.doc - -diff --git a/sw/qa/extras/ww8import/ww8import.cxx b/sw/qa/extras/ww8import/ww8import.cxx -index 50ef934..3311563 100644 ---- a/sw/qa/extras/ww8import/ww8import.cxx -+++ b/sw/qa/extras/ww8import/ww8import.cxx -@@ -30,7 +30,6 @@ public: - void testN757118(); - void testN757905(); - void testAllGapsWord(); -- void testFdo59530(); - void testI120158(); - void testN816603(); - void testN816593(); -@@ -57,7 +56,6 @@ void Test::run() - {"n757118.doc", &Test::testN757118}, - {"n757905.doc", &Test::testN757905}, - {"all_gaps_word.doc", &Test::testAllGapsWord}, -- {"fdo59530.doc", &Test::testFdo59530}, - {"i120158.doc", &Test::testI120158}, - {"n816603.doc", &Test::testN816603}, - {"n816593.doc", &Test::testN816593}, -@@ -221,30 +219,6 @@ void Test::testAllGapsWord() - borderTest.testTheBorders(mxComponent); - } - --void Test::testFdo59530() --{ -- // See ooxmlexport's testFdo38244(). -- // Test comment range feature. -- uno::Reference xTextDocument(mxComponent, uno::UNO_QUERY); -- uno::Reference xParaEnumAccess(xTextDocument->getText(), uno::UNO_QUERY); -- uno::Reference xParaEnum = xParaEnumAccess->createEnumeration(); -- uno::Reference xRunEnumAccess(xParaEnum->nextElement(), uno::UNO_QUERY); -- uno::Reference xRunEnum = xRunEnumAccess->createEnumeration(); -- xRunEnum->nextElement(); -- uno::Reference xPropertySet(xRunEnum->nextElement(), uno::UNO_QUERY); -- CPPUNIT_ASSERT_EQUAL(OUString("TextFieldStart"), getProperty(xPropertySet, "TextPortionType")); -- xRunEnum->nextElement(); -- xPropertySet.set(xRunEnum->nextElement(), uno::UNO_QUERY); -- CPPUNIT_ASSERT_EQUAL(OUString("TextFieldEnd"), getProperty(xPropertySet, "TextPortionType")); -- -- // Test initials. -- uno::Reference xTextFieldsSupplier(mxComponent, uno::UNO_QUERY); -- uno::Reference xFieldsAccess(xTextFieldsSupplier->getTextFields()); -- uno::Reference xFields(xFieldsAccess->createEnumeration()); -- xPropertySet.set(xFields->nextElement(), uno::UNO_QUERY); -- CPPUNIT_ASSERT_EQUAL(OUString("M"), getProperty(xPropertySet, "Initials")); --} -- - void Test::testI120158() - { - // See https://issues.apache.org/ooo/show_bug.cgi?id=120158 -diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx -index 17aad68..0b5422c 100644 ---- a/sw/source/filter/ww8/wrtw8sty.cxx -+++ b/sw/source/filter/ww8/wrtw8sty.cxx -@@ -1945,9 +1945,11 @@ void WW8_WrPlcFtnEdn::Append( WW8_CP nCp, const SwFmtFtn& rFtn ) - aCntnt.push_back( &rFtn ); - } - --WW8_Annotation::WW8_Annotation(const SwPostItField* pPostIt) -+WW8_Annotation::WW8_Annotation(const SwPostItField* pPostIt, WW8_CP nRangeStart, WW8_CP nRangeEnd) - : -- maDateTime( DateTime::EMPTY ) -+ maDateTime( DateTime::EMPTY ), -+ m_nRangeStart(nRangeStart), -+ m_nRangeEnd(nRangeEnd) - { - mpRichText = pPostIt->GetTextObject(); - if (!mpRichText) -@@ -1960,17 +1962,33 @@ WW8_Annotation::WW8_Annotation(const SwPostItField* pPostIt) - WW8_Annotation::WW8_Annotation(const SwRedlineData* pRedline) - : - mpRichText(0), -- maDateTime( DateTime::EMPTY ) -+ maDateTime( DateTime::EMPTY ), -+ m_nRangeStart(0), -+ m_nRangeEnd(0) - { - msSimpleText = pRedline->GetComment(); - msOwner = SW_MOD()->GetRedlineAuthor(pRedline->GetAuthor()); - maDateTime = pRedline->GetTimeStamp(); - } - -+void WW8_WrPlcAnnotations::AddRangeStartPosition( WW8_CP nStartCp) -+{ -+ m_nLastRangeStartPos = nStartCp; -+} -+ - void WW8_WrPlcAnnotations::Append( WW8_CP nCp, const SwPostItField *pPostIt ) - { - aCps.push_back( nCp ); -- WW8_Annotation* p = new WW8_Annotation(pPostIt); -+ WW8_Annotation* p; -+ if( m_nLastRangeStartPos != -1 ) -+ { -+ p = new WW8_Annotation(pPostIt, m_nLastRangeStartPos, nCp); -+ m_nLastRangeStartPos = -1; -+ } -+ else -+ { -+ p = new WW8_Annotation(pPostIt, nCp, nCp); -+ } - aCntnt.push_back( p ); - } - -@@ -2144,11 +2162,19 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, - { - case TXT_ATN: - { -+ std::vector aRangeStartPos; -+ std::vector aRangeEndPos; - // then write first the GrpXstAtnOwners - for ( i = 0; i < nLen; ++i ) - { - const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i]; -+ - aStrArr.push_back(std::pair(rAtn.msOwner,rAtn.m_sInitials)); -+ if( rAtn.m_nRangeStart != rAtn.m_nRangeEnd ) -+ { -+ aRangeStartPos.push_back(rAtn.m_nRangeStart); -+ aRangeEndPos.push_back(rAtn.m_nRangeEnd); -+ } - } - - //sort and remove duplicates -@@ -2181,6 +2207,67 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, - nFcStart = rWrt.pTableStrm->Tell(); - rFib.lcbGrpStAtnOwners = nFcStart - rFib.fcGrpStAtnOwners; - -+ // Commented text ranges -+ if ( rWrt.bWrtWW8 ) -+ { -+ if( aRangeStartPos.size() > 0 ) -+ { -+ // Commented text ranges starting positions (Plcfbkf.aCP) -+ rFib.fcPlcfAtnbkf = nFcStart; -+ for ( i = 0; i < aRangeStartPos.size(); ++i ) -+ { -+ SwWW8Writer::WriteLong( *rWrt.pTableStrm, aRangeStartPos[i] ); -+ } -+ SwWW8Writer::WriteLong( *rWrt.pTableStrm, aRangeStartPos[i-1] + 1); -+ -+ // Commented text ranges additional informations (Plcfbkf.aFBKF) -+ for ( i = 0; i < aRangeStartPos.size(); ++i ) -+ { -+ SwWW8Writer::WriteShort( *rWrt.pTableStrm, i ); // FBKF.ibkl -+ SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 ); // FBKF.bkc -+ } -+ -+ nFcStart = rWrt.pTableStrm->Tell(); -+ rFib.lcbPlcfAtnbkf = nFcStart - rFib.fcPlcfAtnbkf; -+ -+ // Commented text ranges ending positions (PlcfBkl.aCP) -+ rFib.fcPlcfAtnbkl = nFcStart; -+ for ( i = 0; i < aRangeEndPos.size(); ++i ) -+ { -+ SwWW8Writer::WriteLong( *rWrt.pTableStrm, aRangeEndPos[i] ); -+ } -+ SwWW8Writer::WriteLong( *rWrt.pTableStrm, aRangeEndPos[i-1] + 1); -+ -+ // Commented text ranges additional informations (Plcfbkl.aFBKF) -+ for ( i = 0; i < aRangeEndPos.size(); ++i ) -+ { -+ SwWW8Writer::WriteShort( *rWrt.pTableStrm, i ); // FBKF.ibkl -+ SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 ); // FBKF.bkc -+ } -+ -+ nFcStart = rWrt.pTableStrm->Tell(); -+ rFib.lcbPlcfAtnbkl = nFcStart - rFib.fcPlcfAtnbkl; -+ -+ // Commented text ranges as bookmarks (SttbfAtnBkmk) -+ rFib.fcSttbfAtnbkmk = nFcStart; -+ SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0xFFFF ); // SttbfAtnBkmk.fExtend -+ SwWW8Writer::WriteShort( *rWrt.pTableStrm, aRangeStartPos.size() ); // SttbfAtnBkmk.cData -+ SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0xA ); // SttbfAtnBkmk.cbExtra -+ -+ for ( i = 0; i < aRangeStartPos.size(); ++i ) -+ { -+ SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 ); // SttbfAtnBkmk.cchData -+ // One ATNBE structure for all text ranges -+ SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0x0100 ); // ATNBE.bmc -+ SwWW8Writer::WriteLong( *rWrt.pTableStrm, i ); // ATNBE.lTag -+ SwWW8Writer::WriteLong( *rWrt.pTableStrm, -1 ); // ATNBE.lTagOld -+ } -+ -+ nFcStart = rWrt.pTableStrm->Tell(); -+ rFib.lcbSttbfAtnbkmk = nFcStart - rFib.fcSttbfAtnbkmk; -+ } -+ } -+ - // Write the extended >= Word XP ATLD records - if( rWrt.bWrtWW8 ) - { -@@ -2265,6 +2352,7 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, - - if ( TXT_ATN == nTTyp ) - { -+ sal_uInt16 nlTag = 0; - for ( i = 0; i < nLen; ++i ) - { - const WW8_Annotation& rAtn = *(const WW8_Annotation*)aCntnt[i]; -@@ -2314,7 +2402,13 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, - SwWW8Writer::WriteShort( *rWrt.pTableStrm, nFndPos ); - SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 ); - SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 ); -- SwWW8Writer::WriteLong( *rWrt.pTableStrm, -1 ); -+ if( rAtn.m_nRangeStart != rAtn.m_nRangeEnd ) -+ { -+ SwWW8Writer::WriteLong( *rWrt.pTableStrm, nlTag ); -+ ++nlTag; -+ } -+ else -+ SwWW8Writer::WriteLong( *rWrt.pTableStrm, -1 ); - } - } - else -diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx -index bfbbe03..9c4b267 100644 ---- a/sw/source/filter/ww8/wrtww8.hxx -+++ b/sw/source/filter/ww8/wrtww8.hxx -@@ -1189,7 +1189,8 @@ struct WW8_Annotation - String msOwner; - String m_sInitials; - DateTime maDateTime; -- WW8_Annotation(const SwPostItField* pPostIt); -+ WW8_CP m_nRangeStart, m_nRangeEnd; -+ WW8_Annotation(const SwPostItField* pPostIt, WW8_CP nRangeStart, WW8_CP nRangeEnd); - WW8_Annotation(const SwRedlineData* pRedline); - }; - -@@ -1200,10 +1201,13 @@ private: - WW8_WrPlcAnnotations(const WW8_WrPlcAnnotations&); - WW8_WrPlcAnnotations& operator=(WW8_WrPlcAnnotations&); - std::set maProcessedRedlines; -+ -+ WW8_CP m_nLastRangeStartPos; - public: -- WW8_WrPlcAnnotations() {} -+ WW8_WrPlcAnnotations(): m_nLastRangeStartPos(-1){} - ~WW8_WrPlcAnnotations(); - -+ void AddRangeStartPosition( WW8_CP nStartCp ); - void Append( WW8_CP nCp, const SwPostItField* pPostIt ); - void Append( WW8_CP nCp, const SwRedlineData* pRedLine ); - bool IsNewRedlineComment( const SwRedlineData* pRedLine ); -diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx -index d211344..fa1a3be 100644 ---- a/sw/source/filter/ww8/ww8atr.cxx -+++ b/sw/source/filter/ww8/ww8atr.cxx -@@ -2465,6 +2465,11 @@ void WW8AttributeOutput::PostitField( const SwField* pFld ) - m_rWW8Export.WritePostItBegin( m_rWW8Export.pO ); - } - -+void WW8AttributeOutput::WritePostitFieldStart() -+{ -+ m_rWW8Export.pAtn->AddRangeStartPosition( m_rWW8Export.Fc2Cp( m_rWW8Export.Strm().Tell() ) ); -+} -+ - bool WW8AttributeOutput::DropdownField( const SwField* pFld ) - { - bool bExpand = true; -diff --git a/sw/source/filter/ww8/ww8attributeoutput.hxx b/sw/source/filter/ww8/ww8attributeoutput.hxx -index 4c64635..a9693ad 100644 ---- a/sw/source/filter/ww8/ww8attributeoutput.hxx -+++ b/sw/source/filter/ww8/ww8attributeoutput.hxx -@@ -393,6 +393,8 @@ protected: - virtual bool DropdownField( const SwField* pFld ); - virtual bool PlaceholderField( const SwField* pFld ); - -+ virtual void WritePostitFieldStart(); -+ - virtual bool AnalyzeURL( const String& rURL, const String& rTarget, String* pLinkURL, String* pMark ); - - /// Reference to the export, where to get the data from --- -1.8.4.2 - diff --git a/SOURCES/0103-cp-2013101510000026-doc-import-of-comments-affecting.patch b/SOURCES/0103-cp-2013101510000026-doc-import-of-comments-affecting.patch deleted file mode 100644 index 00ac1ec..0000000 --- a/SOURCES/0103-cp-2013101510000026-doc-import-of-comments-affecting.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 17f7655b6dedb7349c3ecd8445f119c4d14641b0 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Zolnai=20Tam=C3=A1s?= -Date: Fri, 3 Jan 2014 00:41:56 +0100 -Subject: [PATCH 103/109] cp#2013101510000026: doc import of comments affecting - more text nodes - -Change-Id: I3932d82cb4cd640b19957b93cc7e59711af1b564 -(cherry picked from commit f2945255df273404ee2457dcf761cb8f334b732b) -(cherry picked from commit e0bd7b01f31bfbaeac3bce86403bf25929c61c84) ---- - sw/qa/extras/ww8export/data/fdo59530.doc | Bin 9728 -> 10240 bytes - sw/qa/extras/ww8export/ww8export.cxx | 15 +++++++++- - sw/source/filter/ww8/ww8par.cxx | 49 +++++++++++++++++++++++++++---- - 3 files changed, 58 insertions(+), 6 deletions(-) - -diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx -index 56040b7..645d246 100644 ---- a/sw/source/filter/ww8/ww8par.cxx -+++ b/sw/source/filter/ww8/ww8par.cxx -@@ -1825,11 +1825,50 @@ long SwWW8ImplReader::Read_And(WW8PLCFManResult* pRes) - WW8_CP nStart = GetAnnotationStart(nAtnIndex); - WW8_CP nEnd = GetAnnotationEnd(nAtnIndex); - sal_Int32 nLen = nEnd - nStart; -- // Don't support ranges affecting multiple SwTxtNode for now. -- if (nLen && pPaM->GetPoint()->nContent.GetIndex() >= nLen) -- { -- pPaM->SetMark(); -- pPaM->GetPoint()->nContent -= nLen; -+ if( nLen ) -+ { -+ if (pPaM->GetPoint()->nContent.GetIndex() >= nLen) -+ { -+ pPaM->SetMark(); -+ pPaM->GetPoint()->nContent -= nLen; -+ } -+ else if (pPaM->GetPoint()->nNode.GetNode().IsTxtNode() ) -+ { -+ pPaM->SetMark(); -+ nLen -= pPaM->GetPoint()->nContent.GetIndex(); -+ -+ SwTxtNode* pTxtNode = 0; -+ // Find first text node which affected by the comment -+ while( pPaM->GetPoint()->nNode >= 0 ) -+ { -+ SwNode* pNode = 0; -+ // Find previous text node -+ do -+ { -+ pPaM->GetPoint()->nNode--; -+ nLen--; // End line character -+ pNode = &pPaM->GetPoint()->nNode.GetNode(); -+ } -+ while( !pNode->IsTxtNode() && pPaM->GetPoint()->nNode >= 0 ); -+ -+ // Subtrackt previous text node's length -+ if( pNode && pNode->IsTxtNode() ) -+ { -+ pTxtNode = pNode->GetTxtNode(); -+ if( nLen < pTxtNode->Len() ) -+ break; -+ else -+ nLen -= pTxtNode->Len(); -+ } -+ } -+ -+ // Set postion of the text range's first character -+ if( pTxtNode ) -+ { -+ pTxtNode->MakeStartIndex(&pPaM->GetPoint()->nContent); -+ pPaM->GetPoint()->nContent += pTxtNode->Len() - nLen; -+ } -+ } - } - } - } --- -1.8.4.2 - diff --git a/SOURCES/0104-pages-with-equal-Priority-and-Class-getting-dropped.patch b/SOURCES/0104-pages-with-equal-Priority-and-Class-getting-dropped.patch deleted file mode 100644 index b401cf2..0000000 --- a/SOURCES/0104-pages-with-equal-Priority-and-Class-getting-dropped.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 6a7a73d278c300ac7519d1ec50e5a4495f174f89 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= -Date: Thu, 12 Dec 2013 12:37:43 +0000 -Subject: [PATCH 104/109] pages with equal Priority and Class getting dropped - -Change-Id: Ib053dc4b6e5fb5f01f48c71a4b295a53c0ec6715 -(cherry picked from commit 9790588da4b2de455ffc7a2cc69f26539823c3da) -(cherry picked from commit be366ad7690b190c5ef4dc42311a4df6b7dcce4b) -Reviewed-on: https://gerrit.libreoffice.org/7054 -Reviewed-by: Stephan Bergmann -Tested-by: Stephan Bergmann ---- - sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx | 11 ++++++++--- - 1 file changed, 8 insertions(+), 3 deletions(-) - -diff --git a/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx b/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx -index d02bae1..835787b 100644 ---- a/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx -+++ b/sd/source/ui/slidesorter/cache/SlsRequestQueue.cxx -@@ -40,9 +40,14 @@ public: - bool operator() (const Request& rRequest1, const Request& rRequest2) - { - if (rRequest1.meClass == rRequest2.meClass) -- return (rRequest1.mnPriorityInClass > rRequest2.mnPriorityInClass); -- else -- return (rRequest1.meClass < rRequest2.meClass); -+ { -+ if (rRequest1.mnPriorityInClass == rRequest2.mnPriorityInClass) -+ { -+ return rRequest1.maKey < rRequest2.maKey; -+ } -+ return rRequest1.mnPriorityInClass > rRequest2.mnPriorityInClass; -+ } -+ return rRequest1.meClass < rRequest2.meClass; - } - }; - /** Request data is compared arbitrarily by their addresses in memory. --- -1.8.4.2 - diff --git a/SOURCES/0105-only-write-new-element-and-attributes-in-ODF-1.2-ext.patch b/SOURCES/0105-only-write-new-element-and-attributes-in-ODF-1.2-ext.patch deleted file mode 100644 index 52b0084..0000000 --- a/SOURCES/0105-only-write-new-element-and-attributes-in-ODF-1.2-ext.patch +++ /dev/null @@ -1,30 +0,0 @@ -From a487e676ef96d1e6e2efa8680385720667790a60 Mon Sep 17 00:00:00 2001 -From: Markus Mohrhard -Date: Sat, 28 Dec 2013 08:13:12 +0100 -Subject: [PATCH 105/109] only write new element and attributes in ODF 1.2 - extended - -Change-Id: I038f200f500ef1c6a0815b6332fb17bb2f62282a -Reviewed-on: https://gerrit.libreoffice.org/7221 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - sc/source/filter/xml/xmlexprt.cxx | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/sc/source/filter/xml/xmlexprt.cxx b/sc/source/filter/xml/xmlexprt.cxx -index 0fbc692..4f97260 100644 ---- a/sc/source/filter/xml/xmlexprt.cxx -+++ b/sc/source/filter/xml/xmlexprt.cxx -@@ -2709,7 +2709,7 @@ void ScXMLExport::WriteTable(sal_Int32 nTable, const ReferenceisProtected()) -+ if (pProtect && pProtect->isProtected() && getDefaultVersion() > SvtSaveOptions::ODFVER_012) - { - if (pProtect->isOptionEnabled(ScTableProtection::SELECT_LOCKED_CELLS)) - AddAttribute(XML_NAMESPACE_TABLE, XML_SELECT_PROTECTED_CELLS, XML_TRUE); --- -1.8.4.2 - diff --git a/SOURCES/0106-read-elements-attribs-written-to-extension-namespace.patch b/SOURCES/0106-read-elements-attribs-written-to-extension-namespace.patch deleted file mode 100644 index 748b8aa..0000000 --- a/SOURCES/0106-read-elements-attribs-written-to-extension-namespace.patch +++ /dev/null @@ -1,88 +0,0 @@ -From 3d7011c3c2b47aca273d7e8a26bdaeaf982d8702 Mon Sep 17 00:00:00 2001 -From: Markus Mohrhard -Date: Sat, 28 Dec 2013 12:44:02 +0100 -Subject: [PATCH 106/109] read elements/attribs written to extension namespace - -Related to validation errors with fdo#31296 - -Change-Id: I1b76e05a9996b1123db164629475a3f7b07dda69 -Reviewed-on: https://gerrit.libreoffice.org/7222 -Reviewed-by: Eike Rathke -Tested-by: Eike Rathke ---- - sc/source/filter/xml/xmlimprt.cxx | 3 +++ - sc/source/filter/xml/xmlimprt.hxx | 5 ++++- - sc/source/filter/xml/xmltabi.cxx | 3 +++ - 3 files changed, 10 insertions(+), 1 deletion(-) - -diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx -index 28c3ace..3378541 100644 ---- a/sc/source/filter/xml/xmlimprt.cxx -+++ b/sc/source/filter/xml/xmlimprt.cxx -@@ -828,6 +828,7 @@ const SvXMLTokenMap& ScXMLImport::GetTableElemTokenMap() - { XML_NAMESPACE_TABLE, XML_TABLE_COLUMNS, XML_TOK_TABLE_COLS }, - { XML_NAMESPACE_TABLE, XML_TABLE_COLUMN, XML_TOK_TABLE_COL }, - { XML_NAMESPACE_TABLE, XML_TABLE_PROTECTION, XML_TOK_TABLE_PROTECTION }, -+ { XML_NAMESPACE_OFFICE_EXT, XML_TABLE_PROTECTION, XML_TOK_TABLE_PROTECTION_EXT }, - { XML_NAMESPACE_TABLE, XML_TABLE_ROW_GROUP, XML_TOK_TABLE_ROW_GROUP }, - { XML_NAMESPACE_TABLE, XML_TABLE_HEADER_ROWS, XML_TOK_TABLE_HEADER_ROWS }, - { XML_NAMESPACE_TABLE, XML_TABLE_ROWS, XML_TOK_TABLE_ROWS }, -@@ -856,6 +857,8 @@ const SvXMLTokenMap& ScXMLImport::GetTableProtectionAttrTokenMap() - { - { XML_NAMESPACE_TABLE, XML_SELECT_PROTECTED_CELLS, XML_TOK_TABLE_SELECT_PROTECTED_CELLS }, - { XML_NAMESPACE_TABLE, XML_SELECT_UNPROTECTED_CELLS, XML_TOK_TABLE_SELECT_UNPROTECTED_CELLS }, -+ { XML_NAMESPACE_OFFICE_EXT, XML_SELECT_PROTECTED_CELLS, XML_TOK_TABLE_SELECT_PROTECTED_CELLS_EXT }, -+ { XML_NAMESPACE_OFFICE_EXT, XML_SELECT_UNPROTECTED_CELLS, XML_TOK_TABLE_SELECT_UNPROTECTED_CELLS_EXT }, - XML_TOKEN_MAP_END - }; - pTableProtectionElemTokenMap = new SvXMLTokenMap(aTableProtectionTokenMap); -diff --git a/sc/source/filter/xml/xmlimprt.hxx b/sc/source/filter/xml/xmlimprt.hxx -index 0957a9f..3fb584a 100644 ---- a/sc/source/filter/xml/xmlimprt.hxx -+++ b/sc/source/filter/xml/xmlimprt.hxx -@@ -240,6 +240,7 @@ enum ScXMLTableTokens - XML_TOK_TABLE_ROW_GROUP, - XML_TOK_TABLE_HEADER_ROWS, - XML_TOK_TABLE_PROTECTION, -+ XML_TOK_TABLE_PROTECTION_EXT, - XML_TOK_TABLE_ROWS, - XML_TOK_TABLE_ROW, - XML_TOK_TABLE_SOURCE, -@@ -254,7 +255,9 @@ enum ScXMLTableTokens - enum ScXMLTokenProtectionTokens - { - XML_TOK_TABLE_SELECT_PROTECTED_CELLS, -- XML_TOK_TABLE_SELECT_UNPROTECTED_CELLS -+ XML_TOK_TABLE_SELECT_UNPROTECTED_CELLS, -+ XML_TOK_TABLE_SELECT_PROTECTED_CELLS_EXT, -+ XML_TOK_TABLE_SELECT_UNPROTECTED_CELLS_EXT - }; - - enum ScXMLTableRowsTokens -diff --git a/sc/source/filter/xml/xmltabi.cxx b/sc/source/filter/xml/xmltabi.cxx -index a1bc801..f15a602 100644 ---- a/sc/source/filter/xml/xmltabi.cxx -+++ b/sc/source/filter/xml/xmltabi.cxx -@@ -286,6 +286,7 @@ SvXMLImportContext *ScXMLTableContext::CreateChildContext( sal_uInt16 nPrefix, - rLName, xAttrList ); - break; - case XML_TOK_TABLE_PROTECTION: -+ case XML_TOK_TABLE_PROTECTION_EXT: - pContext = new ScXMLTableProtectionContext( GetScImport(), nPrefix, rLName, xAttrList ); - break; - case XML_TOK_TABLE_ROW_GROUP: -@@ -454,9 +455,11 @@ ScXMLTableProtectionContext::ScXMLTableProtectionContext( - switch (rAttrTokenMap.Get(nLocalPrefix, aLocalName)) - { - case XML_TOK_TABLE_SELECT_PROTECTED_CELLS: -+ case XML_TOK_TABLE_SELECT_PROTECTED_CELLS_EXT: - bSelectProtectedCells = IsXMLToken(aValue, XML_TRUE); - break; - case XML_TOK_TABLE_SELECT_UNPROTECTED_CELLS: -+ case XML_TOK_TABLE_SELECT_UNPROTECTED_CELLS_EXT: - bSelectUnprotectedCells = IsXMLToken(aValue, XML_TRUE); - break; - default: --- -1.8.4.2 - diff --git a/SOURCES/0107-cp-2013101510000026-fix-file-coruption-caused-by-com.patch b/SOURCES/0107-cp-2013101510000026-fix-file-coruption-caused-by-com.patch deleted file mode 100644 index 28dce52..0000000 --- a/SOURCES/0107-cp-2013101510000026-fix-file-coruption-caused-by-com.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 5ea7f28bb9f787a1650e0d126e28ffb543c2a363 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Zolnai=20Tam=C3=A1s?= -Date: Mon, 6 Jan 2014 15:59:50 +0100 -Subject: [PATCH 107/109] cp#2013101510000026: fix file coruption caused by - comments' doc export - -Plcfbkl contains only character positions. The Plcfbkf is that one -which contains additional informations. - -Change-Id: I9bd8eec5c8e64d9d757764dae51bcb866456cdc9 -(cherry picked from commit 3ed870e237a0b7b95f48bfb8192fe7d5c2957a03) ---- - sw/qa/extras/ww8export/data/fdo59530.doc | Bin 10240 -> 10240 bytes - sw/source/filter/ww8/wrtw8sty.cxx | 7 ------- - 2 files changed, 7 deletions(-) - -diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx -index 0b5422c..7b27efd 100644 ---- a/sw/source/filter/ww8/wrtw8sty.cxx -+++ b/sw/source/filter/ww8/wrtw8sty.cxx -@@ -2238,13 +2238,6 @@ void WW8_WrPlcSubDoc::WriteGenericPlc( WW8Export& rWrt, sal_uInt8 nTTyp, - } - SwWW8Writer::WriteLong( *rWrt.pTableStrm, aRangeEndPos[i-1] + 1); - -- // Commented text ranges additional informations (Plcfbkl.aFBKF) -- for ( i = 0; i < aRangeEndPos.size(); ++i ) -- { -- SwWW8Writer::WriteShort( *rWrt.pTableStrm, i ); // FBKF.ibkl -- SwWW8Writer::WriteShort( *rWrt.pTableStrm, 0 ); // FBKF.bkc -- } -- - nFcStart = rWrt.pTableStrm->Tell(); - rFib.lcbPlcfAtnbkl = nFcStart - rFib.fcPlcfAtnbkl; - --- -1.8.4.2 - diff --git a/SOURCES/0108-Fix-fdo-70807-Page-Style-method-isInUse-broken.patch b/SOURCES/0108-Fix-fdo-70807-Page-Style-method-isInUse-broken.patch deleted file mode 100644 index 4e532cb..0000000 --- a/SOURCES/0108-Fix-fdo-70807-Page-Style-method-isInUse-broken.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 63c2990d0e67e90f5445dac10c8c1f7919031482 Mon Sep 17 00:00:00 2001 -From: Marcos Paulo de Souza -Date: Tue, 7 Jan 2014 12:42:25 -0200 -Subject: [PATCH 108/109] Fix fdo#70807: Page Style method isInUse() broken - -We need to check m_FirstMaster and m_FirstLeft too to verify is a style is used - -Thanks a lot mst__ for pointing how to fix this! - -Change-Id: Ic9c37c552893c17fba4aabcc0fd4beb7fe2550e8 -Reviewed-on: https://gerrit.libreoffice.org/7295 -Reviewed-by: Michael Stahl -Tested-by: Olivier Hallot -(cherry picked from commit 6131787afbb32e1e12aac4cf4f65625d11d39f08) -Signed-off-by: Michael Stahl ---- - sw/source/core/layout/pagedesc.cxx | 11 +++++++---- - 1 file changed, 7 insertions(+), 4 deletions(-) - -diff --git a/sw/source/core/layout/pagedesc.cxx b/sw/source/core/layout/pagedesc.cxx -index 05a24d1..1f7addb 100644 ---- a/sw/source/core/layout/pagedesc.cxx -+++ b/sw/source/core/layout/pagedesc.cxx -@@ -156,13 +156,16 @@ void SwPageDesc::ResetAllAttr( sal_Bool bLeft ) - |* - *************************************************************************/ - -- -- // gets information from Modify -+// gets information from Modify - bool SwPageDesc::GetInfo( SfxPoolItem & rInfo ) const - { - if( !aMaster.GetInfo( rInfo ) ) -- return false; // found -- return aLeft.GetInfo( rInfo ); -+ return false; // found -+ if ( !aLeft.GetInfo( rInfo ) ) -+ return false ; -+ if ( !m_FirstMaster.GetInfo( rInfo ) ) -+ return false; -+ return m_FirstLeft.GetInfo( rInfo ); - } - - /************************************************************************* --- -1.8.4.2 - diff --git a/SOURCES/0109-No-serviceNames-attribute-in-Loader.patch b/SOURCES/0109-No-serviceNames-attribute-in-Loader.patch deleted file mode 100644 index 70cf16b..0000000 --- a/SOURCES/0109-No-serviceNames-attribute-in-Loader.patch +++ /dev/null @@ -1,30 +0,0 @@ -From ac3c6de70409ab3a14d92a0644c29323e47605bf Mon Sep 17 00:00:00 2001 -From: Stephan Bergmann -Date: Tue, 7 Jan 2014 15:37:16 +0100 -Subject: [PATCH 109/109] No serviceNames attribute in Loader - -Change-Id: I6cc001d18683fc412f0ec0b6a33054d6e745463f -(cherry picked from commit 431b49fbec68c17c7a486ef0f577107d3dd27e55) -Reviewed-on: https://gerrit.libreoffice.org/7294 -Reviewed-by: Michael Stahl -Tested-by: Michael Stahl ---- - pyuno/source/loader/pythonloader.py | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/pyuno/source/loader/pythonloader.py b/pyuno/source/loader/pythonloader.py -index 3074d0f..1d1b7de 100644 ---- a/pyuno/source/loader/pythonloader.py -+++ b/pyuno/source/loader/pythonloader.py -@@ -157,7 +157,7 @@ class Loader( XImplementationLoader, XServiceInfo, unohelper.Base ): - return g_implementationName - - def supportsService( self, ServiceName ): -- return ServiceName in self.serviceNames -+ return ServiceName in self.getSupportedServiceNames() - - def getSupportedServiceNames( self ): - return g_supportedServices --- -1.8.4.2 - diff --git a/SOURCES/libreoffice-installfix.patch b/SOURCES/libreoffice-installfix.patch index cc5f03e..e2448a5 100644 --- a/SOURCES/libreoffice-installfix.patch +++ b/SOURCES/libreoffice-installfix.patch @@ -1,10 +1,24 @@ ---- a/solenv/bin/modules/installer/worker.pm 2010-11-20 13:36:38.000000000 +0000 -+++ b/solenv/bin/modules/installer/worker.pm 2010-11-20 13:36:42.000000000 +0000 -@@ -204,7 +204,6 @@ +From 2ed57bc3ba020ebc6aec933445ae0b274685499e Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Mon, 3 Feb 2014 21:41:00 +0100 +Subject: [PATCH] installation fix + +--- + solenv/bin/modules/installer/worker.pm | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/solenv/bin/modules/installer/worker.pm b/solenv/bin/modules/installer/worker.pm +index aab676f..0e6f67d 100644 +--- a/solenv/bin/modules/installer/worker.pm ++++ b/solenv/bin/modules/installer/worker.pm +@@ -96,7 +96,6 @@ sub create_installation_directory - $installdir = installer::systemactions::create_directories("install", $languageref); - installer::logger::print_message( "... creating installation set in $installdir ...\n" ); -- remove_old_installation_sets($installdir); - my $inprogressinstalldir = $installdir . "_inprogress"; - installer::systemactions::rename_directory($installdir, $inprogressinstalldir); - $installdir = $inprogressinstalldir; + $installdir = installer::systemactions::create_directories("install", $languageref); + installer::logger::print_message( "... creating installation set in $installdir ...\n" ); +- remove_old_installation_sets($installdir); + my $inprogressinstalldir = $installdir . "_inprogress"; + installer::systemactions::rename_directory($installdir, $inprogressinstalldir); + $installdir = $inprogressinstalldir; +-- +1.8.4.2 + diff --git a/SOURCES/openoffice.org-2.0.2.rh188467.printingdefaults.patch b/SOURCES/openoffice.org-2.0.2.rh188467.printingdefaults.patch index 45c40aa..8a6dbce 100644 --- a/SOURCES/openoffice.org-2.0.2.rh188467.printingdefaults.patch +++ b/SOURCES/openoffice.org-2.0.2.rh188467.printingdefaults.patch @@ -1,11 +1,17 @@ -Index: configuration/ppds/SGENPRT.PS -=================================================================== -RCS file: /cvs/external/psprint_config/configuration/ppds/SGENPRT.PS,v -retrieving revision 1.3 -diff -u -p -u -r1.3 SGENPRT.PS ---- openoffice.org.orig/psprint_config/configuration/ppds/SGENPRT.PS 26 Nov 2004 16:10:35 -0000 1.3 -+++ openoffice.org/psprint_config/configuration/ppds/SGENPRT.PS 30 Aug 2005 11:17:51 -0000 -@@ -58,6 +58,7 @@ +From ea8d40dfc86fd45bb64ecaa33b703eb99701c3e4 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Mon, 3 Feb 2014 19:25:59 +0100 +Subject: [PATCH] rhbz#188467 printing defaults + +--- + psprint_config/configuration/ppds/SGENPRT.PS | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/psprint_config/configuration/ppds/SGENPRT.PS b/psprint_config/configuration/ppds/SGENPRT.PS +index 0446757..177e2c4 100644 +--- a/psprint_config/configuration/ppds/SGENPRT.PS ++++ b/psprint_config/configuration/ppds/SGENPRT.PS +@@ -42,6 +42,7 @@ *ColorDevice: True *DefaultColorSpace: RGB *LanguageLevel: "2" @@ -13,3 +19,6 @@ diff -u -p -u -r1.3 SGENPRT.PS *% --- For None Color or old PostScript(R) printers use following lines --- *% *ColorDevice: False +-- +1.8.4.2 + diff --git a/SOURCES/openoffice.org-2.4.0.ooo86080.unopkg.bodge.patch b/SOURCES/openoffice.org-2.4.0.ooo86080.unopkg.bodge.patch index b5a7ff7..2186171 100644 --- a/SOURCES/openoffice.org-2.4.0.ooo86080.unopkg.bodge.patch +++ b/SOURCES/openoffice.org-2.4.0.ooo86080.unopkg.bodge.patch @@ -1,13 +1,24 @@ ---- openoffice.org.orig/desktop/scripts/unopkg.sh 2008-01-14 15:55:26.000000000 +0000 -+++ openoffice.org/desktop/scripts/unopkg.sh 2008-02-14 10:52:10.000000000 +0000 -@@ -62,6 +62,33 @@ +From 3b77bbe76b9f99d871074e8baa6e0845f4756442 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Mon, 3 Feb 2014 20:24:50 +0100 +Subject: [PATCH] i#86080 unopkg bodge + +--- + desktop/scripts/unopkg.sh | 33 +++++++++++++++++++++++++++++++-- + 1 file changed, 31 insertions(+), 2 deletions(-) + +diff --git a/desktop/scripts/unopkg.sh b/desktop/scripts/unopkg.sh +index d16d226..aefc918 100755 +--- a/desktop/scripts/unopkg.sh ++++ b/desktop/scripts/unopkg.sh +@@ -53,6 +53,33 @@ AIX) ;; esac +isnotuser=0 +for arg in $@ +do -+if [ "$arg" = "--shared" -o "$arg" = "--bundled" ]; then ++if [ "$arg" = "--shared" -o "$arg" = "--bundled" ]; then + isnotuser=1 +fi +done @@ -34,7 +45,7 @@ #collect all bootstrap variables specified on the command line #so that they can be passed as arguments to javaldx later on for arg in $@ -@@ -110,6 +137,8 @@ +@@ -92,6 +119,8 @@ unset XENVIRONMENT # SAL_NO_XINITTHREADS=true; export SAL_NO_XINITTHREADS # execute binary @@ -45,3 +56,6 @@ +if [ -n "$INSTDIR" ]; then + rm -rf $INSTDIR +fi +-- +1.8.4.2 + diff --git a/SOURCES/openoffice.org-3.1.0.ooo101274.opening-a-directory.patch b/SOURCES/openoffice.org-3.1.0.ooo101274.opening-a-directory.patch index 9bfc221..77ed100 100644 --- a/SOURCES/openoffice.org-3.1.0.ooo101274.opening-a-directory.patch +++ b/SOURCES/openoffice.org-3.1.0.ooo101274.opening-a-directory.patch @@ -109,7 +109,7 @@ index 95e589f..d7fc181 100644 + xInteraction->handle(xRequest); + } +} -+ ++ +} + //========================================================================= diff --git a/SOURCES/openoffice.org-3.1.0.oooXXXXX.solenv.allowmissing.patch b/SOURCES/openoffice.org-3.1.0.oooXXXXX.solenv.allowmissing.patch index 0641054..1e994db 100644 --- a/SOURCES/openoffice.org-3.1.0.oooXXXXX.solenv.allowmissing.patch +++ b/SOURCES/openoffice.org-3.1.0.oooXXXXX.solenv.allowmissing.patch @@ -1,12 +1,18 @@ -Index: bin/modules/installer/scriptitems.pm -=================================================================== -RCS file: /cvs/tools/solenv/bin/modules/installer/scriptitems.pm,v -retrieving revision 1.17 -diff -u -p -r1.17 scriptitems.pm ---- openoffice.org.orig/solenv/bin/modules/installer/scriptitems.pm 24 Feb 2005 16:21:15 -0000 1.17 -+++ openoffice.org/solenv/bin/modules/installer/scriptitems.pm 18 Mar 2005 22:39:42 -0000 -@@ -1356,11 +1356,10 @@ +From eab93c587dd524241f63e885b0e4ac8700da5d16 Mon Sep 17 00:00:00 2001 +From: David Tardon +Date: Mon, 3 Feb 2014 20:31:04 +0100 +Subject: [PATCH] solenv: allow missing files +--- + solenv/bin/modules/installer/scriptitems.pm | 15 ++++++--------- + 1 file changed, 6 insertions(+), 9 deletions(-) + +diff --git a/solenv/bin/modules/installer/scriptitems.pm b/solenv/bin/modules/installer/scriptitems.pm +index 4c384ce..963ca84 100644 +--- a/solenv/bin/modules/installer/scriptitems.pm ++++ b/solenv/bin/modules/installer/scriptitems.pm +@@ -1133,11 +1133,10 @@ sub remove_Files_Without_Sourcedirectory + if ( ! $installer::globals::languagepack && !$installer::globals::helppack) { - $infoline = "ERROR: Removing file $filename from file list.\n"; @@ -19,7 +25,7 @@ diff -u -p -r1.17 scriptitems.pm next; # removing this file from list, if sourcepath is empty } -@@ -1368,11 +1367,10 @@ +@@ -1145,11 +1144,10 @@ sub remove_Files_Without_Sourcedirectory { if (( $onefile->{'ismultilingual'} ) || ( $styles =~ /\bFORCELANGUAGEPACK\b/ )) { @@ -33,7 +39,7 @@ diff -u -p -r1.17 scriptitems.pm next; # removing this file from list, if sourcepath is empty } -@@ -1390,11 +1388,10 @@ +@@ -1167,11 +1165,10 @@ sub remove_Files_Without_Sourcedirectory { if (( $onefile->{'ismultilingual'} ) || ( $styles =~ /\bFORCEHELPPACK\b/ )) { @@ -47,14 +53,6 @@ diff -u -p -r1.17 scriptitems.pm next; # removing this file from list, if sourcepath is empty } ---- openoffice.org.orig/solenv/bin/modules/installer/simplepackage.pm 2010-07-12 10:27:26.000000000 +0100 -+++ openoffice.org/solenv/bin/modules/installer/simplepackage.pm 2010-07-12 10:27:54.000000000 +0100 -@@ -53,7 +53,7 @@ - ( $installer::globals::packageformat eq "archive" )) - { - $installer::globals::is_simple_packager_project = 1; -- $installer::globals::patch_user_dir = 1; -+ $installer::globals::patch_user_dir = 1; - } - elsif( $installer::globals::packageformat eq "dmg" ) - { +-- +1.8.4.2 + diff --git a/SPECS/libreoffice.spec b/SPECS/libreoffice.spec index b9ba8bd..e5d4074 100644 --- a/SPECS/libreoffice.spec +++ b/SPECS/libreoffice.spec @@ -1,5 +1,5 @@ # download path contains version without the last (fourth) digit -%define libo_version 4.1.4 +%define libo_version 4.2.6 # Should contain .alphaX / .betaX, if this is pre-release (actually # pre-RC) version. The pre-release string is part of tarball file names, # so we need a way to define it easily at one place. @@ -17,10 +17,8 @@ %endif # rhbz#465664 jar-repacking breaks help by reordering META-INF/MANIFEST.MF %define __jar_repack %{nil} -# don't worry about whitespace for now -%define _default_patch_flags -s -l # make it easier to download sources from pre-release site -# %%define source_url http://dev-builds.libreoffice.org/pre-releases/src +# http://dev-builds.libreoffice.org/pre-releases/src %define source_url http://download.documentfoundation.org/libreoffice/src/%{libo_version} # URL for external projects' tarballs %define external_url http://dev-www.libreoffice.org/src/ @@ -31,21 +29,22 @@ # effect %bcond_without langpacks -%if %{with langpacks} # generated by %%langpack definitions %global langpack_langs %{nil} -%else -%global langpack_langs en-US -%endif Summary: Free Software Productivity Suite Name: libreoffice Epoch: 1 -Version: %{libo_version}.2 -Release: 3%{?libo_prerelease}%{?dist} +Version: %{libo_version}.3 +Release: 5%{?libo_prerelease}%{?dist} License: (MPLv1.1 or LGPLv3+) and LGPLv3 and LGPLv2+ and BSD and (MPLv1.1 or GPLv2 or LGPLv2 or Netscape) and Public Domain and ASL 2.0 and Artistic and MPLv2.0 Group: Applications/Productivity -URL: http://www.libreoffice.org/default/ +URL: http://www.libreoffice.org/ + +%if 0%{?rhel} && 0%{?rhel} >= 7 +# improve build time by only building for platforms libreoffice is shipped for +ExcludeArch: %{ix86} ppc ppc64 s390 s390x +%endif Source0: %{source_url}/libreoffice-%{version}%{?libo_prerelease}.tar.xz Source1: %{source_url}/libreoffice-help-%{version}%{?libo_prerelease}.tar.xz @@ -61,28 +60,36 @@ Source9: %{external_url}/35c94d2df8893241173de1d16b6034c0-swingExSrc.zip #Unfortunately later versions of hsqldb changed the file format, so if we use a later version we loose #backwards compatability. Source10: %{external_url}/17410483b5b5f267aa18b7e00b65e6e0-hsqldb_1_8_0.zip -%else -Source11: %{external_url}/08c85a6d6d793daee14e10e22eefdc4b-mdds_0.8.1.tar.bz2 +%global bundling_options --without-system-hsqldb +%endif + +%if 0%{?rhel} && 0%{?rhel} < 7 +Source11: %{external_url}/aa5ca9d1ed1082890835afab26400a39-mdds_0.10.3.tar.bz2 Source12: %{external_url}/46e92b68e31e858512b680b3b61dc4c1-mythes-1.2.3.tar.gz Source13: %{external_url}/32f8e1417a64d3c6f2c727f9053f55ea-redland-1.0.16.tar.gz Source14: %{external_url}/4ceb9316488b0ea01acf011023cf7fff-raptor2-2.0.9.tar.gz Source15: %{external_url}/b12c5f9cfdb6b04efce5a4a186b8416b-rasqal-0.9.30.tar.gz -Source16: %{external_url}/dc3d21a3921931096d6e80f6701f6763-libexttextcat-3.4.0.tar.bz2 -Source17: %{external_url}/libcdr-0.0.14.tar.bz2 +Source16: %{external_url}/ae330b9493bd4503ac390106ff6060d7-libexttextcat-3.4.3.tar.bz2 +Source17: %{external_url}/libcdr-0.0.15.tar.bz2 Source18: %{external_url}/b85436266b2ac91d351ab5684b181151-libwpg-0.2.2.tar.bz2 Source19: %{external_url}/a3dcac551fae5ebbec16e844810828c4-libwpd-0.9.9.tar.bz2 Source20: %{external_url}/46eb0e7f213ad61bd5dee0c494132cb0-libwps-0.2.9.tar.bz2 -Source21: %{external_url}/b2371dc7cf4811c9d32146eec913d296-libcmis-0.3.0.tar.gz -Source22: %{external_url}/48d647fbd8ef8889e5a7f422c1bfda94-clucene-core-2.3.3.4.tar.gz -Source23: %{external_url}/libvisio-0.0.31.tar.bz2 -Source24: %{external_url}/861ef15fa0bc018f9ddc932c4ad8b6dd-lcms2-2.4.tar.gz -Source25: %{external_url}/libmspub-0.0.6.tar.bz2 -Source26: %{external_url}/ea2acaf140ae40a87a952caa75184f4d-liborcus-0.5.1.tar.bz2 -Source27: %{external_url}/36271d3fa0d9dec1632029b6d7aac925-liblangtag-0.5.1.tar.bz2 -Source28: %{external_url}/f02578f5218f217a9f20e9c30e119c6a-boost_1_44_0.tar.bz2 -Source29: %{external_url}/c48827713e93539dc7285f9e86ffbdc5-harfbuzz-0.9.17.tar.bz2 -Source30: %{external_url}/8473296c671b6e3dd8197f4145e0854b-libodfgen-0.0.2.tar.bz2 -Source31: %{external_url}/libmwaw-0.1.10.tar.bz2 +Source21: %{external_url}/48d647fbd8ef8889e5a7f422c1bfda94-clucene-core-2.3.3.4.tar.gz +Source22: %{external_url}/libvisio-0.0.31.tar.bz2 +Source23: %{external_url}/861ef15fa0bc018f9ddc932c4ad8b6dd-lcms2-2.4.tar.gz +Source24: %{external_url}/libmspub-0.0.6.tar.bz2 +Source25: %{external_url}/ea2acaf140ae40a87a952caa75184f4d-liborcus-0.5.1.tar.bz2 +Source26: %{external_url}/36271d3fa0d9dec1632029b6d7aac925-liblangtag-0.5.1.tar.bz2 +Source27: %{external_url}/15cb8c0803064faef0c4ddf5bc5ca279-boost_1_54_0.tar.bz2 +Source28: %{external_url}/harfbuzz-0.9.23.tar.bz2 +Source29: %{external_url}/libfreehand-0.0.0.tar.bz2 +Source30: %{external_url}/22f8a85daf4a012180322e1f52a7563b-libcmis-0.4.1.tar.gz +Source31: %{external_url}/libodfgen-0.0.4.tar.bz2 +Source32: %{external_url}/libmwaw-0.2.0.tar.bz2 +Source33: %{external_url}/libetonyek-0.0.4.tar.bz2 +Source34: %{external_url}/libabw-0.0.2.tar.bz2 +Source35: %{external_url}/language-subtag-registry-2014-03-27.tar.bz2 +%global bundling_options %{?bundling_options} --without-system-mdds --without-system-mythes --without-system-redland --without-system-libexttextcat --without-system-libcdr --without-system-libwpg --without-system-libwpd --without-system-libwps --without-system-clucene --without-system-libvisio --without-system-lcms2 --without-system-libmspub --without-system-orcus --without-system-liblangtag --without-system-boost --without-system-harfbuzz --without-system-libfreehand --without-system-libcmis --without-system-libodfgen --without-system-libmwaw --without-system-libetonyek --without-system-libabw %endif # build tools @@ -96,6 +103,7 @@ BuildRequires: doxygen BuildRequires: findutils BuildRequires: flex BuildRequires: gcc-c++ +BuildRequires: git BuildRequires: gperf BuildRequires: icu BuildRequires: make @@ -104,112 +112,118 @@ BuildRequires: perl(Digest::MD5) BuildRequires: zip # libs / headers -BuildRequires: GConf2-devel +BuildRequires: pkgconfig(gconf-2.0) %if 0%{?fedora} || 0%{?rhel} >= 7 -BuildRequires: bluez-libs-devel +BuildRequires: pkgconfig(bluez) %else %ifnarch s390 s390x -BuildRequires: bluez-libs-devel +BuildRequires: pkgconfig(bluez) %endif %endif %if 0%{?fedora} || 0%{?rhel} >= 7 BuildRequires: boost-devel -BuildRequires: clucene-core-devel +BuildRequires: pkgconfig(libclucene-core) %endif -BuildRequires: cppunit-devel +BuildRequires: pkgconfig(cppunit) BuildRequires: cups-devel -BuildRequires: dbus-glib-devel -BuildRequires: evolution-data-server-devel +BuildRequires: pkgconfig(dbus-glib-1) +BuildRequires: pkgconfig(evolution-data-server-1.2) BuildRequires: expat-devel +%if 0%{?fedora} +BuildRequires: firebird-devel +BuildRequires: firebird-libfbembed +%endif BuildRequires: fontpackages-devel -BuildRequires: freetype-devel +BuildRequires: pkgconfig(freetype2) %if 0%{?rhel} && 0%{?rhel} < 7 BuildRequires: gstreamer-devel BuildRequires: gstreamer-plugins-base-devel %else -BuildRequires: graphite2-devel -BuildRequires: gstreamer1-devel -BuildRequires: gstreamer1-plugins-base-devel -BuildRequires: harfbuzz-devel +BuildRequires: pkgconfig(graphite2) +BuildRequires: pkgconfig(gstreamer-1.0) +BuildRequires: pkgconfig(gstreamer-plugins-base-1.0) +BuildRequires: pkgconfig(harfbuzz) %endif -BuildRequires: gtk2-devel -BuildRequires: hunspell-devel +BuildRequires: pkgconfig(gtk+-2.0) +BuildRequires: pkgconfig(hunspell) BuildRequires: hyphen-devel %if 0%{?fedora} BuildRequires: kdelibs4-devel %endif -BuildRequires: libICE-devel -BuildRequires: libXext-devel -BuildRequires: libXinerama-devel -BuildRequires: libXt-devel +BuildRequires: pkgconfig(ice) +BuildRequires: pkgconfig(xext) +BuildRequires: pkgconfig(xinerama) +BuildRequires: pkgconfig(xt) %if 0%{?fedora} || 0%{?rhel} >= 7 -BuildRequires: libcdr-devel -BuildRequires: libcmis-devel >= 0.3.0 +BuildRequires: pkgconfig(lcms2) +BuildRequires: pkgconfig(libabw-0.0) +BuildRequires: pkgconfig(libcdr-0.0) +BuildRequires: pkgconfig(libcmis-0.4) +BuildRequires: pkgconfig(libetonyek-0.0) +BuildRequires: pkgconfig(libfreehand-0.0) +BuildRequires: pkgconfig(libmwaw-0.2) +BuildRequires: pkgconfig(libodfgen-0.0) +%endif +%if 0%{?fedora} +BuildRequires: pkgconfig(libe-book-0.0) +BuildRequires: pkgconfig(libeot) %endif -BuildRequires: libcurl-devel +BuildRequires: pkgconfig(libcurl) %if 0%{?fedora} || 0%{?rhel} >= 7 -BuildRequires: libexttextcat-devel +BuildRequires: pkgconfig(libexttextcat) +BuildRequires: pkgconfig(mdds) %endif BuildRequires: libicu-devel -BuildRequires: libidn-devel +BuildRequires: pkgconfig(libidn) %if 0%{?fedora} || 0%{?rhel} >= 7 BuildRequires: libjpeg-turbo-devel -BuildRequires: liblangtag-devel >= 0.4.0 -BuildRequires: libmspub-devel -BuildRequires: libmwaw-devel -BuildRequires: libodfgen-devel -BuildRequires: liborcus-devel >= 0.5.0 -BuildRequires: libvisio-devel -BuildRequires: libwpd-devel -BuildRequires: libwpg-devel -BuildRequires: libwps-devel +BuildRequires: pkgconfig(liblangtag) +BuildRequires: pkgconfig(libmspub-0.0) +BuildRequires: pkgconfig(liborcus-0.6) +BuildRequires: pkgconfig(libvisio-0.0) +BuildRequires: pkgconfig(libwpd-0.9) +BuildRequires: pkgconfig(libwpg-0.2) +BuildRequires: pkgconfig(libwps-0.2) %else BuildRequires: libjpeg-devel %endif -BuildRequires: libxml2-devel -BuildRequires: libxslt-devel +BuildRequires: pkgconfig(libxml-2.0) +BuildRequires: pkgconfig(libxslt) BuildRequires: lpsolve-devel +BuildRequires: pkgconfig(glu) %if 0%{?fedora} || 0%{?rhel} >= 7 -BuildRequires: mdds-devel >= 0.8.1 +BuildRequires: pkgconfig(mythes) %endif -BuildRequires: mesa-libGLU-devel -%if 0%{?fedora} || 0%{?rhel} >= 7 -BuildRequires: mythes-devel -%endif -BuildRequires: neon-devel -BuildRequires: nss-devel +BuildRequires: pkgconfig(neon) +BuildRequires: pkgconfig(nss) BuildRequires: openldap-devel -BuildRequires: openssl-devel BuildRequires: pam-devel %if 0%{?fedora} || 0%{?rhel} >= 7 -BuildRequires: poppler-cpp-devel +BuildRequires: pkgconfig(poppler-cpp) %endif -BuildRequires: poppler-devel +BuildRequires: pkgconfig(poppler) %if 0%{?fedora} || 0%{?rhel} >= 7 BuildRequires: postgresql-devel %endif %if 0%{libo_python3} -BuildRequires: python3-devel >= 3.3.0 +BuildRequires: pkgconfig(python3) %else BuildRequires: python-devel %endif -BuildRequires: redland-devel -BuildRequires: sane-backends-devel +BuildRequires: pkgconfig(redland) +BuildRequires: pkgconfig(sane-backends) BuildRequires: unixODBC-devel BuildRequires: vigra-devel -BuildRequires: zlib-devel +BuildRequires: pkgconfig(zlib) # java stuff BuildRequires: ant -BuildRequires: ant-apache-regexp %if 0%{?rhel} && 0%{?rhel} < 7 BuildRequires: jakarta-commons-codec BuildRequires: jakarta-commons-lang -BuildRequires: apache-tomcat-apis %else BuildRequires: apache-commons-codec BuildRequires: apache-commons-lang -BuildRequires: tomcat-servlet-3.0-api %endif BuildRequires: bsh %if 0%{?rhel} && 0%{?rhel} < 7 @@ -223,9 +237,9 @@ BuildRequires: junit BuildRequires: pentaho-reporting-flow-engine # fonts needed for unit tests -BuildRequires: liberation-mono-fonts >= 1.0 -BuildRequires: liberation-sans-fonts >= 1.0 -BuildRequires: liberation-serif-fonts >= 1.0 +BuildRequires: liberation-mono-fonts +BuildRequires: liberation-sans-fonts +BuildRequires: liberation-serif-fonts Requires: %{name}-writer = %{epoch}:%{version}-%{release} Requires: %{name}-calc = %{epoch}:%{version}-%{release} @@ -245,103 +259,140 @@ Patch6: libreoffice-installfix.patch Patch7: libreoffice-rhel6gcj.patch Patch8: libreoffice-rhel6poppler.patch Patch9: libreoffice-rhel6langs.patch -Patch10: libreoffice-rhel6limits.patch -Patch11: libreoffice-rhel6glib.patch -%endif -Patch12: 0001-do-not-build-LibreOffice_Test.patch -Patch13: 0001-Resolves-fdo-48835-application-menu-for-LibreOffice.patch -Patch14: 0001-Make-charmap.cxx-compile-with-icu-4.4.patch -Patch15: 0001-select-sheet-menu-as-a-right-click-popup-to-the-prev.patch -Patch16: 0001-Resolves-rhbz-1013480-crash-in-EditLineList-operator.patch -Patch17: 0001-Resolves-rhbz-1015281-crash-on-clicking-custom-anima.patch -Patch18: 0001-Related-rhbz-919070-display-1-means-span-all-display.patch -Patch19: 0001-Resolves-rhbz-1021915-force-menubar-menus-to-be-up-d.patch -# beginning of additional 4.1 patches -Patch20: 0002-EMF-Stroke-size-is-always-supposed-to-be-absolute.patch -Patch21: 0003-fdo-61272-Do-the-mapping-correctly-both-for-WMF-and-.patch -Patch22: 0004-EMF-Implement-line-dashing.patch -Patch23: 0005-EMF-Parse-and-render-custom-line-cap-data.patch -Patch24: 0006-EMF-Line-thickness-has-to-be-considered-when-drawing.patch -Patch25: 0007-cairo-canvas-Line-dashing-size-depends-on-the-line-w.patch -Patch26: 0011-resolved-fdo-67572-export-add-in-equivalents-as-inte.patch -Patch27: 0012-resolved-fdo-61946-use-correct-TabDelta-for-UpdateRe.patch -Patch28: 0013-resolved-fdo-53103-actually-use-the-external-data-fi.patch -Patch29: 0014-resolved-fdo-67536-export-internal-equivalents-as-ad.patch -Patch30: 0016-fix-2D-vs-3D-coordinatesystem-regression-fdo-67300.patch -Patch31: 0017-fix-validation-error-for-OOXML-chart-export-related-.patch -Patch32: 0020-fdo-72078-make-status-bar-text-localizable.patch -Patch33: 0021-don-t-use-fixed-size-icon-sets-fdo-62652.patch -Patch34: 0025-fdo-71056-add-sup-to-list-of-inline-help-XML-tags.patch -Patch35: 0029-fdo-71434-don-t-show-master-text-if-PlaceHolder-type.patch -Patch36: 0032-write-valid-dxf-record-related-fdo-71971.patch -Patch37: 0036-EMF-Do-not-ignore-source-rectangle-of-the-image-to-b.patch -Patch38: 0038-EMF-force-canvas-if-EMF-comments-are-used.patch -Patch39: 0039-Relater-rhbz-903281-NULL-follow-frames-on-drag-drop.patch -Patch40: 0040-fdo-69984-Handle-duplicate-field-names-correctly.patch -Patch41: 0042-fdo-71892-sw-fix-crash-when-pasting-table-in-footnot.patch -Patch42: 0043-fdo-69518-Correctly-handle-the-old-constraint-syntax.patch -Patch43: 0044-Do-not-create-paths-starting-when-root-is-just.patch -Patch44: 0046-fdo-66984-Define-an-assignment-operator-to-prevent-d.patch -Patch45: 0047-EMF-Fill-line-cap-object-if-EmfPlusCustomLineCapData.patch -Patch46: 0049-fdo-72488-Broken-text-when-showing-visible-space.patch -Patch47: 0050-CID-736170-CID-736171-CID-736172-Out-of-Bounds-read-.patch -Patch48: 0056-sax-xmloff-fix-ODF-import-export-of-text-time-text-t.patch -Patch49: 0057-fdo-66969-Set-selected-page-name-after-building-all-.patch -Patch50: 0058-fdo-66969-Reset-group-dimension-data-from-all-refere.patch -Patch51: 0059-fdo-68160-Revert-Resolves-ii122335-Disabling-the-old.patch -Patch52: 0060-fdo-66864-Return-from-full-screen-should-restore-too.patch -Patch53: 0061-fdo-70499-selectn-of-lock-unlocked-cells-with-worksh.patch -Patch54: 0063-correctly-dispose-to-avoid-cyclic-dependencies.patch -Patch55: 0064-disposed-but-not-dtored.patch -Patch56: 0065-fdo-72697-accept-future-loext-sender-initials.patch -Patch57: 0066-odbc-DBMetaData-NULL-pattern-equivalent-to-not-foo.patch -Patch58: 0067-fdo-72697-actually-write-this-only-in-ODF-1.2-extend.patch -Patch59: 0068-fdo-72163-fix-safer-way.patch -Patch60: 0071-Do-not-use-Boost-in-SDK-examples.patch -Patch61: 0072-Keep-using-component_getImplementationEnvironment-in.patch -Patch62: 0073-Avoid-inaccurate-floating-point-computations.patch -Patch63: 0074-fdo-72850-ODF-export-don-t-export-spurious-style-dis.patch -Patch64: 0075-m_bHasActive-must-be-false-after-last-visible-entry-.patch -Patch65: 0076-fdo-60705-Don-t-discard-valid-printing-options.patch -Patch66: 0077-fdo-70232-sw-brown-paper-bag-fix-for-header-sharing-.patch -Patch67: 0078-fdo-69065-sw-fix-mirrored-page-style-with-first-page.patch -Patch68: 0079-fdo-71429-sw-fix-crashes-when-changing-header-first-.patch -Patch69: 0080-XMLPropertyMapEntry-mbImportOnly-and-XMLPropertySetM.patch -Patch70: 0081-prepare-to-read-loext-vertical-justify-fdo-72922.patch -Patch71: 0082-prepare-to-accept-loext-contextual-spacing-fdo-58112.patch -Patch72: 0083-fdo-67370-Hyphens-are-not-visible-in-tagged-PDF.patch -Patch73: 0084-fdo-72916-correct-rounding-of-time-part-of-DateTime.patch -Patch74: 0085-Fix-stepping-to-the-next-change.patch -Patch75: 0086-DOCX-import-close-rPrChange-properly.patch -Patch76: 0088-fdo-65090-RTF-filter-import-RTF_CLMGF-and-RTF_CLMRG.patch -Patch77: 0089-Resolves-fdo-72961-Crash-when-you-open-ODFver.1.0-1..patch -Patch78: 0090-fdo-39206-Add-support-for-image-transformation-in-SV.patch -Patch79: 0091-EMF-Integer-coordinate-values-are-signed.patch -Patch80: 0092-EMF-actually-use-lineJoin-attribute-for-polygons.patch -Patch81: 0093-EMF-mapping-can-rotate-the-width-vector-so-use-resul.patch -Patch82: 0095-Resolves-fdo-72464-Character-line-break-is-set-to-0-.patch -Patch83: 0096-Make-CalcFocusRect-look-right.patch -Patch84: 0097-die-binfilter-die-die-die.patch -Patch85: 0099-added-EEK-and-LVL-to-EUROCONVERT-EUR-to-LV-locale-da.patch -Patch86: 0100-cp-2013101510000026-wrong-highlight-of-commented-tex.patch -Patch87: 0101-cp-2013101510000026-fix-doc-export-of-comments-initi.patch -Patch88: 0102-cp-2013101510000026-doc-export-of-commented-text-ran.patch -Patch89: 0103-cp-2013101510000026-doc-import-of-comments-affecting.patch -Patch90: 0104-pages-with-equal-Priority-and-Class-getting-dropped.patch -Patch91: 0105-only-write-new-element-and-attributes-in-ODF-1.2-ext.patch -Patch92: 0106-read-elements-attribs-written-to-extension-namespace.patch -Patch93: 0107-cp-2013101510000026-fix-file-coruption-caused-by-com.patch -Patch94: 0108-Fix-fdo-70807-Page-Style-method-isInUse-broken.patch -Patch95: 0109-No-serviceNames-attribute-in-Loader.patch -Patch96: 0001-n-839727-rhbz-1038176-Crash-fix.patch -Patch97: 0002-fdo-72645-Allow-GETPIVOTDATA-to-get-result-from-leaf.patch -Patch98: 0003-fdo-72645-Case-insensitive-string-comparison-in-GETP.patch -Patch99: 0004-fdo-72774-Ensure-that-all-the-group-fields-are-in-ca.patch -Patch100: 0005-fdo-72774-Generate-correct-group-items-for-the-year-.patch -Patch101: 0006-fix-occasional-crash-on-dragging-and-dropping-pages-.patch -Patch102: 0007-fdo-37167-create-statement-before-execute-wasNull-ge.patch -Patch103: 0008-fdo-72219-Fix-for-corruption-of-symbols-in-docx.patch -# end of additional 4.1 patches +Patch10: libreoffice-rhel6glib.patch +%endif +Patch11: 0001-Related-rhbz-1032774-bodge-around-reported-NULL-valu.patch +Patch12: 0001-Resolves-rhbz-1035092-no-shortcut-key-for-Italian-To.patch +Patch13: 0001-Resolves-rhbz-912529-Kerkis-SmallCaps-shown-instead-.patch +Patch14: 0001-disable-firebird-unit-test.patch +Patch15: 0001-never-run-autogen.sh.patch +Patch16: 0001-Related-rhbz-1065807-rework-i66157-for-multiple-writ.patch +Patch17: 0001-Resolves-rhbz-1065807-use-xdg-Templates-for-default-.patch +Patch18: 0001-rhbz-1057977-avoid-use-of-invalidated-pointers.patch +Patch19: 0001-KDE-don-t-throw-on-TemplatePathVariable.patch +Patch20: 0001-Change-SDK-javaodc-from-static-Package-to-dynamic-Ge.patch +Patch21: 0001-Package-GeneratedPackage-fixup.patch +Patch22: 0001-Related-rhbz-1075951-abrt-crash-in-MSWordExportBase-.patch +Patch23: 0001-drop-OnlyShowIn-from-.desktop-files.patch +Patch24: 0001-Resolves-rhbz-1081176-don-t-jump-to-cursor-pos-when.patch +Patch25: 0001-Resolves-fdo-36815-enable-printing-WYSIWYG-sidewindo.patch +Patch26: 0001-Related-fdo-36815-print-the-text-highlight-range-as-.patch +Patch27: 0001-add-a-format-all-comments-feature.patch +Patch28: 0001-Resolves-fdo-37130-use-10pt-Default-style-font-for-c.patch +Patch29: 0001-Related-fdo-36815-center-scaled-comment-page-vertica.patch +Patch30: 0001-Resolves-fdo-78128-go-back-to-using-an-interim-metaf.patch +Patch31: 0001-add-X-TryExec-entries-to-desktop-files.patch +Patch32: 0001-Related-fdo-36815-clip-overlarge-comment-contents.patch +Patch33: 0001-center-slide-after-changing-zoom.patch +Patch34: 0001-add-a-status-bar-icon-to-fit-slide-to-window.patch +Patch35: 0001-Related-fdo-50697-reset-the-cache-timeout-on-GetGrap.patch +Patch36: 0001-Resolves-rhbz-1096295-hard-to-distinguish-selected-f.patch +Patch37: 0001-update-libxmlsec-config.-to-support-ppc64le.patch +Patch38: 0001-move-UOF-and-Office-2003-filters-to-xsltfilter-modul.patch +Patch39: 0001-avoid-problems-detecting-HTML-files-with-.xls-ext.patch +Patch40: 0001-scrolling-very-slow-in-calc.patch +Patch41: 0001-Resolves-fdo-81487-pasting-into-outline-view-crashes.patch +Patch42: 0001-Resolves-rhbz-1121341-crash-on-closing-shrunk-validi.patch +Patch43: 0001-Resolves-i125289-do-apply-possible-changed-GraphicSt.patch +Patch44: 0001-rhbz-1121254-reload-font-list-from-shell-on-change.patch +Patch45: 0001-rhbz-1079672-FileDialogHelper-don-t-hand-out-stale-p.patch +Patch46: 0001-Related-rhbz-1130264-plausible-fix-for-reported-cras.patch +Patch47: 0001-Resolves-rhbz-1125588-port-LibreOffice-to-ppc64le.patch +Patch48: 0001-refine-current-date-time-hotkey-handling.patch +%if 0%{?rhel} +Patch49: 0001-disable-libe-book-support.patch +%endif +Patch51: 0001-if-_CALL_ELF-if-defined-_CALL_ELF-_CALL_ELF-2.patch +Patch52: 0001-fix-variable-name.patch +Patch53: 0001-cast-arg-to-the-right-type.patch +Patch54: 0001-sigh-simply-forgot-to-include-the-endian-header.patch + +# <<< beginning of additional 4.2.7 patches +Patch55: 0001-resolved-fdo-62250-absent-value-cell-values-are-not-.patch +Patch56: 0002-localized-GetFullName.patch +Patch57: 0003-Resolves-i119287-corrected-default-style-for-draw-ob.patch +Patch58: 0004-Adjust-for-the-splitting-of-number-format-properties.patch +Patch59: 0005-bnc-881025-Mark-axis-a-percent-axis-only-when-all-da.patch +Patch60: 0006-bnc-883684-Make-chart-objects-exempt-from-automatic-.patch +Patch61: 0007-Fix-ignoring-large-twips-values-like-MSO-does-cp-100.patch +Patch62: 0016-sd-stop-calling-graphics-styles-Image-Styles.patch +Patch63: 0017-fdo-81284-Don-t-write-to-zero-length-files.patch +Patch64: 0018-Resolves-fdo-52226-swap-in-graphics-on-.docx-and-.rt.patch +Patch65: 0019-Related-fdo-52226-ensure-graphics-are-swapped-in-on-.patch +Patch66: 0020-fdo-78554-SVG-Text-from-SVG-no-longer-displayed-in-L.patch +Patch67: 0022-fdo-71076-fdo-71767-Preserve-number-formats-when-cha.patch +Patch68: 0023-fdo-79676-Initialize-with-a-default-chart-only-from-.patch +Patch69: 0025-fdo-81445-Display-correct-label-for-empty-cell.patch +Patch70: 0026-bnc-862510-Improve-handling-of-OOXML-gradients.patch +Patch71: 0027-Do-not-prefer-bandRow-over-firstCol-lastCol-nor-the-.patch +Patch72: 0028-bnc-887225-OOXML-import-Correctly-apply-table-style-.patch +Patch73: 0029-fdo-81470-Fix-a-crasher-during-xlsx-export-with-revi.patch +Patch74: 0031-use-rtl-math-round-here-to-get-the-same-number-on-32.patch +Patch75: 0033-bnc-887230-always-use-theme-color-for-hyperlinks-in-.patch +Patch76: 0035-related-fdo-78502-writerfilter-RTF-import-fix-invali.patch +Patch77: 0036-fdo-79676-Fix-the-Java-UNO-API-test-with-regard-to-c.patch +Patch78: 0038-bool-improvements.patch +Patch79: 0039-Adapt-to-sal-log.hxx.patch +Patch80: 0040-bnc-885548-Initial-work-on-importing-revisions-from-.patch +Patch81: 0041-bnc-885548-Adjust-xlsx-export-of-revisions-to-get-it.patch +Patch82: 0042-Preserve-the-end-of-list-flag-for-xls-round-tripping.patch +Patch83: 0043-bnc-883684-Better-fix-for-this.patch +Patch84: 0044-fdo-81309-Adjust-references-during-sort.patch +Patch85: 0045-emf-emulate-hatch-with-color-blend.patch +Patch86: 0046-bnc-881024-Handle-0-font-height-just-like-outdev-dra.patch +Patch87: 0047-bnc-881024-Don-t-world-transform-font-size-in-WMF-EM.patch +Patch88: 0048-fdo-74295-win32-fpicker-correctly-set-the-default-fi.patch +Patch89: 0049-Resolves-fdo-81581-Mediawiki-doesn-t-recognize-under.patch +Patch90: 0052-Resolves-fdo-80906-Delete-any-control-on-Dialog-edit.patch +Patch91: 0053-fdo-81304-don-t-parse-file-name-as-part-of-URL.patch +Patch92: 0058-Resolves-fdo-81598-i125300-enhanced-handling-of-mult.patch +Patch93: 0059-bnc-862510-PPTX-import-bullets-have-color-as-followi.patch +Patch94: 0060-Related-fdo-81457-skip-setting-an-empty-allocation.patch +Patch95: 0061-Fix-for-Footer-is-missing-if-fisrt-page-different-he.patch +Patch96: 0062-fix-build-of-last-commit.patch +Patch97: 0063-fdo-81617-Split-formula-groups-at-sort-range-boundar.patch +Patch98: 0064-fdo-79578-Properly-update-formulas-upon-change-in-db.patch +Patch99: 0065-Related-fdo-81641-create-new-styles-with-an-initial-.patch +Patch100: 0067-coverity-1194911-Unchecked-dynamic_cast.patch +Patch101: 0068-bnc-467459-fix-editeng-text-search-with-expanded-fie.patch +Patch102: 0069-bnc-885548-Reset-the-default-user-to-the-document-ow.patch +Patch103: 0070-fdo-81330-When-moving-to-a-different-sheet-set-3D-fl.patch +Patch104: 0071-fdo-80846-Get-the-parameter-order-right.patch +Patch105: 0072-fdo-78502-writerfilter-RTF-import-handle-u-keyword-i.patch +Patch106: 0073-fdo-81384-writerfilter-turn-the-horrible-btLr-cell-t.patch +Patch107: 0074-fdo-78904-LO-hangs-while-saving-the-document.patch +Patch108: 0075-fdo-75380-Let-s-not-always-set-the-line-style-to-NON.patch +Patch109: 0076-fdo-80986-disable-highlight-DOCX-import.patch +Patch110: 0077-avoid-buffer-overflow-by-using-wrong-buffer.patch +Patch111: 0078-fdo-81993-Revert-Resolves-i119464-Update-default-ali.patch +Patch112: 0079-fdo-81516-Support-fonts-like-Source-Han-Sans-with-16.patch +Patch113: 0080-bnc-886540-Default-chart-background-for-pptx-docs-sh.patch +Patch114: 0081-bnc-886540-Let-s-not-push-the-available-area-down-wh.patch +Patch115: 0082-bnc-862514-Handle-corner-case-in-slide-sorter-correc.patch +Patch116: 0083-fdo-81835-Don-t-prefer-GDI-Metafiles-to-RTF-HTML-cor.patch +Patch117: 0084-fdo-82137-don-t-include-working-directory-in-tarball.patch +Patch118: 0085-fdo-81516-vcl-limit-number-of-CFFs-read-from-font.patch +Patch119: 0086-fdo-69282-sw-fix-updating-of-page-styles-via-SwDocSh.patch +Patch120: 0087-SwDoc-CopyPageDesc-probably-sending-Modify-for-first.patch +Patch121: 0089-bnc-885548-Set-the-date-time-mode-to-non-fixed-after.patch +Patch122: 0090-fdo-81552-Fail-nicely-if-avahi-doesn-t-let-libreoffi.patch +Patch123: 0091-bnc-862510-PPTX-import-Properly-show-data-labels-in-.patch +Patch124: 0092-Fix-some-number-format-issues-bnc-862510.patch +Patch125: 0093-fdo-81995-fix-Outline-numbering-tab-page.patch +Patch126: 0095-bnc-887227-Do-not-set-TextAutoGrowHeight-for-vertica.patch +Patch127: 0097-fdo-80501-Ensure-that-we-notify-each-listener-only-o.patch +Patch128: 0098-bnc-822170-Let-s-not-even-try-to-export-invalid-char.patch +Patch129: 0099-valgrind-bff-don-t-add-0xffff-oldcode.patch +# >>> end of additional 4.2.7 patches + +Patch130: 0002-Linux-AArch64-port.patch +Patch131: 0001-fix-KDE4-detection-on-aarch64.patch +Patch132: 0001-drop-useless-test-for-ant-apache-regexp.patch +Patch133: 0001-No-fstack-protect-strong-for-gcc3_linux_aarch64-cpp2.patch +Patch134: 0001-set-up-java-on-aarch64.patch +Patch135: 0001-Disable-sdremote-by-default-and-improve-flow-control.patch +Patch136: 0001-rhbz-1111216-allow-to-export-an-empty-sheet-to-PDF.patch +Patch137: 0001-rhbz-1016758-Dispose-bridges-when-disposing-bridge-f.patch %define instdir %{_libdir} %define baseinstdir %{instdir}/libreoffice @@ -349,6 +400,15 @@ Patch103: 0008-fdo-72219-Fix-for-corruption-of-symbols-in-docx.patch %define sdkinstdir %{baseinstdir}/sdk %define fontname opensymbol +# rhbz#1085420 make sure we do not provide bundled libraries +%if 0%{?rhel} && 0%{?rhel} < 7 +# redland libs are already suffixed -> no need to filter them too +%global libo_bundled_libs_filter /^lib\\(clucene\\|lcms2\\)\\.so.*$/d +%filter_from_provides %{libo_bundled_libs_filter} +%filter_from_requires %{libo_bundled_libs_filter} +%filter_setup +%endif + %description LibreOffice is an Open Source, community-developed, office productivity suite. It includes the key desktop applications, such as a word processor, @@ -357,6 +417,23 @@ user interface and feature set similar to other office suites. Sophisticated and flexible, LibreOffice also works transparently with a variety of file formats, including Microsoft Office File Formats. +%package filters +Summary: All import / export filters +Group: Applications/Productivity +Requires: %{name}-calc = %{epoch}:%{version}-%{release} +Requires: %{name}-core = %{epoch}:%{version}-%{release} +Requires: %{name}-draw = %{epoch}:%{version}-%{release} +Requires: %{name}-graphicfilter = %{epoch}:%{version}-%{release} +Requires: %{name}-impress = %{epoch}:%{version}-%{release} +Requires: %{name}-math = %{epoch}:%{version}-%{release} +Requires: %{name}-ure = %{epoch}:%{version}-%{release} +Requires: %{name}-writer = %{epoch}:%{version}-%{release} +Requires: %{name}-xsltfilter = %{epoch}:%{version}-%{release} + +%description filters +Metapackage to pull in all subpackages that contain import or export +filters. + %package core Summary: Core modules for LibreOffice Group: Applications/Productivity @@ -364,9 +441,7 @@ Requires: %{name}-%{fontname}-fonts = %{epoch}:%{version}-%{release} Requires: %{name}-ure = %{epoch}:%{version}-%{release} Requires: liberation-sans-fonts >= 1.0, liberation-serif-fonts >= 1.0, liberation-mono-fonts >= 1.0 Requires: dejavu-sans-fonts, dejavu-serif-fonts, dejavu-sans-mono-fonts -%if 0%{?fedora} || 0%{?rhel} >= 7 Requires: google-crosextra-caladea-fonts, google-crosextra-carlito-fonts -%endif Requires: hyphen-en, hyphen >= 2.4, autocorr-en %if 0%{?rhel} && 0%{?rhel} < 7 Requires: hunspell-en @@ -381,10 +456,18 @@ Requires(preun): gtk2 >= 2.9.4 Requires(postun): gtk2 >= 2.9.4 Obsoletes: libreoffice-binfilter < 1:4.0.0.0 Obsoletes: libreoffice-javafilter < 1:4.1.0.0 +Obsoletes: openoffice.org-core < 1:3.3.1 +Obsoletes: openoffice.org-brand < 1:3.3.1, broffice.org-brand < 1:3.3.1 +Obsoletes: openoffice.org-javafilter < 1:3.3.1 +Obsoletes: openoffice.org-langpack-ms < 1:3.3.1, libreoffice-langpack-ms < 1:3.3.99.1 +Obsoletes: openoffice.org-langpack-ur < 1:3.3.1, libreoffice-langpack-ur < 1:3.3.99.1 +Obsoletes: openoffice.org-testtools < 1:3.3.1 Obsoletes: libreoffice-testtools < 1:3.4.99.1 Obsoletes: autocorr-eu < 1:4.0.1.2 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-core = 1:3.3.0 Provides: openoffice.org-core%{?_isa} = 1:3.3.0 +Provides: openoffice.org-brand = 1:3.3.0, broffice.org-brand = 1:3.3.0 Provides: openoffice.org-brand%{?_isa} = 1:3.3.0, broffice.org-brand%{?_isa} = 1:3.3.0 %endif @@ -396,13 +479,14 @@ Summary: Python support for LibreOffice Group: Development/Libraries Requires: %{name}-core = %{epoch}:%{version}-%{release} Requires: %{name}-ure = %{epoch}:%{version}-%{release} -Requires: %{name}-writer = %{epoch}:%{version}-%{release} %if 0%{libo_python3} Requires: python3 %else Requires: python +Obsoletes: openoffice.org-pyuno < 1:3.3.1 %endif %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-pyuno = 1:3.3.0 Provides: openoffice.org-pyuno%{?_isa} = 1:3.3.0 %endif @@ -423,9 +507,15 @@ Requires: %{name}-ure = %{epoch}:%{version}-%{release} Requires: %{name}-core = %{epoch}:%{version}-%{release} Requires: %{name}-calc = %{epoch}:%{version}-%{release} Obsoletes: %{name}-report-builder < 1:4.1.0.0 +Obsoletes: openoffice.org-base-core < 1:3.3.1 +Obsoletes: openoffice.org-base < 1:3.3.1, broffice.org-base < 1:3.3.1 +Obsoletes: openoffice.org-report-builder < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-base-core = 1:3.3.0 Provides: openoffice.org-base-core%{?_isa} = 1:3.3.0 +Provides: openoffice.org-base = 1:3.3.0, broffice.org-base = 1:3.3.0 Provides: openoffice.org-base%{?_isa} = 1:3.3.0, broffice.org-base%{?_isa} = 1:3.3.0 +Provides: openoffice.org-report-builder = 1:3.3.0 Provides: openoffice.org-report-builder%{?_isa} = 1:3.3.0 %endif @@ -438,7 +528,9 @@ Summary: BeanShell support for LibreOffice Group: Development/Libraries Requires: bsh Requires: %{name}-core = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-bsh < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-bsh = 1:3.3.0 Provides: openoffice.org-bsh%{?_isa} = 1:3.3.0 %endif @@ -449,7 +541,9 @@ Support BeanShell scripts in LibreOffice. Summary: JavaScript support for LibreOffice Group: Development/Libraries Requires: %{name}-core = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-rhino < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-rhino = 1:3.3.0 Provides: openoffice.org-rhino%{?_isa} = 1:3.3.0 %endif @@ -469,7 +563,9 @@ Requires: apache-commons-lang, apache-commons-logging Requires: %{name}-ure = %{epoch}:%{version}-%{release} Requires: %{name}-writer = %{epoch}:%{version}-%{release} Requires: %{name}-core = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-wiki-publisher < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-wiki-publisher = 1:3.3.0 Provides: openoffice.org-wiki-publisher%{?_isa} = 1:3.3.0 %endif @@ -495,7 +591,9 @@ Group: Applications/Productivity Requires: %{name}-ure = %{epoch}:%{version}-%{release} Requires: %{name}-core = %{epoch}:%{version}-%{release} Requires: %{name}-impress = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-ogltrans < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-ogltrans = 1:3.3.0 Provides: openoffice.org-ogltrans%{?_isa} = 1:3.3.0 %endif @@ -503,28 +601,15 @@ Provides: openoffice.org-ogltrans%{?_isa} = 1:3.3.0 OpenGL Transitions enable 3D slide transitions to be used in LibreOffice. Requires good quality 3D support for your graphics card for best experience. -%package presentation-minimizer -Summary: Shrink LibreOffice presentations -Group: Applications/Productivity -Requires: %{name}-ure = %{epoch}:%{version}-%{release} -Requires: %{name}-core = %{epoch}:%{version}-%{release} -Requires: %{name}-impress = %{epoch}:%{version}-%{release} -%if 0%{?rhel} && 0%{?rhel} < 7 -Provides: openoffice.org-presentation-minimizer%{?_isa} = 1:3.3.0 -%endif - -%description presentation-minimizer -The Presentation Minimizer is used to reduce the file size of the current -presentation. Images will be compressed, and data that is no longer needed will -be removed. - %package pdfimport Summary: PDF Importer for LibreOffice Draw Group: Applications/Productivity Requires: %{name}-ure = %{epoch}:%{version}-%{release} Requires: %{name}-core = %{epoch}:%{version}-%{release} Requires: %{name}-draw = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-pdfimport < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-pdfimport = 1:3.3.0 Provides: openoffice.org-pdfimport%{?_isa} = 1:3.3.0 %endif @@ -536,6 +621,8 @@ and enable basic editing of PDF documents. Summary: LibreOffice dingbats font Group: User Interface/X Requires: fontpackages-filesystem +Obsoletes: openoffice.org-fonts < 1:3.3.1 +Obsoletes: openoffice.org-opensymbol-fonts < 1:3.3.1 BuildArch: noarch %if 0%{?rhel} && 0%{?rhel} < 7 Provides: openoffice.org-fonts = 1:3.3.0 @@ -551,8 +638,12 @@ Summary: LibreOffice Word Processor Application Group: Applications/Productivity Requires: %{name}-core = %{epoch}:%{version}-%{release} Requires: %{name}-ure = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-writer-core < 1:3.3.1 +Obsoletes: openoffice.org-writer < 1:3.3.1, broffice.org-writer < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-writer-core = 1:3.3.0 Provides: openoffice.org-writer-core%{?_isa} = 1:3.3.0 +Provides: openoffice.org-writer = 1:3.3.0, broffice.org-writer = 1:3.3.0 Provides: openoffice.org-writer%{?_isa} = 1:3.3.0, broffice.org-writer%{?_isa} = 1:3.3.0 %endif @@ -564,7 +655,9 @@ Summary: Email mail-merge component for LibreOffice Group: Applications/Productivity Requires: %{name}-writer = %{epoch}:%{version}-%{release} Requires: %{name}-pyuno = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-emailmerge < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-emailmerge = 1:3.3.0 Provides: openoffice.org-emailmerge%{?_isa} = 1:3.3.0 %endif @@ -576,8 +669,12 @@ Summary: LibreOffice Spreadsheet Application Group: Applications/Productivity Requires: %{name}-core = %{epoch}:%{version}-%{release} Requires: %{name}-ure = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-calc-core < 1:3.3.1 +Obsoletes: openoffice.org-calc < 1:3.3.1, broffice.org-calc < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-calc-core = 1:3.3.0 Provides: openoffice.org-calc-core%{?_isa} = 1:3.3.0 +Provides: openoffice.org-calc = 1:3.3.0, broffice.org-calc = 1:3.3.0 Provides: openoffice.org-calc%{?_isa} = 1:3.3.0, broffice.org-calc%{?_isa} = 1:3.3.0 %endif @@ -591,8 +688,12 @@ Requires: %{name}-core = %{epoch}:%{version}-%{release} Requires: %{name}-ure = %{epoch}:%{version}-%{release} Requires: %{name}-pdfimport = %{epoch}:%{version}-%{release} Requires: %{name}-graphicfilter = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-draw-core < 1:3.3.1 +Obsoletes: openoffice.org-draw < 1:3.3.1, broffice.org-draw < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-draw-core = 1:3.3.0 Provides: openoffice.org-draw-core%{?_isa} = 1:3.3.0 +Provides: openoffice.org-draw = 1:3.3.0, broffice.org-draw = 1:3.3.0 Provides: openoffice.org-draw%{?_isa} = 1:3.3.0, broffice.org-draw%{?_isa} = 1:3.3.0 %endif @@ -604,11 +705,22 @@ Summary: LibreOffice Presentation Application Group: Applications/Productivity Requires: %{name}-core = %{epoch}:%{version}-%{release} Requires: %{name}-ure = %{epoch}:%{version}-%{release} +Obsoletes: %{name}-presentation-minimizer < 2:4.2.0.0-1.alpha1 Obsoletes: %{name}-presenter-screen < 2:4.0.0.0-1.beta1 +Obsoletes: openoffice.org-impress-core < 1:3.3.1 +Obsoletes: openoffice.org-impress < 1:3.3.1, broffice.org-impress < 1:3.3.1 +Obsoletes: openoffice.org-presentation-minimizer < 1:3.3.1 +Obsoletes: openoffice.org-presenter-screen < 1:3.3.1 +Provides: %{name}-presentation-minimizer%{?_isa} = %{epoch}:%{version}-%{release} Provides: %{name}-presenter-screen%{?_isa} = %{epoch}:%{version}-%{release} %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-impress-core = 1:3.3.0 Provides: openoffice.org-impress-core%{?_isa} = 1:3.3.0 +Provides: openoffice.org-impress = 1:3.3.0, broffice.org-impress = 1:3.3.0 Provides: openoffice.org-impress%{?_isa} = 1:3.3.0, broffice.org-impress%{?_isa} = 1:3.3.0 +Provides: openoffice.org-presentation-minimizer = 1:3.3.0 +Provides: openoffice.org-presentation-minimizer%{?_isa} = 1:3.3.0 +Provides: openoffice.org-presenter-screen = 1:3.3.0 Provides: openoffice.org-presenter-screen%{?_isa} = 1:3.3.0 %endif @@ -620,8 +732,12 @@ Summary: LibreOffice Equation Editor Application Group: Applications/Productivity Requires: %{name}-core = %{epoch}:%{version}-%{release} Requires: %{name}-ure = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-math-core < 1:3.3.1 +Obsoletes: openoffice.org-math < 1:3.3.1, broffice.org-math < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-math-core = 1:3.3.0 Provides: openoffice.org-math-core%{?_isa} = 1:3.3.0 +Provides: openoffice.org-math = 1:3.3.0, broffice.org-math = 1:3.3.0 Provides: openoffice.org-math%{?_isa} = 1:3.3.0, broffice.org-math%{?_isa} = 1:3.3.0 %endif @@ -633,7 +749,9 @@ Summary: LibreOffice Extra Graphic filters Group: Applications/Productivity Requires: %{name}-ure = %{epoch}:%{version}-%{release} Requires: %{name}-core = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-graphicfilter < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-graphicfilter = 1:3.3.0 Provides: openoffice.org-graphicfilter%{?_isa} = 1:3.3.0 %endif @@ -645,7 +763,9 @@ flash filters. Summary: Optional xsltfilter module for LibreOffice Group: Applications/Productivity Requires: %{name}-core = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-xsltfilter < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-xsltfilter = 1:3.3.0 Provides: openoffice.org-xsltfilter%{?_isa} = 1:3.3.0 %endif @@ -671,7 +791,9 @@ creation and management of PostgreSQL databases through a GUI. Summary: UNO Runtime Environment Group: Development/Libraries Requires: unzip, jre >= 1.5.0 +Obsoletes: openoffice.org-ure < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-ure = 1:3.3.0 Provides: openoffice.org-ure%{?_isa} = 1:3.3.0 %endif @@ -689,7 +811,9 @@ Group: Development/Libraries Requires: %{name}-ure = %{epoch}:%{version}-%{release} Requires: %{name}-core = %{epoch}:%{version}-%{release} Requires: unzip, java-devel +Obsoletes: openoffice.org-sdk < 1:3.3.1, openoffice.org-devel < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-sdk = 1:3.3.0, openoffice.org-devel = 1:3.3.0 Provides: openoffice.org-sdk%{?_isa} = 1:3.3.0, openoffice.org-devel%{?_isa} = 1:3.3.0 %endif @@ -703,7 +827,9 @@ building against the sdk use %{sdkinstdir}/setsdkenv_unix.sh. Summary: Software Development Kit documentation for LibreOffice Group: Documentation Requires: %{name}-sdk = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-sdk-doc < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-sdk-doc = 1:3.3.0 Provides: openoffice.org-sdk-doc%{?_isa} = 1:3.3.0 %endif @@ -716,7 +842,9 @@ Summary: LibreOffice Headless plug-in Group: Development/Libraries Requires: %{name}-ure = %{epoch}:%{version}-%{release} Requires: %{name}-core = %{epoch}:%{version}-%{release} +Obsoletes: openoffice.org-headless < 1:3.3.1 %if 0%{?rhel} && 0%{?rhel} < 7 +Provides: openoffice.org-headless = 1:3.3.0 Provides: openoffice.org-headless%{?_isa} = 1:3.3.0 %endif @@ -736,7 +864,19 @@ Requires: glade3-libgladeui %{name}-glade contains a catalog of LibreOffice-specific widgets for glade and ui-previewer tool to check the visual appearance of dialogs. +%package librelogo +Summary: LibreLogo scripting language +Group: Applications/Productivity +Requires: %{name}-writer = %{epoch}:%{version}-%{release} +Requires: %{name}-pyuno = %{epoch}:%{version}-%{release} + +%description librelogo +Enables LibreLogo scripting in Writer. LibreLogo is a Logo-like +programming language with interactive vectorgraphics for education and +DTP. + %if 0%{?fedora} + %package kde Summary: LibreOffice KDE integration plug-in Group: Applications/Productivity @@ -744,6 +884,16 @@ Requires: %{name}-core = %{epoch}:%{version}-%{release} %description kde A plug-in for LibreOffice that enables integration into the KDE desktop environment. + +%package appdata +Summary: AppData support for LibreOffice +Group: Applications/Productivity +License: CC0 +BuildArch: noarch + +%description appdata +%{name}-appdata contains the AppData definition file for LibreOffice. + %endif %if 0%{?_enable_debug_packages} @@ -782,8 +932,8 @@ This package provides gdb pretty printers for package %{name}. %define _langpack_common() \ %{baseinstdir}/program/resource/*%{1}.res \ -%{baseinstdir}/share/config/soffice.cfg/modules/*/ui/res/%{1} \ -%{baseinstdir}/share/config/soffice.cfg/*/ui/res/%{1} \ +%{baseinstdir}/share/config/soffice.cfg/modules/*/ui/res/%{1}.zip \ +%{baseinstdir}/share/config/soffice.cfg/*/ui/res/%{1}.zip \ %{baseinstdir}/share/template/%{1} \ %{baseinstdir}/share/registry/Langpack-%{1}.xcd \ %{baseinstdir}/share/registry/res/registry_%{1}.xcd \ @@ -906,13 +1056,15 @@ BuildArch: noarch \ Rules for auto-correcting common %{langname} typing errors. \ \ %files -n %{pkgname} \ -%doc solver/unxlng*/bin/ure/LICENSE \ +%doc instdir/LICENSE \ %dir %{_datadir}/autocorr \ %{-L:%{_datadir}/autocorr/acor_%{lang}.dat} \ %{!-L:%{_datadir}/autocorr/acor_%{lang}-*.dat} \ %{-i:%{_datadir}/autocorr/acor_%{-i*}-*.dat} \ %{nil} +%langpack -l en -n English -F -H -Y -M -A -E -L en-US -O + %if %{with langpacks} %langpack -l af -n Afrikaans -F -H -Y -A -o af_ZA -V -w af_ZA @@ -930,7 +1082,6 @@ Rules for auto-correcting common %{langname} typing errors. \ %langpack -l de -n German -F -H -Y -M -A -T -X -O -W %langpack -l dz -n Dzongkha -F -s ctl -T -O %langpack -l el -n Greek -F -H -Y -M -T -o el_GR -V -w el_GR -%langpack -l en -n English -F -H -Y -M -A -E -L en-US -O %langpack -l es -n Spanish -F -H -Y -M -A -T -X -O -W %langpack -l et -n Estonian -F -H -Y -T -o et_EE -V -w et_EE %langpack -l eu -n Basque -F -H -Y -T -o eu_ES -V -w eu_ES @@ -945,10 +1096,10 @@ Rules for auto-correcting common %{langname} typing errors. \ %langpack -l fr -n French -F -H -Y -M -A -T -X -O -W %langpack -l ga -n Irish -F -H -Y -M -A -o ga_IE -w ga_IE %langpack -l gl -n Galician -F -H -Y -T -o gl_ES -V -w gl_ES -%langpack -l gu -n Gujarati -F -H -Y -s ctl -o gu_IN -w gu_IN -%langpack -l he -n Hebrew -F -H -s ctl -o he_IL -V -w he_IL +%langpack -l gu -n Gujarati -F -H -Y -s ctl -o gu_IN -w gu_IN -T +%langpack -l he -n Hebrew -F -H -s ctl -o he_IL -V -w he_IL -T %langpack -l hi -n Hindi -F -H -Y -s ctl -T -o hi_IN -v hi-IN -w hi_IN -%langpack -l hr -n Croatian -F -H -Y -A -o hr_HR -V -w hr_HR +%langpack -l hr -n Croatian -F -H -Y -A -o hr_HR -V -w hr_HR -T %langpack -l hu -n Hungarian -F -H -Y -M -A -T -X -o hu_HU -V -w hu_HU %langpack -l it -n Italian -F -H -Y -M -A -T -X -O -W %langpack -l ja -n Japanese -F -A -s cjk -T -X -o ja_JP -V -w ja_JP @@ -963,7 +1114,7 @@ Rules for auto-correcting common %{langname} typing errors. \ %endif %langpack -l mai -n Maithili -F -o mai_IN %if 0%{?rhel} && 0%{?rhel} < 7 -%langpack -l ms -n Malay -F -H +%langpack -l ms -n Malay -F -H -o ms_MY %endif %langpack -l ml -n Malayalam -F -H -Y -o ml_IN -w ml_IN %langpack -l mr -n Marathi -F -H -Y -o mr_IN -w mr_IN @@ -990,7 +1141,7 @@ Rules for auto-correcting common %{langname} typing errors. \ %{baseinstdir}/share/wordbook/sl.dic #rhbz#452379 clump serbian translations together -%langpack -l sr -n Serbian -F -H -Y -A -i sh -O -v sr_CS -w sr_CS +%langpack -l sr -n Serbian -F -H -Y -A -i sr-Latn -O -v sr_CS -w sr_CS %langpack -l ss -n Swati -F -H -o ss_ZA %define langpack_lang Southern Sotho %langpack -l st -n %{langpack_lang} -F -H -o st_ZA @@ -1022,14 +1173,14 @@ Rules for auto-correcting common %{langname} typing errors. \ %autocorr -l af -n Afrikaans %autocorr -l bg -n Bulgarian -%autocorr -l ca -n Catalan -L +%autocorr -l ca -n Catalan %autocorr -l cs -n Czech %autocorr -l da -n Danish %autocorr -l de -n German %autocorr -l es -n Spanish %autocorr -l fa -n Farsi %autocorr -l fi -n Finnish -%autocorr -l fr -n French +%autocorr -l fr -n French -L %autocorr -l ga -n Irish %autocorr -l hr -n Croatian %autocorr -l hu -n Hungarian @@ -1048,7 +1199,7 @@ Rules for auto-correcting common %{langname} typing errors. \ %autocorr -l sk -n Slovak %autocorr -l sl -n Slovenian #rhbz#452379 clump serbian autocorrections together -%autocorr -l sr -n Serbian -i sh +%autocorr -l sr -n Serbian -i sr-Latn %autocorr -l sv -n Swedish %autocorr -l tr -n Turkish %autocorr -l vi -n Vietnamese @@ -1067,6 +1218,15 @@ done \ %prep %setup -q -n %{name}-%{version}%{?libo_prerelease} -b 1 -b 2 rm -rf git-hooks */git-hooks + +# set up git repo +git init +git config user.name rpmbuild +git config user.email rpmbuild@fedoraproject.org +git config gc.auto 0 # disable auto packing +git add -A +git commit -q -a -m %{name}-%{version} + #Customize Palette to remove Sun colours and add Red Hat colours (head -n -1 extras/source/palettes/standard.soc && \ echo -e ' @@ -1076,135 +1236,26 @@ rm -rf git-hooks */git-hooks ' && \ tail -n 1 extras/source/palettes/standard.soc) > redhat.soc mv -f redhat.soc extras/source/palettes/standard.soc -%patch1 -p1 -%patch2 -p1 -b .ooo86080.unopkg.bodge.patch -%patch3 -p1 -b .ooo88341.sc.verticalboxes.patch -%patch4 -p1 -b .oooXXXXX.solenv.allowmissing.patch -%patch5 -p1 -b .ooo101274.opening-a-directory.patch -%patch6 -p1 -b .libreoffice-installfix.patch -%if 0%{?rhel} && 0%{?rhel} < 7 -%patch7 -p1 -b .rhel6gcj.patch -%patch8 -p1 -b .rhel6poppler.patch -%patch9 -p1 -b .rhel6langs.patch -%patch10 -p1 -b .rhel6limits.patch -%patch11 -p1 -b .rhel6glib.patch -%endif -%patch12 -p1 -b .do-not-build-LibreOffice_Test.patch -%patch13 -p1 -b .fdo-48835-application-menu-for-LibreOffice.patch -%patch14 -p1 -b .Make-charmap.cxx-compile-with-icu-4.4.patch -%patch15 -p1 -b .select-sheet-menu-as-a-right-click-popup-to-the-prev.patch -%patch16 -p1 -b .rhbz-1013480-crash-in-EditLineList-operator.patch -%patch17 -p1 -b .rhbz-1015281-crash-on-clicking-custom-anima.patch -%patch18 -p1 -b .rhbz-919070-display-1-means-span-all-display.patch -%patch19 -p1 -b .rhbz-1021915-force-menubar-menus-to-be-up-d.patch -%patch20 -p1 -b .EMF-Stroke-size-is-always-supposed-to-be-absolute.patch -%patch21 -p1 -b .fdo-61272-Do-the-mapping-correctly-both-for-WMF-and-.patch -%patch22 -p1 -b .EMF-Implement-line-dashing.patch -%patch23 -p1 -b .EMF-Parse-and-render-custom-line-cap-data.patch -%patch24 -p1 -b .EMF-Line-thickness-has-to-be-considered-when-drawing.patch -%patch25 -p1 -b .cairo-canvas-Line-dashing-size-depends-on-the-line-w.patch -%patch26 -p1 -b .resolved-fdo-67572-export-add-in-equivalents-as-inte.patch -%patch27 -p1 -b .resolved-fdo-61946-use-correct-TabDelta-for-UpdateRe.patch -%patch28 -p1 -b .resolved-fdo-53103-actually-use-the-external-data-fi.patch -%patch29 -p1 -b .resolved-fdo-67536-export-internal-equivalents-as-ad.patch -%patch30 -p1 -b .fix-2D-vs-3D-coordinatesystem-regression-fdo-67300.patch -%patch31 -p1 -b .fix-validation-error-for-OOXML-chart-export-related-.patch -%patch32 -p1 -b .fdo-72078-make-status-bar-text-localizable.patch -%patch33 -p1 -b .don-t-use-fixed-size-icon-sets-fdo-62652.patch -%patch34 -p1 -b .fdo-71056-add-sup-to-list-of-inline-help-XML-tags.patch -%patch35 -p1 -b .fdo-71434-don-t-show-master-text-if-PlaceHolder-type.patch -%patch36 -p1 -b .write-valid-dxf-record-related-fdo-71971.patch -%patch37 -p1 -b .EMF-Do-not-ignore-source-rectangle-of-the-image-to-b.patch -%patch38 -p1 -b .EMF-force-canvas-if-EMF-comments-are-used.patch -%patch39 -p1 -b .Relater-rhbz-903281-NULL-follow-frames-on-drag-drop.patch -%patch40 -p1 -b .fdo-69984-Handle-duplicate-field-names-correctly.patch -%patch41 -p1 -b .fdo-71892-sw-fix-crash-when-pasting-table-in-footnot.patch -%patch42 -p1 -b .fdo-69518-Correctly-handle-the-old-constraint-syntax.patch -%patch43 -p1 -b .Do-not-create-paths-starting-when-root-is-just.patch -%patch44 -p1 -b .fdo-66984-Define-an-assignment-operator-to-prevent-d.patch -%patch45 -p1 -b .EMF-Fill-line-cap-object-if-EmfPlusCustomLineCapData.patch -%patch46 -p1 -b .fdo-72488-Broken-text-when-showing-visible-space.patch -%patch47 -p1 -b .CID-736170-CID-736171-CID-736172-Out-of-Bounds-read-.patch -%patch48 -p1 -b .sax-xmloff-fix-ODF-import-export-of-text-time-text-t.patch -%patch49 -p1 -b .fdo-66969-Set-selected-page-name-after-building-all-.patch -%patch50 -p1 -b .fdo-66969-Reset-group-dimension-data-from-all-refere.patch -%patch51 -p1 -b .fdo-68160-Revert-Resolves-ii122335-Disabling-the-old.patch -%patch52 -p1 -b .fdo-66864-Return-from-full-screen-should-restore-too.patch -%patch53 -p1 -b .fdo-70499-selectn-of-lock-unlocked-cells-with-worksh.patch -%patch54 -p1 -b .correctly-dispose-to-avoid-cyclic-dependencies.patch -%patch55 -p1 -b .disposed-but-not-dtored.patch -%patch56 -p1 -b .fdo-72697-accept-future-loext-sender-initials.patch -%patch57 -p1 -b .odbc-DBMetaData-NULL-pattern-equivalent-to-not-foo.patch -%patch58 -p1 -b .fdo-72697-actually-write-this-only-in-ODF-1.2-extend.patch -%patch59 -p1 -b .fdo-72163-fix-safer-way.patch -%patch60 -p1 -b .Do-not-use-Boost-in-SDK-examples.patch -%patch61 -p1 -b .Keep-using-component_getImplementationEnvironment-in.patch -%patch62 -p1 -b .Avoid-inaccurate-floating-point-computations.patch -%patch63 -p1 -b .fdo-72850-ODF-export-don-t-export-spurious-style-dis.patch -%patch64 -p1 -b .m_bHasActive-must-be-false-after-last-visible-entry-.patch -%patch65 -p1 -b .fdo-60705-Don-t-discard-valid-printing-options.patch -%patch66 -p1 -b .fdo-70232-sw-brown-paper-bag-fix-for-header-sharing-.patch -%patch67 -p1 -b .fdo-69065-sw-fix-mirrored-page-style-with-first-page.patch -%patch68 -p1 -b .fdo-71429-sw-fix-crashes-when-changing-header-first-.patch -%patch69 -p1 -b .XMLPropertyMapEntry-mbImportOnly-and-XMLPropertySetM.patch -%patch70 -p1 -b .prepare-to-read-loext-vertical-justify-fdo-72922.patch -%patch71 -p1 -b .prepare-to-accept-loext-contextual-spacing-fdo-58112.patch -%patch72 -p1 -b .fdo-67370-Hyphens-are-not-visible-in-tagged-PDF.patch -%patch73 -p1 -b .fdo-72916-correct-rounding-of-time-part-of-DateTime.patch -%patch74 -p1 -b .Fix-stepping-to-the-next-change.patch -%patch75 -p1 -b .DOCX-import-close-rPrChange-properly.patch -%patch76 -p1 -b .fdo-65090-RTF-filter-import-RTF_CLMGF-and-RTF_CLMRG.patch -%patch77 -p1 -b .Resolves-fdo-72961-Crash-when-you-open-ODFver.1.0-1..patch -%patch78 -p1 -b .fdo-39206-Add-support-for-image-transformation-in-SV.patch -%patch79 -p1 -b .EMF-Integer-coordinate-values-are-signed.patch -%patch80 -p1 -b .EMF-actually-use-lineJoin-attribute-for-polygons.patch -%patch81 -p1 -b .EMF-mapping-can-rotate-the-width-vector-so-use-resul.patch -%patch82 -p1 -b .Resolves-fdo-72464-Character-line-break-is-set-to-0-.patch -%patch83 -p1 -b .Make-CalcFocusRect-look-right.patch -%patch84 -p1 -b .die-binfilter-die-die-die.patch -%patch85 -p1 -b .added-EEK-and-LVL-to-EUROCONVERT-EUR-to-LV-locale-da.patch -%patch86 -p1 -b .cp-2013101510000026-wrong-highlight-of-commented-tex.patch -%patch87 -p1 -b .cp-2013101510000026-fix-doc-export-of-comments-initi.patch -%patch88 -p1 -b .cp-2013101510000026-doc-export-of-commented-text-ran.patch -%patch89 -p1 -b .cp-2013101510000026-doc-import-of-comments-affecting.patch -%patch90 -p1 -b .pages-with-equal-Priority-and-Class-getting-dropped.patch -%patch91 -p1 -b .only-write-new-element-and-attributes-in-ODF-1.2-ext.patch -%patch92 -p1 -b .read-elements-attribs-written-to-extension-namespace.patch -%patch93 -p1 -b .cp-2013101510000026-fix-file-coruption-caused-by-com.patch -%patch94 -p1 -b .Fix-fdo-70807-Page-Style-method-isInUse-broken.patch -%patch95 -p1 -b .No-serviceNames-attribute-in-Loader.patch -%patch96 -p1 -b .n-839727-rhbz-1038176-Crash-fix.patch -%patch97 -p1 -b .fdo-72645-Allow-GETPIVOTDATA-to-get-result-from-leaf.patch -%patch98 -p1 -b .fdo-72645-Case-insensitive-string-comparison-in-GETP.patch -%patch99 -p1 -b .fdo-72774-Ensure-that-all-the-group-fields-are-in-ca.patch -%patch100 -p1 -b .fdo-72774-Generate-correct-group-items-for-the-year-.patch -%patch101 -p1 -b .fix-occasional-crash-on-dragging-and-dropping-pages-.patch -%patch102 -p1 -b .fdo-37167-create-statement-before-execute-wasNull-ge.patch -%patch103 -p1 -b .fdo-72219-Fix-for-corruption-of-symbols-in-docx.patch - -# TODO: check this -# these are horribly incomplete--empty translations and copied english -# strings with spattering of translated strings -rm -rf translations/source/{gu,he,hr}/helpcontent2 +git commit -q -a -m 'add Red Hat colors to palette' + +# apply patches +git am %{patches} %if 0%{?rhel} && 0%{?rhel} < 7 cp -r translations/source/en-GB translations/source/ms cp -r translations/source/en-GB translations/source/ur +git add -A +git commit -q -a -m 'fix translations' %endif -# fdo#54514 fix Tango icon names -pushd icon-themes/tango/cmd - mv previouspage.png sc_previouspage.png - mv sc_gotoendodoc.png sc_gotoendofdoc.png -popd +# Seeing .git dir makes some of the build tools change their behavior. +# We do not want that. Note: it is still possible to use +# git --git-dir=.git-rpm +mv .git .git-rpm %build echo build start time is `date`, diskspace: `df -h . | tail -n 1` echo building localizations: %{langpack_langs} -#don't build localized helps which aren't translated -POORHELPS=`ls -d translations/source/*/helpcontent2 translations/source/*|cut -f 3 -d /|sort|uniq -u|xargs` -#don't build localized helps which are poorly translated -POORHELPS="$POORHELPS `grep 'msgstr .Working with Documents' translations/source/*/helpcontent2/source/text/swriter/guide.po| cut -f 3 -d / | xargs`" # path to external tarballs EXTSRCDIR=`dirname %{SOURCE0}` @@ -1218,7 +1269,7 @@ export PATH=$QT4DIR/bin:$PATH #use the RPM_OPT_FLAGS but remove the OOo overridden ones for i in $RPM_OPT_FLAGS; do case "$i" in - -pipe|-Wall|-g|-fexceptions) continue;; + -pipe|-Wall|-Werror*|-g|-fexceptions) continue;; esac ARCH_FLAGS="$ARCH_FLAGS $i" done @@ -1228,15 +1279,17 @@ export CXXFLAGS=$ARCH_FLAGS %if 0%{?rhel} %if 0%{?rhel} < 7 -%define distrooptions --disable-graphite --without-system-mythes --without-system-mdds --without-junit --without-system-redland --without-system-libexttextcat --without-system-libcdr --without-system-libwps --without-system-libwpd --without-system-libwpg --without-system-libcmis --without-system-clucene --without-system-libvisio --without-system-lcms2 --without-system-libmspub --without-system-orcus --without-system-liblangtag --without-system-boost --without-system-libodfgen --without-system-libmwaw --without-system-harfbuzz --enable-gstreamer-0-10 --disable-gstreamer --disable-postgresql-sdbc --with-servlet-api-jar=/usr/share/java/apache-tomcat-apis/tomcat-servlet2.5-api.jar --enable-python=system --with-system-hsqldb +# make segfaults on parallel build +%define distrooptions --disable-eot --disable-firebird-sdbc --disable-gio --disable-graphite --without-junit --enable-gstreamer-0-10 --disable-gstreamer --disable-postgresql-sdbc --enable-python=system --with-system-hsqldb --without-doxygen --with-parallelism=-j1 + %ifarch s390 s390x %define archoptions --disable-sdremote-bluetooth %endif -%else -%define distrooptions --without-system-hsqldb --disable-gstreamer-0-10 --enable-gstreamer --with-system-mythes --enable-python=system --with-servlet-api-jar=/usr/share/java/tomcat-servlet-api.jar +%else # rhel7 +%define distrooptions --disable-eot --disable-firebird-sdbc --disable-gstreamer-0-10 --enable-gstreamer --with-system-mythes --enable-python=system %{?_smp_mflags:--with-parallelism=%{_smp_mflags}} %endif -%else -%define distrooptions --without-system-hsqldb --enable-kde4 --disable-gstreamer-0-10 --enable-gstreamer --with-system-mythes --with-servlet-api-jar=/usr/share/java/tomcat-servlet-api.jar %{?_smp_mflags:--with-parallelism=%{_smp_mflags}} +%else # fedora +%define distrooptions --enable-eot --enable-kde4 --disable-gstreamer-0-10 --enable-gstreamer --with-system-mythes %{?_smp_mflags:--with-parallelism=%{_smp_mflags}} %endif %if %{with langpacks} @@ -1254,22 +1307,22 @@ export PYTHON_LIBS=`python-config --libs python` %endif %endif -# TODO: do we still need this? Perhaps some old patch touches -# configure.ac? +%if 0%{?rhel} aclocal -I m4 autoconf +%endif + # avoid running autogen.sh on make touch autogen.lastrun %configure \ %vendoroption \ %{?with_lang} \ - --disable-ccache \ --disable-fetch-external \ --disable-gnome-vfs \ + --disable-openssl \ --enable-dbus \ --enable-evolution2 \ --enable-ext-nlpsolver \ - --enable-ext-presenter-minimizer \ --enable-ext-wiki-publisher \ --enable-lockdown \ --enable-release-build \ @@ -1288,7 +1341,8 @@ touch autogen.lastrun --without-ppds \ --without-system-npapi-headers \ %{distrooptions} \ - %{archoptions} + %{?bundling_options} \ + %{?archoptions} make VERBOSE=true @@ -1314,7 +1368,7 @@ export PRODUCTVERSIONSHORT PRODUCTVERSION # installation -mkdir -p $RPM_BUILD_ROOT/%{instdir} +mkdir -p %{buildroot}%{instdir} if ! make instsetoo_native PKGFORMAT=installed EPM=not-used-but-must-be-set; then echo - ---dump log start--- cat $ WORKDIR/installation/LibreOffice/installed/logging/en-US/log_*_en-US.log @@ -1327,18 +1381,17 @@ if ! make instsetoo_native PKGFORMAT=installed EPM=not-used-but-must-be-set; the echo - ---dump log end -- languagepacks--- exit 1 fi -mkdir -p $RPM_BUILD_ROOT/%{baseinstdir} -mv $WORKDIR/installation/LibreOffice/installed/install/en-US/* $RPM_BUILD_ROOT/%{baseinstdir} +mkdir -p %{buildroot}%{baseinstdir} +mv $WORKDIR/installation/LibreOffice/installed/install/en-US/* %{buildroot}%{baseinstdir} %if %{with langpacks} for langpack in $WORKDIR/installation/LibreOffice_languagepack/installed/install/*; do [ `basename $langpack` = log ] && continue - cp -rp $langpack/* $RPM_BUILD_ROOT/%{baseinstdir} + cp -rp $langpack/* %{buildroot}%{baseinstdir} rm -rf $langpack done %endif -mv $WORKDIR/installation/LibreOffice_SDK/installed/install/en-US/sdk $RPM_BUILD_ROOT/%{sdkinstdir} -chmod -R +w $RPM_BUILD_ROOT/%{baseinstdir} -rm -f $RPM_BUILD_ROOT/%{baseinstdir}/program/classes/smoketest.jar +mv $WORKDIR/installation/LibreOffice_SDK/installed/install/en-US/sdk %{buildroot}%{sdkinstdir} +chmod -R +w %{buildroot}%{baseinstdir} # postprocessing and tweaks @@ -1347,10 +1400,10 @@ rm -f $RPM_BUILD_ROOT/%{baseinstdir}/program/classes/smoketest.jar # have no inclination to crawl through mountains of perl code to figure out # where it comes from, I am just going to replace it by a sensible # value here. -sed -i -e '/UserInstallation/s@\$ORIGIN/..@$SYSUSERCONFIG@' $RPM_BUILD_ROOT/%{baseinstdir}/program/bootstraprc +sed -i -e '/UserInstallation/s@\$ORIGIN/..@$SYSUSERCONFIG@' %{buildroot}%{baseinstdir}/program/bootstraprc #configure sdk -pushd $RPM_BUILD_ROOT/%{sdkinstdir} +pushd %{buildroot}%{sdkinstdir} sed -e "s,@OO_SDK_NAME@,sdk," \ -e "s,@OO_SDK_HOME@,%{sdkinstdir}," \ -e "s,@OFFICE_HOME@,%{baseinstdir}," \ @@ -1372,14 +1425,14 @@ pushd $RPM_BUILD_ROOT/%{sdkinstdir} popd #ensure a template dir for each lang -pushd $RPM_BUILD_ROOT/%{baseinstdir}/share/template +pushd %{buildroot}%{baseinstdir}/share/template for I in %{langpack_langs}; do mkdir -p $I done popd #Set some aliases to canonical autocorrect language files for locales with matching languages -pushd $RPM_BUILD_ROOT/%{baseinstdir}/share/autocorr +pushd %{buildroot}%{baseinstdir}/share/autocorr %make_autocorr_aliases -l en-GB en-AG en-AU en-BS en-BW en-BZ en-CA en-DK en-GH en-HK en-IE en-IN en-JM en-NG en-NZ en-SG en-TT %make_autocorr_aliases -l en-US en-PH @@ -1390,7 +1443,6 @@ pushd $RPM_BUILD_ROOT/%{baseinstdir}/share/autocorr %make_autocorr_aliases -l af-ZA af-NA %make_autocorr_aliases -l de-DE de-AT de-BE de-CH de-LI de-LU %make_autocorr_aliases -l es-ES es-AR es-BO es-CL es-CO es-CR es-CU es-DO es-EC es-GT es-HN es-MX es-NI es-PA es-PE es-PR es-PY es-SV es-US es-UY es-VE -%make_autocorr_aliases -l fr-FR fr-BE fr-CA fr-CH fr-LU fr-MC %make_autocorr_aliases -l it-IT it-CH %make_autocorr_aliases -l nl-NL nl-AW %make_autocorr_aliases -l sv-SE sv-FI @@ -1399,43 +1451,43 @@ rm -f acor_[a-df-z]*.dat acor_e[su]*.dat %endif popd #rhbz#484055 make these shared across multiple applications -mkdir -p $RPM_BUILD_ROOT/%{_datadir} -mv -f $RPM_BUILD_ROOT/%{baseinstdir}/share/autocorr $RPM_BUILD_ROOT/%{_datadir}/autocorr -chmod 755 $RPM_BUILD_ROOT/%{_datadir}/autocorr +mkdir -p %{buildroot}%{_datadir} +mv -f %{buildroot}%{baseinstdir}/share/autocorr %{buildroot}%{_datadir}/autocorr +chmod 755 %{buildroot}%{_datadir}/autocorr #remove it in case we didn't build with gcj -rm -f $RPM_BUILD_ROOT/%{baseinstdir}/program/classes/sandbox.jar +rm -f %{buildroot}%{baseinstdir}/program/classes/sandbox.jar #remove dummy .dat files -rm -f $RPM_BUILD_ROOT/%{baseinstdir}/program/root?.dat +rm -f %{buildroot}%{baseinstdir}/program/root?.dat #set standard permissions for rpmlint -find $RPM_BUILD_ROOT/%{baseinstdir} -exec chmod +w {} \; -find $RPM_BUILD_ROOT/%{baseinstdir} -type d -exec chmod 0755 {} \; +find %{buildroot}%{baseinstdir} -exec chmod +w {} \; +find %{buildroot}%{baseinstdir} -type d -exec chmod 0755 {} \; # move python bits into site-packages -mkdir -p $RPM_BUILD_ROOT/%{libo_python_sitearch} -pushd $RPM_BUILD_ROOT/%{libo_python_sitearch} +mkdir -p %{buildroot}%{libo_python_sitearch} +pushd %{buildroot}%{libo_python_sitearch} echo "import sys, os" > uno.py echo "sys.path.append('%{baseinstdir}/program')" >> uno.py echo "os.putenv('URE_BOOTSTRAP', 'vnd.sun.star.pathname:%{baseinstdir}/program/fundamentalrc')" >> uno.py -cat $RPM_BUILD_ROOT/%{baseinstdir}/program/uno.py >> uno.py -rm -f $RPM_BUILD_ROOT/%{baseinstdir}/program/uno.py* -mv -f $RPM_BUILD_ROOT/%{baseinstdir}/program/unohelper.py* . +cat %{buildroot}%{baseinstdir}/program/uno.py >> uno.py +rm -f %{buildroot}%{baseinstdir}/program/uno.py* +mv -f %{buildroot}%{baseinstdir}/program/unohelper.py* . popd # rhbz#477435 package opensymbol separately -pushd $RPM_BUILD_ROOT/%{baseinstdir}/share/fonts/truetype +pushd %{buildroot}%{baseinstdir}/share/fonts/truetype install -d -m 0755 %{buildroot}%{_fontdir} install -p -m 0644 *.ttf %{buildroot}%{_fontdir} popd -rm -rf $RPM_BUILD_ROOT/%{baseinstdir}/share/fonts +rm -rf %{buildroot}%{baseinstdir}/share/fonts #ensure that no sneaky un-prelinkable, un-fpic or non executable shared libs #have snuck through pic=0 executable=0 -for foo in `find $RPM_BUILD_ROOT/%{instdir} -name "*" -exec file {} \;| grep ": ELF" | cut -d: -f 1` ; do +for foo in `find %{buildroot}%{instdir} -name "*" -exec file {} \;| grep ": ELF" | cut -d: -f 1` ; do chmod +wx $foo ls -asl $foo result=`readelf -d $foo | grep TEXTREL` || true @@ -1453,51 +1505,29 @@ if [ $pic == 1 ]; then false; fi if [ $executable == 1 ]; then false; fi #make up some /usr/bin scripts -mkdir -p $RPM_BUILD_ROOT/%{_bindir} - -echo \#\!/bin/sh > $RPM_BUILD_ROOT/%{_bindir}/ooffice -echo exec libreoffice \"\$@\" >> $RPM_BUILD_ROOT/%{_bindir}/ooffice -chmod a+x $RPM_BUILD_ROOT/%{_bindir}/ooffice - -echo \#\!/bin/sh > $RPM_BUILD_ROOT/%{_bindir}/ooviewdoc -echo exec libreoffice --view \"\$@\" >> $RPM_BUILD_ROOT/%{_bindir}/ooviewdoc -chmod a+x $RPM_BUILD_ROOT/%{_bindir}/ooviewdoc +mkdir -p %{buildroot}%{_bindir} -echo \#\!/bin/sh > $RPM_BUILD_ROOT/%{_bindir}/oowriter -echo exec libreoffice --writer \"\$@\" >> $RPM_BUILD_ROOT/%{_bindir}/oowriter -chmod a+x $RPM_BUILD_ROOT/%{_bindir}/oowriter +pushd %{buildroot}%{_bindir} +echo \#\!/bin/sh > ooffice +echo exec libreoffice \"\$@\" >> ooffice +chmod a+x ooffice -echo \#\!/bin/sh > $RPM_BUILD_ROOT/%{_bindir}/oocalc -echo exec libreoffice --calc \"\$@\" >> $RPM_BUILD_ROOT/%{_bindir}/oocalc -chmod a+x $RPM_BUILD_ROOT/%{_bindir}/oocalc +echo \#\!/bin/sh > ooviewdoc +echo exec libreoffice --view \"\$@\" >> ooviewdoc +chmod a+x ooviewdoc -echo \#\!/bin/sh > $RPM_BUILD_ROOT/%{_bindir}/ooimpress -echo exec libreoffice --impress \"\$@\" >> $RPM_BUILD_ROOT/%{_bindir}/ooimpress -chmod a+x $RPM_BUILD_ROOT/%{_bindir}/ooimpress - -echo \#\!/bin/sh > $RPM_BUILD_ROOT/%{_bindir}/oodraw -echo exec libreoffice --draw \"\$@\" >> $RPM_BUILD_ROOT/%{_bindir}/oodraw -chmod a+x $RPM_BUILD_ROOT/%{_bindir}/oodraw - -echo \#\!/bin/sh > $RPM_BUILD_ROOT/%{_bindir}/oomath -echo exec libreoffice --math \"\$@\" >> $RPM_BUILD_ROOT/%{_bindir}/oomath -chmod a+x $RPM_BUILD_ROOT/%{_bindir}/oomath - -echo \#\!/bin/sh > $RPM_BUILD_ROOT/%{_bindir}/oobase -echo exec libreoffice --base \"\$@\" >> $RPM_BUILD_ROOT/%{_bindir}/oobase -chmod a+x $RPM_BUILD_ROOT/%{_bindir}/oobase +for app in base calc draw impress math writer; do + echo \#\!/bin/sh > oo$app + echo exec libreoffice --$app \"\$@\" >> oo$app + chmod a+x oo$app +done -cp -f %{SOURCE4} $RPM_BUILD_ROOT/%{_bindir}/unopkg -sed -i -e "s/LAUNCHER/unopkg/g" $RPM_BUILD_ROOT/%{_bindir}/unopkg -sed -i -e "s/BRAND/libreoffice/g" $RPM_BUILD_ROOT/%{_bindir}/unopkg -chmod a+x $RPM_BUILD_ROOT/%{_bindir}/unopkg +sed -e s/LAUNCHER/unopkg/g -e s/BRAND/libreoffice/g %{SOURCE4} > unopkg +chmod a+x unopkg -cp -f %{SOURCE4} $RPM_BUILD_ROOT/%{_bindir}/libreoffice -sed -i -e "s/LAUNCHER/soffice/g" $RPM_BUILD_ROOT/%{_bindir}/libreoffice -sed -i -e "s/BRAND/libreoffice/g" $RPM_BUILD_ROOT/%{_bindir}/libreoffice -chmod a+x $RPM_BUILD_ROOT/%{_bindir}/libreoffice +sed -e s/LAUNCHER/soffice/g -e s/BRAND/libreoffice/g %{SOURCE4} > libreoffice +chmod a+x libreoffice -pushd $RPM_BUILD_ROOT/%{_bindir} # rhbz#499474 provide a /usr/bin/soffice for .recently-used.xbel ln -s %{baseinstdir}/program/soffice soffice # rhbz#499474 provide a /usr/bin/openoffice.org for backwards compat @@ -1509,12 +1539,8 @@ ln -s libreoffice openoffice.org-1.9 %endif popd -# TO-DO, remember to remove the "echo" lines -# and removal of printeradmin.desktop -# for LibreOffice 4.1 where this is upstreamed -pushd $RPM_BUILD_ROOT/%{baseinstdir}/share/xdg/ +pushd %{buildroot}%{baseinstdir}/share/xdg/ chmod u+w *.desktop -rm -rf printeradmin.desktop ICONVERSION=`echo $PRODUCTVERSION | sed -e 's/\.//'` for file in *.desktop; do # rhbz#156677 remove the version from Name= @@ -1524,14 +1550,14 @@ for file in *.desktop; do -e "s/$PRODUCTVERSIONSHORT//g" \ $file done -for app in base calc draw impress math writer; do - echo "TryExec=oo$app" >> $app.desktop -done +# rhbz#156677 / rhbz#186515 do not show math and startcenter +sed -i -e /NoDisplay/s/false/true/ math.desktop startcenter.desktop # relocate the .desktop and icon files -mkdir -p $RPM_BUILD_ROOT/%{_datadir}/applications +mkdir -p %{buildroot}%{_datadir}/applications for app in base calc draw impress math startcenter writer xsltfilter; do + sed -i -e 's/\${UNIXBASISROOTNAME}/%{name}/' $app.desktop desktop-file-validate $app.desktop - cp -p $app.desktop $RPM_BUILD_ROOT/%{_datadir}/applications/libreoffice-$app.desktop + cp -p $app.desktop %{buildroot}%{_datadir}/applications/libreoffice-$app.desktop done popd @@ -1542,46 +1568,65 @@ rm -rf icons/gnome applications application-registry #relocate the rest of them # rhbz#901346 512x512 icons are not used by anything for icon in `find icons -path '*/512x512' -prune -o -type f -print`; do - mkdir -p $RPM_BUILD_ROOT/%{_datadir}/`dirname $icon` - cp -p $icon $RPM_BUILD_ROOT/%{_datadir}/`echo $icon | sed -e s@libreoffice$ICONVERSION-@libreoffice-@ | sed -e s@libreoffice$PRODUCTVERSION-@libreoffice-@` + mkdir -p %{buildroot}%{_datadir}/`dirname $icon` + cp -p $icon %{buildroot}%{_datadir}/`echo $icon | sed -e s@libreoffice$ICONVERSION-@libreoffice-@ | sed -e s@libreoffice$PRODUCTVERSION-@libreoffice-@` done -mkdir -p $RPM_BUILD_ROOT/%{_datadir}/mime-info -cp -p mime-info/libreoffice$PRODUCTVERSION.keys $RPM_BUILD_ROOT/%{_datadir}/mime-info/libreoffice.keys -cp -p mime-info/libreoffice$PRODUCTVERSION.mime $RPM_BUILD_ROOT/%{_datadir}/mime-info/libreoffice.mime +mkdir -p %{buildroot}%{_datadir}/mime-info +cp -p mime-info/libreoffice$PRODUCTVERSION.keys %{buildroot}%{_datadir}/mime-info/libreoffice.keys +cp -p mime-info/libreoffice$PRODUCTVERSION.mime %{buildroot}%{_datadir}/mime-info/libreoffice.mime #add our mime-types, e.g. for .oxt extensions -mkdir -p $RPM_BUILD_ROOT/%{_datadir}/mime/packages -cp -p mime/packages/libreoffice$PRODUCTVERSION.xml $RPM_BUILD_ROOT/%{_datadir}/mime/packages/libreoffice.xml +mkdir -p %{buildroot}%{_datadir}/mime/packages +cp -p mime/packages/libreoffice$PRODUCTVERSION.xml %{buildroot}%{_datadir}/mime/packages/libreoffice.xml popd -rm -rf $RPM_BUILD_ROOT/%{baseinstdir}/readmes -rm -rf $RPM_BUILD_ROOT/%{baseinstdir}/licenses +rm -rf %{buildroot}%{baseinstdir}/readmes +rm -rf %{buildroot}%{baseinstdir}/licenses -mkdir -p $RPM_BUILD_ROOT/%{baseinstdir}/share/psprint/driver -cp -p psprint_config/configuration/ppds/SGENPRT.PS $RPM_BUILD_ROOT/%{baseinstdir}/share/psprint/driver/SGENPRT.PS +mkdir -p %{buildroot}%{baseinstdir}/share/psprint/driver +cp -p psprint_config/configuration/ppds/SGENPRT.PS %{buildroot}%{baseinstdir}/share/psprint/driver/SGENPRT.PS # rhbz#452385 to auto have postgres in classpath if subsequently installed -sed -i -e "s#URE_MORE_JAVA_CLASSPATH_URLS.*#& file:///usr/share/java/postgresql-jdbc.jar#" $RPM_BUILD_ROOT/%{baseinstdir}/program/fundamentalrc +sed -i -e "s#URE_MORE_JAVA_CLASSPATH_URLS.*#& file:///usr/share/java/postgresql-jdbc.jar#" %{buildroot}%{baseinstdir}/program/fundamentalrc # move glade catalog to system glade dir -mkdir -p $RPM_BUILD_ROOT/%{_datadir}/glade3/catalogs -mv $RPM_BUILD_ROOT/%{baseinstdir}/share/glade/libreoffice-catalog.xml $RPM_BUILD_ROOT/%{_datadir}/glade3/catalogs +mkdir -p %{buildroot}%{_datadir}/glade3/catalogs +mv %{buildroot}%{baseinstdir}/share/glade/libreoffice-catalog.xml %{buildroot}%{_datadir}/glade3/catalogs + +%if 0%{?fedora} +# rhbz#1049543 install appdata +mkdir -p %{buildroot}%{_datadir}/appdata +cp -p sysui/desktop/appstream-appdata/*.appdata.xml %{buildroot}%{_datadir}/appdata +%endif -export DESTDIR=$RPM_BUILD_ROOT +# install man pages +install -m 0755 -d %{buildroot}%{_mandir}/man1 +install -m 0644 -p sysui/desktop/man/*.1 %{buildroot}%{_mandir}/man1 +for app in oobase oocalc oodraw ooffice ooimpress oomath ooviewdoc oowriter openoffice.org soffice; do + echo '.so man1/libreoffice.1' > $app.1 + install -m 0644 -p $app.1 %{buildroot}%{_mandir}/man1 +done + +export DESTDIR=%{buildroot} make cmd cmd="install-gdb-printers -a %{_datadir}/gdb/auto-load%{baseinstdir} -c -i %{baseinstdir} -p %{_datadir}/libreoffice/gdb" -#%check -#unset WITH_LANG -## work around flawed accessibility check -#export JFW_PLUGIN_DO_NOT_CHECK_ACCESSIBILITY="1" -#%if 0%{?rhel} && 0%{?rhel} < 7 -#timeout 2h make smoketest.subsequentcheck -#%else -#timeout -k 2m 2h make smoketest.subsequentcheck -#%endif +%check +unset WITH_LANG +# work around flawed accessibility check +export JFW_PLUGIN_DO_NOT_CHECK_ACCESSIBILITY="1" +export OOO_TEST_SOFFICE=path:%{buildroot}%{baseinstdir}/program/soffice +%if 0%{?rhel} && 0%{?rhel} < 7 +timeout 2h make smoketest.subsequentcheck +%else +timeout -k 2m 2h make smoketest.subsequentcheck +%endif +# we don't need this anymore +rm -f %{buildroot}%{baseinstdir}/program/classes/smoketest.jar %files +%files filters + %files core %dir %{baseinstdir} %dir %{baseinstdir}/help @@ -1604,7 +1649,6 @@ make cmd cmd="install-gdb-printers -a %{_datadir}/gdb/auto-load%{baseinstdir} -c %{baseinstdir}/program/libbasprovlo.so %{baseinstdir}/program/libcairocanvaslo.so %{baseinstdir}/program/libcanvasfactorylo.so -%{baseinstdir}/program/cde-open-url %dir %{baseinstdir}/program/classes %{baseinstdir}/program/classes/commonwizards.jar %{baseinstdir}/program/classes/form.jar @@ -1624,7 +1668,6 @@ make cmd cmd="install-gdb-printers -a %{_datadir}/gdb/auto-load%{baseinstdir} -c %{baseinstdir}/program/libexpwraplo.so %{baseinstdir}/program/libfastsaxlo.so %{baseinstdir}/program/flat_logo.svg -%{baseinstdir}/program/libfpickerlo.so %{baseinstdir}/program/libfps_officelo.so %{baseinstdir}/program/gdbtrace %{baseinstdir}/program/gengal @@ -1673,6 +1716,9 @@ make cmd cmd="install-gdb-printers -a %{_datadir}/gdb/auto-load%{baseinstdir} -c %{baseinstdir}/program/liberalo.so %{baseinstdir}/program/libetilo.so %{baseinstdir}/program/libexplo.so +%if 0%{?fedora} +%{baseinstdir}/program/libfirebird_sdbclo.so +%endif %{baseinstdir}/program/libicdlo.so %{baseinstdir}/program/libicglo.so %{baseinstdir}/program/libidxlo.so @@ -1703,12 +1749,13 @@ make cmd cmd="install-gdb-printers -a %{_datadir}/gdb/auto-load%{baseinstdir} -c %{baseinstdir}/program/liblocaledata_others.so %{baseinstdir}/program/libmcnttype.so %{baseinstdir}/program/libmorklo.so -%{baseinstdir}/program/libmozbootstrap.so +%{baseinstdir}/program/libmozbootstraplo.so %{baseinstdir}/program/libmsfilterlo.so %{baseinstdir}/program/libmtfrendererlo.so %{baseinstdir}/program/libmysqllo.so %{baseinstdir}/program/libodbclo.so %{baseinstdir}/program/libodbcbaselo.so +%{baseinstdir}/program/liboglcanvaslo.so %{baseinstdir}/program/liboffacclo.so %{baseinstdir}/program/libooxlo.so %{baseinstdir}/program/libpcrlo.so @@ -1811,7 +1858,6 @@ make cmd cmd="install-gdb-printers -a %{_datadir}/gdb/auto-load%{baseinstdir} -c %{baseinstdir}/program/resource/svxen-US.res %{baseinstdir}/program/resource/swen-US.res %{baseinstdir}/program/resource/textconversiondlgsen-US.res -%{baseinstdir}/program/resource/tken-US.res %{baseinstdir}/program/resource/tplen-US.res %{baseinstdir}/program/resource/uuien-US.res %{baseinstdir}/program/resource/upden-US.res @@ -1828,7 +1874,6 @@ make cmd cmd="install-gdb-printers -a %{_datadir}/gdb/auto-load%{baseinstdir} -c %{baseinstdir}/program/spadmin.bin %{baseinstdir}/program/libstringresourcelo.so %{baseinstdir}/program/libsysshlo.so -%{baseinstdir}/program/tde-open-url %{baseinstdir}/program/libucpcmis1lo.so %{baseinstdir}/program/libucpexpand1lo.so %{baseinstdir}/program/libucpextlo.so @@ -1852,6 +1897,7 @@ make cmd cmd="install-gdb-printers -a %{_datadir}/gdb/auto-load%{baseinstdir} -c %{baseinstdir}/share/config/images_crystal.zip %{baseinstdir}/share/config/images_hicontrast.zip %{baseinstdir}/share/config/images_oxygen.zip +%{baseinstdir}/share/config/images_sifr.zip %{baseinstdir}/share/config/images_tango.zip %{baseinstdir}/share/config/psetup.xpm %{baseinstdir}/share/config/psetupl.xpm @@ -1901,18 +1947,9 @@ make cmd cmd="install-gdb-printers -a %{_datadir}/gdb/auto-load%{baseinstdir} -c %{baseinstdir}/share/wordbook/en-GB.dic %{baseinstdir}/share/wordbook/en-US.dic %{baseinstdir}/share/wordbook/technical.dic -%dir %{baseinstdir}/share/xslt -%{baseinstdir}/share/xslt/common -%dir %{baseinstdir}/share/xslt/export -%{baseinstdir}/share/xslt/export/common -%{baseinstdir}/share/xslt/export/spreadsheetml -%{baseinstdir}/share/xslt/export/wordml -%dir %{baseinstdir}/share/xslt/import -%{baseinstdir}/share/xslt/import/common -%{baseinstdir}/share/xslt/import/spreadsheetml -%{baseinstdir}/share/xslt/import/wordml %{baseinstdir}/program/liblnthlo.so %{_bindir}/unopkg +%{_mandir}/man1/unopkg.1* #icons and mime %{_datadir}/icons/*/*/*/libreoffice* %{_datadir}/mime-info/libreoffice.* @@ -1926,7 +1963,6 @@ make cmd cmd="install-gdb-printers -a %{_datadir}/gdb/auto-load%{baseinstdir} -c %{baseinstdir}/program/libbasegfxlo.so # TODO: shouldn't it have lo suffix? %{baseinstdir}/program/libcomphelper.so -%{baseinstdir}/program/libfileacc.so %{baseinstdir}/program/libfwelo.so %{baseinstdir}/program/libfwilo.so %{baseinstdir}/program/libfwklo.so @@ -1964,10 +2000,10 @@ make cmd cmd="install-gdb-printers -a %{_datadir}/gdb/auto-load%{baseinstdir} -c %{baseinstdir}/program/bootstraprc %{baseinstdir}/program/fundamentalrc %{baseinstdir}/program/setuprc -%doc %{baseinstdir}/CREDITS.odt +%doc %{baseinstdir}/CREDITS.fodt %doc %{baseinstdir}/LICENSE %doc %{baseinstdir}/LICENSE.html -%doc %{baseinstdir}/LICENSE.odt +%doc %{baseinstdir}/LICENSE.fodt %doc %{baseinstdir}/NOTICE %{baseinstdir}/program/intro.* %{baseinstdir}/program/soffice @@ -1999,6 +2035,11 @@ make cmd cmd="install-gdb-printers -a %{_datadir}/gdb/auto-load%{baseinstdir} -c %{baseinstdir}/program/liblcms2.so.2 %{baseinstdir}/share/fingerprint %endif +%{_mandir}/man1/libreoffice.1* +%{_mandir}/man1/openoffice.org.1* +%{_mandir}/man1/soffice.1* +%{_mandir}/man1/ooffice.1* +%{_mandir}/man1/ooviewdoc.1* %post core update-mime-database %{_datadir}/mime &> /dev/null || : @@ -2049,6 +2090,7 @@ done %{baseinstdir}/program/sbase %{_datadir}/applications/libreoffice-base.desktop %{_bindir}/oobase +%{_mandir}/man1/oobase.1* %post base update-desktop-database %{_datadir}/applications &> /dev/null || : @@ -2080,10 +2122,6 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %{baseinstdir}/share/config/soffice.cfg/simpress/transitions-ogl.xml %{baseinstdir}/share/registry/ogltrans.xcd -%files presentation-minimizer -%docdir %{baseinstdir}/share/extensions/presentation-minimizer/help -%{baseinstdir}/share/extensions/presentation-minimizer - %files pdfimport %{baseinstdir}/program/libpdfimportlo.so %{baseinstdir}/program/xpdfimport @@ -2092,7 +2130,7 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %{baseinstdir}/share/xpdfimport/xpdfimport_err.pdf %_font_pkg -n %{fontname} opens___.ttf -%doc solver/unxlng*/bin/ure/LICENSE +%doc instdir/LICENSE %files calc %{baseinstdir}/help/en-US/scalc.* @@ -2105,6 +2143,7 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %{baseinstdir}/program/libsclo.so %{baseinstdir}/program/libscdlo.so %{baseinstdir}/program/libscfiltlo.so +%{baseinstdir}/program/libscopencllo.so %{baseinstdir}/program/libscuilo.so %{baseinstdir}/program/libsolverlo.so %{baseinstdir}/program/resource/analysisen-US.res @@ -2120,6 +2159,7 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %{baseinstdir}/program/scalc %{_datadir}/applications/libreoffice-calc.desktop %{_bindir}/oocalc +%{_mandir}/man1/oocalc.1* %post calc update-desktop-database %{_datadir}/applications &> /dev/null || : @@ -2134,6 +2174,7 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %{baseinstdir}/program/sdraw %{_datadir}/applications/libreoffice-draw.desktop %{_bindir}/oodraw +%{_mandir}/man1/oodraw.1* %post draw update-desktop-database %{_datadir}/applications &> /dev/null || : @@ -2162,6 +2203,7 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %{baseinstdir}/program/swriter %{_datadir}/applications/libreoffice-writer.desktop %{_bindir}/oowriter +%{_mandir}/man1/oowriter.1* %post writer update-desktop-database %{_datadir}/applications &> /dev/null || : @@ -2173,15 +2215,20 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %{baseinstdir}/help/en-US/simpress.* %{baseinstdir}/program/libanimcorelo.so %{baseinstdir}/program/libplacewarelo.so +%{baseinstdir}/program/libPresentationMinimizerlo.so %{baseinstdir}/program/libPresenterScreenlo.so +%{baseinstdir}/program/libwpftimpresslo.so %dir %{baseinstdir}/share/config/soffice.cfg/simpress %{baseinstdir}/share/config/soffice.cfg/simpress/effects.xml +%{baseinstdir}/share/config/soffice.cfg/simpress/layoutlist.xml +%{baseinstdir}/share/config/soffice.cfg/simpress/objectlist.xml %{baseinstdir}/share/config/soffice.cfg/simpress/transitions.xml %{baseinstdir}/share/registry/impress.xcd %{baseinstdir}/program/pagein-impress %{baseinstdir}/program/simpress %{_datadir}/applications/libreoffice-impress.desktop %{_bindir}/ooimpress +%{_mandir}/man1/ooimpress.1* %post impress update-desktop-database %{_datadir}/applications &> /dev/null || : @@ -2198,6 +2245,7 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %{baseinstdir}/program/smath %{_datadir}/applications/libreoffice-math.desktop %{_bindir}/oomath +%{_mandir}/man1/oomath.1* %post math update-desktop-database %{_datadir}/applications &> /dev/null || : @@ -2210,14 +2258,10 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %{baseinstdir}/program/libgraphicfilterlo.so %{baseinstdir}/program/libsvgfilterlo.so %{baseinstdir}/program/libwpftdrawlo.so -%{baseinstdir}/program/resource/flashen-US.res %{baseinstdir}/share/registry/graphicfilter.xcd %files xsltfilter -%{baseinstdir}/share/xslt/docbook -%{baseinstdir}/share/xslt/export/uof -%{baseinstdir}/share/xslt/export/xhtml -%{baseinstdir}/share/xslt/import/uof +%{baseinstdir}/share/xslt %{baseinstdir}/share/registry/xsltfilter.xcd %{_datadir}/applications/libreoffice-xsltfilter.desktop @@ -2227,11 +2271,11 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %{baseinstdir}/program/libpostgresql-sdbc-impllo.so %{baseinstdir}/program/postgresql-sdbc.ini %{baseinstdir}/program/services/postgresql-sdbc.rdb -%{baseinstdir}/share/registry/postgresqlsdbc.xcd +%{baseinstdir}/share/registry/postgresql.xcd %endif %files ure -%doc solver/unxlng*/bin/ure/LICENSE +%doc instdir/LICENSE %{ureinstdir} %files sdk @@ -2255,29 +2299,60 @@ update-desktop-database %{_datadir}/applications &> /dev/null || : %{baseinstdir}/program/pythonloader.unorc %{baseinstdir}/program/pythonscript.py* %{baseinstdir}/program/pyuno.so +%{baseinstdir}/program/services/pyuno.rdb %{baseinstdir}/program/services/scriptproviderforpython.rdb %{baseinstdir}/program/wizards %{baseinstdir}/share/Scripts/python +%exclude %{baseinstdir}/share/Scripts/python/LibreLogo %{libo_python_sitearch}/uno.py* %{libo_python_sitearch}/unohelper.py* %if 0%{libo_python3} %{libo_python_sitearch}/__pycache__/uno.cpython-* %{libo_python_sitearch}/__pycache__/unohelper.cpython-* %endif -%{baseinstdir}/share/registry/librelogo.xcd %{baseinstdir}/share/registry/pyuno.xcd +%files librelogo +%{baseinstdir}/share/registry/librelogo.xcd +%{baseinstdir}/share/Scripts/python/LibreLogo + %files glade %{baseinstdir}/program/ui-previewer %{_datadir}/glade3/catalogs/libreoffice-catalog.xml %if 0%{?fedora} + %files kde %{baseinstdir}/program/libkde4be1lo.so %{baseinstdir}/program/libvclplug_kde4lo.so + +%files appdata +%doc instdir/LICENSE +%dir %{_datadir}/appdata +%{_datadir}/appdata/*.appdata.xml + %endif %changelog +* Mon Dec 01 2014 Stephan Bergmann - 1:4.2.6.3-5 +- Resolves: rhbz#1098973 crash on exit + +* Fri Nov 21 2014 David Tardon - 1:4.2.6.3-4 +- Resolves: rhbz#1111216 LibreOffice Calc: PDF export of an empty document fails + with Write Error + +* Mon Nov 17 2014 Caolán McNamara - 1:4.2.6.3-3 +- CVE-2014-3693: Disable sdremote by default and improve flow control + +* Fri Sep 05 2014 David Tardon - 1:4.2.6.3-2 +- Related: rhbz#1119709 port LibreOffice to aarch64 + +* Thu Aug 28 2014 David Tardon - 1:4.2.6.3-1 +- Resolves: rhbz#1119709 rebase to 4.2.6 + +* Fri Aug 22 2014 Caolán McNamara - 1:4.1.4.2-4 +- Resolves: rhbz#1125588 port LibreOffice to ppc64le + * Fri Jan 24 2014 Daniel Mach - 1:4.1.4.2-3 - Mass rebuild 2014-01-24