diff options
author | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2015-07-17 20:51:37 +0200 |
---|---|---|
committer | Markus Mohrhard <markus.mohrhard@googlemail.com> | 2015-07-17 21:12:50 +0200 |
commit | 95b1491daccdc50dd5391b7e5d4d7432217269a6 (patch) | |
tree | 6dd9a7ab72a1069883a2cd2a41efbb5dca0ea4c7 /chart2/source/controller | |
parent | 8f9effacd8f7817a0ad2b1d89b96682855583e48 (diff) |
add chart sidebar axis panel
Change-Id: Ia0f75c09f11c5751428a19fca33b39a54cdbb249
Diffstat (limited to 'chart2/source/controller')
4 files changed, 399 insertions, 0 deletions
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<css::ui::XUIElement> 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 <sfx2/sidebar/ResourceDefinitions.hrc> +#include <sfx2/sidebar/Theme.hxx> +#include <sfx2/sidebar/ControlFactory.hxx> + +#include <com/sun/star/chart/ChartAxisLabelPosition.hpp> + +#include "ChartAxisPanel.hxx" +#include "ChartController.hxx" +#include <sfx2/bindings.hxx> +#include <sfx2/dispatch.hxx> +#include <sfx2/imagemgr.hxx> +#include <vcl/fixed.hxx> +#include <vcl/lstbox.hxx> +#include <vcl/field.hxx> +#include <vcl/toolbox.hxx> +#include <svl/intitem.hxx> +#include <svl/stritem.hxx> +#include <comphelper/processfactory.hxx> + +using namespace css; +using namespace css::uno; +using ::sfx2::sidebar::Theme; + +namespace chart { namespace sidebar { + +namespace { + +bool isLabelShown(css::uno::Reference<css::frame::XModel> 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<css::frame::XModel> 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<css::frame::XModel> 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<css::frame::XModel> 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<css::frame::XModel> 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<css::frame::XModel> 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<css::frame::XModel> xModel) +{ + css::uno::Reference<css::frame::XController> xController(xModel->getCurrentController()); + css::uno::Reference<css::view::XSelectionSupplier> 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<css::frame::XFrame>& 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<css::util::XModifyBroadcaster> xBroadcaster(mxModel, css::uno::UNO_QUERY_THROW); + xBroadcaster->removeModifyListener(mxListener); + + mpCBShowLabel.clear(); + mpCBReverse.clear(); + + mpLBLabelPos.clear(); + + PanelLayout::dispose(); +} + +void ChartAxisPanel::Initialize() +{ + css::uno::Reference<css::util::XModifyBroadcaster> 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<vcl::Window> ChartAxisPanel::Create ( + vcl::Window* pParent, + const css::uno::Reference<css::frame::XFrame>& 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<ChartAxisPanel>::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 <sfx2/sidebar/ControllerItem.hxx> +#include <sfx2/sidebar/IContextChangeReceiver.hxx> +#include <svx/sidebar/PanelLayout.hxx> + +#include "ChartSidebarModifyListener.hxx" + +#include <com/sun/star/util/XModifyListener.hpp> + +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<vcl::Window> Create( + vcl::Window* pParent, + const css::uno::Reference<css::frame::XFrame>& 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<css::frame::XFrame>& rxFrame, + ChartController* pController); + virtual ~ChartAxisPanel(); + virtual void dispose() SAL_OVERRIDE; + + virtual void updateData() SAL_OVERRIDE; + virtual void modelInvalid() SAL_OVERRIDE; + +private: + //ui controls + VclPtr<CheckBox> mpCBShowLabel; + VclPtr<CheckBox> mpCBReverse; + + VclPtr<ListBox> mpLBLabelPos; + + css::uno::Reference<css::frame::XFrame> mxFrame; + + css::uno::Reference<css::frame::XModel> mxModel; + css::uno::Reference<css::util::XModifyListener> mxListener; + + void Initialize(); + + DECL_LINK(CheckBoxHdl, CheckBox*); + DECL_LINK(ListBoxHdl, void*); +}; + +} } // end of namespace ::chart::sidebar + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |