chart2/source/controller/dialogs/dlg_Theme.cxx | 66 ++++++++---- chart2/source/controller/inc/ChartController.hxx | 3 chart2/source/controller/inc/dlg_Theme.hxx | 6 - chart2/source/controller/main/ChartController.cxx | 58 ++++++++++ chart2/source/controller/main/ControllerCommandDispatch.cxx | 2 chart2/source/controller/sidebar/ChartThemeControl.cxx | 21 +++ chart2/source/controller/sidebar/ChartThemeControl.hxx | 3 chart2/source/controller/sidebar/ChartThemePanel.cxx | 2 chart2/uiconfig/ui/chartthemepopup.ui | 8 + chart2/uiconfig/ui/dlg_Theme.ui | 44 ++++++-- svx/source/svdraw/svdmrkv.cxx | 26 ++++ vcl/inc/jsdialog/jsdialogbuilder.hxx | 2 vcl/jsdialog/jsdialogbuilder.cxx | 12 ++ 13 files changed, 216 insertions(+), 37 deletions(-)
New commits: commit 26e926a2cf745d21d6a47bc3231e51d450086f1e Author: Attila Szűcs <[email protected]> AuthorDate: Tue Sep 2 14:35:40 2025 +0200 Commit: Marco Cecchetti <[email protected]> CommitDate: Wed Feb 4 11:39:50 2026 +0100 Chart themes improvements Added a selection only version for manage themes. Added manage themes button to select theme popup. Added uno command for save to new theme. Renamed chart theme to chart style in UI. added some things needed for lok. Change-Id: Iae79603445914fe08c89ce7e45bb5bc12ee2ae3d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190525 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Caolán McNamara <[email protected]> Tested-by: Caolán McNamara <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198496 Reviewed-by: Marco Cecchetti <[email protected]> diff --git a/chart2/source/controller/dialogs/dlg_Theme.cxx b/chart2/source/controller/dialogs/dlg_Theme.cxx index 576e17d6c5a8..e21add16358a 100644 --- a/chart2/source/controller/dialogs/dlg_Theme.cxx +++ b/chart2/source/controller/dialogs/dlg_Theme.cxx @@ -29,31 +29,36 @@ using namespace css; namespace chart { -SchThemeDlg::SchThemeDlg(weld::Window* pWindow, ChartController* pController) +SchThemeDlg::SchThemeDlg(weld::Window* pWindow, ChartController* pController, bool bSelectOnly) : GenericDialogController(pWindow, u"modules/schart/ui/dlg_Theme.ui"_ustr, u"ChartThemeDialog"_ustr) , mxModel(pController->getChartModel()) , mpController(pController) + , mbSelectOnly(bSelectOnly) , mxThemeIconView(m_xBuilder->weld_icon_view(u"themeview"_ustr)) - , mxSaveTheme(m_xBuilder->weld_button(u"save"_ustr)) - , mxLoadTheme(m_xBuilder->weld_button(u"load"_ustr)) - , mxDeleteTheme(m_xBuilder->weld_button(u"delete"_ustr)) - , mxSaveToNewTheme(m_xBuilder->weld_button(u"savetonew"_ustr)) + , mxSaveTheme(m_xBuilder->weld_button(u"chartsave"_ustr)) + , mxLoadTheme(m_xBuilder->weld_button(u"chartload"_ustr)) + , mxDeleteTheme(m_xBuilder->weld_button(u"chartdelete"_ustr)) + , mxSaveToNewTheme(m_xBuilder->weld_button(u"chartsavetonew"_ustr)) + , mxChangeToManage(m_xBuilder->weld_button(u"chartmanage"_ustr)) { mxThemeIconView->connect_selection_changed(LINK(this, SchThemeDlg, ThemeSelectedHdl)); + mxThemeIconView->connect_item_activated(LINK(this, SchThemeDlg, ThemeItemActivatedHdl)); mxSaveTheme->connect_clicked(LINK(this, SchThemeDlg, ClickSaveHdl)); mxLoadTheme->connect_clicked(LINK(this, SchThemeDlg, ClickLoadHdl)); mxDeleteTheme->connect_clicked(LINK(this, SchThemeDlg, ClickDeleteHdl)); mxSaveToNewTheme->connect_clicked(LINK(this, SchThemeDlg, ClickSaveToNewHdl)); + mxChangeToManage->connect_clicked(LINK(this, SchThemeDlg, ClickChangeToManageHdl)); mxSaveTheme->set_sensitive(false); mxDeleteTheme->set_sensitive(false); - mxSaveTheme->set_visible(true); - mxLoadTheme->set_visible(true); - mxDeleteTheme->set_visible(true); - mxSaveToNewTheme->set_visible(true); + mxChangeToManage->set_visible(mbSelectOnly); + mxSaveTheme->set_visible(!mbSelectOnly); + mxLoadTheme->set_visible(!mbSelectOnly); + mxDeleteTheme->set_visible(!mbSelectOnly); + mxSaveToNewTheme->set_visible(!mbSelectOnly); mxThemeIconView->set_item_width(200); @@ -165,20 +170,20 @@ IMPL_LINK_NOARG(SchThemeDlg, ClickDeleteHdl, weld::Button&, void) if (sId.isEmpty()) return; int nIndex = sId.toInt32(); - // remove it from the themes - ChartThemesType& aChartTypes = ChartThemesType::getInstance(); - aChartTypes.m_aThemes.erase(aChartTypes.m_aThemes.begin() + nIndex); - // remove it from the list - mxThemeIconView->remove(nIndex); - // fix the numbers in the list. + // fix the numbers in the list, before the delete int nThemeCount = ChartThemesType::getInstance().getThemesCount(); - for (int i = nIndex; i < nThemeCount; i++) + for (int i = nIndex + 1; i < nThemeCount; i++) { - sId = OUString::number(i); - OUString sLayoutName = OUString::number(i); + sId = OUString::number(i - 1); + OUString sLayoutName = OUString::number(i - 1); mxThemeIconView->set_id(i, sId); mxThemeIconView->set_text(i, sLayoutName); } + // remove it from the themes + ChartThemesType& aChartTypes = ChartThemesType::getInstance(); + aChartTypes.m_aThemes.erase(aChartTypes.m_aThemes.begin() + nIndex); + // remove it from the list + mxThemeIconView->remove(nIndex); } IMPL_LINK_NOARG(SchThemeDlg, ClickSaveToNewHdl, weld::Button&, void) @@ -203,6 +208,17 @@ IMPL_LINK_NOARG(SchThemeDlg, ClickSaveToNewHdl, weld::Button&, void) device1.disposeAndClear(); } +IMPL_LINK_NOARG(SchThemeDlg, ClickChangeToManageHdl, weld::Button&, void) +{ + mbSelectOnly = false; + mxChangeToManage->set_visible(mbSelectOnly); + mxSaveTheme->set_visible(!mbSelectOnly); + mxLoadTheme->set_visible(!mbSelectOnly); + mxDeleteTheme->set_visible(!mbSelectOnly); + mxSaveToNewTheme->set_visible(!mbSelectOnly); + // Todo: resize window. +} + IMPL_LINK_NOARG(SchThemeDlg, ThemeSelectedHdl, weld::IconView&, void) { // enable / disable buttons based on the selected theme @@ -223,6 +239,20 @@ IMPL_LINK_NOARG(SchThemeDlg, ThemeSelectedHdl, weld::IconView&, void) mxLoadTheme->set_sensitive(bSelected); } +IMPL_LINK_NOARG(SchThemeDlg, ThemeItemActivatedHdl, weld::IconView&, bool) +{ + if (mbSelectOnly) + { + OUString sId = mxThemeIconView->get_selected_id(); + if (sId.isEmpty()) + return false; + int nIndex = sId.toInt32(); + mpController->setTheme(nIndex); + return true; + } + return false; +} + } //namespace chart /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/source/controller/inc/ChartController.hxx b/chart2/source/controller/inc/ChartController.hxx index e7f848ad0153..de5f8475b11a 100644 --- a/chart2/source/controller/inc/ChartController.hxx +++ b/chart2/source/controller/inc/ChartController.hxx @@ -428,7 +428,8 @@ private: void executeDlg_ObjectProperties_withUndoGuard( std::shared_ptr<UndoGuard> aUndoGuard, const OUString& rObjectCID, bool bSuccessOnUnchanged ); void executeDispatch_ChartType(); - void executeDispatch_ManageThemes(); + void executeDispatch_ManageThemes(bool bSelectOnly = false); + void executeDispatch_SaveToNewTheme(); void executeDispatch_InsertTitles(); void executeDispatch_InsertLegend(); diff --git a/chart2/source/controller/inc/dlg_Theme.hxx b/chart2/source/controller/inc/dlg_Theme.hxx index 3891e205565d..72dbde277409 100644 --- a/chart2/source/controller/inc/dlg_Theme.hxx +++ b/chart2/source/controller/inc/dlg_Theme.hxx @@ -30,23 +30,27 @@ class SchThemeDlg final : public weld::GenericDialogController private: rtl::Reference<ChartModel> mxModel; ChartController* mpController; + bool mbSelectOnly; std::unique_ptr<weld::IconView> mxThemeIconView; std::unique_ptr<weld::Button> mxSaveTheme; std::unique_ptr<weld::Button> mxLoadTheme; std::unique_ptr<weld::Button> mxDeleteTheme; std::unique_ptr<weld::Button> mxSaveToNewTheme; + std::unique_ptr<weld::Button> mxChangeToManage; DECL_LINK(ClickSaveHdl, weld::Button&, void); DECL_LINK(ClickLoadHdl, weld::Button&, void); DECL_LINK(ClickDeleteHdl, weld::Button&, void); DECL_LINK(ClickSaveToNewHdl, weld::Button&, void); + DECL_LINK(ClickChangeToManageHdl, weld::Button&, void); DECL_LINK(ThemeSelectedHdl, weld::IconView&, void); + DECL_LINK(ThemeItemActivatedHdl, weld::IconView&, bool); VclPtr<VirtualDevice> makeImage(int nIndex); public: - SchThemeDlg(weld::Window* pParent, ChartController* pController); + SchThemeDlg(weld::Window* pParent, ChartController* pController, bool bSelectOnly); }; } //namespace chart diff --git a/chart2/source/controller/main/ChartController.cxx b/chart2/source/controller/main/ChartController.cxx index e81171eb8a86..aba6abaeb824 100644 --- a/chart2/source/controller/main/ChartController.cxx +++ b/chart2/source/controller/main/ChartController.cxx @@ -1145,6 +1145,44 @@ void SAL_CALL ChartController::dispatch( this->executeDispatch_EditData(); else if( aCommand == "ManageThemes") this->executeDispatch_ManageThemes(); + else if (aCommand == "SelectTheme") + { + this->executeDispatch_ManageThemes(true); + // Todo: try to make a popup window only + // it did something but not displayed anything. + + //static std::shared_ptr<sidebar::ChartThemeControl> pThemeControl + // = std::make_shared<sidebar::ChartThemeControl>(m_xCC); + //assert(pThemeControl); + //std::shared_ptr<sidebar::IThemeHandler> mxThemeWrapper + // = sidebar::createThemeWrapper(getChartModel(), pThemeControl.get(), this); + //pThemeControl->setThemeHandler(mxThemeWrapper); + //pThemeControl->weldPopupWindow(); + + // it need addition includes: + //#include <../sidebar/ChartThemePanel.hxx> + //#include <../sidebar/ChartThemeControl.hxx> + + // it need createThemeWrapper a ChartThemePanel.cxx: + //std::shared_ptr<sidebar::IThemeHandler> createThemeWrapper( + // rtl::Reference<ChartModel> xModel, ChartThemeControl * pControl, + // ChartController * pController) + //{ + // return std::make_shared<sidebar::ThemeWrapper>(xModel, pControl, pController); + //} + + // and in a ChartThemePanel.hxx: + //struct IThemeHandler; + //class ChartThemeControl; + // + //std::shared_ptr<sidebar::IThemeHandler> createThemeWrapper( + // rtl::Reference<ChartModel> xModel, ChartThemeControl * pControl, + // ChartController * pController); + } + else if (aCommand == "ChartSaveToNewTheme") + { + this->executeDispatch_SaveToNewTheme(); + } //insert objects else if( aCommand == "InsertTitles" || aCommand == "InsertMenuTitles") @@ -1584,7 +1622,7 @@ void ChartController::executeDispatch_ChartType() }); } -void ChartController::executeDispatch_ManageThemes() +void ChartController::executeDispatch_ManageThemes(bool bSelectOnly) { SolarMutexGuard aSolarGuard; auto xUndoGuard = std::make_shared<UndoGuard>( @@ -1594,7 +1632,7 @@ void ChartController::executeDispatch_ManageThemes() try { - auto aDlg = std::make_shared<SchThemeDlg>(GetChartFrame(), this); + auto aDlg = std::make_shared<SchThemeDlg>(GetChartFrame(), this, bSelectOnly); weld::DialogController::runAsync( aDlg, [aDlg, xUndoGuard = std::move(xUndoGuard)](int nResult) { @@ -1610,6 +1648,18 @@ void ChartController::executeDispatch_ManageThemes() } } +void ChartController::executeDispatch_SaveToNewTheme() +{ + ChartThemesType& aChartTypes = ChartThemesType::getInstance(); + int nIndex = aChartTypes.m_aThemes.size(); + // maximum 256 chart styles + // Todo: maybe we could figure out some other way to limit this. + if (nIndex >= 256) + { + return; + } + saveTheme(nIndex); +} void ChartController::executeDispatch_SourceData() { @@ -1838,6 +1888,8 @@ const o3tl::sorted_vector< std::u16string_view >& ChartController::impl_getAvail // toolbar commands u"ChartElementSelector", u"ManageThemes", + u"SelectTheme", + u"ChartSaveToNewTheme", // LOK commands u"LOKSetTextSelection", u"LOKTransform", @@ -2331,7 +2383,7 @@ ChartThemesType::ChartThemesType() ChartThemeElementID nElementType = ChartThemeElementID(i % ElementCount); sal_uInt32 nHeight = 240 + i * 10; - sal_uInt32 nColor = 170 << (i % 15); + sal_uInt32 nColor = 0xff000000 + (170 << (i % 15)); const Color aColor(ColorAlpha, nColor); short nKerning = 0; FontWeight nBold = WEIGHT_NORMAL; diff --git a/chart2/source/controller/main/ControllerCommandDispatch.cxx b/chart2/source/controller/main/ControllerCommandDispatch.cxx index e64151fbedae..8206578f732a 100644 --- a/chart2/source/controller/main/ControllerCommandDispatch.cxx +++ b/chart2/source/controller/main/ControllerCommandDispatch.cxx @@ -593,6 +593,8 @@ void ControllerCommandDispatch::updateCommandAvailability() bShapeContext || ( bIsWritable && bControllerStateIsValid && ( m_apControllerState->bMayMoveSeriesForward || m_apControllerState->bMayMoveSeriesBackward ) ); m_aCommandAvailability[ u".uno:ManageThemes"_ustr] = true; + m_aCommandAvailability[ u".uno:SelectTheme"_ustr] = true; + m_aCommandAvailability[ u".uno:ChartSaveToNewTheme"_ustr] = true; // insert objects m_aCommandAvailability[ u".uno:InsertTitles"_ustr ] = m_aCommandAvailability[ u".uno:InsertMenuTitles"_ustr ] = bIsWritable; diff --git a/chart2/source/controller/sidebar/ChartThemeControl.cxx b/chart2/source/controller/sidebar/ChartThemeControl.cxx index 083ad93058a3..d5791f012cd2 100644 --- a/chart2/source/controller/sidebar/ChartThemeControl.cxx +++ b/chart2/source/controller/sidebar/ChartThemeControl.cxx @@ -18,6 +18,7 @@ */ #include <com/sun/star/drawing/FillStyle.hpp> +#include <comphelper/dispatchcommand.hxx> #include <memory> #include <utility> @@ -164,11 +165,17 @@ ChartThemePopup::ChartThemePopup(ChartThemeControl* pControl, weld::Widget* pPar : WeldToolbarPopup(pControl->getFrameInterface(), pParent, "modules/schart/ui/chartthemepopup.ui", "ThemeWindow") , mxControl(pControl) - , mxThemesIconView(m_xBuilder->weld_icon_view(u"themeview"_ustr)) + , mxThemesIconView(m_xBuilder->weld_icon_view(u"themeview1col"_ustr)) + , mxManageChartStylesButton(m_xBuilder->weld_button(u"managechartstyle"_ustr)) { mxThemesIconView->connect_item_activated(LINK(this, ChartThemePopup, ThemeSelectedHdl)); mxThemesIconView->set_item_width(ChartThemeThumbSizeX); + mxManageChartStylesButton->set_visible(true); + mxManageChartStylesButton->set_sensitive(true); + mxManageChartStylesButton->connect_clicked( + LINK(this, ChartThemePopup, ClickManageChartStyleHdl)); + int nThemeCount = ChartThemesType::getInstance().getThemesCount(); for (int i = 0; i < nThemeCount; i++) { @@ -182,7 +189,11 @@ ChartThemePopup::ChartThemePopup(ChartThemeControl* pControl, weld::Widget* pPar } } -ChartThemePopup::~ChartThemePopup() { mxThemesIconView.reset(); } +ChartThemePopup::~ChartThemePopup() +{ + mxThemesIconView.reset(); + mxManageChartStylesButton.reset(); +} VclPtr<VirtualDevice> ChartThemePopup::makeImage(int nIndex) { @@ -218,6 +229,12 @@ IMPL_LINK_NOARG(ChartThemePopup, ThemeSelectedHdl, weld::IconView&, bool) return true; } +IMPL_LINK_NOARG(ChartThemePopup, ClickManageChartStyleHdl, weld::Button&, void) +{ + comphelper::dispatchCommand(u".uno:ManageThemes"_ustr, mxControl->getFrameInterface(), {}); + mxControl->EndPopupMode(); +} + } // end namespace chart::sidebar /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/source/controller/sidebar/ChartThemeControl.hxx b/chart2/source/controller/sidebar/ChartThemeControl.hxx index d380416220c8..c4f88f5ad1d2 100644 --- a/chart2/source/controller/sidebar/ChartThemeControl.hxx +++ b/chart2/source/controller/sidebar/ChartThemeControl.hxx @@ -12,6 +12,7 @@ #include <svtools/popupwindowcontroller.hxx> #include <svtools/toolbarmenu.hxx> +#include <sfx2/weldutils.hxx> namespace chart { @@ -59,8 +60,10 @@ class ChartThemePopup final : public WeldToolbarPopup { rtl::Reference<ChartThemeControl> mxControl; std::unique_ptr<weld::IconView> mxThemesIconView; + std::unique_ptr<weld::Button> mxManageChartStylesButton; DECL_LINK(ThemeSelectedHdl, weld::IconView&, bool); + DECL_LINK(ClickManageChartStyleHdl, weld::Button&, void); void GrabFocus() override; diff --git a/chart2/source/controller/sidebar/ChartThemePanel.cxx b/chart2/source/controller/sidebar/ChartThemePanel.cxx index 887ce76182e8..0e3d15a45645 100644 --- a/chart2/source/controller/sidebar/ChartThemePanel.cxx +++ b/chart2/source/controller/sidebar/ChartThemePanel.cxx @@ -122,7 +122,7 @@ VclPtr<VirtualDevice> ThemeWrapper::makePictureFromThemedChart(sal_uInt32 nIndex aRSP.toggleAutoResizeState(); } - int scale = 4; + int scale = 1; mxModel2->setVisualAreaSize(1, awt::Size(aSize.Width / scale, aSize.Height / scale)); device1->SetOutputSize(Size(aSize.Width / scale, aSize.Height / scale)); diff --git a/chart2/uiconfig/ui/chartthemepopup.ui b/chart2/uiconfig/ui/chartthemepopup.ui index ad04c97cd533..25ac31e56fd5 100644 --- a/chart2/uiconfig/ui/chartthemepopup.ui +++ b/chart2/uiconfig/ui/chartthemepopup.ui @@ -2,6 +2,14 @@ <!-- Generated with glade 3.40.0 --> <interface domain="chart"> <requires lib="gtk+" version="3.24"/> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name pixbuf --> + <column type="GdkPixbuf"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> <object class="GtkPopover" id="ThemeWindow"> <property name="can-focus">False</property> <child> diff --git a/chart2/uiconfig/ui/dlg_Theme.ui b/chart2/uiconfig/ui/dlg_Theme.ui index a1f5ff43c649..4ff39ff57318 100644 --- a/chart2/uiconfig/ui/dlg_Theme.ui +++ b/chart2/uiconfig/ui/dlg_Theme.ui @@ -2,10 +2,18 @@ <!-- Generated with glade 3.40.0 --> <interface domain="chart"> <requires lib="gtk+" version="3.24"/> + <object class="GtkTreeStore" id="liststore1"> + <columns> + <!-- column-name pixbuf --> + <column type="GdkPixbuf"/> + <!-- column-name id --> + <column type="gchararray"/> + </columns> + </object> <object class="GtkDialog" id="ChartThemeDialog"> <property name="can-focus">False</property> <property name="border-width">6</property> - <property name="title" translatable="yes" context="dlg_Theme|ChartThemeDialog">Manage Chart Themes</property> + <property name="title" translatable="yes" context="dlg_Theme|ChartThemeDialog">Manage Chart Styles</property> <property name="modal">True</property> <property name="default-width">0</property> <property name="default-height">0</property> @@ -35,12 +43,12 @@ <object class="GtkLabel" id="iconviewlabel"> <property name="visible">True</property> <property name="can-focus">False</property> - <property name="tooltip-text" translatable="yes" context="dlg_Theme|iconviewlabel|tooltip_text">Selectable chart themes list.</property> + <property name="tooltip-text" translatable="yes" context="dlg_Theme|iconviewlabel|tooltip_text">Selectable chart styles list.</property> <property name="halign">start</property> <property name="valign">start</property> <property name="hexpand">False</property> <property name="vexpand">False</property> - <property name="label" translatable="yes" context="dlg_Theme|iconviewlabel">_Chart themes:</property> + <property name="label" translatable="yes" context="dlg_Theme|iconviewlabel">_Chart styles:</property> <property name="use-underline">True</property> <property name="xalign">0</property> <accessibility> @@ -81,6 +89,7 @@ <property name="can-focus">True</property> <property name="margin">0</property> <property name="model">liststore1</property> + <property name="pixbuf-column">0</property> <property name="hexpand">True</property> <property name="vexpand">True</property> <property name="columns">1</property> @@ -109,8 +118,8 @@ <property name="row-spacing">3</property> <property name="column-spacing">6</property> <child> - <object class="GtkButton" id="load"> - <property name="label" translatable="yes" context="dlg_Theme|themeload">_Load theme to chart</property> + <object class="GtkButton" id="chartload"> + <property name="label" translatable="yes" context="dlg_Theme|chartload">_Load style to chart</property> <property name="can-focus">True</property> <property name="receives-default">True</property> <property name="use-underline">True</property> @@ -121,8 +130,8 @@ </packing> </child> <child> - <object class="GtkButton" id="save"> - <property name="label" translatable="yes" context="dlg_Theme|themesave">_Save to theme</property> + <object class="GtkButton" id="chartsave"> + <property name="label" translatable="yes" context="dlg_Theme|chartsave">_Save to styles</property> <property name="can-focus">True</property> <property name="receives-default">True</property> <property name="use-underline">True</property> @@ -133,8 +142,8 @@ </packing> </child> <child> - <object class="GtkButton" id="delete"> - <property name="label" translatable="yes" context="dlg_Theme|themedelete">_Delete theme</property> + <object class="GtkButton" id="chartdelete"> + <property name="label" translatable="yes" context="dlg_Theme|chartdelete">_Delete style</property> <property name="can-focus">True</property> <property name="receives-default">True</property> <property name="use-underline">True</property> @@ -145,8 +154,8 @@ </packing> </child> <child> - <object class="GtkButton" id="savetonew"> - <property name="label" translatable="yes" context="dlg_Theme|themesavenew">_Save to new theme</property> + <object class="GtkButton" id="chartsavetonew"> + <property name="label" translatable="yes" context="dlg_Theme|chartsavenew">Save to _new style</property> <property name="can-focus">True</property> <property name="receives-default">True</property> <property name="use-underline">True</property> @@ -169,6 +178,19 @@ <property name="position">1</property> </packing> </child> + <child> + <object class="GtkButton" id="chartmanage"> + <property name="label" translatable="yes" context="dlg_Theme|chartmanage">_Manage chart styles</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="use-underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> </object> <packing> <property name="expand">True</property> diff --git a/svx/source/svdraw/svdmrkv.cxx b/svx/source/svdraw/svdmrkv.cxx index 7e151d1e6aca..b265ff860412 100644 --- a/svx/source/svdraw/svdmrkv.cxx +++ b/svx/source/svdraw/svdmrkv.cxx @@ -760,6 +760,27 @@ bool lcl_isStarMath(SdrObject* pO) return false; } +bool lcl_isChartPage(std::u16string_view aCID) +{ + size_t nLastSign = aCID.rfind(':'); //last sign before the type string + if (nLastSign == std::u16string_view::npos) + nLastSign = aCID.rfind('/'); + if (nLastSign == std::u16string_view::npos && aCID.rfind('=') != std::u16string_view::npos) + nLastSign = 0; + + if (nLastSign < std::u16string_view::npos) + { + if (nLastSign > 0) + nLastSign++; + + if (o3tl::starts_with(aCID.substr(nLastSign), u"Page")) + { + return true; + } + } + return false; +} + } // anonymous namespace bool SdrMarkView::dumpGluePointsToJSON(boost::property_tree::ptree& rTree) @@ -1034,6 +1055,11 @@ void SdrMarkView::SetMarkHandlesForLOKit(tools::Rectangle const & rRect, const S OUString aValue; if (aSel >>= aValue) { + if (lcl_isChartPage(aValue)) + { + aExtraInfo.append(", \"isChartPage\": true"); + } + OString aObjectCID(aValue.getStr(), aValue.getLength(), osl_getThreadTextEncoding()); const std::vector<OString> aProps{"Draggable"_ostr, "Resizable"_ostr, "Rotatable"_ostr}; for (const auto& rProp: aProps) diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 72d03bb5dc45..113005bcdf17 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -785,6 +785,8 @@ public: weld::TreeIter* pRet) override; virtual void insert_separator(int pos, const OUString* pId) override; + virtual void do_remove(int pos) override; + virtual void set_image(int pos, VirtualDevice& rIcon) override; virtual void do_clear() override; virtual void do_select(int pos) override; diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index f1a789244196..c9469e6c2906 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -1939,6 +1939,18 @@ void JSIconView::insert_separator(int pos, const OUString* pId) sendUpdate(); } +void JSIconView::do_remove(int pos) +{ + SalInstanceIconView::remove(pos); + sendUpdate(); +} + +void JSIconView::set_image(int pos, VirtualDevice& rIcon) +{ + SalInstanceIconView::set_image(pos, rIcon); + sendUpdate(); +} + void JSIconView::do_clear() { SalInstanceIconView::do_clear();
