bin/pack-debug | 2 desktop/source/lib/init.cxx | 17 +++++ include/svx/srchdlg.hxx | 4 + include/vcl/ITiledRenderable.hxx | 5 + oox/qa/unit/data/tdf170095.pptx |binary oox/qa/unit/shape.cxx | 19 +++++ oox/source/drawingml/shape.cxx | 17 +++-- sc/inc/docuno.hxx | 3 sc/qa/unit/tiledrendering/data/PrintRanges.ods |binary sc/qa/unit/tiledrendering/tiledrendering.cxx | 14 ++++ sc/source/ui/unoobj/docuno.cxx | 14 ++++ sd/uiconfig/simpress/ui/customanimationspanel.ui | 78 ++++++++++++----------- solenv/bin/modules/installer/epmfile.pm | 2 svx/source/dialog/srchdlg.cxx | 20 +++++ svx/source/svdraw/svdobj.cxx | 28 ++++++++ svx/uiconfig/ui/findreplacedialog.ui | 39 +++++++++++ sw/source/uibase/docvw/edtwin.cxx | 2 sysui/desktop/freedesktop/freedesktop-menus.spec | 4 - vcl/inc/font/LogicalFontInstance.hxx | 12 --- vcl/jsdialog/enabled.cxx | 1 vcl/source/font/LogicalFontInstance.cxx | 30 -------- vcl/source/gdi/CommonSalLayout.cxx | 13 --- vcl/source/treelist/iconview.cxx | 5 + 23 files changed, 228 insertions(+), 101 deletions(-)
New commits: commit f4055677ca63cfdeb34295bdaa4ea7a04b1f4a16 Author: Jaume Pujantell <[email protected]> AuthorDate: Tue Dec 23 09:26:12 2025 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Jan 10 17:11:36 2026 +0100 tdf#170095 override soft edge if there are 3D effects In OOXML, 3D effects override the soft-edge effect. Currently in LO 3D effects are not implemented, they are just remembered in a grabbag. To bring LO's behavior closer to other software, if when loaded there are both 3D effects and soft edge effect we ignore the soft edge effect. And if, while editing, a user adds soft edge effect then we dumb the remembered 3D effects in the grabbag. Change-Id: I2f59422d25c24bb4f9042694e0315bb15a2ac4c5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196151 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Miklos Vajna <[email protected]> diff --git a/oox/qa/unit/data/tdf170095.pptx b/oox/qa/unit/data/tdf170095.pptx new file mode 100644 index 000000000000..65bf6535bb48 Binary files /dev/null and b/oox/qa/unit/data/tdf170095.pptx differ diff --git a/oox/qa/unit/shape.cxx b/oox/qa/unit/shape.cxx index 13bc7a1a086e..5ac67b454933 100644 --- a/oox/qa/unit/shape.cxx +++ b/oox/qa/unit/shape.cxx @@ -1079,6 +1079,25 @@ CPPUNIT_TEST_FIXTURE(OoxShapeTest, testDigitGuideName_mathEqual) CPPUNIT_ASSERT_DOUBLES_EQUAL(10000.0, fBoundRectHeight, 5); } } + +CPPUNIT_TEST_FIXTURE(OoxShapeTest, testTdf170095SoftEdge3D) +{ + // Load file with a shape with both soft edge and 3D effects + loadFromFile(u"tdf170095.pptx"); + + // Then make sure the shape has no soft edge: + uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + sal_Int32 nSoftEdgeRad{}; + xShape->getPropertyValue(u"SoftEdgeRadius"_ustr) >>= nSoftEdgeRad; + // Without the accompanying fix in place, this test would have failed with: + // - Expected: 0 + // - Actual : 882 + CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nSoftEdgeRad); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index dece867749bc..336f7dc9172a 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -1620,6 +1620,18 @@ Reference< XShape > const & Shape::createAndInsert( aShapeProps.setProperty(PROP_CharHeight, GetFontHeight( mpMasterTextListStyle->getListStyle()[0].getTextCharacterProperties().moHeight.value() )); } + Sequence<PropertyValue> aCamera3DEffects = get3DProperties().getCameraAttributes(); + Sequence<PropertyValue> aLightRig3DEffects = get3DProperties().getLightRigAttributes(); + Sequence<PropertyValue> aShape3DEffects + = get3DProperties().getShape3DAttributes(rGraphicHelper, nFillPhClr); + bool bHas3DProps = aCamera3DEffects.hasElements() || aLightRig3DEffects.hasElements() + || aShape3DEffects.hasElements(); + if (bHas3DProps) + { + // 3D properties override softeEdge + getEffectProperties().maSoftEdge.moRad = 0; + } + // applying properties aShapeProps.assignUsed( getShapeProperties() ); aShapeProps.assignUsed( maDefaultShapeProperties ); @@ -2013,10 +2025,7 @@ Reference< XShape > const & Shape::createAndInsert( } // add 3D effects if any to GrabBag. They are still used in export. - Sequence< PropertyValue > aCamera3DEffects = get3DProperties().getCameraAttributes(); - Sequence< PropertyValue > aLightRig3DEffects = get3DProperties().getLightRigAttributes(); - Sequence< PropertyValue > aShape3DEffects = get3DProperties().getShape3DAttributes( rGraphicHelper, nFillPhClr ); - if( aCamera3DEffects.hasElements() || aLightRig3DEffects.hasElements() || aShape3DEffects.hasElements() ) + if (bHas3DProps) { uno::Sequence<beans::PropertyValue> a3DEffectsGrabBag = comphelper::InitPropertySequence( { diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx index 66c35a1086da..3fa54ec4622b 100644 --- a/svx/source/svdraw/svdobj.cxx +++ b/svx/source/svdraw/svdobj.cxx @@ -36,6 +36,7 @@ #include <drawinglayer/processor2d/contourextractor2d.hxx> #include <drawinglayer/processor2d/linegeometryextractor2d.hxx> #include <comphelper/processfactory.hxx> +#include <comphelper/sequence.hxx> #include <editeng/editeng.hxx> #include <editeng/outlobj.hxx> #include <o3tl/deleter.hxx> @@ -2054,6 +2055,33 @@ const SfxPoolItem& SdrObject::GetMergedItem(const sal_uInt16 nWhich) const void SdrObject::SetMergedItemSetAndBroadcast(const SfxItemSet& rSet, bool bClearAllItems) { GetProperties().SetMergedItemSetAndBroadcast(rSet, bClearAllItems); + + const SdrMetricItem* pItem; + const bool bSetSoftEdge + = (SfxItemState::SET == rSet.GetItemState(SDRATTR_SOFTEDGE_RADIUS, true, &pItem) + && pItem->GetValue() > 0); + if (bSetSoftEdge) + { + // Remove 3D grabbag + try + { + css::uno::Any aAnyGrabBag; + GetGrabBagItem(aAnyGrabBag); + uno::Sequence<beans::PropertyValue> aSeqGrabBag + = aAnyGrabBag.get<uno::Sequence<beans::PropertyValue>>(); + auto it = std::find_if(aSeqGrabBag.begin(), aSeqGrabBag.end(), + [](const beans::PropertyValue& rProp) { + return rProp.Name == u"3DEffectProperties"_ustr; + }); + if (it == aSeqGrabBag.end()) + return; + comphelper::removeElementAt(aSeqGrabBag, it - aSeqGrabBag.begin()); + SetGrabBagItem(css::uno::Any(aSeqGrabBag)); + } + catch (...) + { + } + } } void SdrObject::ApplyNotPersistAttr(const SfxItemSet& rAttr) commit e6468bc7da8d83425db3fb2ac0219f9ac26bb3ad Author: Szymon Kłos <[email protected]> AuthorDate: Mon Dec 22 05:39:31 2025 +0000 Commit: Andras Timar <[email protected]> CommitDate: Sat Jan 10 17:11:36 2026 +0100 sidebar: fix span values for Impress -> Animation deck - in grid we had single element which was in last column - span it inside box with the second column item - all other fields should occupy full width Change-Id: Ia7dd79798e436377b18ea0c2dfda1b7754780bd5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196059 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Darshan Upadhyay <[email protected]> Reviewed-by: Szymon Kłos <[email protected]> diff --git a/sd/uiconfig/simpress/ui/customanimationspanel.ui b/sd/uiconfig/simpress/ui/customanimationspanel.ui index a9ae9154b9da..7c6578232ff9 100644 --- a/sd/uiconfig/simpress/ui/customanimationspanel.ui +++ b/sd/uiconfig/simpress/ui/customanimationspanel.ui @@ -315,9 +315,9 @@ </child> </object> <packing> - <property name="left-attach">1</property> + <property name="left-attach">0</property> <property name="top-attach">1</property> - <property name="width">2</property> + <property name="width">3</property> </packing> </child> <child> @@ -473,6 +473,7 @@ <packing> <property name="left-attach">1</property> <property name="top-attach">5</property> + <property name="width">2</property> </packing> </child> <child> @@ -488,25 +489,6 @@ <property name="top-attach">6</property> </packing> </child> - <child> - <object class="GtkButton" id="more_properties"> - <property name="visible">True</property> - <property name="can-focus">True</property> - <property name="receives-default">True</property> - <property name="tooltip-text" translatable="yes" context="customanimationspanel|more_properties|tooltip_text">Options</property> - <property name="image">image1</property> - <property name="always-show-image">True</property> - <child internal-child="accessible"> - <object class="AtkObject" id="more_properties-atkobject"> - <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|more_properties">Specifies additional properties for the selected element in the Custom Animations pane.</property> - </object> - </child> - </object> - <packing> - <property name="left-attach">2</property> - <property name="top-attach">6</property> - </packing> - </child> <child> <object class="GtkLabel" id="effect_duration"> <property name="visible">True</property> @@ -537,6 +519,7 @@ <packing> <property name="left-attach">1</property> <property name="top-attach">7</property> + <property name="width">2</property> </packing> </child> <child> @@ -569,6 +552,7 @@ <packing> <property name="left-attach">1</property> <property name="top-attach">8</property> + <property name="width">2</property> </packing> </child> <child> @@ -650,32 +634,52 @@ </packing> </child> <child> - <object class="GtkBox" id="placeholder"> + <object class="GtkBox" id="dirspan"> <property name="visible">True</property> <property name="can-focus">False</property> - <property name="hexpand">True</property> - <property name="spacing">6</property> <child> - <placeholder/> + <object class="GtkBox" id="placeholder"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="hexpand">True</property> + <property name="spacing">6</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="more_properties"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="tooltip-text" translatable="yes" context="customanimationspanel|more_properties|tooltip_text">Options</property> + <property name="image">image1</property> + <property name="always-show-image">True</property> + <child internal-child="accessible"> + <object class="AtkObject" id="more_properties-atkobject"> + <property name="AtkObject::accessible-description" translatable="yes" context="customanimationspanel|extended_tip|more_properties">Specifies additional properties for the selected element in the Custom Animations pane.</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> </object> <packing> <property name="left-attach">1</property> <property name="top-attach">6</property> + <property name="width">2</property> </packing> </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> - <child> - <placeholder/> - </child> </object> </child> </object> commit 2d3f06afe352e73cafbca3b5b03a4d3750601fd9 Author: Andras Timar <[email protected]> AuthorDate: Thu Nov 13 08:50:58 2025 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Jan 10 17:11:36 2026 +0100 Fedora 43 rejects RPM packages that lack SHA-256 digests in the header Change-Id: I51b8d5e3203711bc38bec33892cd5d9346fbe4ae Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193940 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Andras Timar <[email protected]> diff --git a/bin/pack-debug b/bin/pack-debug index 70e3f80c7ed4..ab677738f22b 100755 --- a/bin/pack-debug +++ b/bin/pack-debug @@ -105,7 +105,7 @@ cat $DEBUGSRC | awk ' # debug build source package - rpmbuild -bb --define "_unpackaged_files_terminate_build 0" --define "_binary_payload w1T.xzdio" ${DEBUGSRC}-debugsource --target $build_cpu --buildroot=$buildroot + rpmbuild -bb --define "_unpackaged_files_terminate_build 0" --define "_binary_payload w2.xzdio" --define "_binary_filedigest_algorithm 8" ${DEBUGSRC}-debugsource --target $build_cpu --buildroot=$buildroot echo Update RPM download tar.gz diff --git a/solenv/bin/modules/installer/epmfile.pm b/solenv/bin/modules/installer/epmfile.pm index 472cc4b24b4d..60c35853a6b7 100644 --- a/solenv/bin/modules/installer/epmfile.pm +++ b/solenv/bin/modules/installer/epmfile.pm @@ -1225,7 +1225,7 @@ sub set_autoprovreq_in_specfile close (FINDREQUIRES); } - $autoreqprovline .= "%define _binary_filedigest_algorithm 1 %define _binary_payload w1T.xzdio "; + $autoreqprovline .= "%define _binary_filedigest_algorithm 8 %define _binary_payload w2.xzdio "; for ( my $i = 0; $i <= $#{$changefile}; $i++ ) { diff --git a/sysui/desktop/freedesktop/freedesktop-menus.spec b/sysui/desktop/freedesktop/freedesktop-menus.spec index ca79db012a26..a21444ac26a4 100644 --- a/sysui/desktop/freedesktop/freedesktop-menus.spec +++ b/sysui/desktop/freedesktop/freedesktop-menus.spec @@ -32,8 +32,8 @@ Conflicts: %pkgprefix-redhat-menus Conflicts: %pkgprefix-mandriva-menus BuildArch: noarch AutoReqProv: no -%define _binary_filedigest_algorithm 1 -%define _binary_payload w1T.xzdio +%define _binary_filedigest_algorithm 8 +%define _binary_payload w2.xzdio %define gnome_dir /usr commit 62be940be76471f0cc54df600c8d03dc806c3253 Author: Shardul Vikram Singh <[email protected]> AuthorDate: Wed Oct 22 18:43:21 2025 +0530 Commit: Andras Timar <[email protected]> CommitDate: Sat Jan 10 17:11:36 2026 +0100 JSDialog: implement jsdialog for mergecellsdialog Change-Id: I5318082404f298563a91467e683ea45b21a99ea0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/192851 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Szymon Kłos <[email protected]> Tested-by: Szymon Kłos <[email protected]> diff --git a/vcl/jsdialog/enabled.cxx b/vcl/jsdialog/enabled.cxx index 0e6b999e0365..603186c807d6 100644 --- a/vcl/jsdialog/enabled.cxx +++ b/vcl/jsdialog/enabled.cxx @@ -172,6 +172,7 @@ constexpr auto ScalcDialogList { u"modules/scalc/ui/imoptdialog.ui" }, { u"modules/scalc/ui/insertcells.ui" }, { u"modules/scalc/ui/managenamesdialog.ui" }, + { u"modules/scalc/ui/mergecellsdialog.ui" }, { u"modules/scalc/ui/movecopysheet.ui" }, { u"modules/scalc/ui/movingaveragedialog.ui" }, { u"modules/scalc/ui/optimalcolwidthdialog.ui" }, commit d87d09edeb15884fcf719b5827b73c730cfd447f Author: Sahil Gautam <[email protected]> AuthorDate: Thu Jul 31 12:08:09 2025 +0530 Commit: Andras Timar <[email protected]> CommitDate: Sat Jan 10 17:11:36 2026 +0100 tdf#167647 add tabs to find and replace dialog add two toggle buttons on top of the "find replace dialog" and make them behave as tabs i.e. when replace is clicked, show the replace controls. when the dialog first shows up, we hide the replace controls and when the user switches to replace tab, we show the replace controls, find controls are always visible. i thought through various other ways it could have been done (most of them being more complicated than the current solution). 1. "could we create one tab and just return a shared pointer to it for different tabs so that they share the page". this requires us to return a shared pointer from TabPageClass::Create which is passed in the AddTabPage function. i thought "could we internally store a raw pointer and then in the Create function of the tab page, we return the unique_ptr to it." this doesn't seem like a good idea as when the first tab page is destructed, the raw pointer in the Create function and the unique pointers in other tab pages will become invalid leading to double free. 2. "what if i add the frame only to the first tab and in the code set it as a child of the second tab as well, using something like set_child" -> weld doesn't have any such function as far as i could search. 3. convert the current find-replace dialog into a tab page and add two different instances of it to the dialog. then transfer the data to the other tab on tab switch. this would require addition of a lot of getters and setters and might introduce bugs. Change-Id: I49c5640f39262578e31caee839c2059bb86610a6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188644 Reviewed-by: Szymon Kłos <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> diff --git a/include/svx/srchdlg.hxx b/include/svx/srchdlg.hxx index 34d82fbb9d28..d35bd5b98cf2 100644 --- a/include/svx/srchdlg.hxx +++ b/include/svx/srchdlg.hxx @@ -186,6 +186,8 @@ private: std::unique_ptr<weld::Label> m_xSearchLabel; std::unique_ptr<weld::Image> m_xSearchIcon; std::unique_ptr<weld::Container> m_xSearchBox; + std::unique_ptr<weld::ToggleButton> m_xFindTabBtn; + std::unique_ptr<weld::ToggleButton> m_xReplaceTabBtn; std::unique_ptr<weld::Frame> m_xReplaceFrame; std::unique_ptr<weld::ComboBox> m_xReplaceLB; @@ -247,8 +249,10 @@ private: DECL_DLLPRIVATE_LINK(NoFormatHdl_Impl, weld::Button&, void); DECL_DLLPRIVATE_LINK(AttributeHdl_Impl, weld::Button&, void); DECL_DLLPRIVATE_LINK( TimeoutHdl_Impl, Timer*, void ); + DECL_DLLPRIVATE_LINK(OnTabBtnClick, weld::Toggleable&, void); SVX_DLLPRIVATE void ClickHdl_Impl(const weld::Widget* pCtrl); + SVX_DLLPRIVATE void SetReplaceCtrlsVisible(bool bVisible); SVX_DLLPRIVATE void Construct_Impl(); SVX_DLLPRIVATE void InitControls_Impl(); SVX_DLLPRIVATE void ShowOptionalControls_Impl(); diff --git a/svx/source/dialog/srchdlg.cxx b/svx/source/dialog/srchdlg.cxx index d167b729a514..73cc877f8e2d 100644 --- a/svx/source/dialog/srchdlg.cxx +++ b/svx/source/dialog/srchdlg.cxx @@ -262,6 +262,8 @@ SvxSearchDialog::SvxSearchDialog(weld::Window* pParent, SfxChildWindow* pChildWi , m_xSearchLabel(m_xBuilder->weld_label(u"searchlabel"_ustr)) , m_xSearchIcon(m_xBuilder->weld_image(u"searchicon"_ustr)) , m_xSearchBox(m_xBuilder->weld_container(u"searchbox"_ustr)) + , m_xFindTabBtn(m_xBuilder->weld_toggle_button(u"find_tab_btn"_ustr)) + , m_xReplaceTabBtn(m_xBuilder->weld_toggle_button(u"replace_tab_btn"_ustr)) , m_xReplaceFrame(m_xBuilder->weld_frame(u"replaceframe"_ustr)) , m_xReplaceLB(m_xBuilder->weld_combo_box(u"replaceterm"_ustr)) , m_xReplaceTmplLB(m_xBuilder->weld_combo_box(u"replacelist"_ustr)) @@ -346,6 +348,7 @@ SvxSearchDialog::SvxSearchDialog(weld::Window* pParent, SfxChildWindow* pChildWi m_xReplaceTmplLB->set_size_request(nTermWidth, -1); Construct_Impl(); + SetReplaceCtrlsVisible(false); } IMPL_LINK_NOARG(SvxSearchDialog, PresentTimeoutHdl_Impl, Timer*, void) @@ -383,6 +386,16 @@ SvxSearchDialog::~SvxSearchDialog() m_pImpl.reset(); } +void SvxSearchDialog::SetReplaceCtrlsVisible(bool bVisible) +{ + m_xFindTabBtn->set_active(!bVisible); + m_xReplaceTabBtn->set_active(bVisible); + + m_xReplaceFrame->set_visible(bVisible); + m_xReplaceBtn->set_visible(bVisible); + m_xReplaceAllBtn->set_visible(bVisible); +} + void SvxSearchDialog::Construct_Impl() { m_pImpl.reset(new SearchDlg_Impl()); @@ -646,6 +659,8 @@ void SvxSearchDialog::InitControls_Impl() m_xSearchLB->connect_changed( LINK( this, SvxSearchDialog, ModifyHdl_Impl ) ); m_xReplaceLB->connect_changed( LINK( this, SvxSearchDialog, ModifyHdl_Impl ) ); + m_xFindTabBtn->connect_toggled(LINK(this, SvxSearchDialog, OnTabBtnClick)); + m_xReplaceTabBtn->connect_toggled(LINK(this, SvxSearchDialog, OnTabBtnClick)); Link<weld::Widget&,void> aLink = LINK( this, SvxSearchDialog, FocusHdl_Impl ); m_xSearchLB->connect_focus_in( aLink ); @@ -1277,6 +1292,11 @@ void SvxSearchDialog::ClickHdl_Impl(const weld::Widget* pCtrl) SaveToModule_Impl(); } +IMPL_LINK(SvxSearchDialog, OnTabBtnClick, weld::Toggleable&, rBtn, void) +{ + SetReplaceCtrlsVisible(&rBtn == m_xReplaceTabBtn.get()); +} + IMPL_LINK(SvxSearchDialog, CommandHdl_Impl, weld::Button&, rBtn, void) { bool bInclusive = (m_xLayoutBtn->get_label() == m_sLayoutStr); diff --git a/svx/uiconfig/ui/findreplacedialog.ui b/svx/uiconfig/ui/findreplacedialog.ui index fc2206515cb1..1c9952ea111c 100644 --- a/svx/uiconfig/ui/findreplacedialog.ui +++ b/svx/uiconfig/ui/findreplacedialog.ui @@ -56,6 +56,45 @@ <property name="position">0</property> </packing> </child> + <child> + <object class="GtkBox" id="findreplacetabbox"> + <property name="visible">True</property> + <property name="can-focus">False</property> + <property name="halign">start</property> + <property name="spacing">6</property> + <child> + <object class="GtkToggleButton" id="find_tab_btn"> + <property name="label" translatable="yes" context="findreplacedialog|find_tab_btn">Find</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkToggleButton" id="replace_tab_btn"> + <property name="label" translatable="yes" context="findreplacedialog|replace_tab_btn">Replace</property> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> <child> <object class="GtkBox" id="parent _container_box"> <property name="visible">True</property> commit 00a4b06defe42dcb222b4bb566ae0630b12fdbb1 Author: Gökay Şatır <[email protected]> AuthorDate: Wed Sep 3 20:31:56 2025 +0300 Commit: Andras Timar <[email protected]> CommitDate: Sat Jan 10 17:11:36 2026 +0100 cool#12762: Calc Online: Implement doc_getPrintRanges for document load. Issue: If a document has print ranges defined, Online side doesn't get it on document load and can't show the ranges. Fix: Add it to the document status message. There is also an Online side commit. Also a test added for the feature. Signed-off-by: Gökay Şatır <[email protected]> Change-Id: Id7c1f37be435b2ac6e9f7bb6554376e1867bfbcb Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190563 Reviewed-by: Miklos Vajna <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 459410748b1a..15b79c9bdbb9 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -6720,6 +6720,19 @@ static char* getUndoOrRedo(LibreOfficeKitDocument* pThis, UndoOrRedo eCommand) return pJson; } +/// Returns the JSON representation of print ranges in the document +static char* getPrintRanges(LibreOfficeKitDocument* pThis) +{ + ITiledRenderable* pDoc = getTiledRenderable(pThis); + if (!pDoc) + { + SetLastExceptionMsg(u"Document doesn't support tiled rendering"_ustr); + return nullptr; + } + + return convertOString(rtl::OUStringToOString(pDoc->getPrintRanges(), RTL_TEXTENCODING_UTF8)); +} + /// Returns only the number of the undo or redo elements static char* getUndoOrRedoCount(LibreOfficeKitDocument* pThis, UndoOrRedo eCommand) { @@ -6862,6 +6875,10 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo { return getUndoOrRedo(pThis, UndoOrRedo::REDO); } + else if (aCommand == ".uno:DefinePrintArea") + { + return getPrintRanges(pThis); + } else if (aCommand == ".uno:UndoCount") { return getUndoOrRedoCount(pThis, UndoOrRedo::UNDO); diff --git a/include/vcl/ITiledRenderable.hxx b/include/vcl/ITiledRenderable.hxx index f7ce84f12d51..f93e831a38ea 100644 --- a/include/vcl/ITiledRenderable.hxx +++ b/include/vcl/ITiledRenderable.hxx @@ -95,6 +95,11 @@ public: return Size(1, 1); } + virtual OUString getPrintRanges() + { + return OUString(); + } + /** * Set the document "part", i.e. slide for a slideshow, and * tab for a spreadsheet. diff --git a/sc/inc/docuno.hxx b/sc/inc/docuno.hxx index 5d62c5a13a35..82654a750055 100644 --- a/sc/inc/docuno.hxx +++ b/sc/inc/docuno.hxx @@ -313,6 +313,9 @@ public: /// @see vcl::ITiledRenderable::getDataArea(). virtual Size getDataArea(long nPart) override; + /// @see vcl::ITiledRenderable::getPrintRanges(). + virtual OUString getPrintRanges() override; + /// @see vcl::ITiledRenderable::setPart(). virtual void setPart(int nPart, bool bAllowChangeFocus = true) override; diff --git a/sc/qa/unit/tiledrendering/data/PrintRanges.ods b/sc/qa/unit/tiledrendering/data/PrintRanges.ods new file mode 100644 index 000000000000..a15824d94ad7 Binary files /dev/null and b/sc/qa/unit/tiledrendering/data/PrintRanges.ods differ diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx b/sc/qa/unit/tiledrendering/tiledrendering.cxx index 123a6c99f628..8962205b819a 100644 --- a/sc/qa/unit/tiledrendering/tiledrendering.cxx +++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx @@ -3655,6 +3655,20 @@ CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testPivotFilterPosition) CPPUNIT_ASSERT(it != aView.m_aStateChanges.end()); } +CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testPrintRanges) +{ + ScModelObj* pModelObj = createDoc("PrintRanges.ods"); + ScTestViewCallback aView; + pModelObj->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>()); + + /* + Expected output: { \"printranges\": [ { \"sheet\": 0, \"ranges\": [ [ 2, 6, 2, 6]]}]} + */ + OUString printRanges = pModelObj->getPrintRanges().replaceAll(" ", ""); + + CPPUNIT_ASSERT_EQUAL(u"{\"printranges\":[{\"sheet\":0,\"ranges\":[[2,6,2,6]]}]}"_ustr, printRanges); +} + CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testLOKLanguageStatus) { ScModelObj* pModelObj = createDoc("pivotfr.ods"); diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index d2371ceb940d..9288173ef712 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -141,6 +141,8 @@ #include <strings.hrc> +#include <prnsave.hxx> + using namespace com::sun::star; // #i111553# provides the name of the VBA constant for this document type (e.g. 'ThisExcelDoc' for Calc) @@ -803,6 +805,18 @@ Size ScModelObj::getDataArea(long nPart) return aSize; } +OUString ScModelObj::getPrintRanges() +{ + const ScDocument& rDoc = pDocShell->GetDocument(); + + std::unique_ptr<ScPrintRangeSaver> pSaver = rDoc.CreatePrintRangeSaver(); + + tools::JsonWriter aJsonWriter; + pSaver->GetPrintRangesInfo(aJsonWriter); + + return OStringToOUString(aJsonWriter.finishAndGetAsOString(), RTL_TEXTENCODING_UTF8); +} + void ScModelObj::postKeyEvent(int nType, int nCharCode, int nKeyCode) { SolarMutexGuard aGuard; commit c62c364bc065ebbe7be70cc33e86f98c1726e1d6 Author: Maya Stephens <[email protected]> AuthorDate: Thu Dec 11 15:14:40 2025 +0000 Commit: Andras Timar <[email protected]> CommitDate: Sat Jan 10 17:11:36 2026 +0100 sw: make readonly dialog async when deleting protected content Open writer-edit.fodt, select all and press backspace; the Read-Only Content dialog is synchronous. This commit makes the dialog asynchronous. Very similar to https://gerrit.libreoffice.org/c/core/+/176113, the dialog does not give the warning when the delete key is used instead of backspace before this commit. Change-Id: I9db5fd8a4e5ebb20dbb539119aadbf846a6a6964 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195475 Reviewed-by: Miklos Vajna <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> diff --git a/sw/source/uibase/docvw/edtwin.cxx b/sw/source/uibase/docvw/edtwin.cxx index 8f5a2d3d3e37..1cf591c6605a 100644 --- a/sw/source/uibase/docvw/edtwin.cxx +++ b/sw/source/uibase/docvw/edtwin.cxx @@ -2152,7 +2152,7 @@ KEYINPUT_CHECKTABLE_INSDEL: } else if (!rSh.IsCursorInParagraphMetadataField()) { - rSh.InfoReadOnlyDialog(false); + rSh.InfoReadOnlyDialog(true); eKeyState = SwKeyState::End; } break; commit f182015ff73782c8db19ccce421f3d7cb82a2b91 Author: Maya Stephens <[email protected]> AuthorDate: Fri Dec 19 15:23:04 2025 +0000 Commit: Andras Timar <[email protected]> CommitDate: Sat Jan 10 17:11:36 2026 +0100 Add size info to icons with ondemand rendering For icons with on demand rendering, send the image width and height to make the placeholder image the correct size. Change-Id: Ib47e297dca830c153c0c1ac0e130d2c26a6a6964 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196571 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Michael Stahl <[email protected]> diff --git a/vcl/source/treelist/iconview.cxx b/vcl/source/treelist/iconview.cxx index 2eb254eb2fe0..3e65cf847a0b 100644 --- a/vcl/source/treelist/iconview.cxx +++ b/vcl/source/treelist/iconview.cxx @@ -327,8 +327,13 @@ void IconView::DumpEntryAndSiblings(tools::JsonWriter& rJsonWriter, SvTreeListEn if (pIt) { const SvLBoxContextBmp* pBmpItem = static_cast<const SvLBoxContextBmp*>(pIt); + Size i = pBmpItem->GetBitmap1().GetSizePixel(); if (pBmpItem) + { rJsonWriter.put("ondemand", true); + rJsonWriter.put("width", i.getWidth()); + rJsonWriter.put("height", i.getHeight()); + } } if (const OUString tooltip = GetEntryTooltip(pEntry); !tooltip.isEmpty()) commit 15eb22a9584d8ac8d3654b06c3466bccaa6c37ba Author: Jeff Huang <[email protected]> AuthorDate: Wed Dec 10 14:19:03 2025 +0800 Commit: Andras Timar <[email protected]> CommitDate: Sat Jan 10 17:11:35 2026 +0100 tdf#169920 Remove hardcoded DFKai-SB fix Commit 257bb11cbc5b1eb1f90014f528b9e7d6ccfeae86 introduced a compensation to glyph position miscalculation for DFKai-SB. After commit 6f4a949c07eb06345df08c722f8e59e97888a499, this causes over- compensation. This patch reverts commit 257bb11cbc5b1eb1f90014f528b9e7d6ccfeae86 Co-authored-by: Firefly <[email protected]> Change-Id: I0027f38d5eae58694c59b7590fc3315aae5deef0 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195347 Reviewed-by: Mike Kaganski <[email protected]> Tested-by: Jenkins (cherry picked from commit 005e787efec6c1e352e3cd17231d70508cd18d8e) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195849 Tested-by: Xisco Fauli <[email protected]> Reviewed-by: Xisco Fauli <[email protected]> diff --git a/vcl/inc/font/LogicalFontInstance.hxx b/vcl/inc/font/LogicalFontInstance.hxx index 8a199a4c5980..943fd2555558 100644 --- a/vcl/inc/font/LogicalFontInstance.hxx +++ b/vcl/inc/font/LogicalFontInstance.hxx @@ -97,9 +97,6 @@ public: // TODO: make data members private inline hb_font_t* GetHbFont(); SAL_DLLPRIVATE bool IsGraphiteFont(); - // NeedOffsetCorrection: Return if the font need offset correction in TTB direction. - // nYOffset is the original offset. It is used to check if the correction is necessary. - SAL_DLLPRIVATE bool NeedOffsetCorrection(sal_Int32 nYOffset); void SetAverageWidthFactor(double nFactor) { m_nAveWidthFactor = std::abs(nFactor); } double GetAverageWidthFactor() const { return m_nAveWidthFactor; } const vcl::font::FontSelectPattern& GetFontSelectPattern() const { return m_aFontSelData; } @@ -152,15 +149,6 @@ private: rtl::Reference<vcl::font::PhysicalFontFace> m_pFontFace; std::optional<bool> m_xbIsGraphiteFont; - enum class FontFamilyEnum - { - Unclassified, - DFKaiSB - }; - - // The value is initialized and used in NeedOffsetCorrection(). - std::optional<FontFamilyEnum> m_xeFontFamilyEnum; - mutable hb_draw_funcs_t* m_pHbDrawFuncs = nullptr; basegfx::B2DPolygon m_aDrawPolygon; }; diff --git a/vcl/source/font/LogicalFontInstance.cxx b/vcl/source/font/LogicalFontInstance.cxx index 971965385164..e79b06bf15d9 100644 --- a/vcl/source/font/LogicalFontInstance.cxx +++ b/vcl/source/font/LogicalFontInstance.cxx @@ -243,36 +243,6 @@ bool LogicalFontInstance::IsGraphiteFont() return *m_xbIsGraphiteFont; } -bool LogicalFontInstance::NeedOffsetCorrection(sal_Int32 nYOffset) -{ - if (!m_xeFontFamilyEnum) - { - m_xeFontFamilyEnum = FontFamilyEnum::Unclassified; - - // DFKai-SB (ukai.ttf) is a built-in font under traditional Chinese - // Windows. It has wrong extent values in glyf table. The problem results - // in wrong positioning of glyphs in vertical writing. - // Check https://github.com/harfbuzz/harfbuzz/issues/3521 for reference. - if (GetFontFace()->GetName(vcl::font::NAME_ID_FONT_FAMILY) == "DFKai-SB") - m_xeFontFamilyEnum = FontFamilyEnum::DFKaiSB; - } - - bool bRet = true; - - switch (*m_xeFontFamilyEnum) - { - case FontFamilyEnum::DFKaiSB: - // -839: optimization for one third of ukai.ttf - if (nYOffset == -839) - bRet = false; - break; - default: - bRet = false; - } - - return bRet; -} - bool LogicalFontInstance::NeedsArtificialBold() const { return m_aFontSelData.GetWeight() > WEIGHT_MEDIUM && m_pFontFace->GetWeight() <= WEIGHT_MEDIUM; diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx index e6ec3a176ce5..4c6f54139e03 100644 --- a/vcl/source/gdi/CommonSalLayout.cxx +++ b/vcl/source/gdi/CommonSalLayout.cxx @@ -794,19 +794,6 @@ bool GenericSalLayout::LayoutText(vcl::text::ImplLayoutArgs& rArgs, const SalLay nAdvance = -pHbPositions[i].y_advance; nXOffset = -pHbPositions[i].y_offset; nYOffset = -pHbPositions[i].x_offset - nBaseOffset; - - if (GetFont().NeedOffsetCorrection(pHbPositions[i].y_offset)) - { - // We need glyph's advance, top bearing, and height to - // correct y offset. - basegfx::B2DRectangle aRect; - // Get cached bound rect value for the font, - GetFont().GetGlyphBoundRect(nGlyphIndex, aRect, true); - - nXOffset = -(aRect.getMinX() / nXScale + ( pHbPositions[i].y_advance - + ( aRect.getHeight() / nXScale ) ) / 2.0 ); - } - } else {
