chart2/Library_chartcontroller.mk | 1 chart2/UIConfig_chart2.mk | 1 chart2/source/controller/main/ChartController.cxx | 2 chart2/source/controller/sidebar/Chart2PanelFactory.cxx | 3 chart2/source/controller/sidebar/ChartAxisPanel.cxx | 306 ++++++++++++++++ chart2/source/controller/sidebar/ChartAxisPanel.hxx | 88 ++++ chart2/uiconfig/ui/sidebaraxis.ui | 94 ++++ 7 files changed, 495 insertions(+)
New commits: commit 95b1491daccdc50dd5391b7e5d4d7432217269a6 Author: Markus Mohrhard <markus.mohrh...@googlemail.com> Date: Fri Jul 17 20:51:37 2015 +0200 add chart sidebar axis panel Change-Id: Ia0f75c09f11c5751428a19fca33b39a54cdbb249 diff --git a/chart2/Library_chartcontroller.mk b/chart2/Library_chartcontroller.mk index f2d4b28..d66aed0 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 d2e8408..6a45f9d 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 056e721..9c51cf5 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 be68e6b..6af84f8 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 0000000..f7f8227 --- /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 0000000..8737ab4 --- /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: */ diff --git a/chart2/uiconfig/ui/sidebaraxis.ui b/chart2/uiconfig/ui/sidebaraxis.ui new file mode 100644 index 0000000..8ceb0512 --- /dev/null +++ b/chart2/uiconfig/ui/sidebaraxis.ui @@ -0,0 +1,94 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.18.3 --> +<interface> + <requires lib="gtk+" version="3.12"/> + <object class="GtkGrid" id="ChartAxisPanel"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkGrid" id="grid1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkCheckButton" id="checkbutton_show_label"> + <property name="label" translatable="yes">Show Labels</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="checkbutton_reverse"> + <property name="label" translatable="yes">Reverse direction</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="xalign">0</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">3</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Label Position</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Text orientation</property> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">2</property> + </packing> + </child> + <child> + <object class="GtkComboBoxText" id="comboboxtext_label_position"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <items> + <item translatable="yes">Near Axis</item> + <item translatable="yes">Near Axis (other side)</item> + <item translatable="yes">Outside start</item> + <item translatable="yes">Outside end</item> + </items> + </object> + <packing> + <property name="left_attach">1</property> + <property name="top_attach">1</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="left_attach">0</property> + <property name="top_attach">0</property> + </packing> + </child> + </object> +</interface> _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits