forked from amazingfate/loongoffice
2009-09-07 17:26:44 +0200 iha r275906 : CWS-TOOLING: rebase CWS chartuseability01 to trunk@275801 (milestone: DEV300:m57) 2009-08-27 13:48:16 +0200 iha r275481 : #7049# listbox to select chart elements 2009-08-27 11:54:53 +0200 iha r275464 : #i58163# #i69422# #i102820# enhance chart context menu 2009-08-26 16:49:58 +0200 iha r275435 : #i102820# added missing case 'floor' 2009-08-26 15:33:51 +0200 iha r275427 : #i102820# make 'insert legend' work properly 2009-08-25 16:35:00 +0200 ufi r275369 : i104087 2009-08-25 15:12:17 +0200 iha r275360 : #i104087# 'Object Properties' -> 'Format Selection' 2009-08-25 15:11:31 +0200 iha r275359 : #i104087# 'Object Properties' -> 'Format Selection' 2009-08-25 15:11:15 +0200 iha r275358 : #i104087# 'Object Properties' -> 'Format Selection' 2009-08-25 11:57:43 +0200 iha r275344 : #i104087# changed behavior of insert menu 2009-08-18 12:53:54 +0200 oc r275093 : #i104082,104086,104089# multiple changes because of changed chartUI 2009-08-10 16:46:17 +0200 ufi r274824 : i104083 i104087 i104090 2009-08-07 14:04:34 +0200 iha r274763 : #7049# listbox to select chart elements 2009-08-07 13:06:05 +0200 iha r274760 : #7049# listbox to select chart elements 2009-08-07 13:05:06 +0200 iha r274759 : #7049# listbox to select chart elements 2009-08-07 12:32:31 +0200 iha r274756 : #i58163# #i69422# #i102820# enhance chart context menu 2009-08-07 12:31:54 +0200 iha r274755 : #i58163# #i69422# #i102820# enhance chart context menu 2009-08-06 19:00:48 +0200 iha r274742 : #i103593# make insert menu behavior selection dependent 2009-08-06 19:00:14 +0200 iha r274741 : #i103593# make insert menu behavior selection dependent 2009-08-06 15:34:01 +0200 iha r274731 : #i58163# #i69422# #i102820# enhance chart context menu 2009-08-06 14:39:20 +0200 iha r274728 : #i86146# ease adding R-squared value with an equation 2009-08-06 14:37:02 +0200 iha r274727 : #i86146# ease adding R-squared value with an equation 2009-08-06 13:37:54 +0200 iha r274724 : #i86146# ease adding R-squared value with an equation 2009-08-06 13:37:15 +0200 iha r274723 : #i86146# ease adding R-squared value with an equation 2009-08-06 13:04:27 +0200 iha r274722 : #i103593# make insert menu behavior selection dependent 2009-08-06 13:03:35 +0200 iha r274721 : #i103593# make insert menu behavior selection dependent 2009-08-05 18:26:31 +0200 iha r274693 : #i104033# inconsistent wording 'error indicator' <-> 'error bar' 2009-08-05 16:51:45 +0200 iha r274688 : #i104028# rename font tabpage 'Characters'->'Font' 2009-08-05 16:30:21 +0200 iha r274685 : #i58163# #i69422# #i102820# enhance chart context menu 2009-08-05 15:34:11 +0200 iha r274680 : #i58163# #i69422# #i102820# enhance chart context menu 2009-08-05 15:32:43 +0200 iha r274679 : #i58163# #i69422# #i102820# enhance chart context menu 2009-08-05 15:31:26 +0200 iha r274678 : #i58163# #i69422# #i102820# enhance chart context menu 2009-08-05 15:17:51 +0200 iha r274676 : #i58163# #i69422# #i102820# enhance chart context menu 2009-08-05 15:16:22 +0200 iha r274675 : #i58163# #i69422# #i102820# enhance chart context menu 2009-08-05 14:58:59 +0200 iha r274674 : #7049# listbox to select chart elements 2009-08-05 14:33:54 +0200 iha r274669 : #7049# listbox to select chart elements 2009-08-05 14:22:17 +0200 iha r274665 : #7049# listbox to select chart elements 2009-08-05 13:21:05 +0200 iha r274656 : #i102820# offer insertion of several elements in context menu also if nothing is selected 2009-08-05 11:56:06 +0200 iha r274647 : #7049# listbox to select chart elements 2009-08-05 11:43:40 +0200 iha r274645 : #7049# listbox to select chart elements 2009-07-24 19:46:50 +0200 iha r274318 : #i58163# #i69422# #i102820# enhance chart context menu 2009-07-24 16:23:13 +0200 iha r274313 : #i58163# #i69422# #i102820# enhance chart context menu 2009-07-24 16:13:22 +0200 iha r274311 : #i58163# #i69422# #i102820# enhance chart context menu
786 lines
31 KiB
C++
786 lines
31 KiB
C++
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* $RCSfile: ChartController_Tools.cxx,v $
|
|
* $Revision: 1.9.36.1 $
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
* only, as published by the Free Software Foundation.
|
|
*
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License version 3 for more details
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
* <http://www.openoffice.org/license.html>
|
|
* for a copy of the LGPLv3 License.
|
|
*
|
|
************************************************************************/
|
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
#include "precompiled_chart2.hxx"
|
|
|
|
#include "ChartController.hxx"
|
|
#include "ChartWindow.hxx"
|
|
#include "ChartModelHelper.hxx"
|
|
#include "TitleHelper.hxx"
|
|
#include "ThreeDHelper.hxx"
|
|
#include "DataSeriesHelper.hxx"
|
|
#include "UndoGuard.hxx"
|
|
#include "ControllerLockGuard.hxx"
|
|
#include "macros.hxx"
|
|
#include "ResId.hxx"
|
|
#include "Strings.hrc"
|
|
#include "ObjectIdentifier.hxx"
|
|
#include "ReferenceSizeProvider.hxx"
|
|
#include "chartview/ExplicitValueProvider.hxx"
|
|
#include "chartview/DrawModelWrapper.hxx"
|
|
#include "ChartTransferable.hxx"
|
|
#include "DrawViewWrapper.hxx"
|
|
#include "LegendHelper.hxx"
|
|
#include "AxisHelper.hxx"
|
|
#include "RegressionCurveHelper.hxx"
|
|
|
|
#include <com/sun/star/chart2/DataPointLabel.hpp>
|
|
#include <com/sun/star/beans/XPropertyState.hpp>
|
|
#include <com/sun/star/drawing/CameraGeometry.hpp>
|
|
#include <com/sun/star/graphic/XGraphic.hpp>
|
|
#include <com/sun/star/io/XInputStream.hpp>
|
|
#include <com/sun/star/text/XTextRange.hpp>
|
|
#include <com/sun/star/drawing/TextVerticalAdjust.hpp>
|
|
#include <com/sun/star/drawing/TextHorizontalAdjust.hpp>
|
|
#include <com/sun/star/chart/ErrorBarStyle.hpp>
|
|
|
|
// #include <com/sun/star/drawing/XDrawPageSupplier.hpp>
|
|
|
|
#include <svx/ActionDescriptionProvider.hxx>
|
|
// for TransferableDataHelper/TransferableHelper
|
|
#include <svtools/transfer.hxx>
|
|
// for SotStorageStreamRef
|
|
#include <sot/storage.hxx>
|
|
// for Graphic
|
|
#include <vcl/graph.hxx>
|
|
// for SvxDrawingLayerImport/SvxUnoDrawingModel
|
|
#include <svx/unomodel.hxx>
|
|
// for SdrModel
|
|
#include <svx/svdmodel.hxx>
|
|
// for OInputStreamWrapper
|
|
#include <unotools/streamwrap.hxx>
|
|
// for SolarMutex
|
|
#include <vcl/svapp.hxx>
|
|
#include <vos/mutex.hxx>
|
|
// for OutlinerView
|
|
#include <svx/outliner.hxx>
|
|
|
|
using namespace ::com::sun::star;
|
|
|
|
using ::com::sun::star::uno::Reference;
|
|
using ::com::sun::star::uno::Sequence;
|
|
using ::rtl::OUString;
|
|
|
|
namespace
|
|
{
|
|
|
|
bool lcl_deleteDataSeries(
|
|
const OUString & rCID,
|
|
const Reference< frame::XModel > & xModel,
|
|
const Reference< chart2::XUndoManager > & xUndoManager )
|
|
{
|
|
bool bResult = false;
|
|
uno::Reference< chart2::XDataSeries > xSeries( ::chart::ObjectIdentifier::getDataSeriesForCID( rCID, xModel ));
|
|
uno::Reference< chart2::XChartDocument > xChartDoc( xModel, uno::UNO_QUERY );
|
|
if( xSeries.is() && xChartDoc.is())
|
|
{
|
|
uno::Reference< chart2::XChartType > xChartType(
|
|
::chart::DataSeriesHelper::getChartTypeOfSeries( xSeries, xChartDoc->getFirstDiagram()));
|
|
if( xChartType.is())
|
|
{
|
|
::chart::UndoGuard aUndoGuard(
|
|
ActionDescriptionProvider::createDescription(
|
|
ActionDescriptionProvider::DELETE, ::rtl::OUString( String( ::chart::SchResId( STR_OBJECT_DATASERIES )))),
|
|
xUndoManager, xModel );
|
|
::chart::DataSeriesHelper::deleteSeries( xSeries, xChartType );
|
|
bResult = true;
|
|
aUndoGuard.commitAction();
|
|
}
|
|
}
|
|
return bResult;
|
|
}
|
|
|
|
bool lcl_deleteDataCurve(
|
|
const OUString & rCID,
|
|
const Reference< frame::XModel > & xModel,
|
|
const Reference< chart2::XUndoManager > & xUndoManager )
|
|
{
|
|
bool bResult = false;
|
|
uno::Reference< chart2::XRegressionCurveContainer > xRegCurveCnt(
|
|
::chart::ObjectIdentifier::getObjectPropertySet(
|
|
::chart::ObjectIdentifier::getSeriesParticleFromCID( rCID ), xModel ), uno::UNO_QUERY );
|
|
if( xRegCurveCnt.is())
|
|
{
|
|
::chart::UndoGuard aUndoGuard(
|
|
ActionDescriptionProvider::createDescription(
|
|
ActionDescriptionProvider::DELETE, ::rtl::OUString( String( ::chart::SchResId( STR_OBJECT_CURVE )))),
|
|
xUndoManager, xModel );
|
|
::chart::RegressionCurveHelper::removeAllExceptMeanValueLine( xRegCurveCnt );
|
|
bResult = true;
|
|
aUndoGuard.commitAction();
|
|
}
|
|
return bResult;
|
|
}
|
|
|
|
// void lcl_CopyPageContentToPage(
|
|
// const Reference< drawing::XDrawPage > & xSourcePage,
|
|
// const Reference< drawing::XDrawPage > & xDestPage )
|
|
// {
|
|
// try
|
|
// {
|
|
// Reference< container::XIndexAccess > xSourceIA( xSourcePage, uno::UNO_QUERY_THROW );
|
|
// sal_Int32 nCount( xSourceIA->getCount());
|
|
// for( sal_Int32 i=0; i<nCount; ++i )
|
|
// {
|
|
// Reference< drawing::XShape > xShape;
|
|
// if( xSourceIA->getByIndex( i ) >>= xShape )
|
|
// xDestPage->add( xShape );
|
|
// }
|
|
// }
|
|
// catch( const uno::Exception & ex )
|
|
// {
|
|
// ASSERT_EXCEPTION( ex );
|
|
// }
|
|
// }
|
|
|
|
// // copies all shapes on all pages of xSource to the only page of xDestination
|
|
// void lcl_CopyShapesToChart(
|
|
// const Reference< frame::XModel > & xSource, const Reference< frame::XModel > & xDestination )
|
|
// {
|
|
// try
|
|
// {
|
|
// Reference< drawing::XDrawPageSupplier > xDestPGSupp( xDestination, uno::UNO_QUERY_THROW );
|
|
// Reference< drawing::XDrawPage > xDestPage( xDestPGSupp->getDrawPage());
|
|
// Reference< drawing::XDrawPagesSupplier > xSourcePGsSupp( xSource, uno::UNO_QUERY_THROW );
|
|
// Reference< drawing::XDrawPages > xSourcePages( xSourcePGsSupp->getDrawPages());
|
|
|
|
// sal_Int32 nCount( xSourcePages->getCount());
|
|
// for( sal_Int32 i=0; i<nCount; ++i )
|
|
// {
|
|
// Reference< drawing::XDrawPage > xSourcePage( xSourcePages->getByIndex( i ), uno::UNO_QUERY_THROW );
|
|
// lcl_CopyPageContentToPage( xSourcePage, xDestPage );
|
|
// }
|
|
// }
|
|
// catch( const uno::Exception & ex )
|
|
// {
|
|
// ASSERT_EXCEPTION( ex );
|
|
// }
|
|
// }
|
|
|
|
} // anonymous namespace
|
|
|
|
namespace
|
|
{
|
|
void lcl_InsertStringAsTextShapeIntoDrawPage(
|
|
const Reference< lang::XMultiServiceFactory > & xShapeFactory,
|
|
const Reference< drawing::XDrawPage > & xDrawPage,
|
|
OUString & rString,
|
|
const awt::Point & aPosition )
|
|
{
|
|
OSL_ASSERT( xShapeFactory.is() && xDrawPage.is());
|
|
if( ! (xShapeFactory.is() && xDrawPage.is()))
|
|
return;
|
|
|
|
try
|
|
{
|
|
Reference< drawing::XShape > xTextShape(
|
|
xShapeFactory->createInstance( C2U("com.sun.star.drawing.TextShape")), uno::UNO_QUERY_THROW );
|
|
xDrawPage->add( xTextShape );
|
|
|
|
Reference< text::XTextRange > xRange( xTextShape, uno::UNO_QUERY_THROW );
|
|
xRange->setString( rString );
|
|
|
|
float fCharHeight = 10.0;
|
|
Reference< beans::XPropertySet > xProperties( xTextShape, uno::UNO_QUERY_THROW );
|
|
xProperties->setPropertyValue( C2U("TextAutoGrowHeight"), uno::makeAny( true ));
|
|
xProperties->setPropertyValue( C2U("TextAutoGrowWidth"), uno::makeAny( true ));
|
|
xProperties->setPropertyValue( C2U("CharHeight"), uno::makeAny( fCharHeight ));
|
|
xProperties->setPropertyValue( C2U("CharHeightAsian"), uno::makeAny( fCharHeight ));
|
|
xProperties->setPropertyValue( C2U("CharHeightComplex"), uno::makeAny( fCharHeight ));
|
|
xProperties->setPropertyValue( C2U("TextVerticalAdjust"), uno::makeAny( drawing::TextVerticalAdjust_CENTER ));
|
|
xProperties->setPropertyValue( C2U("TextHorizontalAdjust"), uno::makeAny( drawing::TextHorizontalAdjust_CENTER ));
|
|
xProperties->setPropertyValue( C2U("CharFontName"), uno::makeAny( C2U( "Albany" )));
|
|
|
|
awt::Point aAdaptedPos( aPosition );
|
|
aAdaptedPos.Y -= (xTextShape->getSize().Height / 2);
|
|
aAdaptedPos.X -= (xTextShape->getSize().Width / 2);
|
|
xTextShape->setPosition( aAdaptedPos );
|
|
}
|
|
catch( const uno::Exception & ex )
|
|
{
|
|
ASSERT_EXCEPTION( ex );
|
|
}
|
|
}
|
|
|
|
} // anonymous namespace
|
|
|
|
namespace chart
|
|
{
|
|
|
|
::std::auto_ptr< ReferenceSizeProvider > ChartController::impl_createReferenceSizeProvider() const
|
|
{
|
|
awt::Size aPageSize( ChartModelHelper::getPageSize( m_aModel->getModel()) );
|
|
|
|
return ::std::auto_ptr< ReferenceSizeProvider >(
|
|
new ReferenceSizeProvider( aPageSize,
|
|
Reference< chart2::XChartDocument >( m_aModel->getModel(), uno::UNO_QUERY )));
|
|
}
|
|
|
|
void ChartController::impl_adaptDataSeriesAutoResize()
|
|
{
|
|
::std::auto_ptr< ReferenceSizeProvider > apRefSizeProvider(
|
|
impl_createReferenceSizeProvider());
|
|
if( apRefSizeProvider.get())
|
|
apRefSizeProvider->setValuesAtAllDataSeries();
|
|
}
|
|
|
|
void ChartController::executeDispatch_NewArrangement()
|
|
{
|
|
// remove manual positions at titles, legend and the diagram, remove manual
|
|
// size at the diagram
|
|
|
|
try
|
|
{
|
|
Reference< frame::XModel > xModel( m_aModel->getModel());
|
|
Reference< chart2::XDiagram > xDiagram( ChartModelHelper::findDiagram( xModel ));
|
|
if( xDiagram.is())
|
|
{
|
|
// using assignment for broken gcc 3.3
|
|
UndoGuard aUndoGuard = UndoGuard(
|
|
::rtl::OUString( String( SchResId( STR_ACTION_REARRANGE_CHART ))),
|
|
m_xUndoManager, xModel );
|
|
ControllerLockGuard aCtlLockGuard( xModel );
|
|
|
|
// diagram
|
|
Reference< beans::XPropertyState > xState( xDiagram, uno::UNO_QUERY_THROW );
|
|
xState->setPropertyToDefault( C2U("RelativeSize"));
|
|
xState->setPropertyToDefault( C2U("RelativePosition"));
|
|
|
|
// 3d rotation
|
|
ThreeDHelper::set3DSettingsToDefault( uno::Reference< beans::XPropertySet >( xDiagram, uno::UNO_QUERY ) );
|
|
|
|
// legend
|
|
Reference< beans::XPropertyState > xLegendState( xDiagram->getLegend(), uno::UNO_QUERY );
|
|
if( xLegendState.is())
|
|
xLegendState->setPropertyToDefault( C2U("RelativePosition"));
|
|
|
|
// titles
|
|
for( sal_Int32 eType = TitleHelper::TITLE_BEGIN;
|
|
eType < TitleHelper::NORMAL_TITLE_END;
|
|
++eType )
|
|
{
|
|
Reference< beans::XPropertyState > xTitleState(
|
|
TitleHelper::getTitle(
|
|
static_cast< TitleHelper::eTitleType >( eType ), xModel ), uno::UNO_QUERY );
|
|
if( xTitleState.is())
|
|
xTitleState->setPropertyToDefault( C2U("RelativePosition"));
|
|
}
|
|
|
|
// regression curve equations
|
|
::std::vector< Reference< chart2::XRegressionCurve > > aRegressionCurves(
|
|
RegressionCurveHelper::getAllRegressionCurvesNotMeanValueLine( xDiagram ));
|
|
::std::for_each( aRegressionCurves.begin(), aRegressionCurves.end(),
|
|
RegressionCurveHelper::resetEquationPosition );
|
|
|
|
aUndoGuard.commitAction();
|
|
}
|
|
}
|
|
catch( uno::RuntimeException & ex )
|
|
{
|
|
ASSERT_EXCEPTION( ex );
|
|
}
|
|
}
|
|
|
|
void ChartController::executeDispatch_ScaleText()
|
|
{
|
|
::vos::OGuard aSolarGuard( Application::GetSolarMutex());
|
|
// using assignment for broken gcc 3.3
|
|
UndoGuard aUndoGuard = UndoGuard(
|
|
::rtl::OUString( String( SchResId( STR_ACTION_SCALE_TEXT ))),
|
|
m_xUndoManager, m_aModel->getModel());
|
|
ControllerLockGuard aCtlLockGuard( m_aModel->getModel());
|
|
::std::auto_ptr< ReferenceSizeProvider > apRefSizeProv( impl_createReferenceSizeProvider());
|
|
OSL_ASSERT( apRefSizeProv.get());
|
|
if( apRefSizeProv.get())
|
|
apRefSizeProv->toggleAutoResizeState();
|
|
aUndoGuard.commitAction();
|
|
}
|
|
|
|
void ChartController::executeDispatch_Paste()
|
|
{
|
|
if( m_pChartWindow )
|
|
{
|
|
Graphic aGraphic;
|
|
// paste location: center of window
|
|
Point aPos;
|
|
aPos = m_pChartWindow->PixelToLogic( Rectangle( aPos, m_pChartWindow->GetSizePixel()).Center());
|
|
|
|
// handle different formats
|
|
TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( m_pChartWindow ));
|
|
if( aDataHelper.GetTransferable().is())
|
|
{
|
|
// if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_DRAWING ))
|
|
// {
|
|
// SotStorageStreamRef xStm;
|
|
// if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_DRAWING, xStm ))
|
|
// {
|
|
// xStm->Seek( 0 );
|
|
// uno::Reference< io::XInputStream > xInputStream( new utl::OInputStreamWrapper( *xStm ));
|
|
// SdrModel * pModel = new SdrModel();
|
|
// DrawModelWrapper * pDrawModelWrapper( this->GetDrawModelWrapper());
|
|
// if( SvxDrawingLayerImport( pModel, xInputStream ))
|
|
// lcl_CopyShapesToChart( *pModel, m_pDrawModelWrapper->getSdrModel());
|
|
// delete pModel;
|
|
// }
|
|
// }
|
|
// else
|
|
if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB ))
|
|
{
|
|
// graphic exchange format (graphic manager bitmap format?)
|
|
SotStorageStreamRef xStm;
|
|
if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_SVXB, xStm ))
|
|
(*xStm) >> aGraphic;
|
|
}
|
|
else if( aDataHelper.HasFormat( FORMAT_GDIMETAFILE ))
|
|
{
|
|
// meta file
|
|
GDIMetaFile aMetafile;
|
|
if( aDataHelper.GetGDIMetaFile( FORMAT_GDIMETAFILE, aMetafile ))
|
|
aGraphic = Graphic( aMetafile );
|
|
}
|
|
else if( aDataHelper.HasFormat( FORMAT_BITMAP ))
|
|
{
|
|
// bitmap (non-graphic-manager)
|
|
Bitmap aBmp;
|
|
if( aDataHelper.GetBitmap( FORMAT_BITMAP, aBmp ))
|
|
aGraphic = Graphic( aBmp );
|
|
}
|
|
else if( aDataHelper.HasFormat( FORMAT_STRING ))
|
|
{
|
|
OUString aString;
|
|
if( aDataHelper.GetString( FORMAT_STRING, aString ) && m_pDrawModelWrapper )
|
|
{
|
|
if( m_pDrawViewWrapper )
|
|
{
|
|
OutlinerView* pOutlinerView = m_pDrawViewWrapper->GetTextEditOutlinerView();
|
|
if( pOutlinerView )//in case of edit mode insert into edited string
|
|
pOutlinerView->InsertText( aString );
|
|
else
|
|
{
|
|
awt::Point aTextPos;
|
|
awt::Size aPageSize( ChartModelHelper::getPageSize( m_aModel->getModel()));
|
|
aTextPos.X = (aPageSize.Width / 2);
|
|
aTextPos.Y = (aPageSize.Height / 2);
|
|
lcl_InsertStringAsTextShapeIntoDrawPage(
|
|
m_pDrawModelWrapper->getShapeFactory(),
|
|
m_pDrawModelWrapper->getMainDrawPage(),
|
|
aString, aTextPos );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if( aGraphic.GetType() != GRAPHIC_NONE )
|
|
{
|
|
Reference< graphic::XGraphic > xGraphic( aGraphic.GetXGraphic());
|
|
if( xGraphic.is())
|
|
impl_PasteGraphic( xGraphic, aPos );
|
|
}
|
|
}
|
|
}
|
|
|
|
// note: aPosition is ignored for now. The object is always pasted centered to
|
|
// the page
|
|
void ChartController::impl_PasteGraphic(
|
|
uno::Reference< graphic::XGraphic > & xGraphic,
|
|
const ::Point & /* aPosition */ )
|
|
{
|
|
// note: the XPropertySet of the model is the old API. Also the property
|
|
// "AdditionalShapes" that is used there.
|
|
uno::Reference< beans::XPropertySet > xModelProp( m_aModel->getModel(), uno::UNO_QUERY );
|
|
DrawModelWrapper * pDrawModelWrapper( this->GetDrawModelWrapper());
|
|
if( ! (xGraphic.is() && xModelProp.is()))
|
|
return;
|
|
uno::Reference< lang::XMultiServiceFactory > xFact( pDrawModelWrapper->getShapeFactory());
|
|
uno::Reference< drawing::XShape > xGraphicShape(
|
|
xFact->createInstance( C2U( "com.sun.star.drawing.GraphicObjectShape" )), uno::UNO_QUERY );
|
|
uno::Reference< beans::XPropertySet > xGraphicShapeProp( xGraphicShape, uno::UNO_QUERY );
|
|
if( xGraphicShapeProp.is() && xGraphicShape.is())
|
|
{
|
|
uno::Reference< drawing::XShapes > xPage( pDrawModelWrapper->getMainDrawPage(), uno::UNO_QUERY );
|
|
if( xPage.is())
|
|
{
|
|
xPage->add( xGraphicShape );
|
|
//need to change the model state manually
|
|
{
|
|
uno::Reference< util::XModifiable > xModifiable( m_aModel->getModel(), uno::UNO_QUERY );
|
|
if( xModifiable.is() )
|
|
xModifiable->setModified( true );
|
|
}
|
|
//select new shape
|
|
m_aSelection.setSelection( xGraphicShape );
|
|
m_aSelection.applySelection( m_pDrawViewWrapper );
|
|
}
|
|
xGraphicShapeProp->setPropertyValue( C2U("Graphic"), uno::makeAny( xGraphic ));
|
|
uno::Reference< beans::XPropertySet > xGraphicProp( xGraphic, uno::UNO_QUERY );
|
|
|
|
awt::Size aGraphicSize( 1000, 1000 );
|
|
awt::Point aShapePos( 100,100 );
|
|
// first try size in 100th mm, then pixel size
|
|
if( ! ( xGraphicProp->getPropertyValue( C2U("Size100thMM")) >>= aGraphicSize ) &&
|
|
( ( xGraphicProp->getPropertyValue( C2U("SizePixel")) >>= aGraphicSize ) && m_pChartWindow ))
|
|
{
|
|
::Size aVCLSize( m_pChartWindow->PixelToLogic( Size( aGraphicSize.Width, aGraphicSize.Height )));
|
|
aGraphicSize.Width = aVCLSize.getWidth();
|
|
aGraphicSize.Height = aVCLSize.getHeight();
|
|
}
|
|
xGraphicShape->setSize( aGraphicSize );
|
|
|
|
awt::Size aPageSize( ChartModelHelper::getPageSize( m_aModel->getModel()));
|
|
aShapePos.X = (aPageSize.Width / 2) - (aGraphicSize.Width / 2);
|
|
aShapePos.Y = (aPageSize.Height / 2) - (aGraphicSize.Height / 2);
|
|
xGraphicShape->setPosition( aShapePos );
|
|
}
|
|
}
|
|
|
|
void ChartController::executeDispatch_Copy()
|
|
{
|
|
|
|
Reference< datatransfer::XTransferable > xTransferable;
|
|
|
|
{
|
|
::vos::OGuard aSolarGuard( Application::GetSolarMutex());
|
|
SdrObject * pSelectedObj = 0;
|
|
if( m_pDrawViewWrapper && m_pDrawModelWrapper )
|
|
{
|
|
if( m_aSelection.getSelectedCID().getLength() )
|
|
pSelectedObj = m_pDrawModelWrapper->getNamedSdrObject( m_aSelection.getSelectedCID() );
|
|
else
|
|
pSelectedObj = DrawViewWrapper::getSdrObject( m_aSelection.getSelectedAdditionalShape() );
|
|
|
|
if( pSelectedObj )
|
|
{
|
|
xTransferable = Reference< datatransfer::XTransferable >( new ChartTransferable(
|
|
& m_pDrawModelWrapper->getSdrModel(), pSelectedObj ));
|
|
}
|
|
}
|
|
}
|
|
if( xTransferable.is() )
|
|
{
|
|
Reference< datatransfer::clipboard::XClipboard > xClipboard( TransferableHelper::GetSystemClipboard());
|
|
if( xClipboard.is())
|
|
xClipboard->setContents( xTransferable, Reference< datatransfer::clipboard::XClipboardOwner >() );
|
|
}
|
|
}
|
|
|
|
void ChartController::executeDispatch_Cut()
|
|
{
|
|
executeDispatch_Copy();
|
|
executeDispatch_Delete();
|
|
}
|
|
|
|
//static
|
|
bool ChartController::isObjectDeleteable( const uno::Any& rSelection )
|
|
{
|
|
OUString aSelObjCID;
|
|
if( (rSelection >>= aSelObjCID) && aSelObjCID.getLength() > 0 )
|
|
{
|
|
ObjectType aObjectType(ObjectIdentifier::getObjectType( aSelObjCID ));
|
|
if( (OBJECTTYPE_TITLE == aObjectType) || (OBJECTTYPE_LEGEND == aObjectType)
|
|
|| (OBJECTTYPE_DATA_SERIES == aObjectType) )
|
|
return true;
|
|
if( (OBJECTTYPE_DATA_SERIES == aObjectType) || (OBJECTTYPE_LEGEND_ENTRY == aObjectType) )
|
|
return true;
|
|
if( (OBJECTTYPE_DATA_CURVE_EQUATION == aObjectType) || (OBJECTTYPE_DATA_CURVE == aObjectType) ||
|
|
(OBJECTTYPE_DATA_AVERAGE_LINE == aObjectType) || (OBJECTTYPE_DATA_ERRORS == aObjectType))
|
|
return true;
|
|
if( (OBJECTTYPE_DATA_LABELS == aObjectType) || (OBJECTTYPE_DATA_LABEL == aObjectType) )
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void ChartController::impl_ClearSelection()
|
|
{
|
|
if( m_aSelection.hasSelection())
|
|
{
|
|
m_aSelection.clearSelection();
|
|
impl_notifySelectionChangeListeners();
|
|
}
|
|
}
|
|
|
|
bool ChartController::executeDispatch_Delete()
|
|
{
|
|
bool bReturn = false;
|
|
|
|
// remove the selected object
|
|
//
|
|
rtl::OUString aCID( m_aSelection.getSelectedCID() );
|
|
if( aCID.getLength() )
|
|
{
|
|
if( !isObjectDeleteable( uno::Any( aCID ) ) )
|
|
return false;
|
|
|
|
//remove chart object
|
|
impl_ClearSelection();
|
|
|
|
uno::Reference< chart2::XChartDocument > xChartDoc( m_aModel->getModel(), uno::UNO_QUERY );
|
|
if( !xChartDoc.is() )
|
|
return false;
|
|
|
|
ObjectType aObjectType( ObjectIdentifier::getObjectType( aCID ));
|
|
switch( aObjectType )
|
|
{
|
|
case OBJECTTYPE_TITLE:
|
|
{
|
|
// using assignment for broken gcc 3.3
|
|
UndoGuard aUndoGuard = UndoGuard(
|
|
ActionDescriptionProvider::createDescription(
|
|
ActionDescriptionProvider::DELETE, ::rtl::OUString( String( SchResId( STR_OBJECT_TITLE )))),
|
|
m_xUndoManager, m_aModel->getModel() );
|
|
TitleHelper::removeTitle(
|
|
ObjectIdentifier::getTitleTypeForCID( aCID ), m_aModel->getModel());
|
|
bReturn = true;
|
|
aUndoGuard.commitAction();
|
|
break;
|
|
}
|
|
case OBJECTTYPE_LEGEND:
|
|
{
|
|
uno::Reference< chart2::XDiagram > xDiagram( xChartDoc->getFirstDiagram());
|
|
if( xDiagram.is())
|
|
{
|
|
uno::Reference< beans::XPropertySet > xLegendProp( xDiagram->getLegend(), uno::UNO_QUERY );
|
|
if( xLegendProp.is())
|
|
{
|
|
// using assignment for broken gcc 3.3
|
|
UndoGuard aUndoGuard = UndoGuard(
|
|
ActionDescriptionProvider::createDescription(
|
|
ActionDescriptionProvider::DELETE, ::rtl::OUString( String( SchResId( STR_OBJECT_LEGEND )))),
|
|
m_xUndoManager, m_aModel->getModel() );
|
|
xLegendProp->setPropertyValue( C2U("Show"), uno::makeAny( false ));
|
|
bReturn = true;
|
|
aUndoGuard.commitAction();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
case OBJECTTYPE_DATA_SERIES:
|
|
bReturn = lcl_deleteDataSeries( aCID, m_aModel->getModel(), m_xUndoManager );
|
|
break;
|
|
|
|
case OBJECTTYPE_LEGEND_ENTRY:
|
|
{
|
|
ObjectType eParentObjectType = ObjectIdentifier::getObjectType(
|
|
ObjectIdentifier::getFullParentParticle( aCID ));
|
|
if( eParentObjectType == OBJECTTYPE_DATA_SERIES )
|
|
bReturn = lcl_deleteDataSeries( aCID, m_aModel->getModel(), m_xUndoManager );
|
|
else if( eParentObjectType == OBJECTTYPE_DATA_CURVE )
|
|
bReturn = lcl_deleteDataCurve( aCID, m_aModel->getModel(), m_xUndoManager );
|
|
break;
|
|
}
|
|
|
|
case OBJECTTYPE_DATA_AVERAGE_LINE:
|
|
{
|
|
uno::Reference< chart2::XRegressionCurveContainer > xRegCurveCnt(
|
|
ObjectIdentifier::getObjectPropertySet(
|
|
ObjectIdentifier::getFullParentParticle( aCID ), m_aModel->getModel()), uno::UNO_QUERY );
|
|
if( xRegCurveCnt.is())
|
|
{
|
|
// using assignment for broken gcc 3.3
|
|
UndoGuard aUndoGuard = UndoGuard(
|
|
ActionDescriptionProvider::createDescription(
|
|
ActionDescriptionProvider::DELETE, ::rtl::OUString( String( SchResId( STR_OBJECT_AVERAGE_LINE )))),
|
|
m_xUndoManager, m_aModel->getModel() );
|
|
RegressionCurveHelper::removeMeanValueLine( xRegCurveCnt );
|
|
bReturn = true;
|
|
aUndoGuard.commitAction();
|
|
}
|
|
break;
|
|
}
|
|
|
|
case OBJECTTYPE_DATA_CURVE:
|
|
bReturn = lcl_deleteDataCurve( aCID, m_aModel->getModel(), m_xUndoManager );
|
|
break;
|
|
|
|
case OBJECTTYPE_DATA_CURVE_EQUATION:
|
|
{
|
|
uno::Reference< beans::XPropertySet > xEqProp(
|
|
ObjectIdentifier::getObjectPropertySet( aCID, m_aModel->getModel()));
|
|
if( xEqProp.is())
|
|
{
|
|
uno::Reference< frame::XModel > xModel( m_aModel->getModel());
|
|
// using assignment for broken gcc 3.3
|
|
UndoGuard aUndoGuard = UndoGuard(
|
|
ActionDescriptionProvider::createDescription(
|
|
ActionDescriptionProvider::DELETE, ::rtl::OUString( String( SchResId( STR_OBJECT_CURVE_EQUATION )))),
|
|
m_xUndoManager, xModel );
|
|
{
|
|
ControllerLockGuard aCtlLockGuard( xModel );
|
|
xEqProp->setPropertyValue( C2U("ShowEquation"), uno::makeAny( false ));
|
|
xEqProp->setPropertyValue( C2U("ShowCorrelationCoefficient"), uno::makeAny( false ));
|
|
}
|
|
bReturn = true;
|
|
aUndoGuard.commitAction();
|
|
}
|
|
break;
|
|
}
|
|
|
|
case OBJECTTYPE_DATA_ERRORS:
|
|
{
|
|
uno::Reference< beans::XPropertySet > xErrorBarProp(
|
|
ObjectIdentifier::getObjectPropertySet( aCID, m_aModel->getModel()));
|
|
if( xErrorBarProp.is())
|
|
{
|
|
uno::Reference< frame::XModel > xModel( m_aModel->getModel());
|
|
// using assignment for broken gcc 3.3
|
|
UndoGuard aUndoGuard = UndoGuard(
|
|
ActionDescriptionProvider::createDescription(
|
|
ActionDescriptionProvider::DELETE, ::rtl::OUString( String( SchResId( STR_OBJECT_ERROR_BARS )))),
|
|
m_xUndoManager, xModel );
|
|
{
|
|
ControllerLockGuard aCtlLockGuard( xModel );
|
|
xErrorBarProp->setPropertyValue(
|
|
C2U("ErrorBarStyle"),
|
|
uno::makeAny( ::com::sun::star::chart::ErrorBarStyle::NONE ));
|
|
}
|
|
bReturn = true;
|
|
aUndoGuard.commitAction();
|
|
}
|
|
break;
|
|
}
|
|
|
|
case OBJECTTYPE_DATA_LABELS:
|
|
case OBJECTTYPE_DATA_LABEL:
|
|
{
|
|
uno::Reference< beans::XPropertySet > xObjectProperties =
|
|
ObjectIdentifier::getObjectPropertySet( aCID, m_aModel->getModel() );
|
|
if( xObjectProperties.is() )
|
|
{
|
|
UndoGuard aUndoGuard = UndoGuard(
|
|
ActionDescriptionProvider::createDescription(
|
|
ActionDescriptionProvider::DELETE, ::rtl::OUString( String(
|
|
SchResId( aObjectType == OBJECTTYPE_DATA_LABEL ? STR_OBJECT_LABEL : STR_OBJECT_DATALABELS )))),
|
|
m_xUndoManager, m_aModel->getModel() );
|
|
chart2::DataPointLabel aLabel;
|
|
xObjectProperties->getPropertyValue( C2U( "Label" ) ) >>= aLabel;
|
|
aLabel.ShowNumber = false;
|
|
aLabel.ShowNumberInPercent = false;
|
|
aLabel.ShowCategoryName = false;
|
|
aLabel.ShowLegendSymbol = false;
|
|
if( aObjectType == OBJECTTYPE_DATA_LABELS )
|
|
{
|
|
uno::Reference< chart2::XDataSeries > xSeries( ObjectIdentifier::getDataSeriesForCID( aCID, m_aModel->getModel() ));
|
|
::chart::DataSeriesHelper::setPropertyAlsoToAllAttributedDataPoints( xSeries, C2U( "Label" ), uno::makeAny(aLabel) );
|
|
}
|
|
else
|
|
xObjectProperties->setPropertyValue( C2U( "Label" ), uno::makeAny(aLabel) );
|
|
bReturn = true;
|
|
aUndoGuard.commitAction();
|
|
}
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//remove additional shape
|
|
uno::Reference< drawing::XShape > xShape( m_aSelection.getSelectedAdditionalShape() );
|
|
if( xShape.is() )
|
|
{
|
|
impl_ClearSelection();
|
|
{
|
|
::vos::OGuard aSolarGuard( Application::GetSolarMutex());
|
|
if( m_pDrawViewWrapper )
|
|
m_pDrawViewWrapper->UnmarkAll();
|
|
}
|
|
bReturn = DrawModelWrapper::removeShape( xShape );
|
|
}
|
|
}
|
|
return bReturn;
|
|
}
|
|
|
|
void ChartController::executeDispatch_ToggleLegend()
|
|
{
|
|
Reference< frame::XModel > xModel( m_aModel->getModel());
|
|
UndoGuard aUndoGuard = UndoGuard(
|
|
::rtl::OUString( String( SchResId( STR_ACTION_TOGGLE_LEGEND ))), m_xUndoManager, xModel );
|
|
Reference< beans::XPropertySet > xLegendProp( LegendHelper::getLegend( xModel ), uno::UNO_QUERY );
|
|
bool bChanged = false;
|
|
if( xLegendProp.is())
|
|
{
|
|
try
|
|
{
|
|
bool bShow = false;
|
|
if( xLegendProp->getPropertyValue( C2U("Show")) >>= bShow )
|
|
{
|
|
xLegendProp->setPropertyValue( C2U("Show"), uno::makeAny( ! bShow ));
|
|
bChanged = true;
|
|
}
|
|
}
|
|
catch( const uno::Exception & ex )
|
|
{
|
|
ASSERT_EXCEPTION( ex );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
xLegendProp.set( LegendHelper::getLegend( xModel, m_xCC, true ), uno::UNO_QUERY );
|
|
if( xLegendProp.is())
|
|
bChanged = true;
|
|
}
|
|
|
|
if( bChanged )
|
|
aUndoGuard.commitAction();
|
|
}
|
|
|
|
void ChartController::executeDispatch_ToggleGridHorizontal()
|
|
{
|
|
Reference< frame::XModel > xModel( m_aModel->getModel());
|
|
UndoGuard aUndoGuard = UndoGuard(
|
|
::rtl::OUString( String( SchResId( STR_ACTION_TOGGLE_GRID_HORZ ))), m_xUndoManager, xModel );
|
|
Reference< chart2::XDiagram > xDiagram( ChartModelHelper::findDiagram( m_aModel->getModel()));
|
|
if( xDiagram.is())
|
|
{
|
|
sal_Int32 nDimensionIndex = 1;
|
|
sal_Int32 nCooSysIndex = 0;
|
|
bool bIsMainGrid = true;
|
|
|
|
bool bHasMainYGrid = AxisHelper::isGridShown( nDimensionIndex, nCooSysIndex, bIsMainGrid, xDiagram );
|
|
|
|
if( bHasMainYGrid )
|
|
AxisHelper::hideGrid( nDimensionIndex, nCooSysIndex, bIsMainGrid, xDiagram );
|
|
else
|
|
AxisHelper::showGrid( nDimensionIndex, nCooSysIndex, bIsMainGrid, xDiagram, m_xCC );
|
|
|
|
aUndoGuard.commitAction();
|
|
}
|
|
}
|
|
|
|
} // namespace chart
|