[Libreoffice-commits] core.git: chart2/Library_chartcontroller.mk chart2/source chart2/uiconfig chart2/UIConfig_chart2.mk

Markus Mohrhard markus.mohrhard at googlemail.com
Fri Jul 17 12:13:26 PDT 2015


 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.mohrhard at 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>


More information about the Libreoffice-commits mailing list