/* -*- 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 "ChartColorWrapper.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace chart::sidebar { namespace { OUString getCID(const css::uno::Reference& xModel) { css::uno::Reference xController(xModel->getCurrentController()); css::uno::Reference xSelectionSupplier(xController, css::uno::UNO_QUERY); if (!xSelectionSupplier.is()) return OUString(); css::uno::Any aAny = xSelectionSupplier->getSelection(); if (!aAny.hasValue()) return OUString(); OUString aCID; aAny >>= aCID; return aCID; } css::uno::Reference getPropSet( const rtl::Reference<::chart::ChartModel>& xModel) { OUString aCID = getCID(xModel); css::uno::Reference xPropSet = ObjectIdentifier::getObjectPropertySet(aCID, xModel); ObjectType eType = ObjectIdentifier::getObjectType(aCID); if (eType == OBJECTTYPE_DIAGRAM) { css::uno::Reference xDiagram( xPropSet, css::uno::UNO_QUERY); if (!xDiagram.is()) return xPropSet; xPropSet.set(xDiagram->getWall()); } return xPropSet; } } ChartColorWrapper::ChartColorWrapper( rtl::Reference<::chart::ChartModel> const & xModel, SvxColorToolBoxControl* pControl, const OUString& rName): mxModel(xModel), mpControl(pControl), maPropertyName(rName) { } void ChartColorWrapper::operator()([[maybe_unused]] const OUString& , const svx::NamedThemedColor& rColor) { css::uno::Reference xPropSet = getPropSet(mxModel); if (!xPropSet.is()) { SAL_WARN("chart2", "Invalid reference to xPropSet"); return; } xPropSet->setPropertyValue(maPropertyName, css::uno::Any(rColor.m_aColor)); } void ChartColorWrapper::updateModel(const rtl::Reference<::chart::ChartModel>& xModel) { mxModel = xModel; } void ChartColorWrapper::updateData() { static constexpr OUStringLiteral aLineColor = u"LineColor"; static const std::u16string_view aCommands[2] = {u".uno:XLineColor", u".uno:FillColor"}; css::uno::Reference xPropSet = getPropSet(mxModel); if (!xPropSet.is()) return; css::util::URL aUrl; aUrl.Complete = (maPropertyName == aLineColor) ? aCommands[0] : aCommands[1]; css::frame::FeatureStateEvent aEvent; aEvent.FeatureURL = aUrl; aEvent.IsEnabled = true; aEvent.State = xPropSet->getPropertyValue(maPropertyName); mpControl->statusChanged(aEvent); SfxViewShell* pViewShell = SfxViewShell::Current(); if (comphelper::LibreOfficeKit::isActive() && pViewShell && (maPropertyName == aLineColor)) { std::string sCommand = OUStringToOString(aUrl.Complete, RTL_TEXTENCODING_ASCII_US).getStr(); sal_Int32 nColor = -1; aEvent.State >>= nColor; pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED, (sCommand + "=" + std::to_string(nColor)).c_str()); } } ChartLineStyleWrapper::ChartLineStyleWrapper( rtl::Reference<::chart::ChartModel> const & xModel, SvxLineStyleToolBoxControl* pControl) : mxModel(xModel) , mpControl(pControl) { } void ChartLineStyleWrapper::updateModel(const rtl::Reference<::chart::ChartModel>& xModel) { mxModel = xModel; } namespace { css::uno::Any getLineDash( const css::uno::Reference& xModel, const OUString& rDashName) { css::uno::Reference xFact(xModel, css::uno::UNO_QUERY); css::uno::Reference xNameAccess( xFact->createInstance("com.sun.star.drawing.DashTable"), css::uno::UNO_QUERY ); if(xNameAccess.is()) { if (!xNameAccess->hasByName(rDashName)) return css::uno::Any(); return xNameAccess->getByName(rDashName); } return css::uno::Any(); } } void ChartLineStyleWrapper::updateData() { css::uno::Reference xPropSet = getPropSet(mxModel); if (!xPropSet.is()) return; css::util::URL aUrl; aUrl.Complete = ".uno:XLineStyle"; css::frame::FeatureStateEvent aEvent; aEvent.IsEnabled = true; aEvent.FeatureURL = aUrl; aEvent.State = xPropSet->getPropertyValue("LineStyle"); mpControl->statusChanged(aEvent); aUrl.Complete = ".uno:LineDash"; auto aLineDashName = xPropSet->getPropertyValue("LineDashName"); OUString aDashName; aLineDashName >>= aDashName; css::uno::Any aLineDash = getLineDash(mxModel, aDashName); XLineDashItem aDashItem; aDashItem.PutValue(aLineDash, MID_LINEDASH); aEvent.FeatureURL = aUrl; aDashItem.QueryValue(aEvent.State); mpControl->statusChanged(aEvent); } bool ChartLineStyleWrapper::operator()(std::u16string_view rCommand, const css::uno::Any& rValue) { css::uno::Reference xPropSet = getPropSet(mxModel); if (!xPropSet.is()) { SAL_WARN("chart2", "Invalid reference to xPropSet"); return false; } if (rCommand == u".uno:XLineStyle") { xPropSet->setPropertyValue("LineStyle", rValue); return true; } else if (rCommand == u".uno:LineDash") { XLineDashItem aDashItem; aDashItem.PutValue(rValue, 0); css::uno::Any aAny; aDashItem.QueryValue(aAny, MID_LINEDASH); OUString aDashName = PropertyHelper::addLineDashUniqueNameToTable(aAny, mxModel, ""); xPropSet->setPropertyValue("LineDash", aAny); xPropSet->setPropertyValue("LineDashName", css::uno::Any(aDashName)); return true; } return false; } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */