From 95b1491daccdc50dd5391b7e5d4d7432217269a6 Mon Sep 17 00:00:00 2001 From: Markus Mohrhard Date: Fri, 17 Jul 2015 20:51:37 +0200 Subject: add chart sidebar axis panel Change-Id: Ia0f75c09f11c5751428a19fca33b39a54cdbb249 --- chart2/Library_chartcontroller.mk | 1 + chart2/UIConfig_chart2.mk | 1 + chart2/source/controller/main/ChartController.cxx | 2 + .../controller/sidebar/Chart2PanelFactory.cxx | 3 + .../source/controller/sidebar/ChartAxisPanel.cxx | 306 +++++++++++++++++++++ .../source/controller/sidebar/ChartAxisPanel.hxx | 88 ++++++ chart2/uiconfig/ui/sidebaraxis.ui | 94 +++++++ 7 files changed, 495 insertions(+) create mode 100644 chart2/source/controller/sidebar/ChartAxisPanel.cxx create mode 100644 chart2/source/controller/sidebar/ChartAxisPanel.hxx create mode 100644 chart2/uiconfig/ui/sidebaraxis.ui (limited to 'chart2') diff --git a/chart2/Library_chartcontroller.mk b/chart2/Library_chartcontroller.mk index f2d4b281886c..d66aed070319 100644 --- a/chart2/Library_chartcontroller.mk +++ b/chart2/Library_chartcontroller.mk @@ -188,6 +188,7 @@ $(eval $(call gb_Library_add_exception_objects,chartcontroller,\ chart2/source/controller/main/UndoCommandDispatch \ chart2/source/controller/main/UndoGuard \ chart2/source/controller/sidebar/Chart2PanelFactory \ + chart2/source/controller/sidebar/ChartAxisPanel \ chart2/source/controller/sidebar/ChartElementsPanel \ chart2/source/controller/sidebar/ChartSeriesPanel \ chart2/source/controller/sidebar/ChartSidebarModifyListener \ diff --git a/chart2/UIConfig_chart2.mk b/chart2/UIConfig_chart2.mk index d2e840871aed..6a45f9d6cd45 100644 --- a/chart2/UIConfig_chart2.mk +++ b/chart2/UIConfig_chart2.mk @@ -42,6 +42,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/schart,\ chart2/uiconfig/ui/insertgriddlg \ chart2/uiconfig/ui/inserttitledlg \ chart2/uiconfig/ui/paradialog \ + chart2/uiconfig/ui/sidebaraxis \ chart2/uiconfig/ui/sidebarelements \ chart2/uiconfig/ui/sidebarseries \ chart2/uiconfig/ui/smoothlinesdlg \ diff --git a/chart2/source/controller/main/ChartController.cxx b/chart2/source/controller/main/ChartController.cxx index 056e7214ecac..9c51cf5a6bae 100644 --- a/chart2/source/controller/main/ChartController.cxx +++ b/chart2/source/controller/main/ChartController.cxx @@ -318,6 +318,8 @@ OUString ChartController::GetContextName() case OBJECTTYPE_DATA_ERRORS_Y: case OBJECTTYPE_DATA_ERRORS_Z: return OUString("ErrorBar"); + case OBJECTTYPE_AXIS: + return OUString("Axis"); default: break; } diff --git a/chart2/source/controller/sidebar/Chart2PanelFactory.cxx b/chart2/source/controller/sidebar/Chart2PanelFactory.cxx index be68e6b59927..6af84f8cdc98 100644 --- a/chart2/source/controller/sidebar/Chart2PanelFactory.cxx +++ b/chart2/source/controller/sidebar/Chart2PanelFactory.cxx @@ -32,6 +32,7 @@ #include "ChartElementsPanel.hxx" #include "ChartSeriesPanel.hxx" #include "ChartController.hxx" +#include "ChartAxisPanel.hxx" using namespace css::uno; using ::rtl::OUString; @@ -90,6 +91,8 @@ Reference SAL_CALL ChartPanelFactory::createUIElement ( pPanel = ChartElementsPanel::Create( pParentWindow, xFrame, pController ); else if (rsResourceURL.endsWith("/SeriesPanel")) pPanel = ChartSeriesPanel::Create(pParentWindow, xFrame, pController); + else if (rsResourceURL.endsWith("/AxisPanel")) + pPanel = ChartAxisPanel::Create(pParentWindow, xFrame, pController); if (pPanel) xElement = sfx2::sidebar::SidebarPanelBase::Create( diff --git a/chart2/source/controller/sidebar/ChartAxisPanel.cxx b/chart2/source/controller/sidebar/ChartAxisPanel.cxx new file mode 100644 index 000000000000..f7f82275e0d8 --- /dev/null +++ b/chart2/source/controller/sidebar/ChartAxisPanel.cxx @@ -0,0 +1,306 @@ +/* -*- 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#include +#include +#include + +#include + +#include "ChartAxisPanel.hxx" +#include "ChartController.hxx" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace css; +using namespace css::uno; +using ::sfx2::sidebar::Theme; + +namespace chart { namespace sidebar { + +namespace { + +bool isLabelShown(css::uno::Reference xModel, + const OUString& rCID) +{ + css::uno::Reference< css::beans::XPropertySet > xAxis( + ObjectIdentifier::getAxisForCID(rCID, xModel), uno::UNO_QUERY ); + + if (!xAxis.is()) + return false; + + uno::Any aAny = xAxis->getPropertyValue("DisplayLabels"); + if (!aAny.hasValue()) + return false; + + bool bVisible = false; + aAny >>= bVisible; + return bVisible; +} + +void setLabelShown(css::uno::Reference xModel, + const OUString& rCID, bool bVisible) +{ + css::uno::Reference< css::beans::XPropertySet > xAxis( + ObjectIdentifier::getAxisForCID(rCID, xModel), uno::UNO_QUERY ); + + if (!xAxis.is()) + return; + + xAxis->setPropertyValue("DisplayLabels", css::uno::makeAny(bVisible)); +} + +struct AxisLabelPosMap +{ + sal_Int32 nPos; + css::chart::ChartAxisLabelPosition ePos; +}; + +AxisLabelPosMap aLabelPosMap[] = { + { 0, css::chart::ChartAxisLabelPosition_NEAR_AXIS }, + { 1, css::chart::ChartAxisLabelPosition_NEAR_AXIS_OTHER_SIDE }, + { 2, css::chart::ChartAxisLabelPosition_OUTSIDE_START }, + { 3, css::chart::ChartAxisLabelPosition_OUTSIDE_END } +}; + +sal_Int32 getLabelPosition(css::uno::Reference xModel, + const OUString& rCID) +{ + css::uno::Reference< css::beans::XPropertySet > xAxis( + ObjectIdentifier::getAxisForCID(rCID, xModel), uno::UNO_QUERY ); + + if (!xAxis.is()) + return 0; + + uno::Any aAny = xAxis->getPropertyValue("LabelPosition"); + if (!aAny.hasValue()) + return 0; + + css::chart::ChartAxisLabelPosition ePos; + aAny >>= ePos; + for (size_t i = 0; i < SAL_N_ELEMENTS(aLabelPosMap); ++i) + { + if (aLabelPosMap[i].ePos == ePos) + return aLabelPosMap[i].nPos; + } + + return 0; +} + +void setLabelPosition(css::uno::Reference xModel, + const OUString& rCID, sal_Int32 nPos) +{ + css::uno::Reference< css::beans::XPropertySet > xAxis( + ObjectIdentifier::getAxisForCID(rCID, xModel), uno::UNO_QUERY ); + + if (!xAxis.is()) + return; + + css::chart::ChartAxisLabelPosition ePos; + for (size_t i = 0; i < SAL_N_ELEMENTS(aLabelPosMap); ++i) + { + if (aLabelPosMap[i].nPos == nPos) + ePos = aLabelPosMap[i].ePos; + } + + xAxis->setPropertyValue("LabelPosition", css::uno::makeAny(ePos)); +} + +bool isReverse(css::uno::Reference xModel, + const OUString& rCID) +{ + css::uno::Reference< css::chart2::XAxis > xAxis( + ObjectIdentifier::getAxisForCID(rCID, xModel), uno::UNO_QUERY ); + + if (!xAxis.is()) + return false; + + css::chart2::ScaleData aData = xAxis->getScaleData(); + + return aData.Orientation == css::chart2::AxisOrientation_REVERSE; +} + +void setReverse(css::uno::Reference xModel, + const OUString& rCID, bool bReverse) +{ + css::uno::Reference< css::chart2::XAxis > xAxis( + ObjectIdentifier::getAxisForCID(rCID, xModel), uno::UNO_QUERY ); + + if (!xAxis.is()) + return; + + css::chart2::ScaleData aData = xAxis->getScaleData(); + if (bReverse) + aData.Orientation = css::chart2::AxisOrientation_REVERSE; + else + aData.Orientation = css::chart2::AxisOrientation_MATHEMATICAL; + + xAxis->setScaleData(aData); +} + +OUString getCID(css::uno::Reference xModel) +{ + css::uno::Reference xController(xModel->getCurrentController()); + css::uno::Reference xSelectionSupplier(xController, css::uno::UNO_QUERY); + if (!xSelectionSupplier.is()) + return OUString(); + + uno::Any aAny = xSelectionSupplier->getSelection(); + assert(aAny.hasValue()); + OUString aCID; + aAny >>= aCID; +#ifdef DBG_UTIL + ObjectType eType = ObjectIdentifier::getObjectType(aCID); + assert(eType == OBJECTTYPE_AXIS); +#endif + + return aCID; +} + +} + +ChartAxisPanel::ChartAxisPanel( + vcl::Window* pParent, + const css::uno::Reference& rxFrame, + ChartController* pController) + : PanelLayout(pParent, "ChartAxisPanel", "modules/schart/ui/sidebaraxis.ui", rxFrame), + mxFrame(rxFrame), + mxModel(pController->getModel()), + mxListener(new ChartSidebarModifyListener(this)) +{ + get(mpCBShowLabel, "checkbutton_show_label"); + get(mpCBReverse, "checkbutton_reverse"); + + get(mpLBLabelPos, "comboboxtext_label_position"); + + Initialize(); +} + +ChartAxisPanel::~ChartAxisPanel() +{ + disposeOnce(); +} + +void ChartAxisPanel::dispose() +{ + css::uno::Reference xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); + xBroadcaster->removeModifyListener(mxListener); + + mpCBShowLabel.clear(); + mpCBReverse.clear(); + + mpLBLabelPos.clear(); + + PanelLayout::dispose(); +} + +void ChartAxisPanel::Initialize() +{ + css::uno::Reference xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); + xBroadcaster->addModifyListener(mxListener); + + updateData(); + + Link<> aLink = LINK(this, ChartAxisPanel, CheckBoxHdl); + mpCBShowLabel->SetClickHdl(aLink); + mpCBReverse->SetClickHdl(aLink); + + mpLBLabelPos->SetSelectHdl(LINK(this, ChartAxisPanel, ListBoxHdl)); +} + +void ChartAxisPanel::updateData() +{ + OUString aCID = getCID(mxModel); + SolarMutexGuard aGuard; + + mpCBShowLabel->Check(isLabelShown(mxModel, aCID)); +} + +VclPtr ChartAxisPanel::Create ( + vcl::Window* pParent, + const css::uno::Reference& rxFrame, + ChartController* pController) +{ + if (pParent == NULL) + throw lang::IllegalArgumentException("no parent Window given to ChartAxisPanel::Create", NULL, 0); + if ( ! rxFrame.is()) + throw lang::IllegalArgumentException("no XFrame given to ChartAxisPanel::Create", NULL, 1); + + return VclPtr::Create( + pParent, rxFrame, pController); +} + +void ChartAxisPanel::DataChanged( + const DataChangedEvent& ) +{ + updateData(); +} + +void ChartAxisPanel::HandleContextChange( + const ::sfx2::sidebar::EnumContext& ) +{ + updateData(); +} + +void ChartAxisPanel::NotifyItemUpdate( + sal_uInt16 /*nSID*/, + SfxItemState /*eState*/, + const SfxPoolItem* /*pState*/, + const bool ) +{ +} + +void ChartAxisPanel::modelInvalid() +{ +} + +IMPL_LINK(ChartAxisPanel, CheckBoxHdl, CheckBox*, pCheckbox) +{ + OUString aCID = getCID(mxModel); + bool bChecked = pCheckbox->IsChecked(); + + if (pCheckbox == mpCBShowLabel.get()) + setLabelShown(mxModel, aCID, bChecked); + else if (pCheckbox == mpCBReverse.get()) + setReverse(mxModel, aCID, bChecked); + + return 0; +} + +IMPL_LINK_NOARG(ChartAxisPanel, ListBoxHdl) +{ + OUString aCID = getCID(mxModel); + sal_Int32 nPos = mpLBLabelPos->GetSelectEntryPos(); + + setLabelPosition(mxModel, aCID, nPos); + + return 0; +} + +}} // end of namespace ::chart::sidebar + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/source/controller/sidebar/ChartAxisPanel.hxx b/chart2/source/controller/sidebar/ChartAxisPanel.hxx new file mode 100644 index 000000000000..8737ab4762d3 --- /dev/null +++ b/chart2/source/controller/sidebar/ChartAxisPanel.hxx @@ -0,0 +1,88 @@ +/* -*- 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/. + * + */ + +#ifndef INCLUDED_CHART2_SOURCE_CONTROLLER_SIDEBAR_CHARTAXISPANEL_HXX +#define INCLUDED_CHART2_SOURCE_CONTROLLER_SIDEBAR_CHARTAXISPANEL_HXX + +#include +#include +#include + +#include "ChartSidebarModifyListener.hxx" + +#include + +class FixedText; +class ListBox; +class NumericField; + +namespace chart { + +class ChartController; + +namespace sidebar { + +class ChartAxisPanel : public PanelLayout, + public ::sfx2::sidebar::IContextChangeReceiver, + public ::sfx2::sidebar::ControllerItem::ItemUpdateReceiverInterface, + public ChartSidebarModifyListenerParent +{ +public: + static VclPtr Create( + vcl::Window* pParent, + const css::uno::Reference& rxFrame, + ChartController* pController); + + virtual void DataChanged( + const DataChangedEvent& rEvent) SAL_OVERRIDE; + + virtual void HandleContextChange( + const ::sfx2::sidebar::EnumContext& rContext) SAL_OVERRIDE; + + virtual void NotifyItemUpdate( + const sal_uInt16 nSId, + const SfxItemState eState, + const SfxPoolItem* pState, + const bool bIsEnabled) SAL_OVERRIDE; + + // constructor/destuctor + ChartAxisPanel( + vcl::Window* pParent, + const css::uno::Reference& rxFrame, + ChartController* pController); + virtual ~ChartAxisPanel(); + virtual void dispose() SAL_OVERRIDE; + + virtual void updateData() SAL_OVERRIDE; + virtual void modelInvalid() SAL_OVERRIDE; + +private: + //ui controls + VclPtr mpCBShowLabel; + VclPtr mpCBReverse; + + VclPtr mpLBLabelPos; + + css::uno::Reference mxFrame; + + css::uno::Reference mxModel; + css::uno::Reference mxListener; + + void Initialize(); + + DECL_LINK(CheckBoxHdl, CheckBox*); + DECL_LINK(ListBoxHdl, void*); +}; + +} } // end of namespace ::chart::sidebar + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/chart2/uiconfig/ui/sidebaraxis.ui b/chart2/uiconfig/ui/sidebaraxis.ui new file mode 100644 index 000000000000..8ceb05128569 --- /dev/null +++ b/chart2/uiconfig/ui/sidebaraxis.ui @@ -0,0 +1,94 @@ + + + + + + True + False + + + True + False + + + Show Labels + True + True + False + 0 + True + + + 0 + 0 + + + + + Reverse direction + True + True + False + 0 + True + + + 0 + 3 + + + + + True + False + Label Position + + + 0 + 1 + + + + + True + False + Text orientation + + + 0 + 2 + + + + + True + False + + Near Axis + Near Axis (other side) + Outside start + Outside end + + + + 1 + 1 + + + + + + + + + + + + + + 0 + 0 + + + + -- cgit