desktop/source/lib/init.cxx | 11 include/sfx2/viewsh.hxx | 2 include/svx/fontworkbar.hxx | 2 include/vcl/EnumContext.hxx | 1 include/vcl/jsdialog/executor.hxx | 1 include/vcl/svapp.hxx | 1 include/vcl/weld.hxx | 2 officecfg/registry/data/org/openoffice/Office/UI/Sidebar.xcu | 13 sc/source/ui/cctrl/checklistmenu.cxx | 9 sc/source/ui/cctrl/dpcontrol.cxx | 7 sc/source/ui/dbgui/PivotLayoutTreeListData.cxx | 3 sc/source/ui/inc/tabvwsh.hxx | 2 sc/source/ui/view/output2.cxx | 14 sc/source/ui/view/tabvwsh4.cxx | 5 sd/source/ui/inc/ViewShellBase.hxx | 4 sd/source/ui/inc/unomodel.hxx | 2 sd/source/ui/unoidl/unomodel.cxx | 11 svx/source/inc/StylesPreviewWindow.hxx | 3 svx/source/sidebar/SelectionAnalyzer.cxx | 9 svx/source/tbxctrls/StylesPreviewWindow.cxx | 49 + svx/source/tbxctrls/fontworkgallery.cxx | 47 + svx/source/toolbars/fontworkbar.cxx | 26 sw/inc/view.hxx | 2 sw/source/uibase/shells/drawsh.cxx | 11 sw/source/uibase/uiview/view.cxx | 9 sw/source/uibase/uiview/viewdraw.cxx | 19 vcl/inc/jsdialog/jsdialogbuilder.hxx | 145 +++- vcl/inc/salvtables.hxx | 28 vcl/jsdialog/executor.cxx | 52 + vcl/jsdialog/jsdialogbuilder.cxx | 369 +++++++---- vcl/source/app/salvtables.cxx | 88 +- vcl/source/treelist/iconview.cxx | 4 vcl/source/treelist/svimpbox.cxx | 8 vcl/source/window/EnumContext.cxx | 1 vcl/source/window/dialog.cxx | 14 35 files changed, 747 insertions(+), 227 deletions(-)
New commits: commit 3a2709b2765425759846195754f69787e7803678 Author: Szymon Kłos <[email protected]> AuthorDate: Mon Mar 1 19:27:04 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:28 2021 +0200 jsdialog: send selection change for icon view - add posibility to send additional actions - send selection change for icon view as separate command - optimization, no need for rendering Change-Id: I02dd129068baf32c265612a1cfa2c2af20319ae9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111767 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Jan Holesovsky <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112071 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index f6308b27e26d..c907b128bbd3 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -25,6 +25,7 @@ #include <cppuhelper/compbase.hxx> #include <deque> +#include <unordered_map> class ToolBox; class ComboBox; @@ -33,6 +34,7 @@ class SvTabListBox; class IconView; typedef std::map<OString, weld::Widget*> WidgetMap; +typedef std::unordered_map<std::string, OUString> ActionDataMap; namespace jsdialog { @@ -40,10 +42,52 @@ enum MessageType { FullUpdate, WidgetUpdate, - Close + Close, + Action }; } +/// Class with the message description for storing in the queue +class JSDialogMessageInfo +{ +public: + jsdialog::MessageType m_eType; + VclPtr<vcl::Window> m_pWindow; + std::unique_ptr<ActionDataMap> m_pData; + +private: + void copy(const JSDialogMessageInfo& rInfo) + { + this->m_eType = rInfo.m_eType; + this->m_pWindow = rInfo.m_pWindow; + if (rInfo.m_pData) + { + std::unique_ptr<ActionDataMap> pData(new ActionDataMap(*rInfo.m_pData)); + this->m_pData = std::move(pData); + } + } + +public: + JSDialogMessageInfo(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow, + std::unique_ptr<ActionDataMap> pData) + : m_eType(eType) + , m_pWindow(pWindow) + , m_pData(std::move(pData)) + { + } + + JSDialogMessageInfo(const JSDialogMessageInfo& rInfo) { copy(rInfo); } + + JSDialogMessageInfo& operator=(JSDialogMessageInfo aInfo) + { + if (this == &aInfo) + return *this; + + copy(aInfo); + return *this; + } +}; + class JSDialogNotifyIdle : public Idle { // used to send message @@ -54,7 +98,7 @@ class JSDialogNotifyIdle : public Idle std::string m_LastNotificationMessage; bool m_bForce; - std::deque<std::pair<jsdialog::MessageType, VclPtr<vcl::Window>>> m_aMessageQueue; + std::deque<JSDialogMessageInfo> m_aMessageQueue; public: JSDialogNotifyIdle(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, @@ -64,13 +108,16 @@ public: void clearQueue(); void forceUpdate(); - void sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow); + void sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow, + std::unique_ptr<ActionDataMap> pData = nullptr); private: void send(tools::JsonWriter& aJsonWriter); std::unique_ptr<tools::JsonWriter> generateFullUpdate() const; std::unique_ptr<tools::JsonWriter> generateWidgetUpdate(VclPtr<vcl::Window> pWindow) const; std::unique_ptr<tools::JsonWriter> generateCloseMessage() const; + std::unique_ptr<tools::JsonWriter> + generateActionMessage(VclPtr<vcl::Window> pWindow, std::unique_ptr<ActionDataMap> pData) const; }; class JSDialogSender @@ -90,6 +137,7 @@ public: virtual void sendFullUpdate(bool bForce = false); void sendClose(); virtual void sendUpdate(VclPtr<vcl::Window> pWindow, bool bForce = false); + virtual void sendAction(VclPtr<vcl::Window> pWindow, std::unique_ptr<ActionDataMap> pData); void flush() { mpIdleNotify->Invoke(); } protected: @@ -217,6 +265,8 @@ public: virtual void sendUpdate(bool bForce = false) = 0; virtual void sendFullUpdate(bool bForce = false) = 0; + + virtual void sendAction(std::unique_ptr<ActionDataMap> pData) = 0; }; template <class BaseInstanceClass, class VclClass> @@ -305,6 +355,12 @@ public: if ((!m_bIsFreezed || bForce) && m_pSender) m_pSender->sendFullUpdate(bForce); } + + virtual void sendAction(std::unique_ptr<ActionDataMap> pData) override + { + if (!m_bIsFreezed && m_pSender && pData) + m_pSender->sendAction(BaseInstanceClass::m_xWidget, std::move(pData)); + } }; class JSDialog : public JSWidget<SalInstanceDialog, ::Dialog> diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 14ab57570307..e039566805d3 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -27,6 +27,8 @@ #include <cppuhelper/supportsservice.hxx> #include <utility> +#define ACTION_TYPE "action_type" + namespace { void response_help(vcl::Window* pWindow) @@ -83,7 +85,19 @@ void JSDialogNotifyIdle::send(tools::JsonWriter& aJsonWriter) } } -void JSDialogNotifyIdle::sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow) +namespace +{ +OUString extractActionType(const ActionDataMap& rData) +{ + auto it = rData.find(ACTION_TYPE); + if (it != rData.end()) + return it->second; + return ""; +} +}; + +void JSDialogNotifyIdle::sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow, + std::unique_ptr<ActionDataMap> pData) { // we want only the latest update of same type // TODO: also if we met full update - previous updates are not valid @@ -91,13 +105,22 @@ void JSDialogNotifyIdle::sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Wi while (it != m_aMessageQueue.end()) { - if (it->first == eType && it->second == pWindow) + if (it->m_eType == eType && it->m_pWindow == pWindow) + { + if (it->m_pData && pData + && extractActionType(*it->m_pData) != extractActionType(*pData)) + { + it++; + continue; + } it = m_aMessageQueue.erase(it); + } else it++; } - m_aMessageQueue.push_back(std::make_pair(eType, pWindow)); + JSDialogMessageInfo aMessage(eType, pWindow, std::move(pData)); + m_aMessageQueue.push_back(aMessage); } std::unique_ptr<tools::JsonWriter> JSDialogNotifyIdle::generateFullUpdate() const @@ -161,11 +184,32 @@ std::unique_ptr<tools::JsonWriter> JSDialogNotifyIdle::generateCloseMessage() co return aJsonWriter; } +std::unique_ptr<tools::JsonWriter> +JSDialogNotifyIdle::generateActionMessage(VclPtr<vcl::Window> pWindow, + std::unique_ptr<ActionDataMap> pData) const +{ + std::unique_ptr<tools::JsonWriter> aJsonWriter(new tools::JsonWriter()); + + aJsonWriter->put("jsontype", m_sTypeOfJSON); + aJsonWriter->put("action", "action"); + aJsonWriter->put("id", m_aNotifierWindow->GetLOKWindowId()); + + { + auto aDataNode = aJsonWriter->startNode("data"); + aJsonWriter->put("control_id", pWindow->get_id()); + + for (auto it = pData->begin(); it != pData->end(); it++) + aJsonWriter->put(it->first.c_str(), it->second); + } + + return aJsonWriter; +} + void JSDialogNotifyIdle::Invoke() { for (auto& rMessage : m_aMessageQueue) { - jsdialog::MessageType eType = rMessage.first; + jsdialog::MessageType eType = rMessage.m_eType; switch (eType) { @@ -174,12 +218,16 @@ void JSDialogNotifyIdle::Invoke() break; case jsdialog::MessageType::WidgetUpdate: - send(*generateWidgetUpdate(rMessage.second)); + send(*generateWidgetUpdate(rMessage.m_pWindow)); break; case jsdialog::MessageType::Close: send(*generateCloseMessage()); break; + + case jsdialog::MessageType::Action: + send(*generateActionMessage(rMessage.m_pWindow, std::move(rMessage.m_pData))); + break; } } @@ -219,6 +267,12 @@ void JSDialogSender::sendUpdate(VclPtr<vcl::Window> pWindow, bool bForce) mpIdleNotify->Start(); } +void JSDialogSender::sendAction(VclPtr<vcl::Window> pWindow, std::unique_ptr<ActionDataMap> pData) +{ + mpIdleNotify->sendMessage(jsdialog::MessageType::Action, pWindow, std::move(pData)); + mpIdleNotify->Start(); +} + namespace { vcl::Window* extract_sal_widget(weld::Widget* pParent) @@ -1187,7 +1241,11 @@ void JSIconView::clear() void JSIconView::select(int pos) { SalInstanceIconView::select(pos); - sendUpdate(); + + std::unique_ptr<ActionDataMap> pMap = std::make_unique<ActionDataMap>(); + (*pMap)[ACTION_TYPE] = "select"; + (*pMap)["position"] = OUString::number(pos); + sendAction(std::move(pMap)); } void JSIconView::unselect(int pos) commit 6d76e854b84f2c4391845475f9796dd72a804427 Author: Szymon Kłos <[email protected]> AuthorDate: Fri Feb 26 09:00:33 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:28 2021 +0200 jsdialog: stop idle on destruction be sure timer is stopped after we destroy builder. if we close abandon previous messages. Change-Id: I8c5458d14c45660aadecb1559b87d30a32364ff6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111593 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Jan Holesovsky <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111990 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 968f5de23aaf..f6308b27e26d 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -62,6 +62,7 @@ public: void Invoke() override; + void clearQueue(); void forceUpdate(); void sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow); diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index b915e944cadc..14ab57570307 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -183,10 +183,16 @@ void JSDialogNotifyIdle::Invoke() } } - m_aMessageQueue.clear(); + clearQueue(); } -JSDialogSender::~JSDialogSender() { sendClose(); } +void JSDialogNotifyIdle::clearQueue() { m_aMessageQueue.clear(); } + +JSDialogSender::~JSDialogSender() +{ + sendClose(); + mpIdleNotify->Stop(); +} void JSDialogSender::sendFullUpdate(bool bForce) { @@ -199,6 +205,7 @@ void JSDialogSender::sendFullUpdate(bool bForce) void JSDialogSender::sendClose() { + mpIdleNotify->clearQueue(); mpIdleNotify->sendMessage(jsdialog::MessageType::Close, nullptr); flush(); } commit 777ed7aa3a891fd52c3602ecb061da1daab61e7b Author: Szymon Kłos <[email protected]> AuthorDate: Mon Mar 1 10:01:42 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:27 2021 +0200 jsdialog: update on treeview clear Change-Id: I4152e7581ae9172e77474c7f62bd42351636793e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111733 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Henry Castro <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111989 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index ddb7adc2b35c..968f5de23aaf 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -472,6 +472,8 @@ public: virtual void remove(int pos) override; virtual void remove(const weld::TreeIter& rIter) override; + virtual void clear() override; + void drag_start(); void drag_end(); }; diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 3332f125cc3d..b915e944cadc 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -1121,6 +1121,12 @@ void JSTreeView::remove(const weld::TreeIter& rIter) sendUpdate(); } +void JSTreeView::clear() +{ + SalInstanceTreeView::clear(); + sendUpdate(); +} + void JSTreeView::expand_row(const weld::TreeIter& rIter) { SalInstanceTreeView::expand_row(rIter); commit d11fb90920766955c7982584751493d29cd45f77 Author: Jim Raykowski <[email protected]> AuthorDate: Fri Jan 22 20:38:21 2021 -0900 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:27 2021 +0200 tdf#137121 add popup menu to style items used in styles preview window Change-Id: Ib9bd6584416b24301d3d302165d12c89bcd1e178 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109838 Tested-by: Jenkins Reviewed-by: Jim Raykowski <[email protected]> diff --git a/svx/source/inc/StylesPreviewWindow.hxx b/svx/source/inc/StylesPreviewWindow.hxx index 8381f3b72c49..9e90c4d36288 100644 --- a/svx/source/inc/StylesPreviewWindow.hxx +++ b/svx/source/inc/StylesPreviewWindow.hxx @@ -56,7 +56,8 @@ public: void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override; - bool MouseButtonDown(const MouseEvent&) override; + bool MouseButtonDown(const MouseEvent& rMEvt) override; + bool Command(const CommandEvent& rEvent) override; void SetStyle(const std::pair<OUString, OUString>& sStyleName); diff --git a/svx/source/tbxctrls/StylesPreviewWindow.cxx b/svx/source/tbxctrls/StylesPreviewWindow.cxx index f0f24e2bf907..40d070477065 100644 --- a/svx/source/tbxctrls/StylesPreviewWindow.cxx +++ b/svx/source/tbxctrls/StylesPreviewWindow.cxx @@ -54,6 +54,9 @@ #include <sal/log.hxx> +#include <vcl/event.hxx> +#include <vcl/commandevent.hxx> + StyleStatusListener::StyleStatusListener( StylesPreviewWindow_Base* pPreviewControl, const css::uno::Reference<css::frame::XDispatchProvider>& xDispatchProvider) @@ -102,15 +105,47 @@ void StyleItemController::Select(bool bSelect) Invalidate(); } -bool StyleItemController::MouseButtonDown(const MouseEvent&) +bool StyleItemController::MouseButtonDown(const MouseEvent& rMEvt) { - css::uno::Sequence<css::beans::PropertyValue> aArgs(2); - aArgs[0].Value <<= m_aStyleName.second; - aArgs[1].Name = "Family"; - aArgs[1].Value <<= sal_Int16(m_eStyleFamily); + if (rMEvt.IsLeft()) + { + css::uno::Sequence<css::beans::PropertyValue> aArgs(2); + aArgs[0].Value <<= m_aStyleName.second; + aArgs[1].Name = "Family"; + aArgs[1].Value <<= sal_Int16(m_eStyleFamily); + + aArgs[0].Name = "Template"; + SfxToolBoxControl::Dispatch(m_xDispatchProvider, ".uno:StyleApply", aArgs); + } + + return false; +} - aArgs[0].Name = "Template"; - SfxToolBoxControl::Dispatch(m_xDispatchProvider, ".uno:StyleApply", aArgs); +bool StyleItemController::Command(const CommandEvent& rEvent) +{ + if (rEvent.GetCommand() != CommandEventId::ContextMenu) + return CustomWidgetController::Command(rEvent); + + std::unique_ptr<weld::Builder> xBuilder( + Application::CreateBuilder(GetDrawingArea(), "svx/ui/stylemenu.ui")); + std::unique_ptr<weld::Menu> xMenu(xBuilder->weld_menu("menu")); + std::string_view rIdent = xMenu->popup_at_rect( + GetDrawingArea(), tools::Rectangle(rEvent.GetMousePosPixel(), Size(1, 1))); + if (rIdent == "update" || rIdent == "edit") + { + css::uno::Sequence<css::beans::PropertyValue> aArgs(2); + aArgs[0].Name = "Param"; + aArgs[0].Value <<= m_aStyleName.second; + aArgs[1].Name = "Family"; + aArgs[1].Value <<= sal_Int16(m_eStyleFamily); + + SfxToolBoxControl::Dispatch(m_xDispatchProvider, + rIdent == "update" ? OUString(".uno:StyleUpdateByExample") + : OUString(".uno:EditStyle"), + aArgs); + + return true; + } return false; } commit 2d635cea465818f3e5b7e04dcba6731e6898000e Author: Szymon Kłos <[email protected]> AuthorDate: Wed Feb 3 16:44:35 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:27 2021 +0200 Don't skip lines if only one row in the list Mouse wheel emits delta > 1 so if we see only one row but delta is 3 we skip then 2 rows. Change-Id: I136788d38a189c061a55cba12eef05c7a4733820 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110379 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/source/treelist/svimpbox.cxx b/vcl/source/treelist/svimpbox.cxx index 68e32734e72a..7198ed561c0f 100644 --- a/vcl/source/treelist/svimpbox.cxx +++ b/vcl/source/treelist/svimpbox.cxx @@ -291,6 +291,10 @@ IMPL_LINK( SvImpLBox, ScrollUpDownHdl, ScrollBar *, pScrollBar, void ) if( !nDelta ) return; + // when only one row don't skip lines + if (pScrollBar->GetPageSize() == 1) + nDelta = nDelta > 0 ? 1 : -1; + m_nFlags &= ~LBoxFlags::Filling; m_bInVScrollHdl = true; commit 69f662277496d88f94772b3aa3fb4dcf01d2a8ee Author: Szymon Kłos <[email protected]> AuthorDate: Wed Feb 3 17:21:54 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:27 2021 +0200 Resize IconView entry if there is no space If IconView has only one row and there is no space for default 100px height - scale down the entries. Change-Id: I8b310f1274ba91872af0849e36e3a87e775c98b1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110381 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/source/treelist/iconview.cxx b/vcl/source/treelist/iconview.cxx index 7786a6976c2a..44fc3db789d4 100644 --- a/vcl/source/treelist/iconview.cxx +++ b/vcl/source/treelist/iconview.cxx @@ -104,6 +104,10 @@ void IconView::PaintEntry(SvTreeListEntry& rEntry, tools::Long nX, tools::Long n const Color aHighlightTextColor(rSettings.GetHighlightTextColor()); aHighlightFont.SetColor(aHighlightTextColor); + Size aOutputSize = GetOutputSizePixel(); + if (aOutputSize.getHeight() < nTempEntryHeight) + nTempEntryHeight = aOutputSize.getHeight(); + Size aRectSize(nTempEntryWidth, nTempEntryHeight); SvViewDataEntry* pViewDataEntry = GetViewDataEntry(&rEntry); commit 690d3f11f36d350eb110621ae237464d7185be42 Author: Szymon Kłos <[email protected]> AuthorDate: Wed Feb 3 16:17:29 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:27 2021 +0200 Invalidate IconView on scroll if has only one row When we have only one row the page size for scrollbar is set to 1 so delta is always 1. This prevents from invalidation when scrolling up using a scrollbar button and results in artifacts on the screen. Change-Id: I92ed0133450ba459e19b575d8c52d059464b1e33 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110377 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/source/treelist/svimpbox.cxx b/vcl/source/treelist/svimpbox.cxx index d72de8763981..68e32734e72a 100644 --- a/vcl/source/treelist/svimpbox.cxx +++ b/vcl/source/treelist/svimpbox.cxx @@ -303,7 +303,7 @@ IMPL_LINK( SvImpLBox, ScrollUpDownHdl, ScrollBar *, pScrollBar, void ) if( nDelta > 0 ) { - if( nDelta == 1 ) + if( nDelta == 1 && pScrollBar->GetPageSize() > 1) CursorDown(); else PageDown( static_cast<sal_uInt16>(nDelta) ); @@ -311,7 +311,7 @@ IMPL_LINK( SvImpLBox, ScrollUpDownHdl, ScrollBar *, pScrollBar, void ) else { nDelta *= -1; - if( nDelta == 1 ) + if( nDelta == 1 && pScrollBar->GetPageSize() > 1) CursorUp(); else PageUp( static_cast<sal_uInt16>(nDelta) ); commit 480b346d106f24070fbb02d6b2fc40e6a2ec98fe Author: Henry Castro <[email protected]> AuthorDate: Mon Feb 22 15:16:06 2021 -0400 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:26 2021 +0200 jsdialog: fix missing update for "treeview" action "select" When Treeview control selects an item, the state of the control has changed and it should update the new changes to the client side. Change-Id: I27d6a215148fcef260799d76ffe209460f38c559 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111355 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Szymon Kłos <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/113683 Tested-by: Jenkins Reviewed-by: Henry Castro <[email protected]> diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 5f4ad0ec2bd2..3332f125cc3d 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -1056,6 +1056,7 @@ void JSTreeView::select(int pos) } } enable_notify_events(); + sendUpdate(); } weld::TreeView* JSTreeView::get_drag_source() const { return g_DragSource; } commit 12fb7a05ebcce753941b3e9e0988a7870e1fb03d Author: Henry Castro <[email protected]> AuthorDate: Wed Feb 17 16:47:27 2021 -0400 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:26 2021 +0200 lok: add batch mode option to load the document When the LibreOffice Kit is active by default is set to headless mode, with the flag "DialogCancelMode::Silent", according to the documentation it should close the dialog, but it was changed for dialog tunneling. However the dialog tunneling is being deprecated, and in order to not produce any regression, it will be used temporary a new state "DialogCancelMode::LOKSilent", to disable any dialog interactivity. Change-Id: I3b6cce38c37f75dc1b24dda352f6caec19438ff1 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111087 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Jan Holesovsky <[email protected]> (cherry picked from commit 5f3fbb019bd79bd57eed94e01bd2202efd9a0c06) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111319 Tested-by: Jenkins Reviewed-by: Henry Castro <[email protected]> diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 1964eac0a2a2..0d1b7999dae1 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -2240,6 +2240,12 @@ static LibreOfficeKitDocument* lo_documentLoadWithOptions(LibreOfficeKit* pThis, const OUString aDeviceFormFactor = extractParameter(aOptions, "DeviceFormFactor"); SfxLokHelper::setDeviceFormFactor(aDeviceFormFactor); + const OUString aBatch = extractParameter(aOptions, u"Batch"); + if (!aBatch.isEmpty()) + { + Application::SetDialogCancelMode(DialogCancelMode::LOKSilent); + } + uno::Sequence<css::beans::PropertyValue> aFilterOptions(3); aFilterOptions[0] = css::beans::PropertyValue( "FilterOptions", 0, diff --git a/include/vcl/svapp.hxx b/include/vcl/svapp.hxx index 1f4dff193024..ab2af42dc41c 100644 --- a/include/vcl/svapp.hxx +++ b/include/vcl/svapp.hxx @@ -212,6 +212,7 @@ private: enum class DialogCancelMode { Off, ///< do not automatically cancel dialogs Silent, ///< silently cancel any dialogs + LOKSilent, ///< silently cancel any dialogs (LOK case) Fatal ///< cancel any dialogs by std::abort }; diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index af8fb38b10e6..27949e4d19b7 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -950,6 +950,10 @@ bool Dialog::ImplStartExecute() "Dialog \"" << ImplGetDialogText(this) << "\"cancelled in silent mode"); return false; + + case DialogCancelMode::LOKSilent: + return false; + default: // default cannot happen case DialogCancelMode::Fatal: std::abort(); commit 7749d40346790430be2aea7635b47eae20252462 Author: Szymon Kłos <[email protected]> AuthorDate: Wed Feb 10 08:04:06 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:26 2021 +0200 jsdialog: update on treeview item remove Change-Id: I36b07284b18d3eda184fd6c3f186763d1265d2a6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110665 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Jan Holesovsky <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111988 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 4c78f135a67a..ddb7adc2b35c 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -468,6 +468,10 @@ public: virtual void expand_row(const weld::TreeIter& rIter) override; virtual void collapse_row(const weld::TreeIter& rIter) override; + using SalInstanceTreeView::remove; + virtual void remove(int pos) override; + virtual void remove(const weld::TreeIter& rIter) override; + void drag_start(); void drag_end(); }; diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index c7c8c3735fd5..5f4ad0ec2bd2 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -1108,6 +1108,18 @@ void JSTreeView::set_text(const weld::TreeIter& rIter, const OUString& rStr, int sendUpdate(); } +void JSTreeView::remove(int pos) +{ + SalInstanceTreeView::remove(pos); + sendUpdate(); +} + +void JSTreeView::remove(const weld::TreeIter& rIter) +{ + SalInstanceTreeView::remove(rIter); + sendUpdate(); +} + void JSTreeView::expand_row(const weld::TreeIter& rIter) { SalInstanceTreeView::expand_row(rIter); commit 04ec107195c81331932e62a0630b94cd7fb09355 Author: Szymon Kłos <[email protected]> AuthorDate: Wed Feb 10 07:21:30 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:26 2021 +0200 fontwork: center in online in writer Avoid unnecessary position change Change-Id: I338b9a28653569e1b7c19ba3a1f590363fb2f94c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110664 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Jan Holesovsky <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112164 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/sw/source/uibase/uiview/viewdraw.cxx b/sw/source/uibase/uiview/viewdraw.cxx index b23fb93ed520..6ee6e4eafe22 100644 --- a/sw/source/uibase/uiview/viewdraw.cxx +++ b/sw/source/uibase/uiview/viewdraw.cxx @@ -162,18 +162,17 @@ void SwView::ExecDraw(SfxRequest& rReq) const SwRect& rVisArea = comphelper::LibreOfficeKit::isActive() ? m_pWrtShell->getLOKVisibleArea() : m_pWrtShell->VisArea(); Point aPos( rVisArea.Center() ); + tools::Rectangle aObjRect( pObj->GetLogicRect() ); - if( rVisArea.Width() > aDocSize.Width()) + if ( rVisArea.Width() > aDocSize.Width()) aPos.setX( aDocSize.Width() / 2 + rVisArea.Left() ); + else if (aPos.getX() > aObjRect.GetWidth() / 2) + aPos.AdjustX( -(aObjRect.GetWidth() / 2) ); - if(rVisArea.Height() > aDocSize.Height()) + if (rVisArea.Height() > aDocSize.Height()) aPos.setY( aDocSize.Height() / 2 + rVisArea.Top() ); - - tools::Rectangle aObjRect( pObj->GetLogicRect() ); - if (aPos.getX() > aObjRect.GetWidth() / 2) - aPos.AdjustX( -(aObjRect.GetWidth() / 2) ); - if (aPos.getY() > aObjRect.GetHeight() / 2) - aPos.AdjustY( -(aObjRect.GetHeight() / 2) ); + else if (aPos.getY() > aObjRect.GetHeight() / 2) + aPos.AdjustY( -(aObjRect.GetHeight() / 2) ); m_pWrtShell->EnterStdMode(); m_pWrtShell->SwFEShell::InsertDrawObj( *pObj, aPos ); commit ce10de8ed4159422700eef2a80237528d4fcd98d Author: Szymon Kłos <[email protected]> AuthorDate: Mon Feb 8 16:58:44 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:25 2021 +0200 jsdialog: handle standard buttons like help - dump response bindings - execute help callback Change-Id: Ib0696b4ba74a186a2b80d49f21a1442d1c520821 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110586 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Jan Holesovsky <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111958 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 190d1bb33465..4c78f135a67a 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -400,6 +400,8 @@ public: virtual void set_primary_text(const OUString& rText) override; virtual void set_secondary_text(const OUString& rText) override; + + virtual void response(int response) override; }; class JSCheckButton : public JSWidget<SalInstanceCheckButton, ::CheckBox> diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx index 409c77a5d126..7504db8900fe 100644 --- a/vcl/jsdialog/executor.cxx +++ b/vcl/jsdialog/executor.cxx @@ -345,6 +345,14 @@ bool ExecuteAction(sal_uInt64 nWindowId, const OString& rWidget, StringMap& rDat pDialog->response(RET_CANCEL); return true; } + else if (sAction == "response") + { + OString nResponseString + = OUStringToOString(rData["data"], RTL_TEXTENCODING_ASCII_US); + int nResponse = std::atoi(nResponseString.getStr()); + pDialog->response(nResponse); + return true; + } } } else if (sControlType == "radiobutton") diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index da0537893a35..c7c8c3735fd5 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -27,6 +27,23 @@ #include <cppuhelper/supportsservice.hxx> #include <utility> +namespace +{ +void response_help(vcl::Window* pWindow) +{ + ::Dialog* pDialog = dynamic_cast<::Dialog*>(pWindow); + if (!pDialog) + return; + + vcl::Window* pButtonWindow = pDialog->get_widget_for_response(RET_HELP); + ::Button* pButton = dynamic_cast<::Button*>(pButtonWindow); + if (!pButton) + return; + + pButton->Click(); +} +} + JSDialogNotifyIdle::JSDialogNotifyIdle(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, std::string sTypeOfJSON) : Idle("JSDialog notify") @@ -748,6 +765,12 @@ void JSDialog::undo_collapse() void JSDialog::response(int response) { + if (response == RET_HELP) + { + response_help(m_xWidget.get()); + return; + } + sendClose(); SalInstanceDialog::response(response); } @@ -922,6 +945,18 @@ void JSMessageDialog::set_secondary_text(const OUString& rText) sendFullUpdate(); } +void JSMessageDialog::response(int response) +{ + if (response == RET_HELP) + { + response_help(m_xWidget.get()); + return; + } + + sendClose(); + SalInstanceMessageDialog::response(response); +} + JSCheckButton::JSCheckButton(JSDialogSender* pSender, ::CheckBox* pCheckBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) : JSWidget<SalInstanceCheckButton, ::CheckBox>(pSender, pCheckBox, pBuilder, bTakeOwnership) diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx index f1e3fe30cf06..af8fb38b10e6 100644 --- a/vcl/source/window/dialog.cxx +++ b/vcl/source/window/dialog.cxx @@ -1653,6 +1653,16 @@ void Dialog::DumpAsPropertyTree(tools::JsonWriter& rJsonWriter) sal_Int32 nStartPos = sDialogId.lastIndexOf('/'); nStartPos = nStartPos >= 0 ? nStartPos + 1 : 0; rJsonWriter.put("dialogid", sDialogId.copy(nStartPos)); + + { + auto aResponses = rJsonWriter.startArray("responses"); + for (auto& rResponse : mpDialogImpl->maResponses) + { + auto aResponse = rJsonWriter.startStruct(); + rJsonWriter.put("id", rResponse.first->get_id()); + rJsonWriter.put("response", rResponse.second); + } + } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 47a2459a24396578a7afd1331b1c6baefa2d9750 Author: Szymon Kłos <[email protected]> AuthorDate: Tue Jan 19 12:02:41 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:25 2021 +0200 pivot table: avoid crash on drag n drop Change-Id: I8d081cf884c38b2e4f367143ad728c29b1466fbd Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109634 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/sc/source/ui/dbgui/PivotLayoutTreeListData.cxx b/sc/source/ui/dbgui/PivotLayoutTreeListData.cxx index d6b3f6d980a9..b01286755e20 100644 --- a/sc/source/ui/dbgui/PivotLayoutTreeListData.cxx +++ b/sc/source/ui/dbgui/PivotLayoutTreeListData.cxx @@ -181,6 +181,9 @@ void ScPivotLayoutTreeListData::PushDataFieldNames(std::vector<ScDPName>& rDataF void ScPivotLayoutTreeListData::InsertEntryForSourceTarget(weld::TreeView& rSource, int nTarget) { + if (rSource.count_selected_rows() <=0) + return; + ScItemValue* pItemValue = reinterpret_cast<ScItemValue*>(rSource.get_selected_id().toInt64()); if (mpParent->IsDataElement(pItemValue->maFunctionData.mnCol)) commit cc2c4fd39cf190fd527162b39390964bc251a7a9 Author: Szymon Kłos <[email protected]> AuthorDate: Mon Feb 1 16:48:28 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:25:25 2021 +0200 autofilter: scale dropdown button according to zoom level Change-Id: I4f8a16e196bc33ea5b29fda0edc1f773a24e28db Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110259 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Jan Holesovsky <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111896 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/sc/source/ui/cctrl/dpcontrol.cxx b/sc/source/ui/cctrl/dpcontrol.cxx index 24620cdbd661..d7dd13dd5c4e 100644 --- a/sc/source/ui/cctrl/dpcontrol.cxx +++ b/sc/source/ui/cctrl/dpcontrol.cxx @@ -146,6 +146,13 @@ void ScDPFieldButton::getPopupBoundingBox(Point& rPos, Size& rSize) const tools::Long nW = std::min(maSize.getWidth() / 2, nMaxSize); tools::Long nH = std::min(maSize.getHeight(), nMaxSize); + double fZoom = static_cast<double>(maZoomY) > 1.0 ? static_cast<double>(maZoomY) : 1.0; + if (fZoom > 1.0) + { + nW = fZoom * (nW - 1); + nH = fZoom * (nH - 1); + } + // #i114944# AutoFilter button is left-aligned in RTL. // DataPilot button is always right-aligned for now, so text output isn't affected. if (mbPopupLeft) diff --git a/sc/source/ui/view/output2.cxx b/sc/source/ui/view/output2.cxx index 367d0dca1f5a..78304634df1d 100644 --- a/sc/source/ui/view/output2.cxx +++ b/sc/source/ui/view/output2.cxx @@ -1351,8 +1351,10 @@ void ScOutputData::GetOutputArea( SCCOL nX, SCSIZE nArrY, tools::Long nPosX, too ( rPattern.GetItem(ATTR_MERGE_FLAG).GetValue() & (ScMF::Auto|ScMF::Button|ScMF::ButtonPopup) ) && ( !bBreak || mpRefDevice == pFmtDevice ) ) { - // filter drop-down width is now independent from row height - const tools::Long nFilter = DROPDOWN_BITMAP_SIZE; + // filter drop-down width depends on row height + double fZoom = mpRefDevice ? static_cast<double>(mpRefDevice->GetMapMode().GetScaleY()) : 1.0; + fZoom = fZoom > 1.0 ? fZoom : 1.0; + const tools::Long nFilter = fZoom * DROPDOWN_BITMAP_SIZE; bool bFit = ( nNeeded + nFilter <= nMergeSizeX ); if ( bFit ) { @@ -4915,11 +4917,13 @@ void ScOutputData::DrawRotated(bool bPixelToLogic) eOrient!=SvxCellOrientation::Stacked && pInfo->bAutoFilter) { - // filter drop-down width is now independent from row height + // filter drop-down width depends on row height + double fZoom = mpRefDevice ? static_cast<double>(mpRefDevice->GetMapMode().GetScaleY()) : 1.0; + fZoom = fZoom > 1.0 ? fZoom : 1.0; if (bPixelToLogic) - nAvailWidth -= mpRefDevice->PixelToLogic(Size(0,DROPDOWN_BITMAP_SIZE)).Height(); + nAvailWidth -= mpRefDevice->PixelToLogic(Size(0,fZoom * DROPDOWN_BITMAP_SIZE)).Height(); else - nAvailWidth -= DROPDOWN_BITMAP_SIZE; + nAvailWidth -= fZoom * DROPDOWN_BITMAP_SIZE; tools::Long nComp = nEngineWidth; if (nAvailWidth<nComp) nAvailWidth=nComp; } commit 361121394f0794bbd0f4d23f1a410448fceb4c4e Author: Szymon Kłos <[email protected]> AuthorDate: Wed Jan 27 14:34:19 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:04:33 2021 +0200 Introduce Fontwork context Change-Id: I61512e4da13514d3e5a199ccb46468ba199b808f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110023 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Jan Holesovsky <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112274 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/include/svx/fontworkbar.hxx b/include/svx/fontworkbar.hxx index 1f3a81a9a79c..33c67e8f051b 100644 --- a/include/svx/fontworkbar.hxx +++ b/include/svx/fontworkbar.hxx @@ -26,12 +26,14 @@ class SfxViewShell; class SdrView; +class SdrObject; /************************************************************************/ namespace svx { bool SVXCORE_DLLPUBLIC checkForSelectedFontWork(SdrView const* pSdrView, sal_uInt32& nCheckStatus); +bool SVXCORE_DLLPUBLIC checkForFontWork(SdrObject* pObj); class SAL_WARN_UNUSED SVXCORE_DLLPUBLIC FontworkBar final : public SfxShell { diff --git a/include/vcl/EnumContext.hxx b/include/vcl/EnumContext.hxx index 1c356979d858..639a427a138a 100644 --- a/include/vcl/EnumContext.hxx +++ b/include/vcl/EnumContext.hxx @@ -71,6 +71,7 @@ public: Chart, ChartElements, Draw, + DrawFontwork, DrawLine, DrawPage, DrawText, diff --git a/officecfg/registry/data/org/openoffice/Office/UI/Sidebar.xcu b/officecfg/registry/data/org/openoffice/Office/UI/Sidebar.xcu index ce273e192e59..f9285cb66b5b 100644 --- a/officecfg/registry/data/org/openoffice/Office/UI/Sidebar.xcu +++ b/officecfg/registry/data/org/openoffice/Office/UI/Sidebar.xcu @@ -373,6 +373,7 @@ Calc, EditCell, visible ; Calc, Pivot, visible, .uno:CellTextDlg ; DrawImpress, Draw, hidden ; + DrawImpress, DrawFontwork, hidden ; DrawImpress, DrawText, visible ; DrawImpress, DrawLine, hidden ; DrawImpress, Graphic, hidden ; @@ -563,13 +564,16 @@ <prop oor:name="ContextList"> <value oor:separator=";"> Calc, Draw, visible ; + Calc, DrawFontwork, visible ; Calc, OLE, hidden ; DrawImpress, 3DObject, visible ; DrawImpress, Draw, visible ; + DrawImpress, DrawFontwork, visible ; DrawImpress, Graphic, hidden ; DrawImpress, TextObject, hidden ; DrawImpress, OLE, hidden ; WriterVariants, Draw, visible ; + WriterVariants, DrawFontwork, visible ; Writer, Graphic, hidden ; Writer, OLE, hidden ; Writer, Frame, visible ; @@ -625,9 +629,11 @@ <prop oor:name="ContextList"> <value oor:separator=";"> Calc, Draw, visible ; + Calc, DrawFontwork, visible ; Calc, OLE, hidden ; DrawImpress, 3DObject, visible ; DrawImpress, Draw, hidden ; + DrawImpress, DrawFontwork, hidden ; DrawImpress, Graphic, hidden ; DrawImpress, TextObject, hidden ; DrawImpress, OLE, hidden ; @@ -657,16 +663,19 @@ <prop oor:name="ContextList"> <value oor:separator=";"> Calc, Draw, visible ; + Calc, DrawFontwork, visible ; Calc, DrawLine, visible ; Calc, Graphic, visible ; Calc, OLE, hidden ; DrawImpress, 3DObject, visible ; DrawImpress, Draw, visible ; + DrawImpress, DrawFontwork, visible ; DrawImpress, DrawLine, visible ; DrawImpress, Graphic, visible ; DrawImpress, TextObject, hidden ; DrawImpress, OLE, hidden ; WriterVariants, Draw, visible ; + WriterVariants, DrawFontwork, visible ; </value> </prop> <prop oor:name="ImplementationURL" oor:type="xs:string"> @@ -720,6 +729,7 @@ <value oor:separator=";"> Calc, Chart, visible ; Calc, Draw, hidden ; + Calc, DrawFontwork, hidden ; Calc, DrawLine, visible ; Calc, Form, visible ; Calc, Graphic, hidden ; @@ -728,6 +738,7 @@ Calc, OLE, visible ; DrawImpress, 3DObject, visible ; DrawImpress, Draw, visible ; + DrawImpress, DrawFontwork, visible ; DrawImpress, DrawLine, visible ; DrawImpress, Form, visible ; DrawImpress, Graphic, hidden ; @@ -736,6 +747,7 @@ DrawImpress, OLE, visible ; DrawImpress, TextObject, hidden ; WriterVariants, Draw, hidden ; + WriterVariants, DrawFontwork, hidden ; WriterVariants, Form, visible ; WriterVariants, Graphic, visible, .uno:GraphicDialog ; WriterVariants, Media, visible ; @@ -1149,6 +1161,7 @@ DrawImpress, DrawLine, hidden ; DrawImpress, 3DObject, hidden ; DrawImpress, Draw, hidden ; + DrawImpress, DrawFontwork, hidden ; DrawImpress, DrawText, visible ; DrawImpress, Graphic, hidden ; DrawImpress, Table, visible ; diff --git a/svx/source/sidebar/SelectionAnalyzer.cxx b/svx/source/sidebar/SelectionAnalyzer.cxx index baeaffc20858..a7e6da146edf 100644 --- a/svx/source/sidebar/SelectionAnalyzer.cxx +++ b/svx/source/sidebar/SelectionAnalyzer.cxx @@ -22,6 +22,7 @@ #include <svx/svdobj.hxx> #include <svx/svdotext.hxx> #include <svx/svdpage.hxx> +#include <svx/fontworkbar.hxx> using vcl::EnumContext; @@ -46,6 +47,10 @@ EnumContext::Context SelectionAnalyzer::GetContextForSelection_SC(const SdrMarkL { eContext = EnumContext::Context::DrawText; } + else if (svx::checkForFontWork(pObj)) + { + eContext = EnumContext::Context::DrawFontwork; + } else { const SdrInventor nInv = pObj->GetObjInventor(); @@ -133,6 +138,10 @@ EnumContext::Context SelectionAnalyzer::GetContextForSelection_SD(const SdrMarkL else eContext = EnumContext::Context::DrawText; } + else if (svx::checkForFontWork(pObj)) + { + eContext = EnumContext::Context::DrawFontwork; + } else { const SdrInventor nInv = pObj->GetObjInventor(); diff --git a/svx/source/toolbars/fontworkbar.cxx b/svx/source/toolbars/fontworkbar.cxx index 8a89952d8db3..fcaab8cce21e 100644 --- a/svx/source/toolbars/fontworkbar.cxx +++ b/svx/source/toolbars/fontworkbar.cxx @@ -205,26 +205,34 @@ FontworkBar::~FontworkBar() } namespace svx { +bool checkForFontWork( SdrObject* pObj ) +{ + static constexpr OUStringLiteral sTextPath = u"TextPath"; + bool bFound = false; + + if( dynamic_cast<const SdrObjCustomShape*>( pObj) != nullptr ) + { + const SdrCustomShapeGeometryItem aGeometryItem( pObj->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) ); + const Any* pAny = aGeometryItem.GetPropertyValueByName( sTextPath, sTextPath ); + if( pAny ) + *pAny >>= bFound; + } + + return bFound; +} + bool checkForSelectedFontWork( SdrView const * pSdrView, sal_uInt32& nCheckStatus ) { if ( nCheckStatus & 2 ) return ( nCheckStatus & 1 ) != 0; - static const char sTextPath[] = "TextPath"; - const SdrMarkList& rMarkList = pSdrView->GetMarkedObjectList(); const size_t nCount = rMarkList.GetMarkCount(); bool bFound = false; for(size_t i=0; (i<nCount) && !bFound ; ++i) { SdrObject* pObj = rMarkList.GetMark(i)->GetMarkedSdrObj(); - if( dynamic_cast<const SdrObjCustomShape*>( pObj) != nullptr ) - { - const SdrCustomShapeGeometryItem aGeometryItem( pObj->GetMergedItem( SDRATTR_CUSTOMSHAPE_GEOMETRY ) ); - const Any* pAny = aGeometryItem.GetPropertyValueByName( sTextPath, sTextPath ); - if( pAny ) - *pAny >>= bFound; - } + bFound = checkForFontWork(pObj); } if ( bFound ) nCheckStatus |= 1; diff --git a/sw/source/uibase/shells/drawsh.cxx b/sw/source/uibase/shells/drawsh.cxx index 59fe518a77de..5bdbdc71f81d 100644 --- a/sw/source/uibase/shells/drawsh.cxx +++ b/sw/source/uibase/shells/drawsh.cxx @@ -35,6 +35,7 @@ #include <swmodule.hxx> #include <doc.hxx> #include <docsh.hxx> +#include <svx/fontworkbar.hxx> #include <svx/svdoashp.hxx> #include <svx/xfillit0.hxx> @@ -534,7 +535,15 @@ SwDrawShell::SwDrawShell(SwView &_rView) : { SetName("Draw"); - SfxShell::SetContextName(vcl::EnumContext::GetContextName(vcl::EnumContext::Context::Draw)); + vcl::EnumContext::Context eContext = vcl::EnumContext::Context::Draw; + + SwWrtShell &rSh = GetShell(); + SdrView* pDrView = rSh.GetDrawView(); + sal_uInt32 nCheckStatus = 0; + if (pDrView && svx::checkForSelectedFontWork(pDrView, nCheckStatus)) + eContext = vcl::EnumContext::Context::DrawFontwork; + + SfxShell::SetContextName(vcl::EnumContext::GetContextName(eContext)); } // Edit SfxRequests for FontWork diff --git a/vcl/source/window/EnumContext.cxx b/vcl/source/window/EnumContext.cxx index 7d3d704180f4..b407a8069bc7 100644 --- a/vcl/source/window/EnumContext.cxx +++ b/vcl/source/window/EnumContext.cxx @@ -159,6 +159,7 @@ void EnumContext::ProvideContextContainers() AddEntry("Chart", Context::Chart); AddEntry("ChartElements", Context::ChartElements); AddEntry("Draw", Context::Draw); + AddEntry("DrawFontwork", Context::DrawFontwork); AddEntry("DrawLine", Context::DrawLine); AddEntry("DrawPage", Context::DrawPage); AddEntry("DrawText", Context::DrawText); commit 56da8fcde1c435d2c0e13bd55b52c94bf6e4e6d9 Author: Szymon Kłos <[email protected]> AuthorDate: Tue Jan 26 16:35:10 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:02:23 2021 +0200 fontwork: insert in the center of LOK view Change-Id: Iabde4ee927546b0e396c4fbd6d0099fa82240166 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109968 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Jan Holesovsky <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112163 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/include/sfx2/viewsh.hxx b/include/sfx2/viewsh.hxx index 67671a6a678b..bf52719f99b5 100644 --- a/include/sfx2/viewsh.hxx +++ b/include/sfx2/viewsh.hxx @@ -382,6 +382,8 @@ public: bool isLOKTablet() const { return maLOKDeviceFormFactor == LOKDeviceFormFactor::TABLET; } /// Check if the lok client is running on a mobile device. bool isLOKMobilePhone() const { return maLOKDeviceFormFactor == LOKDeviceFormFactor::MOBILE; } + + virtual tools::Rectangle getLOKVisibleArea() const { return tools::Rectangle(); } }; diff --git a/sc/source/ui/inc/tabvwsh.hxx b/sc/source/ui/inc/tabvwsh.hxx index 480f4ca9c73b..7a07d476eb0b 100644 --- a/sc/source/ui/inc/tabvwsh.hxx +++ b/sc/source/ui/inc/tabvwsh.hxx @@ -400,6 +400,8 @@ public: void InitFormEditData(); void ClearFormEditData(); ScFormEditData* GetFormEditData() { return mpFormEditData.get(); } + + virtual tools::Rectangle getLOKVisibleArea() const override; }; #endif diff --git a/sc/source/ui/view/tabvwsh4.cxx b/sc/source/ui/view/tabvwsh4.cxx index 34a11e3f8e6e..0a1d2212f1fb 100644 --- a/sc/source/ui/view/tabvwsh4.cxx +++ b/sc/source/ui/view/tabvwsh4.cxx @@ -1858,4 +1858,9 @@ ScNavigatorSettings* ScTabViewShell::GetNavigatorSettings() return pNavSettings.get(); } +tools::Rectangle ScTabViewShell::getLOKVisibleArea() const +{ + return GetViewData().getLOKVisibleArea(); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sd/source/ui/inc/ViewShellBase.hxx b/sd/source/ui/inc/ViewShellBase.hxx index 0510b2ad0fb5..085285f900b1 100644 --- a/sd/source/ui/inc/ViewShellBase.hxx +++ b/sd/source/ui/inc/ViewShellBase.hxx @@ -217,6 +217,9 @@ public: /// See SfxViewShell::NotifyCursor(). void NotifyCursor(SfxViewShell* pViewShell) const override; + void setLOKVisibleArea(const ::tools::Rectangle& rArea) { maLOKVisibleArea = rArea; } + virtual ::tools::Rectangle getLOKVisibleArea() const override { return maLOKVisibleArea; } + protected: virtual void Notify(SfxBroadcaster& rBC, const SfxHint& rHint) override; @@ -228,6 +231,7 @@ private: std::unique_ptr<Implementation> mpImpl; DrawDocShell* mpDocShell; SdDrawDocument* mpDocument; + ::tools::Rectangle maLOKVisibleArea; /** Determine from the properties of the document shell the initial type of the view shell in the center pane. We use this method to avoid diff --git a/sd/source/ui/inc/unomodel.hxx b/sd/source/ui/inc/unomodel.hxx index 4f4ba44e170e..483dca72f73a 100644 --- a/sd/source/ui/inc/unomodel.hxx +++ b/sd/source/ui/inc/unomodel.hxx @@ -255,6 +255,8 @@ public: virtual void setGraphicSelection(int nType, int nX, int nY) override; /// @see lok::Document::resetSelection(). virtual void resetSelection() override; + /// @see vcl::ITiledRenderable::setClientVisibleArea(). + virtual void setClientVisibleArea(const tools::Rectangle& rRectangle) override; /// @see vcl::ITiledRenderable::setClipboard(). virtual void setClipboard(const css::uno::Reference<css::datatransfer::clipboard::XClipboard>& xClipboard) override; /// @see vcl::ITiledRenderable::isMimeTypeSupported(). diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx index 5321e17f900e..b325c3c9e201 100644 --- a/sd/source/ui/unoidl/unomodel.cxx +++ b/sd/source/ui/unoidl/unomodel.cxx @@ -2619,6 +2619,17 @@ void SdXImpressDocument::resetSelection() pSdrView->UnmarkAll(); } +void SdXImpressDocument::setClientVisibleArea(const ::tools::Rectangle& rRectangle) +{ + SolarMutexGuard aGuard; + + DrawViewShell* pViewShell = GetViewShell(); + if (!pViewShell) + return; + + pViewShell->GetViewShellBase().setLOKVisibleArea(rRectangle); +} + void SdXImpressDocument::setClipboard(const uno::Reference<datatransfer::clipboard::XClipboard>& xClipboard) { SolarMutexGuard aGuard; diff --git a/svx/source/tbxctrls/fontworkgallery.cxx b/svx/source/tbxctrls/fontworkgallery.cxx index 416791cc0590..b34199ba292f 100644 --- a/svx/source/tbxctrls/fontworkgallery.cxx +++ b/svx/source/tbxctrls/fontworkgallery.cxx @@ -20,16 +20,19 @@ #include <com/sun/star/text/WritingMode.hpp> +#include <comphelper/lok.hxx> + #include <vcl/toolbox.hxx> #include <vcl/virdev.hxx> +#include <sfx2/viewsh.hxx> + #include <svl/itempool.hxx> #include <svtools/toolbarmenu.hxx> #include <svtools/popupwindowcontroller.hxx> #include <svx/fmmodel.hxx> -#include <svx/dialmgr.hxx> #include <svx/strings.hrc> #include <svx/svdpage.hxx> #include <svx/svdobj.hxx> @@ -38,6 +41,8 @@ #include <svx/gallery.hxx> #include <svx/fontworkgallery.hxx> +#include <tools/UnitConversion.hxx> + #include <algorithm> #include <memory> @@ -193,17 +198,41 @@ void FontWorkGalleryDialog::insertSelectedFontwork() // pNewObject->SetPage(nullptr); tools::Rectangle aObjRect( pNewObject->GetLogicRect() ); - tools::Rectangle aVisArea = pOutDev->PixelToLogic(tools::Rectangle(Point(0,0), pOutDev->GetOutputSizePixel())); - Point aPagePos = aVisArea.Center(); - bool bIsInsertedObjectSmallerThanVisibleArea = - aVisArea.GetSize().getHeight() > aObjRect.GetSize().getHeight() && - aVisArea.GetSize().getWidth() > aObjRect.GetSize().getWidth(); - if (bIsInsertedObjectSmallerThanVisibleArea) + Point aPagePos; + Size aFontworkSize = aObjRect.GetSize(); + + if (comphelper::LibreOfficeKit::isActive()) { - aPagePos.AdjustX( -(aObjRect.GetWidth() / 2) ); - aPagePos.AdjustY( -(aObjRect.GetHeight() / 2) ); + SfxViewShell* pViewShell = SfxViewShell::Current(); + + aPagePos = pViewShell->getLOKVisibleArea().Center(); + + aPagePos.setX(convertTwipToMm100(aPagePos.X())); + aPagePos.setY(convertTwipToMm100(aPagePos.Y())); + + sal_Int32 nLOKViewWidth = 0.8 * convertTwipToMm100(pViewShell->getLOKVisibleArea().getWidth()); + if (aFontworkSize.getWidth() > nLOKViewWidth) + { + double fScale = static_cast<double>(aFontworkSize.getWidth()) / nLOKViewWidth; + aFontworkSize.setWidth(aFontworkSize.getWidth() / fScale); + aFontworkSize.setHeight(aFontworkSize.getHeight() / fScale); + } } - tools::Rectangle aNewObjectRectangle(aPagePos, aObjRect.GetSize()); + else + { + Size aSize = pOutDev->GetOutputSizePixel(); + tools::Rectangle aPixelVisRect(Point(0,0), aSize); + tools::Rectangle aVisArea = pOutDev->PixelToLogic(aPixelVisRect); + + aPagePos = aVisArea.Center(); + } + + if (aPagePos.getX() > aFontworkSize.getWidth() / 2) + aPagePos.AdjustX( -(aFontworkSize.getWidth() / 2) ); + if (aPagePos.getY() > aFontworkSize.getHeight() / 2) + aPagePos.AdjustY( -(aFontworkSize.getHeight() / 2) ); + + tools::Rectangle aNewObjectRectangle(aPagePos, aFontworkSize); pNewObject->SetLogicRect(aNewObjectRectangle); if (bUseSpecialCalcMode) diff --git a/sw/inc/view.hxx b/sw/inc/view.hxx index 0cf34eccc881..57c41b4a7971 100644 --- a/sw/inc/view.hxx +++ b/sw/inc/view.hxx @@ -680,6 +680,8 @@ public: void SetOldFrameCat(const OUString& sStr); const OUString& GetOldDrwCat(); void SetOldDrwCat(const OUString& sStr); + + virtual tools::Rectangle getLOKVisibleArea() const override; }; inline tools::Long SwView::GetXScroll() const diff --git a/sw/source/uibase/uiview/view.cxx b/sw/source/uibase/uiview/view.cxx index 9dd7b932de0b..1bc3afaba83a 100644 --- a/sw/source/uibase/uiview/view.cxx +++ b/sw/source/uibase/uiview/view.cxx @@ -1895,6 +1895,15 @@ void SwView::AddTransferable(SwTransferable& rTransferable) GetViewImpl()->AddTransferable(rTransferable); } +tools::Rectangle SwView::getLOKVisibleArea() const +{ + SwViewShell* pVwSh = GetWrtShellPtr(); + if (pVwSh) + return pVwSh->getLOKVisibleArea(); + else + return tools::Rectangle(); +} + OUString SwView::GetDataSourceName() const { uno::Reference<lang::XMultiServiceFactory> xFactory(GetDocShell()->GetModel(), uno::UNO_QUERY); diff --git a/sw/source/uibase/uiview/viewdraw.cxx b/sw/source/uibase/uiview/viewdraw.cxx index 219d4bbf52c8..b23fb93ed520 100644 --- a/sw/source/uibase/uiview/viewdraw.cxx +++ b/sw/source/uibase/uiview/viewdraw.cxx @@ -159,10 +159,9 @@ void SwView::ExecDraw(SfxRequest& rReq) if ( pObj ) { Size aDocSize( m_pWrtShell->GetDocSize() ); - const SwRect& rVisArea = m_pWrtShell->VisArea(); + const SwRect& rVisArea = comphelper::LibreOfficeKit::isActive() ? + m_pWrtShell->getLOKVisibleArea() : m_pWrtShell->VisArea(); Point aPos( rVisArea.Center() ); - Size aSize; - Size aPrefSize( pObj->GetSnapRect().GetSize() ); if( rVisArea.Width() > aDocSize.Width()) aPos.setX( aDocSize.Width() / 2 + rVisArea.Left() ); @@ -170,10 +169,11 @@ void SwView::ExecDraw(SfxRequest& rReq) if(rVisArea.Height() > aDocSize.Height()) aPos.setY( aDocSize.Height() / 2 + rVisArea.Top() ); - if( aPrefSize.Width() && aPrefSize.Height() ) - aSize = rWin2.PixelToLogic(aPrefSize, MapMode(MapUnit::MapTwip)); - else - aSize = Size( 2835, 2835 ); + tools::Rectangle aObjRect( pObj->GetLogicRect() ); + if (aPos.getX() > aObjRect.GetWidth() / 2) + aPos.AdjustX( -(aObjRect.GetWidth() / 2) ); + if (aPos.getY() > aObjRect.GetHeight() / 2) + aPos.AdjustY( -(aObjRect.GetHeight() / 2) ); m_pWrtShell->EnterStdMode(); m_pWrtShell->SwFEShell::InsertDrawObj( *pObj, aPos ); commit d5594a306e884e4c4700bdb28e48349445de2810 Author: Szymon Kłos <[email protected]> AuthorDate: Mon Feb 8 12:37:38 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:00:46 2021 +0200 jsdialog autofilter: show submenu on demad - add posibility to trigger full update - send information if docking window is visible - send close message on builder destruction Change-Id: I0b3abc5ebcacf7f9a48910edf1bf0d73e8120d6e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/110578 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/include/vcl/jsdialog/executor.hxx b/include/vcl/jsdialog/executor.hxx index 159b1dccd730..713afaff9082 100644 --- a/include/vcl/jsdialog/executor.hxx +++ b/include/vcl/jsdialog/executor.hxx @@ -59,6 +59,7 @@ public: namespace jsdialog { VCL_DLLPUBLIC bool ExecuteAction(sal_uInt64 nWindowId, const OString& rWidget, StringMap& rData); +VCL_DLLPUBLIC void SendFullUpdate(sal_uInt64 nWindowId, const OString& rWidget); VCL_DLLPUBLIC StringMap jsonToStringMap(const char* pJSON); }; diff --git a/sc/source/ui/cctrl/checklistmenu.cxx b/sc/source/ui/cctrl/checklistmenu.cxx index c61c52cf7840..e33c0b891360 100644 --- a/sc/source/ui/cctrl/checklistmenu.cxx +++ b/sc/source/ui/cctrl/checklistmenu.cxx @@ -297,15 +297,8 @@ void ScCheckListMenuControl::launchSubMenu(bool bSetMenuPos) mxMenu->select(*mxScratchIter); rSubMenuControl.GrabFocus(); - // TODO: something better to retrigger JSON dialog invalidation if (comphelper::LibreOfficeKit::isActive()) - { - StringMap args; - args["cmd"] = "change"; - args["type"] = "checkbox"; - args["data"] = "true"; - jsdialog::ExecuteAction(pSubMenu->GetLOKWindowId(), "toggle_all", args); - } + jsdialog::SendFullUpdate(pSubMenu->GetLOKWindowId(), "toggle_all"); } IMPL_LINK_NOARG(ScCheckListMenuControl, PostPopdownHdl, void*, void) diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index db25a8322891..190d1bb33465 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -84,7 +84,7 @@ public: initializeSender(aNotifierWindow, aContentWindow, sTypeOfJSON); } - virtual ~JSDialogSender() = default; + virtual ~JSDialogSender(); virtual void sendFullUpdate(bool bForce = false); void sendClose(); @@ -146,6 +146,8 @@ class JSInstanceBuilder : public SalInstanceBuilder, public JSDialogSender friend VCL_DLLPUBLIC bool jsdialog::ExecuteAction(sal_uInt64 nWindowId, const OString& rWidget, StringMap& rData); + friend VCL_DLLPUBLIC void jsdialog::SendFullUpdate(sal_uInt64 nWindowId, + const OString& rWidget); static std::map<sal_uInt64, WidgetMap>& GetLOKWeldWidgetsMap(); static void InsertWindowToMap(sal_uInt64 nWindowId); @@ -204,7 +206,20 @@ private: VclPtr<vcl::Window>& GetNotifierWindow(); }; -template <class BaseInstanceClass, class VclClass> class JSWidget : public BaseInstanceClass +class BaseJSWidget +{ +public: + virtual ~BaseJSWidget() = default; + + virtual void sendClose() = 0; + + virtual void sendUpdate(bool bForce = false) = 0; + + virtual void sendFullUpdate(bool bForce = false) = 0; +}; + +template <class BaseInstanceClass, class VclClass> +class JSWidget : public BaseInstanceClass, public BaseJSWidget { protected: rtl::Reference<JSDropTarget> m_xDropTarget; @@ -272,19 +287,19 @@ public: m_bIsFreezed = false; } - void sendClose() + virtual void sendClose() override { if (m_pSender) m_pSender->sendClose(); } - void sendUpdate(bool bForce = false) + virtual void sendUpdate(bool bForce = false) override { if (!m_bIsFreezed && m_pSender) m_pSender->sendUpdate(BaseInstanceClass::m_xWidget, bForce); } - void sendFullUpdate(bool bForce = false) + virtual void sendFullUpdate(bool bForce = false) override { if ((!m_bIsFreezed || bForce) && m_pSender) m_pSender->sendFullUpdate(bForce); diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx index 145481955d43..409c77a5d126 100644 --- a/vcl/jsdialog/executor.cxx +++ b/vcl/jsdialog/executor.cxx @@ -34,6 +34,17 @@ StringMap jsonToStringMap(const char* pJSON) return aArgs; } +void SendFullUpdate(sal_uInt64 nWindowId, const OString& rWidget) +{ + weld::Widget* pWidget = JSInstanceBuilder::FindWeldWidgetsMap(nWindowId, rWidget); + + if (pWidget != nullptr) + { + auto pJSWidget = dynamic_cast<BaseJSWidget*>(pWidget); + pJSWidget->sendFullUpdate(); + } +} + bool ExecuteAction(sal_uInt64 nWindowId, const OString& rWidget, StringMap& rData) { weld::Widget* pWidget = JSInstanceBuilder::FindWeldWidgetsMap(nWindowId, rWidget); diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 4038e009d017..da0537893a35 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -97,18 +97,20 @@ std::unique_ptr<tools::JsonWriter> JSDialogNotifyIdle::generateFullUpdate() cons if (m_sTypeOfJSON == "autofilter") { vcl::Window* pWindow = m_aContentWindow.get(); - DockingWindow* pDockingWIndow = dynamic_cast<DockingWindow*>(pWindow); - while (pWindow && !pDockingWIndow) + DockingWindow* pDockingWindow = dynamic_cast<DockingWindow*>(pWindow); + while (pWindow && !pDockingWindow) { pWindow = pWindow->GetParent(); - pDockingWIndow = dynamic_cast<DockingWindow*>(pWindow); + pDockingWindow = dynamic_cast<DockingWindow*>(pWindow); } - if (pDockingWIndow) + if (pDockingWindow) { - Point aPos = pDockingWIndow->GetFloatingPos(); + Point aPos = pDockingWindow->GetFloatingPos(); aJsonWriter->put("posx", aPos.getX()); aJsonWriter->put("posy", aPos.getY()); + if (!pDockingWindow->IsVisible()) + aJsonWriter->put("visible", "false"); } } @@ -167,6 +169,8 @@ void JSDialogNotifyIdle::Invoke() m_aMessageQueue.clear(); } +JSDialogSender::~JSDialogSender() { sendClose(); } + void JSDialogSender::sendFullUpdate(bool bForce) { if (bForce) commit 87b986a7bfc315036d146f607942db8598073125 Author: Szymon Kłos <[email protected]> AuthorDate: Mon Jan 25 15:04:17 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:00:34 2021 +0200 jsdialog: missing method for treeview Change-Id: Ice358bb9d79cc0e257e03fba4ef9df1397284158 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109971 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Tomaž Vajngerl <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111840 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 267dc960ecd9..db25a8322891 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -431,6 +431,7 @@ public: using SalInstanceTreeView::set_toggle; /// pos is used differently here, it defines how many steps of iterator we need to perform to take entry virtual void set_toggle(int pos, TriState eState, int col = -1) override; + virtual void set_toggle(const weld::TreeIter& rIter, TriState bOn, int col = -1) override; using SalInstanceTreeView::select; /// pos is used differently here, it defines how many steps of iterator we need to perform to take entry diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 9fd33ae26b3a..4038e009d017 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -991,6 +991,12 @@ void JSTreeView::set_toggle(int pos, TriState eState, int col) } } +void JSTreeView::set_toggle(const weld::TreeIter& rIter, TriState bOn, int col) +{ + SalInstanceTreeView::set_toggle(rIter, bOn, col); + sendUpdate(); +} + void JSTreeView::select(int pos) { assert(m_xTreeView->IsUpdateMode() && "don't select when frozen"); commit ea0879d963ed77e1d737742ec358e294a800830b Author: Szymon Kłos <[email protected]> AuthorDate: Fri Jan 15 11:38:50 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 21:00:09 2021 +0200 jsdialog: partial updates for more widgets + DrawingArea + Combobox + Listbox + RadioButton + Expander + IconView + Entry + TextView + SpinField Change-Id: Ic1fdc8ae37216089d0ba18191ff12895c1f5e84e Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109367 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index aa9de490c249..267dc960ecd9 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -88,7 +88,7 @@ public: virtual void sendFullUpdate(bool bForce = false); void sendClose(); - virtual void sendUpdate(VclPtr<vcl::Window> pWindow); + virtual void sendUpdate(VclPtr<vcl::Window> pWindow, bool bForce = false); void flush() { mpIdleNotify->Invoke(); } protected: @@ -278,10 +278,10 @@ public: m_pSender->sendClose(); } - void sendUpdate() + void sendUpdate(bool bForce = false) { if (!m_bIsFreezed && m_pSender) - m_pSender->sendUpdate(BaseInstanceClass::m_xWidget); + m_pSender->sendUpdate(BaseInstanceClass::m_xWidget, bForce); } void sendFullUpdate(bool bForce = false) diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 658ee5ae18d6..9fd33ae26b3a 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -182,8 +182,11 @@ void JSDialogSender::sendClose() flush(); } -void JSDialogSender::sendUpdate(VclPtr<vcl::Window> pWindow) +void JSDialogSender::sendUpdate(VclPtr<vcl::Window> pWindow, bool bForce) { + if (bForce) + mpIdleNotify->forceUpdate(); + mpIdleNotify->sendMessage(jsdialog::MessageType::WidgetUpdate, pWindow); mpIdleNotify->Start(); } @@ -772,7 +775,7 @@ JSEntry::JSEntry(JSDialogSender* pSender, ::Edit* pEntry, SalInstanceBuilder* pB void JSEntry::set_text(const OUString& rText) { SalInstanceEntry::set_text(rText); - sendFullUpdate(); + sendUpdate(); } void JSEntry::set_text_without_notify(const OUString& rText) { SalInstanceEntry::set_text(rText); } @@ -788,19 +791,19 @@ void JSListBox::insert(int pos, const OUString& rStr, const OUString* pId, const OUString* pIconName, VirtualDevice* pImageSurface) { SalInstanceComboBoxWithoutEdit::insert(pos, rStr, pId, pIconName, pImageSurface); - sendFullUpdate(); + sendUpdate(); } void JSListBox::remove(int pos) { SalInstanceComboBoxWithoutEdit::remove(pos); - sendFullUpdate(); + sendUpdate(); } void JSListBox::set_active(int pos) { SalInstanceComboBoxWithoutEdit::set_active(pos); - sendFullUpdate(); + sendUpdate(); } JSComboBox::JSComboBox(JSDialogSender* pSender, ::ComboBox* pComboBox, SalInstanceBuilder* pBuilder, @@ -814,25 +817,25 @@ void JSComboBox::insert(int pos, const OUString& rStr, const OUString* pId, const OUString* pIconName, VirtualDevice* pImageSurface) { SalInstanceComboBoxWithEdit::insert(pos, rStr, pId, pIconName, pImageSurface); - sendFullUpdate(); + sendUpdate(); } void JSComboBox::remove(int pos) { SalInstanceComboBoxWithEdit::remove(pos); - sendFullUpdate(); + sendUpdate(); } void JSComboBox::set_entry_text(const OUString& rText) { SalInstanceComboBoxWithEdit::set_entry_text(rText); - sendFullUpdate(); + sendUpdate(); } void JSComboBox::set_active(int pos) { SalInstanceComboBoxWithEdit::set_active(pos); - sendFullUpdate(); + sendUpdate(); } JSNotebook::JSNotebook(JSDialogSender* pSender, ::TabControl* pControl, @@ -884,7 +887,7 @@ JSSpinButton::JSSpinButton(JSDialogSender* pSender, ::FormattedField* pSpin, void JSSpinButton::set_value(int value) { SalInstanceSpinButton::set_value(value); - sendFullUpdate(true); // if input is limited we can receive the same JSON + sendUpdate(true); // if input is limited we can receive the same JSON } JSMessageDialog::JSMessageDialog(JSDialogSender* pSender, ::MessageDialog* pDialog, @@ -924,7 +927,7 @@ JSCheckButton::JSCheckButton(JSDialogSender* pSender, ::CheckBox* pCheckBox, void JSCheckButton::set_active(bool active) { SalInstanceCheckButton::set_active(active); - sendFullUpdate(); + sendUpdate(); } JSDrawingArea::JSDrawingArea(JSDialogSender* pSender, VclDrawingArea* pDrawingArea, @@ -938,13 +941,13 @@ JSDrawingArea::JSDrawingArea(JSDialogSender* pSender, VclDrawingArea* pDrawingAr void JSDrawingArea::queue_draw() { SalInstanceDrawingArea::queue_draw(); - sendFullUpdate(); + sendUpdate(); } void JSDrawingArea::queue_draw_area(int x, int y, int width, int height) { SalInstanceDrawingArea::queue_draw_area(x, y, width, height); - sendFullUpdate(); + sendUpdate(); } JSToolbar::JSToolbar(JSDialogSender* pSender, ::ToolBox* pToolbox, SalInstanceBuilder* pBuilder, @@ -963,7 +966,7 @@ JSTextView::JSTextView(JSDialogSender* pSender, ::VclMultiLineEdit* pTextView, void JSTextView::set_text(const OUString& rText) { SalInstanceTextView::set_text(rText); - sendFullUpdate(); + sendUpdate(); } JSTreeView::JSTreeView(JSDialogSender* pSender, ::SvTabListBox* pTreeView, @@ -1081,7 +1084,7 @@ JSExpander::JSExpander(JSDialogSender* pSender, ::VclExpander* pExpander, void JSExpander::set_expanded(bool bExpand) { SalInstanceExpander::set_expanded(bExpand); - sendFullUpdate(); + sendUpdate(); } JSIconView::JSIconView(JSDialogSender* pSender, ::IconView* pIconView, SalInstanceBuilder* pBuilder, @@ -1094,32 +1097,32 @@ void JSIconView::insert(int pos, const OUString* pStr, const OUString* pId, const OUString* pIconName, weld::TreeIter* pRet) { SalInstanceIconView::insert(pos, pStr, pId, pIconName, pRet); - sendFullUpdate(); + sendUpdate(); } void JSIconView::insert(int pos, const OUString* pStr, const OUString* pId, const VirtualDevice* pIcon, weld::TreeIter* pRet) { SalInstanceIconView::insert(pos, pStr, pId, pIcon, pRet); - sendFullUpdate(); + sendUpdate(); } void JSIconView::clear() { SalInstanceIconView::clear(); - sendFullUpdate(); + sendUpdate(); } void JSIconView::select(int pos) { SalInstanceIconView::select(pos); - sendFullUpdate(); + sendUpdate(); } void JSIconView::unselect(int pos) { SalInstanceIconView::unselect(pos); - sendFullUpdate(); + sendUpdate(); } JSRadioButton::JSRadioButton(JSDialogSender* pSender, ::RadioButton* pRadioButton, @@ -1132,7 +1135,7 @@ JSRadioButton::JSRadioButton(JSDialogSender* pSender, ::RadioButton* pRadioButto void JSRadioButton::set_active(bool active) { SalInstanceRadioButton::set_active(active); - sendFullUpdate(); + sendUpdate(); } /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ commit 37c9e0acd5ae72231b6c4c222e46e10ff7b9a0fb Author: Szymon Kłos <[email protected]> AuthorDate: Tue Jan 19 14:08:35 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:59:56 2021 +0200 jsdialog: enqueue update on dialog weld Change-Id: I01f14cdf0aa3ea16cd311aed9abe14423e2ec846 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109727 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 836c73f3edea..658ee5ae18d6 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -484,16 +484,8 @@ std::unique_ptr<weld::Dialog> JSInstanceBuilder::weld_dialog(const OString& id) RememberWidget("__DIALOG__", pRet.get()); - const vcl::ILibreOfficeKitNotifier* pNotifier = pDialog->GetLOKNotifier(); - if (pNotifier) - { - tools::JsonWriter aJsonWriter; - m_aOwnedToplevel->DumpAsPropertyTree(aJsonWriter); - aJsonWriter.put("id", m_aOwnedToplevel->GetLOKWindowId()); - pNotifier->libreOfficeKitViewCallback(LOK_CALLBACK_JSDIALOG, aJsonWriter.extractData()); - } - initializeSender(GetNotifierWindow(), GetContentWindow(), GetTypeOfJSON()); + sendFullUpdate(); } return pRet; commit 29ff600b3973a3576cf6a1a1d0acad668c6c3bf3 Author: Szymon Kłos <[email protected]> AuthorDate: Wed Jan 20 17:48:18 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:59:44 2021 +0200 jsdialog: don't send multiple updates with the same content Change-Id: I601511a85386a8a35cbc6a121a4719928f585794 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109726 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index e8c8ff4d4232..836c73f3edea 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -68,6 +68,18 @@ void JSDialogNotifyIdle::send(tools::JsonWriter& aJsonWriter) void JSDialogNotifyIdle::sendMessage(jsdialog::MessageType eType, VclPtr<vcl::Window> pWindow) { + // we want only the latest update of same type + // TODO: also if we met full update - previous updates are not valid + auto it = m_aMessageQueue.begin(); + + while (it != m_aMessageQueue.end()) + { + if (it->first == eType && it->second == pWindow) + it = m_aMessageQueue.erase(it); + else + it++; + } + m_aMessageQueue.push_back(std::make_pair(eType, pWindow)); } commit 35be0bd997b194de1af6df0767a12db7a8590aad Author: Szymon Kłos <[email protected]> AuthorDate: Tue Jan 19 17:06:22 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:59:29 2021 +0200 jsdialog: reduce number of unnecessary messages Change-Id: I8dfa464a39931a12dd2ecf91fc48f4812d75301b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109645 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 137659e9b217..aa9de490c249 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -246,8 +246,10 @@ public: using BaseInstanceClass::set_sensitive; virtual void set_sensitive(bool sensitive) override { + bool bIsSensitive = BaseInstanceClass::get_sensitive(); BaseInstanceClass::set_sensitive(sensitive); - sendUpdate(); + if (bIsSensitive != sensitive) + sendUpdate(); } virtual css::uno::Reference<css::datatransfer::dnd::XDropTarget> get_drop_target() override commit 4fbdc8f0f5f5710010d7820d3215296eb5734e9f Author: Szymon Kłos <[email protected]> AuthorDate: Tue Jan 19 15:55:29 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:59:17 2021 +0200 jsdialog: flush message queue on dialog close Change-Id: I9e7d24e43a7ee7bf1a006c8d16e7b47a6b714fd9 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109644 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 0c274868c716..137659e9b217 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -89,6 +89,7 @@ public: virtual void sendFullUpdate(bool bForce = false); void sendClose(); virtual void sendUpdate(VclPtr<vcl::Window> pWindow); + void flush() { mpIdleNotify->Invoke(); } protected: void initializeSender(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 98eb4fbdeb3a..e8c8ff4d4232 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -167,7 +167,7 @@ void JSDialogSender::sendFullUpdate(bool bForce) void JSDialogSender::sendClose() { mpIdleNotify->sendMessage(jsdialog::MessageType::Close, nullptr); - mpIdleNotify->Start(); + flush(); } void JSDialogSender::sendUpdate(VclPtr<vcl::Window> pWindow) commit 110aa29fc688eab8193bb92c6fc7d5ce470d721c Author: Szymon Kłos <[email protected]> AuthorDate: Tue Jan 19 14:20:51 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:59:07 2021 +0200 jsdialog: remove unnecessary handler Change-Id: I4e4d032c73fc090f443dcc7bef0267e1df123810 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109643 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index b38ba2914462..29f671940c85 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -2237,7 +2237,7 @@ protected: friend class ::LOKTrigger; - virtual void signal_clicked(const OString& rIdent) { m_aClickHdl.Call(rIdent); } + void signal_clicked(const OString& rIdent) { m_aClickHdl.Call(rIdent); } void signal_toggle_menu(const OString& rIdent) { m_aToggleMenuHdl.Call(rIdent); } public: diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index bf35c54609cf..0c274868c716 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -409,8 +409,6 @@ class JSToolbar : public JSWidget<SalInstanceToolbar, ::ToolBox> public: JSToolbar(JSDialogSender* pSender, ::ToolBox* pToolbox, SalInstanceBuilder* pBuilder, bool bTakeOwnership); - - virtual void signal_clicked(const OString& rIdent) override; }; class JSTextView : public JSWidget<SalInstanceTextView, ::VclMultiLineEdit> diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index e40e098b74e0..98eb4fbdeb3a 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -949,12 +949,6 @@ JSToolbar::JSToolbar(JSDialogSender* pSender, ::ToolBox* pToolbox, SalInstanceBu { } -void JSToolbar::signal_clicked(const OString& rIdent) -{ - SalInstanceToolbar::signal_clicked(rIdent); - sendFullUpdate(); -} - JSTextView::JSTextView(JSDialogSender* pSender, ::VclMultiLineEdit* pTextView, SalInstanceBuilder* pBuilder, bool bTakeOwnership) : JSWidget<SalInstanceTextView, ::VclMultiLineEdit>(pSender, pTextView, pBuilder, commit cc19e24c2d4a0120d8ff43355eefe91bf03826bf Author: Szymon Kłos <[email protected]> AuthorDate: Tue Jan 19 12:09:45 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:58:53 2021 +0200 jsdialog: send updates also for source treeview on drag + simplify updates + unify naming Change-Id: Iebdaae3d910ef2cba0c818aa17d407e39f62a5e4 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109635 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index b638ac01a417..bf35c54609cf 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -86,7 +86,7 @@ public: virtual ~JSDialogSender() = default; - virtual void notifyDialogState(bool bForce = false); + virtual void sendFullUpdate(bool bForce = false); void sendClose(); virtual void sendUpdate(VclPtr<vcl::Window> pWindow); @@ -233,20 +233,20 @@ public: virtual void show() override { BaseInstanceClass::show(); - notifyDialogState(); + sendFullUpdate(); } virtual void hide() override { BaseInstanceClass::hide(); - notifyDialogState(); + sendFullUpdate(); } using BaseInstanceClass::set_sensitive; virtual void set_sensitive(bool sensitive) override { BaseInstanceClass::set_sensitive(sensitive); - sendUpdate(BaseInstanceClass::m_xWidget); + sendUpdate(); } virtual css::uno::Reference<css::datatransfer::dnd::XDropTarget> get_drop_target() override @@ -275,16 +275,16 @@ public: m_pSender->sendClose(); } - void sendUpdate(VclPtr<vcl::Window> pWindow) + void sendUpdate() { if (!m_bIsFreezed && m_pSender) - m_pSender->sendUpdate(pWindow); + m_pSender->sendUpdate(BaseInstanceClass::m_xWidget); } - void notifyDialogState(bool bForce = false) + void sendFullUpdate(bool bForce = false) { if ((!m_bIsFreezed || bForce) && m_pSender) - m_pSender->notifyDialogState(bForce); + m_pSender->sendFullUpdate(bForce); } }; diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 0c57aaf4fa44..e40e098b74e0 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -155,7 +155,7 @@ void JSDialogNotifyIdle::Invoke() m_aMessageQueue.clear(); } -void JSDialogSender::notifyDialogState(bool bForce) +void JSDialogSender::sendFullUpdate(bool bForce) { if (bForce) mpIdleNotify->forceUpdate(); @@ -726,13 +726,13 @@ JSDialog::JSDialog(JSDialogSender* pSender, ::Dialog* pDialog, SalInstanceBuilde void JSDialog::collapse(weld::Widget* pEdit, weld::Widget* pButton) { SalInstanceDialog::collapse(pEdit, pButton); - notifyDialogState(); + sendFullUpdate(); } void JSDialog::undo_collapse() { SalInstanceDialog::undo_collapse(); - notifyDialogState(); + sendFullUpdate(); } void JSDialog::response(int response) @@ -750,7 +750,7 @@ JSLabel::JSLabel(JSDialogSender* pSender, FixedText* pLabel, SalInstanceBuilder* void JSLabel::set_label(const OUString& rText) { SalInstanceLabel::set_label(rText); - sendUpdate(m_xWidget); + sendUpdate(); }; JSButton::JSButton(JSDialogSender* pSender, ::Button* pButton, SalInstanceBuilder* pBuilder, @@ -768,7 +768,7 @@ JSEntry::JSEntry(JSDialogSender* pSender, ::Edit* pEntry, SalInstanceBuilder* pB void JSEntry::set_text(const OUString& rText) { SalInstanceEntry::set_text(rText); - notifyDialogState(); + sendFullUpdate(); } void JSEntry::set_text_without_notify(const OUString& rText) { SalInstanceEntry::set_text(rText); } @@ -784,19 +784,19 @@ void JSListBox::insert(int pos, const OUString& rStr, const OUString* pId, const OUString* pIconName, VirtualDevice* pImageSurface) { SalInstanceComboBoxWithoutEdit::insert(pos, rStr, pId, pIconName, pImageSurface); - notifyDialogState(); + sendFullUpdate(); } void JSListBox::remove(int pos) { SalInstanceComboBoxWithoutEdit::remove(pos); - notifyDialogState(); + sendFullUpdate(); } void JSListBox::set_active(int pos) { SalInstanceComboBoxWithoutEdit::set_active(pos); - notifyDialogState(); + sendFullUpdate(); } JSComboBox::JSComboBox(JSDialogSender* pSender, ::ComboBox* pComboBox, SalInstanceBuilder* pBuilder, @@ -810,25 +810,25 @@ void JSComboBox::insert(int pos, const OUString& rStr, const OUString* pId, const OUString* pIconName, VirtualDevice* pImageSurface) { SalInstanceComboBoxWithEdit::insert(pos, rStr, pId, pIconName, pImageSurface); - notifyDialogState(); + sendFullUpdate(); } void JSComboBox::remove(int pos) { SalInstanceComboBoxWithEdit::remove(pos); - notifyDialogState(); + sendFullUpdate(); } void JSComboBox::set_entry_text(const OUString& rText) { SalInstanceComboBoxWithEdit::set_entry_text(rText); - notifyDialogState(); + sendFullUpdate(); } void JSComboBox::set_active(int pos) { SalInstanceComboBoxWithEdit::set_active(pos); - notifyDialogState(); + sendFullUpdate(); } JSNotebook::JSNotebook(JSDialogSender* pSender, ::TabControl* pControl, @@ -845,7 +845,7 @@ void JSNotebook::set_current_page(int nPage) bForce = true; SalInstanceNotebook::set_current_page(nPage); - notifyDialogState(bForce); + sendFullUpdate(bForce); } void JSNotebook::set_current_page(const OString& rIdent) @@ -856,19 +856,19 @@ void JSNotebook::set_current_page(const OString& rIdent) bForce = true; SalInstanceNotebook::set_current_page(rIdent); - notifyDialogState(bForce); + sendFullUpdate(bForce); } void JSNotebook::remove_page(const OString& rIdent) { SalInstanceNotebook::remove_page(rIdent); - notifyDialogState(); + sendFullUpdate(); } void JSNotebook::insert_page(const OString& rIdent, const OUString& rLabel, int nPos) { SalInstanceNotebook::insert_page(rIdent, rLabel, nPos); - notifyDialogState(); + sendFullUpdate(); } JSSpinButton::JSSpinButton(JSDialogSender* pSender, ::FormattedField* pSpin, @@ -880,7 +880,7 @@ JSSpinButton::JSSpinButton(JSDialogSender* pSender, ::FormattedField* pSpin, void JSSpinButton::set_value(int value) { SalInstanceSpinButton::set_value(value); - notifyDialogState(true); // if input is limited we can receive the same JSON + sendFullUpdate(true); // if input is limited we can receive the same JSON } JSMessageDialog::JSMessageDialog(JSDialogSender* pSender, ::MessageDialog* pDialog, @@ -902,13 +902,13 @@ JSMessageDialog::JSMessageDialog(::MessageDialog* pDialog, SalInstanceBuilder* p void JSMessageDialog::set_primary_text(const OUString& rText) { SalInstanceMessageDialog::set_primary_text(rText); - notifyDialogState(); + sendFullUpdate(); } void JSMessageDialog::set_secondary_text(const OUString& rText) { SalInstanceMessageDialog::set_secondary_text(rText); - notifyDialogState(); + sendFullUpdate(); } JSCheckButton::JSCheckButton(JSDialogSender* pSender, ::CheckBox* pCheckBox, @@ -920,7 +920,7 @@ JSCheckButton::JSCheckButton(JSDialogSender* pSender, ::CheckBox* pCheckBox, void JSCheckButton::set_active(bool active) { SalInstanceCheckButton::set_active(active); - notifyDialogState(); + sendFullUpdate(); } JSDrawingArea::JSDrawingArea(JSDialogSender* pSender, VclDrawingArea* pDrawingArea, @@ -934,13 +934,13 @@ JSDrawingArea::JSDrawingArea(JSDialogSender* pSender, VclDrawingArea* pDrawingAr void JSDrawingArea::queue_draw() { SalInstanceDrawingArea::queue_draw(); - notifyDialogState(); + sendFullUpdate(); } void JSDrawingArea::queue_draw_area(int x, int y, int width, int height) { SalInstanceDrawingArea::queue_draw_area(x, y, width, height); - notifyDialogState(); + sendFullUpdate(); } JSToolbar::JSToolbar(JSDialogSender* pSender, ::ToolBox* pToolbox, SalInstanceBuilder* pBuilder, @@ -952,7 +952,7 @@ JSToolbar::JSToolbar(JSDialogSender* pSender, ::ToolBox* pToolbox, SalInstanceBu void JSToolbar::signal_clicked(const OString& rIdent) { SalInstanceToolbar::signal_clicked(rIdent); - notifyDialogState(); + sendFullUpdate(); } JSTextView::JSTextView(JSDialogSender* pSender, ::VclMultiLineEdit* pTextView, @@ -965,7 +965,7 @@ JSTextView::JSTextView(JSDialogSender* pSender, ::VclMultiLineEdit* pTextView, void JSTextView::set_text(const OUString& rText) { SalInstanceTextView::set_text(rText); - notifyDialogState(); + sendFullUpdate(); } JSTreeView::JSTreeView(JSDialogSender* pSender, ::SvTabListBox* pTreeView, @@ -986,7 +986,7 @@ void JSTreeView::set_toggle(int pos, TriState eState, int col) SalInstanceTreeView::set_toggle(pEntry, eState, col); signal_toggled(iter_col(SalInstanceTreeIter(pEntry), col)); - sendUpdate(m_xTreeView); + sendUpdate(); } } @@ -1032,7 +1032,9 @@ void JSTreeView::drag_end() m_xDropTarget->fire_drop(aEvent); - sendUpdate(m_xTreeView); + sendUpdate(); + if (g_DragSource) + g_DragSource->sendUpdate(); } g_DragSource = nullptr; @@ -1045,31 +1047,31 @@ void JSTreeView::insert(const weld::TreeIter* pParent, int pos, const OUString* SalInstanceTreeView::insert(pParent, pos, pStr, pId, pIconName, pImageSurface, bChildrenOnDemand, pRet); - sendUpdate(m_xTreeView); + sendUpdate(); } void JSTreeView::set_text(int row, const OUString& rText, int col) { SalInstanceTreeView::set_text(row, rText, col); - sendUpdate(m_xTreeView); + sendUpdate(); } void JSTreeView::set_text(const weld::TreeIter& rIter, const OUString& rStr, int col) { SalInstanceTreeView::set_text(rIter, rStr, col); - sendUpdate(m_xTreeView); + sendUpdate(); } void JSTreeView::expand_row(const weld::TreeIter& rIter) { SalInstanceTreeView::expand_row(rIter); - sendUpdate(m_xTreeView); + sendUpdate(); } void JSTreeView::collapse_row(const weld::TreeIter& rIter) { SalInstanceTreeView::collapse_row(rIter); - sendUpdate(m_xTreeView); + sendUpdate(); } JSExpander::JSExpander(JSDialogSender* pSender, ::VclExpander* pExpander, @@ -1081,7 +1083,7 @@ JSExpander::JSExpander(JSDialogSender* pSender, ::VclExpander* pExpander, void JSExpander::set_expanded(bool bExpand) { SalInstanceExpander::set_expanded(bExpand); - notifyDialogState(); + sendFullUpdate(); } JSIconView::JSIconView(JSDialogSender* pSender, ::IconView* pIconView, SalInstanceBuilder* pBuilder, @@ -1094,32 +1096,32 @@ void JSIconView::insert(int pos, const OUString* pStr, const OUString* pId, const OUString* pIconName, weld::TreeIter* pRet) { SalInstanceIconView::insert(pos, pStr, pId, pIconName, pRet); - notifyDialogState(); + sendFullUpdate(); } void JSIconView::insert(int pos, const OUString* pStr, const OUString* pId, const VirtualDevice* pIcon, weld::TreeIter* pRet) { SalInstanceIconView::insert(pos, pStr, pId, pIcon, pRet); - notifyDialogState(); + sendFullUpdate(); } void JSIconView::clear() { SalInstanceIconView::clear(); - notifyDialogState(); + sendFullUpdate(); } void JSIconView::select(int pos) { SalInstanceIconView::select(pos); - notifyDialogState(); + sendFullUpdate(); } void JSIconView::unselect(int pos) { SalInstanceIconView::unselect(pos); - notifyDialogState(); + sendFullUpdate(); } JSRadioButton::JSRadioButton(JSDialogSender* pSender, ::RadioButton* pRadioButton, @@ -1132,7 +1134,7 @@ JSRadioButton::JSRadioButton(JSDialogSender* pSender, ::RadioButton* pRadioButto void JSRadioButton::set_active(bool active) { SalInstanceRadioButton::set_active(active); - notifyDialogState(); + sendFullUpdate(); } /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ commit 5a1c70b6e8c706c8f0d80d48cd3365ea2f760436 Author: Szymon Kłos <[email protected]> AuthorDate: Tue Jan 19 08:39:15 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:58:43 2021 +0200 jsdialog: set entry text without back notification We don't want to disturb user while editing the text Change-Id: I8a8b9a688133d27fc2aeaee6178a773641f4a79f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109612 Tested-by: Szymon Kłos <[email protected]> Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index cefa5776c79b..b638ac01a417 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -246,7 +246,7 @@ public: virtual void set_sensitive(bool sensitive) override { BaseInstanceClass::set_sensitive(sensitive); - notifyDialogState(); + sendUpdate(BaseInstanceClass::m_xWidget); } virtual css::uno::Reference<css::datatransfer::dnd::XDropTarget> get_drop_target() override @@ -320,6 +320,7 @@ public: JSEntry(JSDialogSender* pSender, ::Edit* pEntry, SalInstanceBuilder* pBuilder, bool bTakeOwnership); virtual void set_text(const OUString& rText) override; + void set_text_without_notify(const OUString& rText); }; class JSListBox : public JSWidget<SalInstanceComboBoxWithoutEdit, ::ListBox> diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx index 53f5ec56013b..145481955d43 100644 --- a/vcl/jsdialog/executor.cxx +++ b/vcl/jsdialog/executor.cxx @@ -183,12 +183,12 @@ bool ExecuteAction(sal_uInt64 nWindowId, const OString& rWidget, StringMap& rDat } else if (sControlType == "edit") { - auto pEdit = dynamic_cast<weld::Entry*>(pWidget); + auto pEdit = dynamic_cast<JSEntry*>(pWidget); if (pEdit) { if (sAction == "change") { - pEdit->set_text(rData["data"]); + pEdit->set_text_without_notify(rData["data"]); LOKTrigger::trigger_changed(*pEdit); return true; } diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 38ef2a44e354..0c57aaf4fa44 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -750,7 +750,7 @@ JSLabel::JSLabel(JSDialogSender* pSender, FixedText* pLabel, SalInstanceBuilder* void JSLabel::set_label(const OUString& rText) { SalInstanceLabel::set_label(rText); - notifyDialogState(); + sendUpdate(m_xWidget); }; JSButton::JSButton(JSDialogSender* pSender, ::Button* pButton, SalInstanceBuilder* pBuilder, @@ -771,6 +771,8 @@ void JSEntry::set_text(const OUString& rText) notifyDialogState(); } +void JSEntry::set_text_without_notify(const OUString& rText) { SalInstanceEntry::set_text(rText); } + JSListBox::JSListBox(JSDialogSender* pSender, ::ListBox* pListBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership) : JSWidget<SalInstanceComboBoxWithoutEdit, ::ListBox>(pSender, pListBox, pBuilder, commit f30b8ead84b263b23b38bef87698b84ea6ba56fc ... etc. - the rest is truncated _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
