LibreOffice Module chart2 (master) 1
ControllerCommandDispatch.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 *
9 * This file incorporates work covered by the following license notice:
10 *
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 */
19
21#include <ChartModelHelper.hxx>
22#include <ChartModel.hxx>
23#include <DiagramHelper.hxx>
24#include <Diagram.hxx>
25#include <Axis.hxx>
26#include <AxisHelper.hxx>
27#include <TitleHelper.hxx>
28#include <LegendHelper.hxx>
29#include <ObjectIdentifier.hxx>
30#include <ChartType.hxx>
31#include <ChartTypeHelper.hxx>
32#include <ChartController.hxx>
34#include <DataSeries.hxx>
35#include <DataSeriesHelper.hxx>
36#include <StatisticsHelper.hxx>
38#include "ShapeController.hxx"
39
40#include <vcl/svapp.hxx>
41#include <sal/log.hxx>
43#include <comphelper/lok.hxx>
44#include <sfx2/viewsh.hxx>
45#include <sfx2/objsh.hxx>
46
47#include <com/sun/star/chart2/XRegressionCurve.hpp>
48#include <com/sun/star/chart2/XDataProviderAccess.hpp>
49
50// only needed until #i68864# is fixed
51#include <com/sun/star/frame/XLayoutManager.hpp>
52
53using namespace ::com::sun::star;
54
55using ::com::sun::star::uno::Reference;
56using ::com::sun::star::uno::Sequence;
57
58namespace
59{
60bool lcl_isStatusBarVisible( const Reference< frame::XController > & xController )
61{
62 bool bIsStatusBarVisible = false;
63 // Status-Bar visible, workaround: this should not be necessary. @todo:
64 // remove when Issue #i68864# is fixed
65 if( xController.is())
66 {
67 Reference< beans::XPropertySet > xPropSet( xController->getFrame(), uno::UNO_QUERY );
68 if( xPropSet.is() )
69 {
70 uno::Reference< css::frame::XLayoutManager > xLayoutManager;
71 xPropSet->getPropertyValue( "LayoutManager" ) >>= xLayoutManager;
72 if ( xLayoutManager.is() )
73 bIsStatusBarVisible = xLayoutManager->isElementVisible( "private:resource/statusbar/statusbar" );
74 }
75 }
76 return bIsStatusBarVisible;
77}
78
79} // anonymous namespace
80
81namespace chart
82{
83
84namespace impl
85{
86
88namespace {
89 bool const MOVE_SERIES_FORWARD = true;
90 bool const MOVE_SERIES_BACKWARD = false;
91}
92
105{
107
110
111 // -- State variables -------
117
118 // May the selected series be moved forward or backward (cf
119 // format>arrangement).
122
123 // trendlines
131
138
144};
145
147 bHasSelectedObject( false ),
148 bIsPositionableObject( false ),
149 bIsTextObject(false),
150 bIsDeleteableObjectSelected(false),
151 bIsFormateableObjectSelected(false),
152 bMayMoveSeriesForward( false ),
153 bMayMoveSeriesBackward( false ),
154 bMayAddMenuTrendline( false ),
155 bMayAddTrendline( false ),
156 bMayAddTrendlineEquation( false ),
157 bMayAddR2Value( false ),
158 bMayAddMeanValue( false ),
159 bMayAddXErrorBars( false ),
160 bMayAddYErrorBars( false ),
161 bMayDeleteTrendline( false ),
162 bMayDeleteTrendlineEquation( false ),
163 bMayDeleteR2Value( false ),
164 bMayDeleteMeanValue( false ),
165 bMayDeleteXErrorBars( false ),
166 bMayDeleteYErrorBars( false ),
167 bMayFormatTrendline( false ),
168 bMayFormatTrendlineEquation( false ),
169 bMayFormatMeanValue( false ),
170 bMayFormatXErrorBars( false ),
171 bMayFormatYErrorBars( false )
172{}
173
175 const Reference< frame::XController > & xController,
177{
178 Reference< view::XSelectionSupplier > xSelectionSupplier(
179 xController, uno::UNO_QUERY );
180
181 // Update ControllerState variables.
182 if( !xSelectionSupplier.is())
183 return;
184
185 uno::Any aSelObj( xSelectionSupplier->getSelection() );
186 ObjectIdentifier aSelOID( aSelObj );
187 OUString aSelObjCID( aSelOID.getObjectCID() );
188
189 bHasSelectedObject = aSelOID.isValid();
190
191 ObjectType aObjectType(ObjectIdentifier::getObjectType( aSelObjCID ));
192
193 bIsPositionableObject = (aObjectType != OBJECTTYPE_DATA_POINT) && aSelOID.isDragableObject();
194 bIsTextObject = aObjectType == OBJECTTYPE_TITLE;
195
196 rtl::Reference< Diagram > xDiagram = xModel->getFirstChartDiagram();
198 if( aObjectType==OBJECTTYPE_DIAGRAM || aObjectType==OBJECTTYPE_DIAGRAM_WALL || aObjectType==OBJECTTYPE_DIAGRAM_FLOOR )
199 bIsFormateableObjectSelected = xDiagram->isSupportingFloorAndWall();
200
201 rtl::Reference< DataSeries > xGivenDataSeries =
203 aSelObjCID, xModel );
204
206
207 bMayMoveSeriesForward = (aObjectType!=OBJECTTYPE_DATA_POINT) && xDiagram && xDiagram->isSeriesMoveable(
208 xGivenDataSeries,
209 MOVE_SERIES_FORWARD );
210
211 bMayMoveSeriesBackward = (aObjectType!=OBJECTTYPE_DATA_POINT) && xDiagram && xDiagram->isSeriesMoveable(
212 xGivenDataSeries,
213 MOVE_SERIES_BACKWARD );
214
215 bMayAddMenuTrendline = false;
216 bMayAddTrendline = false;
218 bMayAddR2Value = false;
219 bMayAddMeanValue = false;
220 bMayAddXErrorBars = false;
221 bMayAddYErrorBars = false;
222 bMayDeleteTrendline = false;
224 bMayDeleteR2Value = false;
225 bMayDeleteMeanValue = false;
226 bMayDeleteXErrorBars = false;
227 bMayDeleteYErrorBars = false;
228 bMayFormatTrendline = false;
230 bMayFormatMeanValue = false;
231 bMayFormatXErrorBars = false;
232 bMayFormatYErrorBars = false;
233 if( !bHasSelectedObject )
234 return;
235
236 if( xGivenDataSeries.is())
237 {
239 sal_Int32 nDimensionCount = xDiagram->getDimension();
241 DataSeriesHelper::getChartTypeOfSeries( xGivenDataSeries, xDiagram ));
242
243 // trend lines/mean value line
244 if( (aObjectType == OBJECTTYPE_DATA_SERIES || aObjectType == OBJECTTYPE_DATA_POINT)
245 && ChartTypeHelper::isSupportingRegressionProperties( xFirstChartType, nDimensionCount ))
246 {
247 // Trendline
248 bMayAddTrendline = true;
249
250 // Mean Value
253 }
254
255 // error bars
256 if( (aObjectType == OBJECTTYPE_DATA_SERIES || aObjectType == OBJECTTYPE_DATA_POINT)
257 && ChartTypeHelper::isSupportingStatisticProperties( xFirstChartType, nDimensionCount ))
258 {
261
264 }
265 }
266
267 if( aObjectType == OBJECTTYPE_DATA_AVERAGE_LINE )
268 bMayFormatMeanValue = true;
269
270 if( aObjectType == OBJECTTYPE_DATA_ERRORS_X)
272
273 if( aObjectType == OBJECTTYPE_DATA_ERRORS_Y )
275
276 if( aObjectType == OBJECTTYPE_DATA_CURVE )
277 {
278 bMayFormatTrendline = true;
279 bMayDeleteTrendline = true;
281 ObjectIdentifier::getObjectPropertySet( aSelObjCID, xModel ), uno::UNO_QUERY );
282
283 // Trendline Equation
287 }
288 else if( aObjectType == OBJECTTYPE_DATA_CURVE_EQUATION )
289 {
291 bool bHasR2Value = false;
292 bool bMayHaveR2 = true;
293 try
294 {
295 uno::Reference< beans::XPropertySet > xEquationProperties =
297 if( xEquationProperties.is() )
298 {
299 xEquationProperties->getPropertyValue( "ShowCorrelationCoefficient" ) >>= bHasR2Value;
300 xEquationProperties->getPropertyValue( "MayHaveCorrelationCoefficient" ) >>= bMayHaveR2;
301 }
302 }
303 catch(const uno::RuntimeException&)
304 {
305 TOOLS_WARN_EXCEPTION("chart2", "" );
306 }
307 bMayAddR2Value = !bHasR2Value && bMayHaveR2;
308 bMayDeleteR2Value = bHasR2Value;
309 }
310}
311
324{
325 ModelState();
326
328
329 bool HasAnyAxis() const;
330 bool HasAnyGrid() const;
331 bool HasAnyTitle() const;
332
337
345
351
358
363
366
367 bool bDataTable = false;
368};
369
371 bIsReadOnly(true),
372 bIsThreeD(false),
373 bHasOwnData(false),
374 bHasDataFromPivotTable(false),
375 bHasMainTitle(false),
376 bHasSubTitle(false),
377 bHasXAxisTitle(false),
378 bHasYAxisTitle(false),
379 bHasZAxisTitle(false),
380 bHasSecondaryXAxisTitle(false),
381 bHasSecondaryYAxisTitle(false),
382 bHasXAxis(false),
383 bHasYAxis(false),
384 bHasZAxis(false),
385 bHasAAxis(false),
386 bHasBAxis(false),
387 bHasMainXGrid(false),
388 bHasMainYGrid(false),
389 bHasMainZGrid(false),
390 bHasHelpXGrid(false),
391 bHasHelpYGrid(false),
392 bHasHelpZGrid(false),
393 bHasAutoScaledText(false),
394 bHasLegend(false),
395 bHasWall(false),
396 bHasFloor(false),
397 bSupportsStatistics(false),
398 bSupportsAxes(false)
399{}
400
402{
403 rtl::Reference< Diagram > xDiagram = xModel->getFirstChartDiagram();
404
405 bIsReadOnly = xModel->isReadonly();
406
407 sal_Int32 nDimensionCount = 0;
408 if (xDiagram)
409 nDimensionCount = xDiagram->getDimension();
410
411 rtl::Reference< ChartType > xFirstChartType;
412 if (xDiagram)
413 xFirstChartType = xDiagram->getChartTypeByIndex( 0 );
414 bSupportsStatistics = ChartTypeHelper::isSupportingStatisticProperties( xFirstChartType, nDimensionCount );
415 bSupportsAxes = ChartTypeHelper::isSupportingMainAxis( xFirstChartType, nDimensionCount, 0 );
416
417 bIsThreeD = (nDimensionCount == 3);
418 if (xModel.is())
419 {
420 bHasOwnData = xModel->hasInternalDataProvider();
421 bHasDataFromPivotTable = !bHasOwnData && xModel->isDataFromPivotTable();
422 }
423
431
432 bHasXAxis = bSupportsAxes && AxisHelper::getAxis( 0, true, xDiagram ).is();
433 bHasYAxis = bSupportsAxes && AxisHelper::getAxis( 1, true, xDiagram ).is();
434 bHasZAxis = bSupportsAxes && AxisHelper::getAxis( 2, true, xDiagram ).is();
435 bHasAAxis = bSupportsAxes && AxisHelper::getAxis( 0, false, xDiagram ).is();
436 bHasBAxis = bSupportsAxes && AxisHelper::getAxis( 1, false, xDiagram ).is();
437
438 bHasMainXGrid = bSupportsAxes && AxisHelper::isGridShown( 0, 0, true, xDiagram );
439 bHasMainYGrid = bSupportsAxes && AxisHelper::isGridShown( 1, 0, true, xDiagram );
440 bHasMainZGrid = bSupportsAxes && AxisHelper::isGridShown( 2, 0, true, xDiagram );
441 bHasHelpXGrid = bSupportsAxes && AxisHelper::isGridShown( 0, 0, false, xDiagram );
442 bHasHelpYGrid = bSupportsAxes && AxisHelper::isGridShown( 1, 0, false, xDiagram );
443 bHasHelpZGrid = bSupportsAxes && AxisHelper::isGridShown( 2, 0, false, xDiagram );
444
448
450 bHasWall = xDiagram && xDiagram->isSupportingFloorAndWall();
452
453 bDataTable = xDiagram.is() && xDiagram->getDataTable().is();
454}
455
457{
459}
460
462{
465}
466
468{
470}
471
472} // namespace impl
473
476 ChartController* pController, CommandDispatchContainer* pContainer ) :
478 m_xChartController( pController ),
479 m_xSelectionSupplier( Reference< view::XSelectionSupplier >( pController ) ),
480 m_xDispatch( Reference< frame::XDispatch >( pController ) ),
481 m_apModelState( new impl::ModelState() ),
482 m_apControllerState( new impl::ControllerState() ),
483 m_pDispatchContainer( pContainer )
484{
485}
486
488{
489}
490
492{
493 if( !m_xChartController.is())
494 return;
495
497 OSL_ASSERT( xModel.is());
498 if( xModel.is())
499 xModel->addModifyListener( this );
500
501 // Listen selection modifications (Arrangement feature - issue 63017).
502 if( m_xSelectionSupplier.is() )
503 m_xSelectionSupplier->addSelectionChangeListener( this );
504
505 if( m_apModelState && xModel.is())
506 m_apModelState->update( xModel );
507
508 if( m_apControllerState && xModel.is())
510
512}
513
515 const OUString & rURL,
516 const Reference< frame::XStatusListener > & xSingleListener )
517{
518 std::map< OUString, uno::Any >::const_iterator aArgIt( m_aCommandArguments.find( rURL ));
519 if( aArgIt != m_aCommandArguments.end())
520 fireStatusEventForURL( rURL, aArgIt->second, commandAvailable( rURL ), xSingleListener );
521 else
522 fireStatusEventForURL( rURL, uno::Any(), commandAvailable( rURL ), xSingleListener );
523}
524
526{
527 bool bModelStateIsValid = (m_apModelState != nullptr);
528 bool bControllerStateIsValid = (m_apControllerState != nullptr);
529 // Model and controller states exist.
530 OSL_ASSERT( bModelStateIsValid );
531 OSL_ASSERT( bControllerStateIsValid );
532
533 // read-only
534 bool bIsWritable = bModelStateIsValid && (! m_apModelState->bIsReadOnly);
535 bool bShapeContext = m_xChartController.is() && m_xChartController->isShapeContext();
536
537 bool bEnableDataTableDialog = false;
538 bool bCanCreateDataProvider = false;
539
540 if ( m_xChartController.is() )
541 {
542 Reference< beans::XPropertySet > xProps( m_xChartController->getModel(), uno::UNO_QUERY );
543 if ( xProps.is() )
544 {
545 try
546 {
547 xProps->getPropertyValue("EnableDataTableDialog") >>= bEnableDataTableDialog;
548 }
549 catch( const uno::Exception& )
550 {
551 TOOLS_WARN_EXCEPTION("chart2", "" );
552 }
553 }
554
555 rtl::Reference< ChartModel > xChartModel = m_xChartController->getChartModel();
556 OSL_ENSURE(xChartModel.is(), "Invalid XChartDocument");
557 if ( xChartModel.is() )
558 {
559 css::uno::Reference< com::sun::star::chart2::XDataProviderAccess > xCreatorDoc(xChartModel->getParent(), uno::UNO_QUERY);
560 bCanCreateDataProvider = xCreatorDoc.is();
561 }
562 }
563
564 // edit commands
565 m_aCommandAvailability[ ".uno:Cut" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bIsDeleteableObjectSelected;
566 m_aCommandAvailability[ ".uno:Copy" ] = bControllerStateIsValid && m_apControllerState->bHasSelectedObject;
567 m_aCommandAvailability[ ".uno:Paste" ] = bIsWritable;
568
569 // toolbar commands
570 m_aCommandAvailability[ ".uno:ToggleGridHorizontal" ] = bIsWritable;
571 m_aCommandArguments[ ".uno:ToggleGridHorizontal" ] <<= bModelStateIsValid && m_apModelState->bHasMainYGrid;
572 m_aCommandAvailability[ ".uno:ToggleGridVertical" ] = bIsWritable;
573 m_aCommandArguments[ ".uno:ToggleGridVertical" ] <<= bModelStateIsValid && m_apModelState->bHasMainXGrid;
574
575 m_aCommandAvailability[ ".uno:ToggleLegend" ] = bIsWritable;
576 m_aCommandArguments[ ".uno:ToggleLegend" ] <<= bModelStateIsValid && m_apModelState->bHasLegend;
577
578 m_aCommandAvailability[ ".uno:NewArrangement" ] = bIsWritable;
579 m_aCommandAvailability[ ".uno:Update" ] = bIsWritable;
580 m_aCommandAvailability[ ".uno:DefaultColors" ] = bIsWritable;
581 m_aCommandAvailability[ ".uno:BarWidth" ] = bIsWritable;
582 m_aCommandAvailability[ ".uno:NumberOfLines" ] = bIsWritable;
583 m_aCommandAvailability[ ".uno:ArrangeRow" ] =
584 bShapeContext || ( bIsWritable && bControllerStateIsValid && ( m_apControllerState->bMayMoveSeriesForward || m_apControllerState->bMayMoveSeriesBackward ) );
585
586 // insert objects
587 m_aCommandAvailability[ ".uno:InsertTitles" ] = m_aCommandAvailability[ ".uno:InsertMenuTitles" ] = bIsWritable;
588 m_aCommandAvailability[ ".uno:InsertLegend" ] = m_aCommandAvailability[ ".uno:InsertMenuLegend" ] = bIsWritable;
589 m_aCommandAvailability[ ".uno:DeleteLegend" ] = bIsWritable;
590 m_aCommandAvailability[ ".uno:InsertMenuDataLabels" ] = bIsWritable;
591 m_aCommandAvailability[ ".uno:InsertRemoveAxes" ] = m_aCommandAvailability[ ".uno:InsertMenuAxes" ] = bIsWritable && m_apModelState->bSupportsAxes;
592 m_aCommandAvailability[ ".uno:InsertMenuGrids" ] = bIsWritable && m_apModelState->bSupportsAxes;
593 m_aCommandAvailability[ ".uno:InsertMenuTrendlines" ] = bIsWritable && m_apModelState->bSupportsStatistics && bControllerStateIsValid && m_apControllerState->bMayAddMenuTrendline;
594 m_aCommandAvailability[ ".uno:InsertMenuMeanValues" ] = bIsWritable && m_apModelState->bSupportsStatistics;
595 m_aCommandAvailability[ ".uno:InsertMenuXErrorBars" ] = bIsWritable && m_apModelState->bSupportsStatistics;
596 m_aCommandAvailability[ ".uno:InsertMenuYErrorBars" ] = bIsWritable && m_apModelState->bSupportsStatistics;
597 m_aCommandAvailability[ ".uno:InsertSymbol" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bIsTextObject;
598 m_aCommandAvailability[ ".uno:InsertMenuDataTable" ] = bIsWritable;
599
600 // format objects
601 bool bFormatObjectAvailable = bIsWritable && bControllerStateIsValid && m_apControllerState->bIsFormateableObjectSelected;
602 m_aCommandAvailability[ ".uno:FormatSelection" ] = bFormatObjectAvailable;
603 m_aCommandAvailability[ ".uno:FormatAxis" ] = bFormatObjectAvailable;
604 m_aCommandAvailability[ ".uno:FormatTitle" ] = bFormatObjectAvailable;
605 m_aCommandAvailability[ ".uno:FormatDataSeries" ] = bFormatObjectAvailable;
606 m_aCommandAvailability[ ".uno:FormatDataPoint" ] = bFormatObjectAvailable;
607 m_aCommandAvailability[ ".uno:FormatDataLabels" ] = bFormatObjectAvailable;
608 m_aCommandAvailability[ ".uno:FormatDataLabel" ] = bFormatObjectAvailable;
609 m_aCommandAvailability[ ".uno:FormatXErrorBars" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayFormatXErrorBars;
610 m_aCommandAvailability[ ".uno:FormatYErrorBars" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayFormatYErrorBars;
611 m_aCommandAvailability[ ".uno:FormatMeanValue" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayFormatMeanValue;
612 m_aCommandAvailability[ ".uno:FormatTrendline" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayFormatTrendline;
613 m_aCommandAvailability[ ".uno:FormatTrendlineEquation" ] = bFormatObjectAvailable && bControllerStateIsValid && m_apControllerState->bMayFormatTrendlineEquation;
614 m_aCommandAvailability[ ".uno:FormatStockLoss" ] = bFormatObjectAvailable;
615 m_aCommandAvailability[ ".uno:FormatStockGain" ] = bFormatObjectAvailable;
616
617 m_aCommandAvailability[ ".uno:DiagramType" ] = bIsWritable;
618 m_aCommandAvailability[ ".uno:Legend" ] = bIsWritable && m_apModelState->bHasLegend;
619 m_aCommandAvailability[ ".uno:DiagramWall" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasWall;
620 m_aCommandAvailability[ ".uno:DiagramArea" ] = bIsWritable;
621
622 m_aCommandAvailability[ ".uno:TransformDialog" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bHasSelectedObject && m_apControllerState->bIsPositionableObject;
623
624 // 3d commands
625 m_aCommandAvailability[ ".uno:View3D" ] = bIsWritable && bModelStateIsValid && m_apModelState->bIsThreeD;
626 m_aCommandAvailability[ ".uno:DiagramFloor" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasFloor;
627
628 //some more format commands with different ui text
629 m_aCommandAvailability[ ".uno:FormatWall" ] = m_aCommandAvailability[ ".uno:DiagramWall" ];
630 m_aCommandAvailability[ ".uno:FormatFloor" ] = m_aCommandAvailability[ ".uno:DiagramFloor" ];
631 m_aCommandAvailability[ ".uno:FormatChartArea" ] = m_aCommandAvailability[ ".uno:DiagramArea" ];
632 m_aCommandAvailability[ ".uno:FormatLegend" ] = m_aCommandAvailability[ ".uno:Legend" ];
633
634 // depending on own data and ability to create new data provider
635 m_aCommandAvailability[".uno:DataRanges"] = bIsWritable && bModelStateIsValid && !m_apModelState->bHasDataFromPivotTable
636 && ((m_apModelState->bHasOwnData && bCanCreateDataProvider) || !m_apModelState->bHasOwnData);
637 m_aCommandAvailability[ ".uno:DiagramData" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasOwnData && bEnableDataTableDialog;
638
639 // titles
640 m_aCommandAvailability[ ".uno:MainTitle" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasMainTitle;
641 m_aCommandAvailability[ ".uno:SubTitle" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasSubTitle;
642 m_aCommandAvailability[ ".uno:XTitle" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasXAxisTitle;
643 m_aCommandAvailability[ ".uno:YTitle" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasYAxisTitle;
644 m_aCommandAvailability[ ".uno:ZTitle" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasZAxisTitle;
645 m_aCommandAvailability[ ".uno:SecondaryXTitle" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasSecondaryXAxisTitle;
646 m_aCommandAvailability[ ".uno:SecondaryYTitle" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasSecondaryYAxisTitle;
647 m_aCommandAvailability[ ".uno:AllTitles" ] = bIsWritable && bModelStateIsValid && m_apModelState->HasAnyTitle();
648
649 // text
650 m_aCommandAvailability[ ".uno:ScaleText" ] = bIsWritable && bModelStateIsValid ;
651 m_aCommandArguments[ ".uno:ScaleText" ] <<= bModelStateIsValid && m_apModelState->bHasAutoScaledText;
652
653 // axes
654 m_aCommandAvailability[ ".uno:DiagramAxisX" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasXAxis;
655 m_aCommandAvailability[ ".uno:DiagramAxisY" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasYAxis;
656 m_aCommandAvailability[ ".uno:DiagramAxisZ" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasZAxis;
657 m_aCommandAvailability[ ".uno:DiagramAxisA" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasAAxis;
658 m_aCommandAvailability[ ".uno:DiagramAxisB" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasBAxis;
659 m_aCommandAvailability[ ".uno:DiagramAxisAll" ] = bIsWritable && bModelStateIsValid && m_apModelState->HasAnyAxis();
660
661 // grids
662 // note: x and y are swapped in the commands!
663 m_aCommandAvailability[ ".uno:DiagramGridYMain" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasMainXGrid;
664 m_aCommandAvailability[ ".uno:DiagramGridXMain" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasMainYGrid;
665 m_aCommandAvailability[ ".uno:DiagramGridZMain" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasMainZGrid;
666 m_aCommandAvailability[ ".uno:DiagramGridYHelp" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasHelpXGrid;
667 m_aCommandAvailability[ ".uno:DiagramGridXHelp" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasHelpYGrid;
668 m_aCommandAvailability[ ".uno:DiagramGridZHelp" ] = bIsWritable && bModelStateIsValid && m_apModelState->bHasHelpZGrid;
669 m_aCommandAvailability[ ".uno:DiagramGridAll" ] = bIsWritable && bModelStateIsValid && m_apModelState->HasAnyGrid();
670
671 // series arrangement
672 m_aCommandAvailability[ ".uno:Forward" ] = ( bShapeContext ? isShapeControllerCommandAvailable( ".uno:Forward" ) :
673 ( bIsWritable && bControllerStateIsValid && m_apControllerState->bMayMoveSeriesForward && bEnableDataTableDialog ) );
674 m_aCommandAvailability[ ".uno:Backward" ] = ( bShapeContext ? isShapeControllerCommandAvailable( ".uno:Backward" ) :
675 ( bIsWritable && bControllerStateIsValid && m_apControllerState->bMayMoveSeriesBackward && bEnableDataTableDialog ) );
676
677 m_aCommandAvailability[ ".uno:InsertDataLabels" ] = bIsWritable;
678 m_aCommandAvailability[ ".uno:InsertDataLabel" ] = bIsWritable;
679 m_aCommandAvailability[ ".uno:InsertMeanValue" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayAddMeanValue;
680 m_aCommandAvailability[ ".uno:InsertTrendline" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayAddTrendline;
681 const bool bInsertTrendlineEquation = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayAddTrendlineEquation;
682 m_aCommandAvailability[ ".uno:InsertTrendlineEquation" ] = bInsertTrendlineEquation;
683 m_aCommandAvailability[ ".uno:InsertTrendlineEquationAndR2" ] = bInsertTrendlineEquation && m_apControllerState->bMayAddR2Value;
684 m_aCommandAvailability[ ".uno:InsertR2Value" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayAddR2Value
685 && !m_apControllerState->bMayAddTrendlineEquation;
686 m_aCommandAvailability[ ".uno:DeleteR2Value" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayDeleteR2Value;
687
688 m_aCommandAvailability[ ".uno:InsertXErrorBars" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayAddXErrorBars;
689 m_aCommandAvailability[ ".uno:InsertYErrorBars" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayAddYErrorBars;
690
691 m_aCommandAvailability[ ".uno:DeleteDataLabels" ] = bIsWritable;
692 m_aCommandAvailability[ ".uno:DeleteDataLabel" ] = bIsWritable;
693 m_aCommandAvailability[ ".uno:DeleteTrendline" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayDeleteTrendline;
694 m_aCommandAvailability[ ".uno:DeleteTrendlineEquation" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayDeleteTrendlineEquation;
695 m_aCommandAvailability[ ".uno:DeleteMeanValue" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayDeleteMeanValue;
696 m_aCommandAvailability[ ".uno:DeleteXErrorBars" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayDeleteXErrorBars;
697 m_aCommandAvailability[ ".uno:DeleteYErrorBars" ] = bIsWritable && bControllerStateIsValid && m_apControllerState->bMayDeleteYErrorBars;
698
699 m_aCommandAvailability[ ".uno:ResetDataPoint" ] = bIsWritable;
700 m_aCommandAvailability[ ".uno:ResetAllDataPoints" ] = bIsWritable;
701
702 m_aCommandAvailability[ ".uno:InsertAxis" ] = bIsWritable;
703 m_aCommandAvailability[ ".uno:DeleteAxis" ] = bIsWritable;
704 m_aCommandAvailability[ ".uno:InsertAxisTitle" ] = bIsWritable;
705 m_aCommandAvailability[ ".uno:FormatMajorGrid" ] = bIsWritable;
706 m_aCommandAvailability[ ".uno:InsertMajorGrid" ] = bIsWritable;
707 m_aCommandAvailability[ ".uno:DeleteMajorGrid" ] = bIsWritable;
708 m_aCommandAvailability[ ".uno:FormatMinorGrid" ] = bIsWritable;
709 m_aCommandAvailability[ ".uno:InsertMinorGrid" ] = bIsWritable;
710 m_aCommandAvailability[ ".uno:DeleteMinorGrid" ] = bIsWritable;
711
712 // data table
713 m_aCommandAvailability[ ".uno:InsertDataTable" ] = bIsWritable && bModelStateIsValid && !m_apModelState->bDataTable;
714 m_aCommandAvailability[ ".uno:DeleteDataTable" ] = bIsWritable && bModelStateIsValid && m_apModelState->bDataTable;
715}
716
717bool ControllerCommandDispatch::commandAvailable( const OUString & rCommand )
718{
719 std::map< OUString, bool >::const_iterator aIt( m_aCommandAvailability.find( rCommand ));
720 if( aIt != m_aCommandAvailability.end())
721 return aIt->second;
722 SAL_WARN("chart2", "commandAvailable: command not in availability map:" << rCommand);
723 return false;
724}
725
727{
728 ShapeController* pShapeController(nullptr);
729 {
732 pShapeController = m_pDispatchContainer->getShapeController();
733 }
734 if ( pShapeController )
735 {
736 FeatureState aState( pShapeController->getState( rCommand ) );
737 return aState.bEnabled;
738 }
739 return false;
740}
741
743 const OUString & rURL,
744 const Reference< frame::XStatusListener > & xSingleListener /* = 0 */ )
745{
746 bool bIsChartSelectorURL = rURL == ".uno:ChartElementSelector";
747 if( rURL.isEmpty() || bIsChartSelectorURL )
748 {
749 uno::Any aArg;
750 aArg <<= Reference< frame::XController >(m_xChartController);
751 fireStatusEventForURL( ".uno:ChartElementSelector", aArg, true, xSingleListener );
752 }
753
754 if( rURL.isEmpty() )
755 {
756 for (auto const& elem : m_aCommandAvailability)
757 fireStatusEventForURLImpl( elem.first, xSingleListener );
758 }
759 else if( !bIsChartSelectorURL )
760 fireStatusEventForURLImpl( rURL, xSingleListener );
761
762 // statusbar. Should be handled by base implementation
763 // @todo: remove if Issue 68864 is fixed
764 if( rURL.isEmpty() || rURL == ".uno:StatusBarVisible" )
765 {
766 bool bIsStatusBarVisible( lcl_isStatusBarVisible( m_xChartController ));
767 fireStatusEventForURL( ".uno:StatusBarVisible", uno::Any( bIsStatusBarVisible ), true, xSingleListener );
768 }
769}
770
771// ____ XDispatch ____
773 const util::URL& URL,
774 const Sequence< beans::PropertyValue >& Arguments )
775{
776 if( commandAvailable( URL.Complete ))
777 m_xDispatch->dispatch( URL, Arguments );
778}
779
780// ____ WeakComponentImplHelperBase ____
782void ControllerCommandDispatch::disposing(std::unique_lock<std::mutex>& /*rGuard*/)
783{
784 m_xChartController.clear();
785 m_xDispatch.clear();
786 m_xSelectionSupplier.clear();
787}
788
789// ____ XEventListener (base of XModifyListener) ____
790void SAL_CALL ControllerCommandDispatch::disposing( const lang::EventObject& /* Source */ )
791{
792 m_xChartController.clear();
793 m_xDispatch.clear();
794 m_xSelectionSupplier.clear();
795}
796
797// ____ XModifyListener ____
798void SAL_CALL ControllerCommandDispatch::modified( const lang::EventObject& aEvent )
799{
800 bool bUpdateCommandAvailability = false;
801
802 // Update the "ModelState" Struct.
804 {
805 m_apModelState->update( m_xChartController->getChartModel());
806 bUpdateCommandAvailability = true;
807 }
808
809 // Update the "ControllerState" Struct.
811 {
813 bUpdateCommandAvailability = true;
814 }
815
816 if( bUpdateCommandAvailability )
818
820 {
821 if (SfxViewShell* pViewShell = SfxViewShell::Current())
822 if (SfxObjectShell* pObjSh = pViewShell->GetObjectShell())
823 pObjSh->SetModified();
824 }
825
827}
828
829// ____ XSelectionChangeListener ____
830void SAL_CALL ControllerCommandDispatch::selectionChanged( const lang::EventObject& aEvent )
831{
832 // Update the "ControllerState" Struct.
834 {
837 }
838
840}
841
842} // namespace chart
843
844/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
css::uno::Reference< css::frame::XDispatch > m_xDispatch
AnyEventRef aEvent
static SAL_WARN_UNUSED_RESULT SfxViewShell * Current()
static rtl::Reference< ::chart::Axis > getAxis(sal_Int32 nDimensionIndex, bool bMainAxis, const rtl::Reference< ::chart::Diagram > &xDiagram)
static bool isGridShown(sal_Int32 nDimensionIndex, sal_Int32 nCooSysIndex, bool bMainGrid, const rtl::Reference< ::chart::Diagram > &xDiagram)
Definition: AxisHelper.cxx:525
static bool isObjectDeleteable(const css::uno::Any &rSelection)
static bool isSupportingRegressionProperties(const rtl::Reference< ::chart::ChartType > &xChartType, sal_Int32 nDimensionCount)
static bool isSupportingMainAxis(const rtl::Reference< ::chart::ChartType > &xChartType, sal_Int32 nDimensionCount, sal_Int32 nDimensionIndex)
static bool isSupportingStatisticProperties(const rtl::Reference< ::chart::ChartType > &xChartType, sal_Int32 nDimensionCount)
virtual void SAL_CALL modified(const css::lang::EventObject &aEvent) override
bool commandAvailable(const OUString &rCommand)
bool isShapeControllerCommandAvailable(const OUString &rCommand)
virtual void SAL_CALL modified(const css::lang::EventObject &aEvent) override
virtual void fireStatusEvent(const OUString &rURL, const css::uno::Reference< css::frame::XStatusListener > &xSingleListener) override
virtual void SAL_CALL selectionChanged(const css::lang::EventObject &aEvent) override
ControllerCommandDispatch(const css::uno::Reference< css::uno::XComponentContext > &xContext, ChartController *pController, CommandDispatchContainer *pContainer)
std::map< OUString, bool > m_aCommandAvailability
CommandDispatchContainer * m_pDispatchContainer
std::unique_ptr< impl::ControllerState > m_apControllerState
css::uno::Reference< css::view::XSelectionSupplier > m_xSelectionSupplier
std::unique_ptr< impl::ModelState > m_apModelState
rtl::Reference< ChartController > m_xChartController
virtual void SAL_CALL dispatch(const css::util::URL &URL, const css::uno::Sequence< css::beans::PropertyValue > &Arguments) override
css::uno::Reference< css::frame::XDispatch > m_xDispatch
virtual void disposing(std::unique_lock< std::mutex > &rGuard) override
is called when this is disposed
void fireStatusEventForURLImpl(const OUString &rURL, const css::uno::Reference< css::frame::XStatusListener > &xSingleListener)
std::map< OUString, css::uno::Any > m_aCommandArguments
static bool hasLegend(const rtl::Reference< ::chart::Diagram > &xDiagram)
returns <FALSE>, if either there is no legend at the diagram, or there is a legend which has a "Show"...
static bool isDragableObject(std::u16string_view rClassifiedIdentifier)
static rtl::Reference< ::chart::DataSeries > getDataSeriesForCID(std::u16string_view rObjectCID, const rtl::Reference<::chart::ChartModel > &xChartModel)
const OUString & getObjectCID() const
static css::uno::Reference< css::beans::XPropertySet > getObjectPropertySet(std::u16string_view rObjectCID, const rtl::Reference< ::chart::ChartModel > &xChartDocument)
ObjectType getObjectType() const
static AutoResizeState getAutoResizeState(const rtl::Reference<::chart::ChartModel > &xChartDoc)
Retrieves the state auto-resize from all objects that support this feature.
This is a CommandDispatch implementation for shapes.
virtual FeatureState getState(const OUString &rCommand) override
static rtl::Reference< ::chart::Title > getTitle(eTitleType nTitleIndex, ChartModel &rModel)
#define TOOLS_WARN_EXCEPTION(area, stream)
#define SAL_WARN(area, stream)
OOO_DLLPUBLIC_CHARTTOOLS rtl::Reference< ::chart::ChartType > getChartTypeOfSeries(const rtl::Reference< ::chart::DataSeries > &xSeries, const rtl::Reference< ::chart::Diagram > &xDiagram)
OOO_DLLPUBLIC_CHARTTOOLS bool MayHaveCorrelationCoefficient(const css::uno::Reference< css::chart2::XRegressionCurve > &xCurve)
OOO_DLLPUBLIC_CHARTTOOLS bool hasMeanValueLine(const css::uno::Reference< css::chart2::XRegressionCurveContainer > &xRegCnt)
OOO_DLLPUBLIC_CHARTTOOLS bool hasEquation(const css::uno::Reference< css::chart2::XRegressionCurve > &xCurve)
OOO_DLLPUBLIC_CHARTTOOLS bool hasErrorBars(const rtl::Reference< ::chart::DataSeries > &xDataSeries, bool bYError=true)
::cppu::ImplInheritanceHelper< CommandDispatch, css::view::XSelectionChangeListener > ControllerCommandDispatch_Base
@ OBJECTTYPE_DATA_SERIES
@ OBJECTTYPE_DIAGRAM
@ OBJECTTYPE_DATA_ERRORS_X
@ OBJECTTYPE_DIAGRAM_FLOOR
@ OBJECTTYPE_DATA_POINT
@ OBJECTTYPE_DATA_ERRORS_Y
@ OBJECTTYPE_DATA_CURVE_EQUATION
@ OBJECTTYPE_DATA_AVERAGE_LINE
@ OBJECTTYPE_DATA_CURVE
@ OBJECTTYPE_DIAGRAM_WALL
Represents the current state of the controller (needed for issue 63017).
void update(const Reference< frame::XController > &xController, const rtl::Reference<::chart::ChartModel > &xModel)
Represents the current state of the model.
void update(const rtl::Reference<::chart::ChartModel > &xModel)
Reference< XController > xController
Reference< XModel > xModel