diff options
Diffstat (limited to 'binfilter/bf_sch/source/core/sch_chtmode4.cxx')
-rw-r--r-- | binfilter/bf_sch/source/core/sch_chtmode4.cxx | 1721 |
1 files changed, 1721 insertions, 0 deletions
diff --git a/binfilter/bf_sch/source/core/sch_chtmode4.cxx b/binfilter/bf_sch/source/core/sch_chtmode4.cxx new file mode 100644 index 000000000000..a2dd9f1087f4 --- /dev/null +++ b/binfilter/bf_sch/source/core/sch_chtmode4.cxx @@ -0,0 +1,1721 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * 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. + * + ************************************************************************/ + +#include "pairs.hxx" + +#include <bf_svx/eeitem.hxx> +#include <bf_sfx2/sfxsids.hrc> +#ifdef _MSC_VER +#pragma hdrstop +#endif +#include <bf_svx/svdopath.hxx> +#include <vcl/msgbox.hxx> +#include <bf_svtools/itempool.hxx> +#include <bf_svx/svdorect.hxx> +#include <bf_sfx2/printer.hxx> + +#include <bf_svx/editdata.hxx> +#include "schattr.hxx" + +#ifndef _SVX_CHRTITEM_HXX //autogen +#define ITEMID_DOUBLE 0 +#define ITEMID_CHARTDATADESCR SCHATTR_DATADESCR_DESCR +#define ITEMID_CHARTSTYLE CHATTR_DIAGRAM_STYLE +#define ITEMID_CHARTLEGENDPOS SCHATTR_LEGEND_POS + +#include <bf_svtools/eitem.hxx> + +#include <bf_svx/chrtitem.hxx> +#endif + +#define ITEMID_FONTHEIGHT EE_CHAR_FONTHEIGHT +#define ITEMID_FONTWIDTH EE_CHAR_FONTWIDTH +#include <bf_svx/fhgtitem.hxx> +#include <bf_svx/fwdtitem.hxx> +#ifndef _CHTMODEL_HXX +#include <globfunc.hxx> +#include <chtmodel.hxx> +#endif +#include <bf_svx/svdoutl.hxx> // wg. SdrOutliner +#include <bf_svx/svdpage.hxx> +#include "objadj.hxx" +#include "schresid.hxx" +#include "objid.hxx" +#include "datarow.hxx" +#include <bf_svx/dlgutil.hxx> + +#include "chtscene.hxx" +#include "glob.hrc" +#include <math.h> +#include <float.h> + +#include "chmod3d.hxx" +#include "docshell.hxx" + +#include <bf_sfx2/app.hxx> +#include <vcl/virdev.hxx> + +#include <rtl/logfile.hxx> + +#include "chaxis.hxx" +#include "ChXChartDocument.hxx" + +#include "ReBuildHint.hxx" +namespace binfilter { + +/************************************************************************/ + +/************************************************************************* +|* +|* Achsen & Gitter aendern; +|* Liefert bei Aenderung TRUE. +|* +\************************************************************************/ + + + + + +/************************************************************************* +|* +|* Datenbeschriftung aendern; +|* FG: 24.4.97 nRow ist ein Parameter der ermoeglicht die Datenbeschriftung +|* einer einzigen Reihe zu aendern, falls er -1 ist werden alle +|* Datenreihen mit dem uebergebenen Attributen belegt. (default ist alle) +|* +\************************************************************************/ + +/*N*/ void ChartModel::ChangeDataDescr(SvxChartDataDescr eDescr, BOOL bSym, +/*N*/ long nRowToChange, BOOL bBuildChart) +/*N*/ { +/*N*/ if( nRowToChange == -1 || +/*N*/ IsPieChart()) +/*N*/ { +/*N*/ // change setting globally +/*N*/ eDataDescr = eDescr; +/*N*/ bShowSym = bSym; +/*N*/ +/*N*/ // clear individual settings +/*N*/ long nEndRow = GetRowCount(); +/*N*/ for( long nRow = 0; nRow < nEndRow; nRow++ ) +/*N*/ { +/*N*/ SfxItemSet &rAttr = SAL_CONST_CAST( SfxItemSet&, GetDataRowAttr( (short)nRow )); +/*N*/ +/*N*/ rAttr.Put( SvxChartDataDescrItem( eDescr )); +/*N*/ rAttr.Put( SfxBoolItem( SCHATTR_DATADESCR_SHOW_SYM, bSym )); +/*N*/ +/*N*/ // the following is the preferred method, but the items are not evaluated appropriately +/*N*/ // rAttr.ClearItem( ITEMID_CHARTDATADESCR ); +/*N*/ // rAttr.ClearItem( SCHATTR_DATADESCR_SHOW_SYM ); +/*N*/ } +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ SfxItemSet &rAttr = SAL_CONST_CAST( SfxItemSet&, GetDataRowAttr( (short)nRowToChange )); +/*N*/ +/*N*/ rAttr.Put( SvxChartDataDescrItem( eDescr )); +/*N*/ rAttr.Put( SfxBoolItem( SCHATTR_DATADESCR_SHOW_SYM, bSym )); +/*N*/ } +/*N*/ +/*N*/ if( bBuildChart ) +/*?*/ BuildChart( FALSE ); +/*N*/ } + +/************************************************************************* +|* +|* Seitengroesse aendern; +|* Liefert bei Aenderung TRUE. +|* +\************************************************************************/ + +/*N*/ BOOL ChartModel::ResizePage(const Size& rNewSize) +/*N*/ { +/*N*/ SdrPage* pPage = GetPage(0); +/*N*/ +/*N*/ if (!pPage || pPage->GetSize() == rNewSize) return FALSE; +/*N*/ else +/*N*/ { +/*N*/ BOOL bWasChanged = IsChanged(); +/*N*/ +/*N*/ pPage->SetSize(rNewSize); +/*N*/ eOldChartStyle = eChartStyle; +/*N*/ if (rNewSize.Width () != 0 && rNewSize.Height () != 0) BuildChart(FALSE); +/*N*/ +/*N*/ if (!bWasChanged) SetChanged(FALSE); +/*N*/ +/*N*/ return TRUE; +/*N*/ } +/*N*/ } + + +/************************************************************************ +|* +|* skaliere Texte neu um +|* +\************************************************************************/ + +/*N*/ void ChartModel::ResizeText (SfxItemSet *pTextAttr, Size aPageSize, BOOL bResizePage ) +/*N*/ { +/*N*/ double fRatio; +/*N*/ if( bResizePage ) +/*N*/ fRatio = (double)aPageSize.Height() / (double)aInitialSize.Height(); +/*N*/ else +/*?*/ fRatio = (double)aDiagramRectangle.GetHeight() / (double)aLastDiagramRectangle.GetHeight(); +/*N*/ +/*N*/ // resize all three fonts +/*N*/ static const USHORT nWhichIds[ 3 ] = { +/*N*/ EE_CHAR_FONTHEIGHT, +/*N*/ EE_CHAR_FONTHEIGHT_CJK, +/*N*/ EE_CHAR_FONTHEIGHT_CTL +/*N*/ }; +/*N*/ +/*N*/ for( int i=0; i < 3; i++ ) +/*N*/ { +/*N*/ long nHeight = ((SvxFontHeightItem &)pTextAttr->Get( nWhichIds[ i ] )).GetHeight(); +/*N*/ +/*N*/ // Scale and round height. +/*N*/ nHeight = (long)( fRatio * (double)nHeight + 0.5 ); +/*N*/ +/*N*/ float fPoints = (float)CalcToPoint( nHeight, SFX_MAPUNIT_100TH_MM, 10 ); +/*N*/ if( fPoints < 2.0 ) fPoints = 2.0; +/*N*/ +/*N*/ pTextAttr->Put( SvxFontHeightItem( CalcToUnit( fPoints / (float)10.0, SFX_MAPUNIT_100TH_MM ), +/*N*/ 100, nWhichIds[ i ] )); +/*N*/ } +/*N*/ } + +/************************************************************************* +|* +|* Textobjekt fuer Editieren vorbereiten +|* +\************************************************************************/ + + +/************************************************************************* +|* +|* Editieren abschlieáen +|* +\************************************************************************/ + + +/************************************************************************* +|* +|* Attribute lesen +|* +\************************************************************************/ + +//SfxItemSet ChartModel::GetAttr() const +/*N*/ void ChartModel::GetAttr(SfxItemSet& rAttr) +/*N*/ { +/*N*/ CHART_TRACE( "ChartModel::GetAttr(SfxItemSet& rAttr)" ); +/*N*/ +/*N*/ rAttr.Put(SvxChartStyleItem(ChartStyle())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_TITLE_SHOW_MAIN, ShowMainTitle())); +/*N*/ rAttr.Put(SfxStringItem(CHATTR_TITLE_MAIN, MainTitle())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_TITLE_SHOW_SUB, ShowSubTitle())); +/*N*/ rAttr.Put(SfxStringItem(CHATTR_TITLE_SUB, SubTitle())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_TITLE_SHOW_X_AXIS, ShowXAxisTitle())); +/*N*/ rAttr.Put(SfxStringItem(CHATTR_TITLE_X_AXIS, XAxisTitle())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_TITLE_SHOW_Y_AXIS, ShowYAxisTitle())); +/*N*/ rAttr.Put(SfxStringItem(CHATTR_TITLE_Y_AXIS, YAxisTitle())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_TITLE_SHOW_Z_AXIS, ShowZAxisTitle())); +/*N*/ rAttr.Put(SfxStringItem(CHATTR_TITLE_Z_AXIS, ZAxisTitle())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_X_AXIS, ShowXAxis())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_X_MAIN, ShowXGridMain())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_X_HELP, ShowXGridHelp())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_X_DESCR, ShowXDescr())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_Y_AXIS, ShowYAxis())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_Y_MAIN, ShowYGridMain())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_Y_HELP, ShowYGridHelp())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_Y_DESCR, ShowYDescr())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_Z_AXIS, ShowZAxis())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_Z_MAIN, ShowZGridMain())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_Z_HELP, ShowZGridHelp())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_Z_DESCR, ShowZDescr())); +/*N*/ +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_2Y_AXIS, GetAxisByUID(CHART_AXIS_SECONDARY_Y)->IsVisible())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_2Y_DESCR, GetAxisByUID(CHART_AXIS_SECONDARY_Y)->HasDescription())); +/*N*/ +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_2X_AXIS, GetAxisByUID(CHART_AXIS_SECONDARY_X)->IsVisible())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_AXISGRID_SHOW_2X_DESCR, GetAxisByUID(CHART_AXIS_SECONDARY_X)->HasDescription())); +/*N*/ +/*N*/ const SfxPoolItem *pPoolItem = NULL; +/*N*/ if (pLegendAttr->GetItemState(SCHATTR_LEGEND_POS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ rAttr.Put(SvxChartLegendPosItem +/*N*/ (((const SvxChartLegendPosItem*)pPoolItem)->GetValue(), +/*N*/ pItemPool->GetSlotId(SCHATTR_LEGEND_POS))); +/*N*/ +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_DATA_SWITCH, IsSwitchData())); +/*N*/ +/*N*/ +/*N*/ rAttr.Put (SfxBoolItem (SCHATTR_STAT_AVERAGE,bShowAverage)); +/*N*/ rAttr.Put (SfxInt32Item (SCHATTR_STAT_KIND_ERROR, (INT32) eErrorKind)); +/*N*/ rAttr.Put (SfxInt32Item (SCHATTR_STAT_INDICATE, (INT32) eIndicate)); +/*N*/ rAttr.Put (SvxDoubleItem (fIndicatePercent, SCHATTR_STAT_PERCENT)); +/*N*/ rAttr.Put (SvxDoubleItem (fIndicateBigError, SCHATTR_STAT_BIGERROR)); +/*N*/ rAttr.Put (SvxDoubleItem (fIndicatePlus, SCHATTR_STAT_CONSTPLUS)); +/*N*/ rAttr.Put (SvxDoubleItem (fIndicateMinus, SCHATTR_STAT_CONSTMINUS)); +/*N*/ rAttr.Put (SfxInt32Item (SCHATTR_STAT_REGRESSTYPE, (INT32) eRegression)); +/*N*/ +/*N*/ //Datenbeschriftung +/*N*/ rAttr.Put(SfxBoolItem(SCHATTR_DATADESCR_SHOW_SYM,bShowSym)); +/*N*/ rAttr.Put(SvxChartDataDescrItem(eDataDescr)); +/*N*/ +/*N*/ rAttr.Put(SfxInt32Item(CHATTR_BARWIDTH,GetBarPercentWidth())); +/*N*/ rAttr.Put(SfxBoolItem(CHATTR_BARCONNECT, (BOOL)(m_nDefaultColorSet&CHSPECIAL_TRACELINES))); +/*N*/ +/*N*/ if (pChartAttr->GetItemState(SCHATTR_STYLE_SHAPE, TRUE, &pPoolItem)== SFX_ITEM_SET) +/*N*/ { +/*?*/ long nTmp= (long)((const SfxInt32Item*)pPoolItem)->GetValue(); +/*?*/ rAttr.Put(SfxInt32Item(SCHATTR_STYLE_SHAPE,nTmp)); +/*N*/ } +/*N*/ +/*N*/ ChartScene *pScene=GetScene(); +/*N*/ if(pScene) +/*N*/ //-/ pScene->TakeAttributes(rAttr,TRUE,FALSE); +/*N*/ rAttr.Put(pScene->GetItemSet()); +/*N*/ +/*N*/ if( pChartAttr->GetItemState( SCHATTR_USER_DEFINED_ATTR, TRUE, &pPoolItem ) == SFX_ITEM_SET ) +/*N*/ { +/*?*/ rAttr.Put( *pPoolItem ); +/*N*/ } +/*N*/ } + +/************************************************************************* +|* +|* Attribute setzen +|* +\************************************************************************/ + +/*N*/ void ChartModel::PutAttr(const SfxItemSet& rAttr) +/*N*/ { +/*N*/ const SfxPoolItem *pPoolItem = NULL; +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_TITLE_SHOW_MAIN, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ ShowMainTitle () = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_TITLE_MAIN, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*?*/ MainTitle () = ((const SfxStringItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_TITLE_SHOW_SUB, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ ShowSubTitle () = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_TITLE_SUB, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*?*/ SubTitle () = ((const SfxStringItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_TITLE_SHOW_X_AXIS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ ShowXAxisTitle () = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_TITLE_X_AXIS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*?*/ XAxisTitle () = ((const SfxStringItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_TITLE_SHOW_Y_AXIS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ ShowYAxisTitle () = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_TITLE_Y_AXIS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*?*/ YAxisTitle () = ((const SfxStringItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_TITLE_SHOW_Z_AXIS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ ShowZAxisTitle () = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_TITLE_Z_AXIS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*?*/ ZAxisTitle () = ((const SfxStringItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_X_AXIS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ ShowXAxis (((const SfxBoolItem*)pPoolItem)->GetValue()); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_X_MAIN, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ ShowXGridMain () = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_X_HELP, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*?*/ ShowXGridHelp () = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_X_DESCR, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ ShowXDescr (((const SfxBoolItem*)pPoolItem)->GetValue()); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_Y_AXIS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ ShowYAxis (((const SfxBoolItem*)pPoolItem)->GetValue()); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_Y_MAIN, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ ShowYGridMain () = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_Y_HELP, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*?*/ ShowYGridHelp () = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_Y_DESCR, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ ShowYDescr (((const SfxBoolItem*)pPoolItem)->GetValue()); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_Z_AXIS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ ShowZAxis (((const SfxBoolItem*)pPoolItem)->GetValue()); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_Z_MAIN, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*?*/ ShowZGridMain () = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_Z_HELP, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*?*/ ShowZGridHelp () = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_Z_DESCR, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ ShowZDescr (((const SfxBoolItem*)pPoolItem)->GetValue()); +/*N*/ +/*N*/ +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_2Y_AXIS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ { +/*N*/ BOOL b = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ pChartBAxis->GetItemSet()->Put(SfxBoolItem(SCHATTR_AXIS_SHOWAXIS,b)); +/*N*/ } +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_2Y_DESCR, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ { +/*N*/ BOOL b = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ pChartBAxis->GetItemSet()->Put(SfxBoolItem(SCHATTR_AXIS_SHOWDESCR,b)); +/*N*/ } +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_2X_AXIS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ { +/*N*/ BOOL b = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ pChartAAxis->GetItemSet()->Put(SfxBoolItem(SCHATTR_AXIS_SHOWAXIS,b)); +/*N*/ } +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_AXISGRID_SHOW_2X_DESCR, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ { +/*N*/ BOOL b = ((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ pChartAAxis->GetItemSet()->Put(SfxBoolItem(SCHATTR_AXIS_SHOWDESCR,b)); +/*N*/ } +/*N*/ +/*N*/ +/*N*/ +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_LEGEND_POS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ pLegendAttr->Put(SvxChartLegendPosItem +/*N*/ (((const SvxChartLegendPosItem*)pPoolItem)->GetValue(), +/*?*/ pItemPool->GetWhich(CHATTR_LEGEND_POS))); +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_DATA_SWITCH, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*?*/ ChangeSwitchData(((const SfxBoolItem*)pPoolItem)->GetValue()); +/*N*/ +/*N*/ +/*N*/ +/*N*/ //Statistik +/*N*/ if (rAttr.GetItemState(SCHATTR_STAT_CONSTPLUS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ fIndicatePlus=((const SvxDoubleItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(SCHATTR_STAT_BIGERROR, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ fIndicateBigError=((const SvxDoubleItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(SCHATTR_STAT_PERCENT, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ fIndicatePercent=((const SvxDoubleItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(SCHATTR_STAT_INDICATE, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*?*/ eIndicate=(SvxChartIndicate)((const SfxInt32Item*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(SCHATTR_STAT_KIND_ERROR, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ eErrorKind=(SvxChartKindError)((const SfxInt32Item*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(SCHATTR_STAT_AVERAGE, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ bShowAverage=((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(SCHATTR_STAT_CONSTMINUS, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ fIndicateMinus=((const SvxDoubleItem*)pPoolItem)->GetValue(); +/*N*/ if (rAttr.GetItemState(SCHATTR_STAT_REGRESSTYPE, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ eRegression=(SvxChartRegress)((const SfxInt32Item*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ +/*N*/ //Datenbeschriftung +/*N*/ SvxChartDataDescr eNewDataDescr,eOldDataDescr; +/*N*/ BOOL bNewShowSym, bOldShowSym; +/*N*/ +/*N*/ eNewDataDescr = eOldDataDescr = eDataDescr; +/*N*/ bNewShowSym = bOldShowSym = bShowSym; +/*N*/ +/*N*/ if (rAttr.GetItemState(SCHATTR_DATADESCR_DESCR, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ eNewDataDescr=(SvxChartDataDescr)((const SvxChartDataDescrItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if (rAttr.GetItemState(SCHATTR_DATADESCR_SHOW_SYM, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ bNewShowSym=((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ +/*N*/ if( bOldShowSym != bNewShowSym || eOldDataDescr != eNewDataDescr ) +/*N*/ { +/*?*/ ChangeDataDescr(eNewDataDescr,bNewShowSym); +/*N*/ } +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_BARWIDTH, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*?*/ SetBarPercentWidth((long)((const SfxInt32Item*)pPoolItem)->GetValue()); +/*N*/ +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_BARCONNECT, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*N*/ { +/*N*/ BOOL bTmp=((const SfxBoolItem*)pPoolItem)->GetValue(); +/*N*/ m_nDefaultColorSet=(bTmp) +/*N*/ ?(m_nDefaultColorSet|CHSPECIAL_TRACELINES) +/*N*/ :(m_nDefaultColorSet|CHSPECIAL_TRACELINES)-CHSPECIAL_TRACELINES; +/*N*/ } +/*N*/ +/*N*/ if (rAttr.GetItemState(SCHATTR_STYLE_SHAPE, TRUE, &pPoolItem)== SFX_ITEM_SET) +/*N*/ { +/*N*/ long nTmp= (long)((const SfxInt32Item*)pPoolItem)->GetValue(); +/*N*/ SfxItemSet aS(*pItemPool,SCHATTR_STYLE_SHAPE,SCHATTR_STYLE_SHAPE,0); +/*N*/ aS.Put(SfxInt32Item(SCHATTR_STYLE_SHAPE,nTmp)); +/*N*/ PutDataRowAttrAll(aS); +/*N*/ } +/*N*/ +/*N*/ // Autopilot mit CHATTR_ +/*N*/ if (rAttr.GetItemState(CHATTR_STYLE_SHAPE, TRUE, &pPoolItem)== SFX_ITEM_SET) +/*N*/ { +/*?*/ long nTmp= (long)((const SfxInt32Item*)pPoolItem)->GetValue(); +/*?*/ SfxItemSet aS(*pItemPool,SCHATTR_STYLE_SHAPE,SCHATTR_STYLE_SHAPE,0); +/*?*/ aS.Put(SfxInt32Item(SCHATTR_STYLE_SHAPE,nTmp)); +/*?*/ PutDataRowAttrAll(aS); +/*N*/ } +/*N*/ if( rAttr.GetItemState(CHATTR_AXIS_AUTO_ORIGIN, TRUE, &pPoolItem) == SFX_ITEM_SET) +/*N*/ { +/*?*/ BOOL bTmp= (BOOL)((const SfxBoolItem*)pPoolItem)->GetValue(); +/*?*/ SfxItemSet aS( *pItemPool, SCHATTR_AXIS_AUTO_ORIGIN, SCHATTR_AXIS_AUTO_ORIGIN); +/*?*/ aS.Put( SfxBoolItem( SCHATTR_AXIS_AUTO_ORIGIN, bTmp )); +/*?*/ if( pChartYAxis ) +/*?*/ { +/*?*/ pChartYAxis->SetAttributes( aS ); +/*?*/ } +/*?*/ if( pChartBAxis ) +/*?*/ { +/*?*/ pChartBAxis->SetAttributes( aS ); +/*?*/ } +/*N*/ } +/*N*/ +/*N*/ ChartScene *pScene=GetScene(); +/*N*/ if(pScene) //ToDo: Ist das hier nötig??? warum nicht direkt rAttr? #63904# +/*N*/ { +/*N*/ SfxItemSet aSceneSet(*pItemPool,nRowWhichPairs); +/*N*/ aSceneSet.Put(rAttr); +/*N*/ +/*N*/ //-/ pScene->NbcSetAttributes(aSceneSet,FALSE); +/*N*/ pScene->SetItemSet(aSceneSet); +/*N*/ +/*N*/ } +/*N*/ +/*N*/ if( rAttr.GetItemState( SCHATTR_USER_DEFINED_ATTR, TRUE, &pPoolItem ) == SFX_ITEM_SET ) +/*N*/ { +/*?*/ pChartAttr->Put( *pPoolItem ); +/*N*/ } +/*N*/ +/*N*/ +/*N*/ if (rAttr.GetItemState(CHATTR_DIAGRAM_STYLE, TRUE, &pPoolItem) +/*N*/ == SFX_ITEM_SET) +/*?*/ ChangeChart( ((const SvxChartStyleItem*)pPoolItem)->GetValue()); +/*N*/ } + +/*N*/ long ChartModel::GetAxisUID(long nRow) +/*N*/ { +/*N*/ return ((const SfxInt32Item &)GetDataRowAttr(nRow).Get(SCHATTR_AXIS)).GetValue(); +/*N*/ }; + + + + +/************************************************************************* +|* +|* Attribute setzen +|* +\************************************************************************/ + + +/************************************************************************* +|* +|* gesamte Grafik initialisieren +|* +\************************************************************************/ + +/*N*/ void ChartModel::Initialize() +/*N*/ { +/*N*/ mbIsInitialized = TRUE; +/*N*/ +/*N*/ if (!(aInitialSize.Height () && aInitialSize.Width ())) +/*N*/ { +/*?*/ SdrPage* pPage = GetPage(0); +/*?*/ if (pPage) aInitialSize = pPage->GetSize(); +/*?*/ +/*?*/ if (!(aInitialSize.Height () && aInitialSize.Width ())) aInitialSize = Size (7000, 8000); +/*?*/ // 13000, 8666 +/*N*/ } +/*N*/ +/*N*/ ScaleText( 0, aInitialSize ); +/*N*/ +/*N*/ if( bShouldBuildChart ) +/*N*/ { +/*N*/ // Force build chart. If it has been loaded from an XML file, than that is +/*N*/ // done by unlocking it. +/*N*/ bNoBuildChart = FALSE; +/*N*/ +/*N*/ if( pDocShell && +/*N*/ pDocShell->IsEnableSetModified()) +/*N*/ { +/*?*/ pDocShell->EnableSetModified( FALSE ); +/*?*/ if (IsLockedBuild()) +/*?*/ UnlockBuild(); +/*?*/ else +/*?*/ BuildChart( FALSE ); +/*?*/ pDocShell->EnableSetModified( TRUE ); +/*N*/ } +/*N*/ else +/*N*/ if (IsLockedBuild()) +/*?*/ UnlockBuild(); +/*N*/ else +/*N*/ BuildChart( FALSE ); +/*N*/ } +/*N*/ +/*N*/ SetDiagramRectangle( GetChartRect() ); +/*N*/ } + + +/************************************************************************* +|* +|* Sub-Methode von BuildChart() +|* +\************************************************************************/ +/*N*/ void ChartModel::ScaleText( long nTitle, const Size& rPageSize ) +/*N*/ { +/*N*/ // #67459# +/*N*/ // if the page size is unchanged ... +/*N*/ if( aInitialSize == rPageSize ) +/*N*/ { +/*N*/ // ... and the diagram (possibly) has been resized +/*N*/ if( GetDiagramHasBeenMovedOrResized() && (aLastDiagramRectangle != aDiagramRectangle) ) +/*N*/ { +/*?*/ if( nTitle != CHOBJID_DIAGRAM_X_AXIS ) +/*?*/ ResizeText( &GetAttr(CHOBJID_DIAGRAM_X_AXIS), rPageSize, FALSE ); +/*?*/ if( nTitle != CHOBJID_DIAGRAM_Y_AXIS ) +/*?*/ ResizeText( &GetAttr(CHOBJID_DIAGRAM_Y_AXIS), rPageSize, FALSE ); +/*?*/ if( nTitle != CHOBJID_DIAGRAM_A_AXIS ) +/*?*/ ResizeText( &GetAttr(CHOBJID_DIAGRAM_A_AXIS), rPageSize, FALSE ); +/*?*/ if( nTitle != CHOBJID_DIAGRAM_B_AXIS ) +/*?*/ ResizeText( &GetAttr(CHOBJID_DIAGRAM_B_AXIS), rPageSize, FALSE ); +/*?*/ if( nTitle != CHOBJID_DIAGRAM_Z_AXIS ) +/*?*/ ResizeText( &GetAttr(CHOBJID_DIAGRAM_Z_AXIS), rPageSize, FALSE ); +/*?*/ +/*?*/ for( ULONG i=0; i<aDataRowAttrList.Count(); i++ ) +/*?*/ ResizeText( aDataRowAttrList.GetObject(i), rPageSize, FALSE ); +/*?*/ ResizeText(pDummyAttr,rPageSize); // also resize crash test dummy to normal for next test ? +/*N*/ } +/*N*/ } +/*N*/ else // page size has changed +/*N*/ { +/*N*/ if(nTitle != CHOBJID_TITLE_MAIN) +/*N*/ ResizeText (pMainTitleAttr ,rPageSize); +/*N*/ if(nTitle != CHOBJID_TITLE_SUB) +/*N*/ ResizeText (pSubTitleAttr ,rPageSize); +/*N*/ if(nTitle != CHOBJID_DIAGRAM_TITLE_X_AXIS) +/*N*/ ResizeText (pXAxisTitleAttr,rPageSize); +/*N*/ if(nTitle != CHOBJID_DIAGRAM_TITLE_Y_AXIS) +/*N*/ ResizeText (pYAxisTitleAttr,rPageSize); +/*N*/ if(nTitle != CHOBJID_DIAGRAM_TITLE_Z_AXIS) +/*N*/ ResizeText (pZAxisTitleAttr,rPageSize); +/*N*/ +/*N*/ if(nTitle != CHOBJID_DIAGRAM_X_AXIS) +/*N*/ ResizeText(&GetAttr(CHOBJID_DIAGRAM_X_AXIS),rPageSize); +/*N*/ if(nTitle != CHOBJID_DIAGRAM_Y_AXIS) +/*N*/ ResizeText(&GetAttr(CHOBJID_DIAGRAM_Y_AXIS),rPageSize); +/*N*/ if(nTitle != CHOBJID_DIAGRAM_A_AXIS) +/*N*/ ResizeText(&GetAttr(CHOBJID_DIAGRAM_A_AXIS),rPageSize); +/*N*/ if(nTitle != CHOBJID_DIAGRAM_B_AXIS) +/*N*/ ResizeText(&GetAttr(CHOBJID_DIAGRAM_B_AXIS),rPageSize); +/*N*/ if(nTitle != CHOBJID_DIAGRAM_Z_AXIS) +/*N*/ ResizeText(&GetAttr(CHOBJID_DIAGRAM_Z_AXIS),rPageSize); +/*N*/ if(nTitle != CHOBJID_LEGEND) +/*N*/ ResizeText(pLegendAttr, rPageSize); +/*N*/ for( ULONG i=0; i<aDataRowAttrList.Count(); i++ ) +/*N*/ ResizeText(aDataRowAttrList.GetObject(i),rPageSize); +/*N*/ ResizeText(pDummyAttr,rPageSize); // also resize crash test dummy to normal for next test ? +/*N*/ } +/*N*/ } + +/************************************************************************* +|* +|* Sub-Methode von BuildChart(), Anzeige des Haupttitels +|* +\************************************************************************/ +/*N*/ void ChartModel::DoShowMainTitle(USHORT& rIndex,const long nYOfs) +/*N*/ { +/*N*/ SdrPage* pPage=GetPage(0); +/*N*/ const Size& rPageSize=pPage->GetSize(); +/*N*/ +/*N*/ Point aTitlePosition; +/*N*/ if (bUseRelativePositionsForChartGroups && (aTitleTopCenter.X() >= 0) && +/*N*/ (aTitleTopCenter.Y() >= 0) && GetMainTitleHasBeenMoved()) +/*N*/ { +/*N*/ double fRelativXPosition = ((double) aTitleTopCenter.X()) / aInitialSize.Width(); +/*N*/ double fRelativYPosition = ((double) aTitleTopCenter.Y()) / aInitialSize.Height(); +/*N*/ aTitlePosition.X() = (long)((double)rPageSize.Width() * fRelativXPosition ); +/*N*/ aTitlePosition.Y() = (long)((double)rPageSize.Height() * fRelativYPosition ); +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ aTitlePosition.X() = aChartRect.Left() + aChartRect.GetWidth() / 2; +/*N*/ aTitlePosition.Y() = aChartRect.Top(); +/*N*/ } +/*N*/ +/*N*/ SdrTextObj *pObj = CreateTextObj(CHOBJID_TITLE_MAIN, aTitlePosition, +/*N*/ aMainTitle, +/*N*/ *pMainTitleAttr, TRUE, CHADJUST_TOP_CENTER); +/*N*/ +/*N*/ aChartRect.Top() += GetOutputSize(*pObj).Height() + nYOfs; +/*N*/ pObj->SetResizeProtect(TRUE); +/*N*/ pPage->NbcInsertObject(pObj, rIndex++); +/*N*/ } + +/************************************************************************* +|* +|* Sub-Methode von BuildChart(), man koennte vermutlich DoShowMainTitle und +|* DoShowSubTitle zu DoShowTitle zusammenfassen +|* +\************************************************************************/ +/*N*/ void ChartModel::DoShowSubTitle(USHORT& rIndex,const long nYOfs) +/*N*/ { +/*N*/ SdrPage* pPage=GetPage(0); +/*N*/ const Size& rPageSize=pPage->GetSize(); +/*N*/ +/*N*/ Point aSubTitlePosition; +/*N*/ if (bUseRelativePositionsForChartGroups && (aSubTitleTopCenter.X() >= 0) && +/*N*/ (aSubTitleTopCenter.Y() >= 0) && GetSubTitleHasBeenMoved()) +/*N*/ { +/*N*/ double fRelativeXPosition = ((double) aSubTitleTopCenter.X()) / aInitialSize.Width(); +/*N*/ double fRelativeYPosition = ((double) aSubTitleTopCenter.Y()) / aInitialSize.Height(); +/*N*/ aSubTitlePosition.X() = (long)((double)rPageSize.Width() * fRelativeXPosition ); +/*N*/ aSubTitlePosition.Y() = (long)((double)rPageSize.Height() * fRelativeYPosition ); +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ aSubTitlePosition.X() = aChartRect.Left() + aChartRect.GetWidth() / 2; +/*N*/ aSubTitlePosition.Y() = aChartRect.Top(); +/*N*/ } +/*N*/ SdrTextObj *pObj = CreateTextObj(CHOBJID_TITLE_SUB, aSubTitlePosition, +/*N*/ aSubTitle, +/*N*/ *pSubTitleAttr, TRUE, CHADJUST_TOP_CENTER); +/*N*/ +/*N*/ aChartRect.Top() += GetOutputSize(*pObj).Height() + nYOfs; +/*N*/ pObj->SetResizeProtect(TRUE); +/*N*/ pPage->NbcInsertObject(pObj, rIndex++); +/*N*/ } + +/************************************************************************* +|* +|* Sub-Methode von BuildChart(), Anzeige der Legende +|* +\************************************************************************/ +/*N*/ void ChartModel::DoShowLegend(const Rectangle& rWholeRect, +/*N*/ const long nXOfs,const long nYOfs,USHORT& rIndex) +/*N*/ { +/*N*/ SdrPage* pPage=GetPage(0); +/*N*/ const Size& rPageSize=pPage->GetSize(); +/*N*/ +/*N*/ SvxChartLegendPos eLegendPos = ((const SvxChartLegendPosItem&) pLegendAttr->Get(SCHATTR_LEGEND_POS)). +/*N*/ GetValue(); +/*N*/ +/*N*/ if (eLegendPos != CHLEGEND_NONE) +/*N*/ { +/*N*/ SdrObject *pObj = CreateLegend(rWholeRect); +/*N*/ +/*N*/ if (pObj) +/*N*/ { +/*N*/ Rectangle aRect = pObj->GetLogicRect(); +/*N*/ ChartAdjust eAdjust; +/*N*/ +/*N*/ Point aLegendPosition; +/*N*/ if (bUseRelativePositionsForChartGroups && (aLegendTopLeft.X() >= 0) && +/*N*/ (aLegendTopLeft.Y() >= 0) && GetLegendHasBeenMoved()) +/*N*/ { +/*N*/ double fRatioX = +/*N*/ static_cast< double >( rPageSize.Width() ) / +/*N*/ static_cast< double >( aInitialSize.Width() ); +/*N*/ double fRatioY = +/*N*/ static_cast< double >( rPageSize.Height() ) / +/*N*/ static_cast< double >( aInitialSize.Height() ); +/*N*/ +/*N*/ aLegendPosition.X() = static_cast< long >( +/*N*/ static_cast< double >( aLegendTopLeft.X() ) * fRatioX ); +/*N*/ aLegendPosition.Y() = static_cast< long >( +/*N*/ static_cast< double >( aLegendTopLeft.Y() ) * fRatioY ); +/*N*/ +/*N*/ if( bAdjustMarginsForLegend ) +/*N*/ { +/*N*/ switch (eLegendPos) +/*N*/ { +/*N*/ case CHLEGEND_LEFT: +/*?*/ eAdjust = CHADJUST_TOP_LEFT; +/*?*/ aChartRect.Left() += aRect.GetWidth() + nXOfs; +/*?*/ break; +/*?*/ +/*?*/ case CHLEGEND_TOP: +/*?*/ eAdjust = CHADJUST_TOP_LEFT; +/*?*/ aChartRect.Top() += aRect.GetHeight() + nYOfs; +/*?*/ break; +/*N*/ +/*N*/ case CHLEGEND_RIGHT: +/*N*/ eAdjust = CHADJUST_TOP_LEFT; +/*N*/ aChartRect.Right() -= aRect.GetWidth() + nXOfs; +/*N*/ break; +/*N*/ +/*?*/ case CHLEGEND_BOTTOM: +/*?*/ eAdjust = CHADJUST_TOP_LEFT; +/*?*/ aChartRect.Bottom() -= aRect.GetHeight() + nYOfs; +/*?*/ break; +/*N*/ } +/*N*/ } +/*N*/ // #96418# why shifting the legend nXOfs/nYOfs away from the +/*N*/ // edge, if it moved manually; it may well reach the edge in +/*N*/ // that case. So just check if it laps out of the edge. Apart +/*N*/ // from that the default position did not satisfy this condition +/*N*/ // and was therefore always shifted inside +/*N*/ if (aLegendPosition.X() + aRect.GetWidth() > rPageSize.Width()) +/*N*/ { +/*?*/ aLegendPosition.X() = rPageSize.Width() - aRect.GetWidth(); +/*N*/ } +/*N*/ if (aLegendPosition.Y() + aRect.GetHeight() > rPageSize.Height()) +/*N*/ { +/*?*/ aLegendPosition.Y() = rPageSize.Height() - aRect.GetHeight(); +/*N*/ } +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ switch (eLegendPos) +/*N*/ { +/*N*/ case CHLEGEND_LEFT: +/*?*/ aLegendPosition.X() = rWholeRect.Left(); +/*?*/ aLegendPosition.Y() = rWholeRect.Top() + rWholeRect.GetHeight() / 2; +/*?*/ eAdjust = CHADJUST_CENTER_LEFT; +/*?*/ aChartRect.Left() += aRect.GetWidth() + nXOfs; +/*?*/ break; +/*?*/ +/*?*/ case CHLEGEND_TOP: +/*?*/ aLegendPosition.X() = rWholeRect.Left() + rWholeRect.GetWidth() / 2; +/*?*/ aLegendPosition.Y() = aChartRect.Top(); +/*?*/ eAdjust = CHADJUST_TOP_CENTER; +/*?*/ aChartRect.Top() += aRect.GetHeight() + nYOfs; +/*?*/ break; +/*N*/ +/*N*/ case CHLEGEND_RIGHT: +/*N*/ aLegendPosition.X() = rWholeRect.Right(); +/*N*/ aLegendPosition.Y() = rWholeRect.Top() + rWholeRect.GetHeight() / 2; +/*N*/ eAdjust = CHADJUST_CENTER_RIGHT; +/*N*/ aChartRect.Right() -= aRect.GetWidth() + nXOfs; +/*N*/ break; +/*N*/ +/*N*/ case CHLEGEND_BOTTOM: +/*?*/ aLegendPosition.X() = rWholeRect.Left() + rWholeRect.GetWidth() / 2; +/*?*/ aLegendPosition.Y() = rWholeRect.Bottom(); +/*?*/ eAdjust = CHADJUST_BOTTOM_CENTER; +/*?*/ aChartRect.Bottom() -= aRect.GetHeight() + nYOfs; +/*?*/ break; +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ // For 3D pie charts that whose position and size have not been altered +/*N*/ // manually, the calculated size in aChartRect is +/*N*/ // set to aDiagramRectangle after a possible adaption to half +/*N*/ // it's height. This adaption mimics the behaviour from BuildChart +/*N*/ // and takes place only if the diagram is not more than twice as wide +/*N*/ // as it is high. +/*N*/ if (IsPieChart() && IsReal3D() && ! GetDiagramHasBeenMovedOrResized()) +/*N*/ { +/*N*/ long nWidth=aChartRect.GetWidth(); +/*N*/ long nHeight=aChartRect.GetHeight(); +/*N*/ if( ((double)nHeight/(double)nWidth) > 0.5 ) +/*N*/ { +/*N*/ aChartRect.Top()+=nHeight/4; +/*N*/ aChartRect.Bottom()-=nHeight/4; +/*N*/ } +/*N*/ SetDiagramRectangle (aChartRect); +/*N*/ } +/*N*/ +/*N*/ aRect.SetPos(aLegendPosition); +/*N*/ AdjustRect(aRect, eAdjust); +/*N*/ pObj->NbcSetLogicRect(aRect); +/*N*/ pObj->SetResizeProtect(TRUE); +/*N*/ if (pObj->ISA(SchObjGroup)) +/*N*/ { +/*N*/ ((SchObjGroup *)pObj)->SetGroupType(SchObjGroup::LEGEND); +/*N*/ ((SchObjGroup *)pObj)->SetModel(this); +/*N*/ } +/*N*/ pPage->InsertObject(pObj, rIndex); +/*N*/ } +/*N*/ } +/*N*/ } + +//Übertragung der Page-Objekt-Attribute in die Modeleigenen AttrSets +/*N*/ void ChartModel::Rescue3DObjAttr(SdrObjList* pList)//#52277# +/*N*/ { +/*N*/ CHART_TRACE( "ChartModel::Rescue3DObjAttr" ); +/*N*/ if(pList) +/*N*/ { +/*N*/ SdrObject* pObj; +/*N*/ long nRow, nCol; +/*N*/ //-/ SfxItemSet aSet( *pItemPool, SID_ATTR_3D_START, SID_ATTR_3D_END ); +/*N*/ SfxItemSet aSet( *pItemPool, SDRATTR_3D_FIRST, SDRATTR_3D_LAST); +/*N*/ aSet.ClearItem(); +/*N*/ +/*N*/ SdrObjListIter aIterator( *pList, IM_DEEPWITHGROUPS ); +/*N*/ +/*N*/ while( aIterator.IsMore() ) +/*N*/ { +/*N*/ pObj = aIterator.Next(); +/*N*/ SchDataRow* pDataRow = GetDataRow( *pObj ); +/*N*/ SchDataPoint* pDataPoint = GetDataPoint( *pObj ); +/*N*/ if( pDataRow ) +/*N*/ { +/*N*/ nRow = pDataRow->GetRow(); +/*N*/ //-/ pObj->TakeAttributes( aSet, FALSE, TRUE ); +/*N*/ aSet.Put(pObj->GetItemSet()); +/*N*/ +/*N*/ aSet.ClearInvalidItems(); +/*N*/ aDataRowAttrList.GetObject( nRow )->Put( aSet ); +/*N*/ aSet.ClearItem(); +/*N*/ } +/*N*/ else if( pDataPoint ) +/*N*/ { +/*N*/ nCol = pDataPoint->GetCol(); +/*N*/ nRow = pDataPoint->GetRow(); +/*N*/ //-/ pObj->TakeAttributes( aSet, FALSE, TRUE ); +/*N*/ aSet.Put(pObj->GetItemSet()); +/*N*/ +/*N*/ aSet.ClearInvalidItems(); +/*N*/ PutDataPointAttr( nCol, nRow, aSet ); +/*N*/ aSet.ClearItem(); +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ SchObjectId *pId = GetObjectId( *pObj ); +/*N*/ if( pId ) +/*N*/ { +/*N*/ long nId = pId->GetObjId(); +/*N*/ //-/ pObj->TakeAttributes( aSet, FALSE, TRUE ); +/*N*/ aSet.Put(pObj->GetItemSet()); +/*N*/ if( aSet.Count() ) +/*N*/ { +/*N*/ aSet.ClearInvalidItems(); +/*N*/ GetAttr( nId ).Put( aSet, TRUE ); +/*N*/ aSet.ClearItem(); +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ } +/************************************************************************* +|* +|* Sub-Methode von BuildChart(), Loeschen aller Chartobjecte +|* +\************************************************************************/ +/*N*/ void ChartModel::DeleteChartObjects() +/*N*/ { +/*N*/ SdrPage* pPage=GetPage(0); +/*N*/ BOOL bResize = (aInitialSize != pPage->GetSize()); +/*N*/ +/*N*/ // FG: Bevor die Objekte geloescht und neu aufgebaut werden, merkt man sich deren +/*N*/ // Position. Da in InitalSize die urspruengliche Seitengroesse steht, kann +/*N*/ // man nun die relative Position auf der Seite bestimmen. +/*N*/ // Diese relative Position bleibt bei einem Resize erhalten, +/*N*/ // falls der Schalter "bUseRelativePositionsForChartGroups" auf TRUE steht. +/*N*/ +/*N*/ SdrObject* pGroupObject = GetObjWithId( CHOBJID_DIAGRAM_AREA, *pPage ); +/*N*/ if( pGroupObject != NULL ) +/*N*/ DeleteObject( pGroupObject ); +/*N*/ +/*N*/ pGroupObject = GetObjWithId( CHOBJID_TITLE_MAIN, *pPage ); +/*N*/ if (pGroupObject != NULL) +/*N*/ { +/*N*/ aTitleTopCenter = pGroupObject->GetBoundRect().TopCenter(); +/*N*/ DeleteObject(pGroupObject); +/*N*/ } +/*N*/ +/*N*/ pGroupObject = GetObjWithId(CHOBJID_TITLE_SUB, *pPage); +/*N*/ if (pGroupObject != NULL) +/*N*/ { +/*N*/ aSubTitleTopCenter = pGroupObject->GetBoundRect().TopCenter(); +/*N*/ DeleteObject(pGroupObject); +/*N*/ } +/*N*/ +/*N*/ pGroupObject = GetObjWithId(CHOBJID_DIAGRAM, *pPage); +/*N*/ if (pGroupObject != NULL) +/*N*/ { +/*N*/ // FG: 11.3.97 Wenn die Grenzen des Objekts woanders gesetzt worden sind, duerfen sie hier +/*N*/ // nicht mehr gesetzt werden. +/*N*/ if (pGroupObject->ISA(SchObjGroup)) +/*N*/ { +/*N*/ if (GetDiagramHasBeenMovedOrResized() && +/*N*/ ((SchObjGroup *) pGroupObject)->GetAskForLogicRect()) +/*N*/ { +/*N*/ // FG: So leider nicht das Chart-Rect ist fehlerhafterweise nicht das Bounding-Rectangle +/*N*/ // aDiagramRectangle = pGroupObject->GetLogicRect(); +/*N*/ SetDiagramRectangle( GetChartRect() ); +/*N*/ } +/*N*/ } +/*N*/ else if (pGroupObject->ISA(ChartScene)) +/*N*/ { +/*N*/ if (GetDiagramHasBeenMovedOrResized() && +/*N*/ ((ChartScene *) pGroupObject)->GetAskForLogicRect()) +/*N*/ { +/*N*/ // FG: So leider nicht das Chart-Rect ist fehlerhafterweise nicht das Bounding-Rectangle +/*N*/ // aDiagramRectangle = pGroupObject->GetLogicRect(); +/*N*/ SetDiagramRectangle( GetChartRect() ); +/*N*/ } +/*N*/ +/*N*/ +/*N*/ if( pGroupObject == pScene ) +/*N*/ pScene = NULL; +/*N*/ } +/*N*/ DeleteObject(pGroupObject); +/*N*/ } +/*N*/ +/*N*/ pGroupObject = GetObjWithId(CHOBJID_LEGEND, *pPage); +/*N*/ if (pGroupObject != NULL) +/*N*/ { +/*N*/ // FG: 11.3.97 Wenn die Grenzen des Objekts woanders gesetzt worden sind, duerfen sie hier +/*N*/ // nicht mehr gesetzt werden. +/*N*/ if (GetLegendHasBeenMoved()&& +/*N*/ ((SchObjGroup *) pGroupObject)->GetAskForLogicRect() ) +/*N*/ // #107305# I don't see where aLegendTopLeft should have changed at +/*N*/ // another place, if not via resizing. Besides, why should it for +/*N*/ // the legend and not the titles? +/*N*/ // && ! bResize ) +/*N*/ { +/*N*/ aLegendTopLeft = pGroupObject->GetLogicRect().TopLeft(); +/*N*/ } +/*N*/ DeleteObject(pGroupObject); +/*N*/ } +/*N*/ +/*N*/ +/*N*/ +/*N*/ pGroupObject = GetObjWithId(CHOBJID_DIAGRAM_TITLE_X_AXIS, *pPage); +/*N*/ if (pGroupObject != NULL) +/*N*/ { +/*N*/ aTitleXAxisPosition = SetPointOfRectangle(pGroupObject->GetBoundRect(), eAdjustXAxesTitle); +/*N*/ DeleteObject(pGroupObject); +/*N*/ } +/*N*/ +/*N*/ pGroupObject = GetObjWithId(CHOBJID_DIAGRAM_TITLE_Y_AXIS, *pPage); +/*N*/ if (pGroupObject != NULL) +/*N*/ { +/*N*/ Rectangle Test1 = pGroupObject->GetBoundRect(); +/*N*/ Rectangle Test2 = pGroupObject->GetSnapRect(); +/*N*/ aTitleYAxisPosition = SetPointOfRectangle(pGroupObject->GetBoundRect(), eAdjustYAxesTitle); +/*N*/ DeleteObject(pGroupObject); +/*N*/ } +/*N*/ +/*N*/ pGroupObject = GetObjWithId(CHOBJID_DIAGRAM_TITLE_Z_AXIS, *pPage); +/*N*/ if (pGroupObject != NULL) +/*N*/ { +/*N*/ aTitleZAxisPosition = SetPointOfRectangle(pGroupObject->GetBoundRect(), eAdjustXAxesTitle); +/*N*/ DeleteObject(pGroupObject); +/*N*/ } +/*N*/ } +/************************************************************************* +|* +|* Sub-Methode von BuildChart(), Wertebereichueberpruefung mit MsgBox +|* +\************************************************************************/ +/*N*/ BOOL ChartModel::CheckRanges(BOOL bCheckAlways) +/*N*/ { +/*N*/ //ToDo:CHOBJID_DIAGRAM_B_AXIS +/*N*/ BOOL bOK=TRUE; +/*N*/ if ((eChartStyle != eOldChartStyle) || (bCheckAlways)) +/*N*/ { +/*N*/ if ((pChartYAxis->GetMin() < 0.0) && (pChartYAxis->GetMax() > 0.0) && (!IsSignedChart())) +/*N*/ { +/*?*/ // FG: Falls ein Pointer auf ein Fenster uebergeben wird ist die Dialogbox nicht-modal +/*?*/ // Nutzt man dies fuer Veraenderungen am Chart aus, stuertzt das Programm ab. +/*?*/ // InfoBox aInfoBox(SFX_APP()->GetAppWindow(), String(SchResId(STR_ONLY_ABS_VALUES))); +/*?*/ InfoBox aInfoBox(NULL, String(SchResId(STR_ONLY_ABS_VALUES))); +/*?*/ aInfoBox.Execute(); +/*?*/ eOldChartStyle = eChartStyle; +/*?*/ bOK=FALSE; +/*N*/ } +/*N*/ else if ((pChartYAxis->GetMin() < 0.0) && (!IsNegativeChart ())) +/*N*/ { +/*N*/ // FG: Falls ein Pointer auf ein Fenster uebergeben wird ist die Dialogbox nicht-modal +/*N*/ // Nutzt man dies fuer Veraenderungen am Chart aus, stuertzt das Programm ab. +/*N*/ // InfoBox aInfoBox(SFX_APP()->GetAppWindow(), String(SchResId(STR_NO_MIN_VALUES))); +/*?*/ InfoBox aInfoBox(NULL, String(SchResId(STR_NO_MIN_VALUES))); +/*?*/ aInfoBox.Execute(); +/*?*/ eOldChartStyle = eChartStyle; +/*?*/ bOK=FALSE; +/*N*/ } +/*N*/ } + /* + if (bCheckAlways) + if ((pChartYAxis->GetMin() <= 0.0) + && ((const SfxBoolItem&)GetAttr(CHOBJID_DIAGRAM_Y_AXIS).Get(SCHATTR_AXIS_LOGARITHM)).GetValue()) + { + // FG: Falls ein Pointer auf ein Fenster uebergeben wird ist die Dialogbox nicht-modal + // Nutzt man dies fuer Veraenderungen am Chart aus, stuertzt das Programm ab. + // InfoBox aInfoBox(SFX_APP()->GetAppWindow(), String(SchResId(STR_NO_LOGARITHMIC_MIN_VALUES))); + InfoBox aInfoBox(NULL, String(SchResId(STR_NO_LOGARITHMIC_MIN_VALUES))); + aInfoBox.Execute(); + eOldChartStyle = eChartStyle; + bOK=FALSE; + } +*/ +/*N*/ return bOK; +/*N*/ } +/************************************************************************* +|* +|* Sub-Methode von BuildChart(), Chart-ReSizing +|* +\************************************************************************/ +/*N*/ void ChartModel::ResizeChart(const Size& rPageSize) +/*N*/ { +/*N*/ if (GetUseRelativePositions() && GetDiagramHasBeenMovedOrResized()) +/*N*/ { +/*N*/ if ((rPageSize.Width() == aInitialSize.Width()) && (rPageSize.Height() == aInitialSize.Height())) +/*N*/ { // FG: Es war also ein Resize nur des Diagramms (also nur der Grafik und nicht der Seite) +/*N*/ aChartRect= aDiagramRectangle; +/*N*/ } +/*N*/ else // FG: 11.3.97 Dann war es ein Resize des gesamten Charts +/*N*/ { + // The whole chart has been resized. + // The old size aDiagramRectangle of the diagram has to fullfill the constraint + // the it has to have a positive extent both in the horizontal and the vertical + // direction. + // + // Previously (before 24.07.2001) the constraints to fullfill have been tighter: + // All four border lines had to lie inside the chart rectangle. + // If the new solution, that solves error #88404# proves to work, then remove this + // paragraph and the commented code below. +/*N*/ if ( (aDiagramRectangle.nLeft < aDiagramRectangle.nRight) +/*N*/ && (aDiagramRectangle.nTop < aDiagramRectangle.nBottom) ) +// if ((aDiagramRectangle.nLeft >= 0) && (aDiagramRectangle.nTop >= 0) && +// (aDiagramRectangle.nRight >= 0) && (aDiagramRectangle.nBottom >= 0)) +/*N*/ { +/*?*/ double fRelativeXPosition = ((double) aDiagramRectangle.Left()) / aInitialSize.Width(); +/*?*/ double fRelativeYPosition = ((double) aDiagramRectangle.Top()) / aInitialSize.Height(); +// if ((fRelativeXPosition <= 1.0) && (fRelativeYPosition <= 1.0)) +// { +/*?*/ aChartRect.nLeft = (long)((double)rPageSize.Width() * fRelativeXPosition ); +/*?*/ aChartRect.nTop = (long)((double)rPageSize.Height() * fRelativeYPosition ); +// } +/*?*/ fRelativeXPosition = ((double) aDiagramRectangle.Right()) / aInitialSize.Width(); +/*?*/ fRelativeYPosition = ((double) aDiagramRectangle.Bottom()) / aInitialSize.Height(); +// if ((fRelativeXPosition <= 1.0) && (fRelativeYPosition <= 1.0)) +// { +/*?*/ aChartRect.nRight = (long)((double)rPageSize.Width() * fRelativeXPosition ); +/*?*/ aChartRect.nBottom = (long)((double)rPageSize.Height() * fRelativeYPosition ); +// } +/*?*/ } +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ } +/************************************************************************* +|* +|* Sub-Methode von BuildChart(), +|* +|* FG: Hier wird der Platz berechnet, den man als oberen Rand freilassen +|* soll,falls keine Titel dargestellt werden. +|* +\************************************************************************/ +/*N*/ void ChartModel::CalculateUpperBorder() +/*N*/ { +/*N*/ if ((!bShowMainTitle && !bShowSubTitle)) +/*N*/ { +/*N*/ BOOL bSwitchColRow = eChartStyle == CHSTYLE_2D_BAR || +/*N*/ eChartStyle == CHSTYLE_2D_STACKEDBAR || +/*N*/ eChartStyle == CHSTYLE_2D_PERCENTBAR || +/*N*/ eChartStyle == CHSTYLE_3D_BAR || +/*N*/ eChartStyle == CHSTYLE_3D_FLATBAR || +/*N*/ eChartStyle == CHSTYLE_3D_STACKEDFLATBAR || +/*N*/ eChartStyle == CHSTYLE_3D_PERCENTFLATBAR; +/*N*/ +/*N*/ SfxItemSet aTextAttr((const SfxItemSet &)GetAttr( +/*N*/ bSwitchColRow ? +/*N*/ CHOBJID_DIAGRAM_X_AXIS +/*N*/ : CHOBJID_DIAGRAM_Y_AXIS)); +/*N*/ +/*N*/ Size aTextSize (((SvxFontWidthItem &) aTextAttr.Get (EE_CHAR_FONTWIDTH)).GetWidth (), +/*N*/ ((SvxFontHeightItem &) aTextAttr.Get (EE_CHAR_FONTHEIGHT)).GetHeight ()); +/*N*/ +/*N*/ aChartRect.Top () += aTextSize.Height () / 2; +/*N*/ } +/*N*/ } +/************************************************************************* +|* +|* Sub-Methode von BuildChart(), Chart-ReSizing +|* +\************************************************************************/ +/*N*/ void ChartModel::CreateRectsAndTitles(long whatTitle) +/*N*/ { +/*N*/ // FG: Abhaengig von der Groesse der Page, also der Ausgabe +/*N*/ // werden die Raender erst mal auf 2% der jeweiligen Richtungsausdehnung gesetzt +/*N*/ // abgespeichert wird das im ChartModel. Sollte ein Text uber den den linken +/*N*/ // Rand zu weit hinausragen, also linker Rand OuterRect(SdrTextObj) < 0, +/*N*/ // So wird entweder der Offset neu berechnet oder der Text veraendert. +/*N*/ // Im Moment ist es nur moeglich den linken Rand nachzuregeln. +/*N*/ SdrPage* pPage=GetPage(0); +/*N*/ const Size& rPageSize=pPage->GetSize(); +/*N*/ +/*N*/ long nYOfs = (rPageSize.Height() / 100) * 2; +/*N*/ long nXOfs = (rPageSize.Width() /100) * 2; +/*N*/ USHORT nIndex = 0; +/*N*/ +/*N*/ // #97159# the chart rect was set one unit too large in either direction +/*N*/ aChartRect.SetPos( Point( 0, 0 ) ); +/*N*/ aChartRect.SetSize( rPageSize ); +/*N*/ +/*N*/ SchRectObj* pRect = new SchRectObj(aChartRect); +/*N*/ pRect->SetModel( this ); +/*N*/ pPage->InsertObject(SetObjectAttr( pRect, CHOBJID_DIAGRAM_AREA, +/*N*/ FALSE, TRUE, pDiagramAreaAttr), nIndex++); +/*N*/ +/*N*/ aChartRect.Left() += nXOfs; // FG: Dies ist das Rechteck in das das Chart (also die Balken ...) +/*N*/ aChartRect.Top() += nYOfs; // rein muss. Erst ist es maximal gross und dann wird immer +/*N*/ aChartRect.Right() -= nXOfs; // mehr abgezwackt. +/*N*/ aChartRect.Bottom() -= nYOfs; +/*N*/ +/*N*/ Rectangle aWholeRect (aChartRect); +/*N*/ +/*N*/ // Falls aInitialSize Null ist dann wird es auf die Seitengroesse gesetzt +/*N*/ if( !aInitialSize.Width ()) aInitialSize.Width () = rPageSize.Width (); +/*N*/ if( !aInitialSize.Height ()) aInitialSize.Height () = rPageSize.Height (); +/*N*/ +/*N*/ // FG: Dieser Offset wird bei der Legende und den Diagrammtiteln gebraucht. +/*N*/ // Er wird aus aesthetischen Gruenden verdoppelt. +/*N*/ // Also ab jetzt oberer Rand nYOfs + Titel + 2*nYOfs + Unteritel + 2*nYOfs + Diagramm +/*N*/ // Fuer die Legende gilt das fuer den X-Abstand. +/*N*/ nXOfs *= 2; nYOfs *=2; +/*N*/ +/*N*/ if (bTextScalable) +/*N*/ ScaleText(whatTitle,rPageSize); +/*N*/ +/*N*/ if (bShowMainTitle) +/*N*/ DoShowMainTitle(nIndex,nYOfs); +/*N*/ +/*N*/ if (bShowSubTitle) +/*N*/ DoShowSubTitle(nIndex,nYOfs); +/*N*/ +/*N*/ CalculateUpperBorder(); +/*N*/ DoShowLegend(aWholeRect,nXOfs,nYOfs,nIndex); +/*N*/ ResizeChart(rPageSize); +/*N*/ } +/************************************************************************* +|* +|* gesamte Grafik erzeugen +|* +\************************************************************************/ + +namespace +{ +class lcl_MapModeResetGuard +{ +public: + lcl_MapModeResetGuard( OutputDevice * pOutDev ) : + m_pOutDev( pOutDev ), + m_aMapMode( pOutDev ? pOutDev->GetMapMode() : MapMode() ) + {} + + ~lcl_MapModeResetGuard() + { + if( m_pOutDev ) + m_pOutDev->SetMapMode( m_aMapMode ); + } + +private: + OutputDevice * m_pOutDev; + MapMode m_aMapMode; +}; + +} + +/*N*/ void ChartModel::BuildChart(BOOL bCheckRanges,long whatTitle) +/*N*/ { +/*N*/ RTL_LOGFILE_CONTEXT_AUTHOR (context, "sch", "af119097", "::ChartModel::BuildChart"); +/*N*/ +/*N*/ #ifdef DBG_UTIL +/*N*/ ByteString aBStr( aMainTitle, RTL_TEXTENCODING_ASCII_US ); +/*N*/ CHART_TRACE1( "ChartModel::BuildChart (%s)", aBStr.GetBuffer()); +/*N*/ #endif +/*N*/ +/*N*/ //kein setzen der p*Attr durch die Objekte +/*N*/ SetAttrAutoStorage(FALSE); +/*N*/ +/*N*/ if (bNoBuildChart) +/*N*/ { +/*N*/ bShouldBuildChart = TRUE; +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ RTL_LOGFILE_CONTEXT_AUTHOR (context2, +/*N*/ "sch", "af119097", "::ChartModel::BuildChart not locked"); +/*N*/ //nicht ganz so schön, aber vorteilhaft. Hiermit wird ein Itemset mit +/*N*/ //Attributen gefüllt, die beim Einfügen etc. als default benutzt werden +/*N*/ //(SetDefAttrRow). Da an dieser Stelle ein Defaultset erstellt wird, sind +/*N*/ //auch Chart-globale Items gleich gesetzt (Shape3D, Fehlerbalken,Datenbeschriftung) +/*N*/ //lediglich die Linien oder Flächenfarbe muss generiert werden! +/*N*/ //Alternative: nur in ChangeChart defaults erstellen +/*N*/ if( pChartData ) +/*N*/ { +/*N*/ // in scatter charts the first series is for x values +/*N*/ // so use first 'y-series' to copy attributes to new series +/*N*/ if( IsXYChart()) +/*N*/ { +/*N*/ if( GetRowCount() > 1 ) +/*N*/ pDummyAttr->Put( GetDataRowAttr( 1 )); +/*N*/ } +/*N*/ else +/*N*/ if( GetRowCount() > 0 ) +/*N*/ pDummyAttr->Put( GetDataRowAttr( 0 )); +/*N*/ } +/*N*/ +/*N*/ //Hotfix für OLE-Charts #54884# Die Wurzel des Übels liegt möglicherweise irgendwo anders! +/*N*/ if(!pRefOutDev) +/*N*/ { +/*?*/ if(pChartRefOutDev) +/*?*/ { +/*?*/ DBG_ERROR("ChartModel::BuildChart: restoring lost pRefOutDev... something strange happend!"); +/*?*/ SetRefDevice(pChartRefOutDev); +/*?*/ } +/*?*/ else +/*?*/ { +/*?*/ CHART_TRACE( "ChartModel::BuildChart no pRefOutDev!" ); +/*?*/ if( pDocShell ) +/*?*/ { +/*?*/ // this is a valid upcast, because we 'know' that the +/*?*/ // pDocShell member is always a SchChartDocShell +/*?*/ OutputDevice * pOutDev = static_cast< SchChartDocShell * >( pDocShell )->GetRefDevice(); +/*?*/ SetRefDevice( pOutDev ); +/*?*/ GetOutliner()->SetRefDevice( pOutDev ); +/*?*/ } +/*?*/ else +/*?*/ { +/*?*/ OutputDevice* pOut = Application::GetDefaultDevice(); +/*?*/ // this is no error: if a ChartModel is copied via clipboard there is no docshell +/*?*/ // DBG_ERROR("ChartModel::BuildChart : no Docshell! (OutputDevice)"); +/*?*/ pChartRefOutDev = new VirtualDevice( *pOut ); +/*?*/ MapMode aMapMode = pChartRefOutDev->GetMapMode(); +/*?*/ aMapMode.SetMapUnit(MAP_100TH_MM); +/*?*/ pChartRefOutDev->SetMapMode(aMapMode); +/*?*/ SetRefDevice(pChartRefOutDev); +/*?*/ GetOutliner()->SetRefDevice(pChartRefOutDev); +/*?*/ } +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ CheckRanges(bCheckRanges); +/*N*/ +/*N*/ if( !pChartData ) // create default chart if no chart exists so far +/*N*/ InitChartData(); +/*N*/ +/*N*/ if (GetColCount() && GetRowCount()) +/*N*/ { +/*N*/ SdrPage* pPage = GetPage(0); +/*N*/ if (pPage) +/*N*/ { +/*N*/ //#61431# MapMode speichern, am Ende BuildCharts restaurieren +/*N*/ +/*N*/ // remember the MapMode of the Printer and restore it at the end +/*N*/ // of the current block, because it may be changed later in this +/*N*/ // method (AdjustPrinter) +/*N*/ lcl_MapModeResetGuard aPrinterMapModeGuard( +/*N*/ static_cast< SchChartDocShell * >( GetObjectShell() )->GetPrinter() ); +/*N*/ +/*N*/ AdjustPrinter(); +/*N*/ +/*N*/ // FG : DAs hier braucht es weil bei 3D-Charts der Bildchsimraufbau von der ChartScene +/*N*/ // erst beim ersten Paint initiiert wird. Erst dann werden die Achsentitel ausgegeben +/*N*/ // da ist aber BuildChart, aInitialSize=aPageSize setzt schon gelaufen. Deshalb diese +/*N*/ // "Chart-Globale" Variable; +/*N*/ aInitialSizefor3d = aInitialSize; +/*N*/ +/*N*/ // ItemSet mit entspr. Bereich anlegen +/*N*/ //-/ SfxItemSet aSet( GetItemPool(), SID_ATTR_3D_RANGE_SCENE, 0); +/*N*/ SfxItemSet aSet( GetItemPool(), +/*N*/ SDRATTR_3DSCENE_FIRST, SDRATTR_3DSCENE_LAST); +/*N*/ BOOL bItemSetUsed = FALSE; +/*N*/ +/*N*/ if( pScene ) +/*N*/ { +/*N*/ //-/ pScene->TakeAttributes(aSet, TRUE, TRUE); +/*N*/ aSet.Put(pScene->GetItemSet()); +/*N*/ bItemSetUsed = TRUE; +/*N*/ aSceneMatrix = pScene->GetTransform(); +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ SdrObject* pLoadedScene = GetObjWithId(CHOBJID_DIAGRAM, *pPage); +/*N*/ if (pLoadedScene && pLoadedScene->ISA(E3dPolyScene)) +/*N*/ { +/*N*/ //-/ ((E3dObject*)pLoadedScene)->SetAttrUseSubObjects(FALSE); +/*N*/ //-/ pLoadedScene->TakeAttributes(aSet, TRUE, TRUE); +/*N*/ aSet.Put(pLoadedScene->GetItemSet()); +/*N*/ bItemSetUsed = TRUE; +/*N*/ aSceneMatrix = ((E3dPolyScene*) pLoadedScene)->GetTransform(); +/*N*/ Rescue3DObjAttr(pLoadedScene->GetSubList()); //#52277# +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ DeleteChartObjects(); +/*N*/ Size aPageSize = pPage->GetSize(); +/*N*/ +/*N*/ SdrObjGroup *pObj = NULL; +/*N*/ BOOL bNeedSetDiagram=FALSE; +/*N*/ +/*N*/ // if type addin is set the core CreateChart shoudln't be called +/*N*/ // if an addin is used together with a base diagram type the base +/*N*/ // type should be set as chart type here (!= CHSTYLE_ADDIN) +/*N*/ if( eChartStyle != CHSTYLE_ADDIN ) +/*N*/ { +/*N*/ // core CreateChart +/*N*/ CreateRectsAndTitles(whatTitle); +/*N*/ +/*N*/ if(bResizePie && IsPieChart() && IsReal3D()) +/*N*/ { +/*N*/ long nWidth=aChartRect.GetWidth(); +/*N*/ long nHeight=aChartRect.GetHeight(); +/*N*/ if( ((double)nHeight/(double)nWidth) > 0.5 ) +/*N*/ { +/*?*/ bNeedSetDiagram=TRUE; +/*?*/ aChartRect.Top()+=nHeight/4; +/*?*/ aChartRect.Bottom()-=nHeight/4; +/*?*/ SetDiagramHasBeenMovedOrResized(TRUE); +/*?*/ SetUseRelativePositions(TRUE); +/*?*/ bResizePie=FALSE; +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ pObj = CreateChart(aChartRect); +/*N*/ +/*N*/ if (pObj->ISA(SchObjGroup)) +/*N*/ { +/*N*/ ((SchObjGroup *)pObj)->SetModel(this); +/*N*/ ((SchObjGroup *)pObj)->SetGroupIsChart(); +/*N*/ } +/*N*/ +/*N*/ pPage->NbcInsertObject(pObj, 1); +/*N*/ +/*N*/ } +/*N*/ +/*N*/ // ==================== +/*N*/ // call AddIn if required +/*N*/ // ==================== +/*N*/ if( mbIsInitialized && +/*N*/ mxChartAddIn.is()) +/*N*/ { +/*?*/ // avoid recursion +/*?*/ if( ! GetChartStatusFlag( CHS_NO_ADDIN_REFRESH )) +/*?*/ { +/*?*/ SetChartStatusFlag( CHS_NO_ADDIN_REFRESH ); +/*?*/ try +/*?*/ { +/*?*/ mxChartAddIn->refresh(); +/*?*/ } +/*?*/ catch( ::com::sun::star::uno::Exception aEx ) +/*?*/ { +/*?*/ #ifdef DBG_UTIL +/*?*/ // convert ::rtl::OUString => tools String => ByteString +/*?*/ String aStr( aEx.Message ); +/*?*/ ByteString aBStr( aStr, RTL_TEXTENCODING_ASCII_US ); +/*?*/ DBG_ERROR1( "AddIn threw exception during refresh(): %s", aBStr.GetBuffer()); +/*?*/ #endif +/*?*/ } +/*?*/ ResetChartStatusFlag( CHS_NO_ADDIN_REFRESH ); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ aInitialSize = aPageSize; +/*N*/ +/*N*/ if(pScene && IsReal3D() ) +/*N*/ { +/*N*/ +/*N*/ #ifndef NO_56798_FIX //#56798# QuickFix 5.0-Final +/*N*/ +/*N*/ if(bClearDepth) +/*N*/ { +/*N*/ //-/ aSet.ClearItem(SID_ATTR_3D_DEPTH); +/*N*/ aSet.ClearItem(SDRATTR_3DOBJ_DEPTH); +/*N*/ bClearDepth=FALSE; +/*N*/ } +/*N*/ #endif +/*N*/ +/*N*/ //-/ aSet.ClearItem(SID_ATTR_3D_DOUBLE_SIDED); //#56941# +/*N*/ //-/ aSet.ClearItem(SID_ATTR_3D_HORZ_SEGS); +/*?*/ aSet.ClearItem(SDRATTR_3DOBJ_DOUBLE_SIDED); //#56941# +/*?*/ aSet.ClearItem(SDRATTR_3DOBJ_HORZ_SEGS); +/*N*/ +/*N*/ if(bItemSetUsed) +/*N*/ { +/*N*/ //funktioniert nur, wenn nicht durch vorherigen Aufruf (CheckRanges) eine MsgBox entstand +/*N*/ if(eChartStyle != eOldChartStyle) +/*N*/ { +/*N*/ // Falls sich der ChartStyle aendert, die Extrude-Tiefe +/*N*/ // auf unfueltig setzen +/*N*/ const SfxPoolItem* pPoolItem = NULL; +/*N*/ //-/ SfxItemState eState = aSet.GetItemState(SID_ATTR_3D_DEPTH, FALSE, &pPoolItem); +/*N*/ SfxItemState eState = aSet.GetItemState(SDRATTR_3DOBJ_DEPTH, FALSE, &pPoolItem); +/*N*/ if(eState == SFX_ITEM_SET) +/*N*/ { +/*N*/ // Ist gesetzt, invalidiere +/*N*/ //-/ aSet.InvalidateItem(SID_ATTR_3D_DEPTH); +/*N*/ aSet.InvalidateItem(SDRATTR_3DOBJ_DEPTH); +/*N*/ CHART_TRACE( "Chart: Invalidating saveable item ..." ); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ // Attribute an neuer Szene setzen +/*N*/ +/*N*/ //-/ pScene->NbcSetAttributes(aSet, TRUE); +/*N*/ pScene->SetItemSet(aSet); +/*N*/ +/*N*/ } +/*N*/ +/*N*/ pScene->NbcSetTransform(aSceneMatrix); +/*N*/ +/*N*/ const SfxPoolItem *pPoolItem = NULL; +/*N*/ if(!IsPieChart()) +/*N*/ { +/*N*/ if(pChartXAxis->HasDescription()) +/*N*/ { +/*N*/ if(GetAttr(CHOBJID_DIAGRAM_X_AXIS).GetItemState( SCHATTR_TEXT_OVERLAP, FALSE, &pPoolItem ) >= SFX_ITEM_AVAILABLE ) +/*N*/ { +/*N*/ if(!( (const SfxBoolItem*) pPoolItem)->GetValue()) +/*N*/ pScene->ReduceDescrList(aXDescrList); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ if(pChartYAxis->HasDescription()) +/*N*/ { +/*N*/ if(GetAttr(CHOBJID_DIAGRAM_Y_AXIS).GetItemState( SCHATTR_TEXT_OVERLAP, FALSE, &pPoolItem ) >= SFX_ITEM_AVAILABLE ) +/*N*/ { +/*N*/ if(!( (const SfxBoolItem*) pPoolItem)->GetValue()) +/*N*/ pScene->ReduceDescrList(aYDescrList); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ if(pChartZAxis->HasDescription()) +/*N*/ { +/*N*/ if(GetAttr(CHOBJID_DIAGRAM_Z_AXIS).GetItemState( SCHATTR_TEXT_OVERLAP, FALSE, &pPoolItem ) >= SFX_ITEM_AVAILABLE ) +/*N*/ { +/*N*/ if(!( (const SfxBoolItem*) pPoolItem)->GetValue()) +/*N*/ pScene->ReduceDescrList(aZDescrList); +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ +/*N*/ if(bNeedSetDiagram && pScene) +/*N*/ { +/*?*/ Rectangle aRectangle; +/*?*/ aRectangle = pScene->GetSnapRect(); +/*?*/ ((ChartScene *)pObj)->SetAskForLogicRect(FALSE); +/*?*/ SetDiagramRectangle(aRectangle); +/*?*/ SetDiagramHasBeenMovedOrResized(TRUE); +/*N*/ } +/*N*/ +/*N*/ //#61431# MapMode speichern, am Ende BuildCharts restaurieren +/*N*/ +/*N*/ // the MapMode of the RefDevice is restored by the +/*N*/ // lcl_MapModeResetGuard +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ //Jetzt sollen sich die Objekte wieder drum kümmern, da?das Model die Attribute erhält +/*N*/ SetAttrAutoStorage(TRUE); +/*N*/ SetDiagramRectangle( aChartRect ); +/*N*/ eOldChartStyle = eChartStyle; +/*N*/ +/*N*/ // notify build to listeners +/*N*/ Broadcast( SchReBuildHint()); +/*N*/ } + + + +/*N*/ void ChartModel::SetUseRelativePositions (BOOL value) +/*N*/ { +/*N*/ if (value == FALSE) +/*N*/ { +/*N*/ SetDiagramHasBeenMovedOrResized(FALSE); +/*N*/ SetMainTitleHasBeenMoved(FALSE); +/*N*/ SetSubTitleHasBeenMoved(FALSE); +/*N*/ SetLegendHasBeenMoved(FALSE); +/*N*/ SetXAxisTitleHasBeenMoved(FALSE); +/*N*/ SetYAxisTitleHasBeenMoved(FALSE); +/*N*/ SetZAxisTitleHasBeenMoved(FALSE); +/*N*/ if((IsReal3D() && IsPieChart())) +/*N*/ { +/*?*/ Matrix4D aMatrix; //Reset der Matrix.... könnte man auch grundsätzlich machen? +/*?*/ aMatrix.RotateX(-F_PI/3); +/*?*/ aSceneMatrix=aMatrix; +/*?*/ if(pScene) +/*?*/ pScene->NbcSetTransform(aSceneMatrix); +/*?*/ bResizePie=TRUE; +/*N*/ } +/*N*/ } +/*N*/ bUseRelativePositionsForChartGroups = value; +/*N*/ } + +/************************************************************************* +|* +|* bestimme Mittelwert +|* +\************************************************************************/ + + + +/************************************************************************* +|* +|* erzeuge mittelwertlinie +|* +\************************************************************************/ + + + +/************************************************************************* +|* +|* bestimme Varianz +|* +\************************************************************************/ + + +/*N*/ double ChartModel::GetVariantY (long nRow) +/*N*/ { +/*N*/ long nColCnt = GetColCount(); +/*N*/ +/*N*/ if (nColCnt) +/*N*/ { +/*N*/ double fSum = 0.0; +/*N*/ double fQuadSum = 0.0; +/*N*/ long nValidCols = nColCnt; +/*N*/ +/*N*/ for (long nCol = 0; +/*N*/ nCol < nColCnt; +/*N*/ nCol ++) +/*N*/ { +/*N*/ double fData = GetData ((short) nCol, (short) nRow, FALSE); +/*N*/ +/*N*/ if( fData == DBL_MIN ) +/*N*/ { +/*N*/ nValidCols--; +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ fSum += fData; +/*N*/ fQuadSum += fData * fData; +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ return nValidCols? (fQuadSum - fSum*fSum / (double)nValidCols) / (double)nValidCols: DBL_MIN; +/*N*/ } +/*N*/ else return 0; +/*N*/ } + +/************************************************************************* +|* +|* bestimme Varianz +|* +\************************************************************************/ + + +/*N*/ double ChartModel::GetSigmaY (long nRow) +/*N*/ { +/*N*/ return sqrt (GetVariantY (nRow)); +/*N*/ } + +/************************************************************************* +|* +|* bestimme Fehler des groessten Wertes +|* +\************************************************************************/ + + +/*N*/ double ChartModel::GetBigErrorY (long nRow, +/*N*/ double fError) +/*N*/ { +/*N*/ double fMax = 0.0; +/*N*/ long nColCnt = GetColCount(); +/*N*/ +/*N*/ for (long nCol = 0; +/*N*/ nCol < nColCnt; +/*N*/ nCol ++) +/*N*/ { +/*N*/ double fData = GetData ((short) nCol, (short) nRow, FALSE); +/*N*/ +/*N*/ if (fData != DBL_MIN) +/*N*/ if (fData > fMax) fMax = fData; +/*N*/ } +/*N*/ +/*N*/ return fMax * fError / 100.0; +/*N*/ } + +/************************************************************************* +|* +|* bestimme lineare regression +|* +\************************************************************************/ + + + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |