/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include #include #include #include #include #include #include #include #include #include namespace { class ImpressSdrObject : public SdrUIObject { public: ImpressSdrObject(const VclPtr& xImpressWin, OUString aName); SdrObject* get_object() override; virtual bool equals(const UIObject& rOther) const override; private: VclPtr mxWindow; OUString maName; }; sd::DrawViewShell* getViewShell(const VclPtr& xWindow) { sd::DrawViewShell* pViewShell = dynamic_cast(xWindow->GetViewShell()); assert(pViewShell); return pViewShell; } OUString getObjectName(SdrObject const* pObject) { if (pObject->GetName().isEmpty()) return "Unnamed Drawinglayer object " + OUString::number(pObject->GetOrdNum()); else return pObject->GetName(); } SdrObject* getObject(const VclPtr& xWindow, std::u16string_view rName) { SdrPage* pPage = getViewShell(xWindow)->getCurrentPage(); if (!pPage) return nullptr; for (const rtl::Reference& pObj : *pPage) if (rName == getObjectName(pObj.get())) return pObj.get(); return nullptr; } } ImpressSdrObject::ImpressSdrObject(const VclPtr& xImpressWin, OUString aName) : mxWindow(xImpressWin) , maName(std::move(aName)) { } SdrObject* ImpressSdrObject::get_object() { return getObject(mxWindow, maName); } bool ImpressSdrObject::equals(const UIObject& rOther) const { const ImpressSdrObject* pOther = dynamic_cast(&rOther); if (!pOther) return false; return mxWindow.get() == pOther->mxWindow.get(); } ImpressWindowUIObject::ImpressWindowUIObject(const VclPtr& xWindow) : WindowUIObject(xWindow) , mxWindow(xWindow) { } StringMap ImpressWindowUIObject::get_state() { StringMap aMap = WindowUIObject::get_state(); aMap[u"SelectedText"_ustr] = getViewShell(mxWindow)->GetSelectionText(false); aMap[u"CurrentSlide"_ustr] = OUString::number(getViewShell(mxWindow)->GetCurPagePos() + 1); aMap[u"Zoom"_ustr] = OUString::number(getViewShell(mxWindow)->GetZoom()); return aMap; } void ImpressWindowUIObject::execute(const OUString& rAction, const StringMap& rParameters) { if (rAction == "SET") { if (rParameters.find(u"ZOOM"_ustr) != rParameters.end()) { auto itr = rParameters.find(u"ZOOM"_ustr); OUString aVal = itr->second; sal_Int32 nVal = aVal.toInt32(); getViewShell(mxWindow)->SetZoom(nVal); } } else if (rAction == "GOTO") { if (rParameters.find(u"PAGE"_ustr) != rParameters.end()) { auto itr = rParameters.find(u"PAGE"_ustr); OUString aVal = itr->second; sal_Int32 nVal = aVal.toInt32(); getViewShell(mxWindow)->SwitchPage(nVal - 1); } } else if (rAction == "SELECT") { if (rParameters.find(u"OBJECT"_ustr) != rParameters.end()) { auto itr = rParameters.find(u"OBJECT"_ustr); OUString aName = itr->second; SdrObject* pObj = getObject(mxWindow, aName); SdrPageView* pPageView = getViewShell(mxWindow)->GetView()->GetSdrPageView(); getViewShell(mxWindow)->GetView()->MarkObj(pObj, pPageView); } } else if (rAction == "SIDEBAR") { SfxViewFrame* pViewFrm = SfxViewFrame::Current(); assert(pViewFrm && "ImpressWindowUIObject::execute: no viewframe"); pViewFrm->ShowChildWindow(SID_SIDEBAR); auto itr = rParameters.find(u"PANEL"_ustr); if (itr != rParameters.end()) { OUString aVal = itr->second; ::sfx2::sidebar::Sidebar::ShowPanel(aVal, pViewFrm->GetFrame().GetFrameInterface()); } } else if (rAction == "DESELECT") { getViewShell(mxWindow)->GetView()->UnMarkAll(); } else WindowUIObject::execute(rAction, rParameters); } std::unique_ptr ImpressWindowUIObject::get_child(const OUString& rID) { return std::unique_ptr(new ImpressSdrObject(mxWindow, rID)); } std::set ImpressWindowUIObject::get_children() const { SdrPage* pPage = getViewShell(mxWindow)->getCurrentPage(); std::set aRet; if (!pPage) return aRet; for (const rtl::Reference& pObject : *pPage) aRet.insert(getObjectName(pObject.get())); return aRet; } OUString ImpressWindowUIObject::get_name() const { return u"ImpressWindowUIObject"_ustr; } std::unique_ptr ImpressWindowUIObject::create(vcl::Window* pWindow) { sd::Window* pWin = dynamic_cast(pWindow); assert(pWin); return std::unique_ptr(new ImpressWindowUIObject(pWin)); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */