diff options
Diffstat (limited to 'binfilter/bf_sch/source/core/sch_chtmode3.cxx')
-rw-r--r-- | binfilter/bf_sch/source/core/sch_chtmode3.cxx | 1712 |
1 files changed, 1712 insertions, 0 deletions
diff --git a/binfilter/bf_sch/source/core/sch_chtmode3.cxx b/binfilter/bf_sch/source/core/sch_chtmode3.cxx new file mode 100644 index 000000000000..0c6583dc7537 --- /dev/null +++ b/binfilter/bf_sch/source/core/sch_chtmode3.cxx @@ -0,0 +1,1712 @@ +/* -*- 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 <bf_svx/tabline.hxx> +#include <bf_svx/svdograf.hxx> +#include <bf_svx/svdopath.hxx> +#include <bf_svtools/whiter.hxx> +#include <bf_svx/xbtmpit.hxx> + +#include <bf_svx/eeitem.hxx> +#ifndef _SVX_COLRITEM_HXX //autogen +#define ITEMID_COLOR EE_CHAR_COLOR +#endif +#include <bf_svx/xflftrit.hxx> +#include <bf_svx/xflhtit.hxx> +#include <bf_svx/xtable.hxx> +#include "schattr.hxx" + +// header for SvxChartTextOrientItem +#ifndef _SVX_CHRTITEM_HXX +#define ITEMID_DOUBLE 0 +#define ITEMID_CHARTTEXTORIENT SCHATTR_TEXT_ORIENT + + +#endif +#define ITEMID_FONTHEIGHT EE_CHAR_FONTHEIGHT +#include <globfunc.hxx> +#include <bf_svx/svxids.hrc> + + + +#include "schattr.hxx" +#ifndef _SVX_BRSHITEM_HXX //autogen +#define ITEMID_BRUSH SCHATTR_SYMBOL_BRUSH +#include <bf_svx/brshitem.hxx> +#endif +#ifndef _SVX_SIZEITEM_HXX //autogen +#define ITEMID_SIZE 0 +#include <bf_svx/sizeitem.hxx> +#endif +// header for SAL_STATIC_CAST +#include <sal/types.h> + +#include <bf_svx/xlnedit.hxx> + +#include <bf_svx/xlnstit.hxx> + +#include <bf_svx/xlndsit.hxx> + +#include <bf_svx/xlnclit.hxx> + +#include <bf_svx/xlnwtit.hxx> + + +#include "glob.hrc" + +#include "chtscene.hxx" +#include "pairs.hxx" + +#include "chaxis.hxx" + +namespace binfilter { + +/************************************************************************* +|* +|* Entscheidung, ob BuildChart notwendig +|* +\************************************************************************/ +/*N*/ BOOL ChartModel::IsAttrChangeNeedsBuildChart(const SfxItemSet& rAttr) +/*N*/ { +/*N*/ // BM #60999# rebuild for all EE_CHAR attributes because of possibly red color for negative numbers. sorry :-( +/*N*/ return TRUE; + + /* + BOOL bNeedBuild=FALSE; + + SfxWhichIter aWhichIter(rAttr); + USHORT nWhich = aWhichIter.FirstWhich(); + while (nWhich != 0) + { + if (rAttr.GetItemState(nWhich) == SFX_ITEM_SET) + { + if(nWhich < XATTR_LINE_FIRST || nWhich > XATTR_FILL_LAST) + { + + switch(nWhich) + { + + case EE_CHAR_COLOR: + case EE_CHAR_UNDERLINE: + case EE_CHAR_STRIKEOUT: + break; + + default: + + bNeedBuild=TRUE; + break; + } + } + } + nWhich = aWhichIter.NextWhich(); + } + return bNeedBuild; +*/ +/*N*/ } + +/************************************************************************* +|* +|* Achsen-Attribute ermitteln +|* +\************************************************************************/ +/*N*/ ChartAxis* ChartModel::GetAxis(long nId) +/*N*/ { +/*N*/ switch(nId) +/*N*/ { +/*N*/ case CHOBJID_DIAGRAM_X_AXIS: +/*N*/ return pChartXAxis; +/*N*/ case CHOBJID_DIAGRAM_Y_AXIS: +/*N*/ return pChartYAxis; +/*N*/ case CHOBJID_DIAGRAM_Z_AXIS: +/*N*/ return pChartZAxis; +/*N*/ case CHOBJID_DIAGRAM_B_AXIS: +/*N*/ return pChartBAxis; +/*?*/ case CHOBJID_DIAGRAM_A_AXIS: +/*?*/ return pChartAAxis; +/*N*/ } +/*?*/ DBG_ERROR("ChartModel::GetAxis() illegal argument (nId=CHOBJID_)"); +/*?*/ return pChartYAxis; +/*N*/ } + + + +/* + Get axis attributes. + If pAxisObj is NULL then the intersection of the attributes of all five + axes is taken, regardless of wether the axes are visible or not. +*/ +/*N*/ SfxItemSet ChartModel::GetFullAxisAttr( const SdrObjGroup* pAxisObj, bool bOnlyInserted ) const +/*N*/ { +/*N*/ if (pAxisObj) +/*N*/ { +/*?*/ SchObjectId* pObjId = GetObjectId(*pAxisObj); +/*?*/ +/*?*/ if (pObjId) +/*?*/ { +/*?*/ long nId=pObjId->GetObjId(); +/*?*/ +/*?*/ SfxItemSet aAttr(*pItemPool,nAxisWhichPairs); +/*?*/ aAttr.Put(GetAttr(nId)); +/*?*/ ((ChartModel*)this)->GetAxis(nId)->GetMembersAsAttr(aAttr); +/*?*/ return aAttr; +/*?*/ } +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ // clear member item set for all axes +/*N*/ pAxisAttr->ClearItem(); +/*N*/ bool bIsFirst = true; +/*N*/ +/*N*/ if( ! bOnlyInserted || HasAxis( CHOBJID_DIAGRAM_X_AXIS )) +/*N*/ if( bIsFirst ) +/*N*/ { +/*N*/ pAxisAttr->Set( GetAttr( CHOBJID_DIAGRAM_X_AXIS )); +/*N*/ bIsFirst = false; +/*N*/ } +/*N*/ else +/*?*/ IntersectSets( GetAttr( CHOBJID_DIAGRAM_X_AXIS ), *pAxisAttr ); +/*N*/ +/*N*/ if( ! bOnlyInserted || HasAxis( CHOBJID_DIAGRAM_Y_AXIS )) +/*N*/ if( bIsFirst ) +/*N*/ { +/*?*/ pAxisAttr->Set( GetAttr( CHOBJID_DIAGRAM_Y_AXIS )); +/*?*/ bIsFirst = false; +/*N*/ } +/*N*/ else +/*N*/ IntersectSets( GetAttr( CHOBJID_DIAGRAM_Y_AXIS ), *pAxisAttr ); +/*N*/ +/*N*/ if( ! bOnlyInserted || (Is3DChart() && HasAxis( CHOBJID_DIAGRAM_Z_AXIS ))) +/*N*/ if( bIsFirst ) +/*N*/ { +/*?*/ pAxisAttr->Set( GetAttr( CHOBJID_DIAGRAM_Z_AXIS )); +/*?*/ bIsFirst = false; +/*N*/ } +/*N*/ else +/*N*/ IntersectSets( GetAttr( CHOBJID_DIAGRAM_Z_AXIS ), *pAxisAttr ); +/*N*/ +/*N*/ if( ! bOnlyInserted || HasAxis( CHOBJID_DIAGRAM_A_AXIS )) +/*?*/ if( bIsFirst ) +/*?*/ { +/*?*/ pAxisAttr->Set( GetAttr( CHOBJID_DIAGRAM_A_AXIS )); +/*?*/ bIsFirst = false; +/*?*/ } +/*?*/ else +/*?*/ IntersectSets( GetAttr( CHOBJID_DIAGRAM_A_AXIS ), *pAxisAttr ); +/*N*/ +/*N*/ if( ! bOnlyInserted || HasAxis( CHOBJID_DIAGRAM_B_AXIS )) +/*?*/ if( bIsFirst ) +/*?*/ { +/*?*/ pAxisAttr->Set( GetAttr( CHOBJID_DIAGRAM_B_AXIS )); +/*?*/ bIsFirst = false; +/*?*/ } +/*?*/ else +/*?*/ IntersectSets( GetAttr( CHOBJID_DIAGRAM_B_AXIS ), *pAxisAttr ); +/*N*/ } +/*N*/ +/*N*/ // if( bOnlyInserted ) +/*N*/ // pAxisAttr->ClearItem( SCHATTR_AXIS_SHOWDESCR ); +/*N*/ +/*N*/ return *pAxisAttr; +/*N*/ } + +/************************************************************************* +|* +|* Achsen-Attribute aendern; +|* Liefert bei geaenderten Attributen TRUE. +|* +\************************************************************************/ + +/*N*/ BOOL ChartModel::ChangeAxisAttr(const SfxItemSet &rAttr,SdrObjGroup *pAxisObj,BOOL bMerge) +/*N*/ { +/*N*/ if (pAxisObj) +/*N*/ { +/*N*/ SchObjectId *pObjId = GetObjectId(*pAxisObj); +/*N*/ +/*N*/ if (! pObjId) return FALSE; +/*N*/ else +/*N*/ { +/*N*/ SfxItemSet aSet(*pItemPool,nAxisWhichPairs); +/*N*/ aSet.Put(rAttr); +/*N*/ +/*N*/ const SfxPoolItem *pPoolItem = NULL; +/*N*/ +/*N*/ if(rAttr.GetItemState(SID_ATTR_NUMBERFORMAT_VALUE,TRUE,&pPoolItem)==SFX_ITEM_SET) +/*N*/ { +/*N*/ UINT32 nTmp=((const SfxUInt32Item*)pPoolItem)->GetValue(); +/*N*/ aSet.Put(SfxUInt32Item(IsPercentChart() +/*N*/ ? SCHATTR_AXIS_NUMFMTPERCENT : SCHATTR_AXIS_NUMFMT , nTmp)); +/*N*/ } +/*N*/ +/*N*/ long nId=pObjId->GetObjId(); +/*N*/ SetAttributes( nId, aSet, bMerge ); // at the model +/*N*/ SetAxisAttributes( &GetAttr( nId ), pAxisObj ); // at the drawing object +/*N*/ +/*N*/ // at the axis itself! +/*N*/ long nAxisUId = ChartAxis::GetUniqueIdByObjectId( nId ); +/*N*/ if( nAxisUId != CHAXIS_AXIS_UNKNOWN ) +/*N*/ { +/*N*/ // this method always returns a valid pointer +/*N*/ GetAxisByUID( nAxisUId )->SetAttributes( rAttr ); +/*N*/ } +/*N*/ else +/*N*/ DBG_ERROR( "ChartAxis not found for Object" ); +/*N*/ +/*N*/ if(IsAttrChangeNeedsBuildChart(aSet)) +/*N*/ BuildChart(FALSE,nId); //z.B. auch Texte skalieren! +/*N*/ return TRUE; +/*N*/ } +/*N*/ } +/*N*/ else +/*N*/ { +/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 PutAxisAttr(rAttr,bMerge); + return FALSE; +/*N*/ } +/*N*/ } + +/************************************************************************* +|* +|* Datenreihen-Attribute setzen +|* +\************************************************************************/ +/*N*/ void ChartModel::PutDataRowAttrAll(const SfxItemSet& rAttr,BOOL bMerge,BOOL bClearPoints) +/*N*/ { +/*N*/ long nCnt=aDataRowAttrList.Count(); +/*N*/ while(nCnt--) +/*N*/ PutDataRowAttr(nCnt,rAttr,bMerge,bClearPoints); +/*N*/ } + +/*N*/ void ChartModel::PutDataRowAttr(long nRow, const SfxItemSet& rAttr,BOOL bMerge,BOOL bClearPoints) +/*N*/ { +/*N*/ +/*N*/ CHART_TRACE1( "ChartModel::PutDataRowAttr %smerge", bMerge? "": "NO " ); +/*N*/ // DBG_ITEMS((SfxItemSet&)rAttr,this); +/*N*/ +/*N*/ if( aDataRowAttrList.Count() <= (unsigned long)nRow ) +/*N*/ { +/*?*/ DBG_ERROR( "Invalid index to array requested" ); +/*?*/ return; +/*N*/ } +/*N*/ +/*N*/ if(!bMerge) +/*?*/ aDataRowAttrList.GetObject(nRow)->ClearItem(); +/*N*/ +/*N*/ PutItemSetWithNameCreation( *aDataRowAttrList.GetObject( nRow ), rAttr ); +/*N*/ +/*N*/ if(bClearPoints && (nRow < GetRowCount())) +/*N*/ { +/*N*/ long nCol,nColCnt=GetColCount(); +/*N*/ for(nCol=0;nCol<nColCnt;nCol++) +/*N*/ { +/*N*/ ClearDataPointAttr(nCol,nRow,rAttr); +/*N*/ } +/*N*/ } +/*N*/ } +/************************************************************************* +|* +|* Datenreihen-Attribute ermitteln +|* +\************************************************************************/ + +/*N*/ const SfxItemSet& ChartModel::GetDataRowAttr( long nRow ) const +/*N*/ { +/*N*/ if( nRow < (long)aDataRowAttrList.Count() ) +/*N*/ { +/*N*/ SfxItemSet* pSet = aDataRowAttrList.GetObject( nRow ); +/*N*/ DBG_ASSERT( pSet, "Invalid ItemSet" ); +/*N*/ return *pSet; +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ DBG_ERROR( "Requested data row attribute is unavailable" ); +/*N*/ +/*N*/ // return something +/*?*/ DBG_ASSERT( pChartAttr, "Invalid Chart-ItemSet" ); +/*?*/ return *pChartAttr; +/*N*/ } +/*N*/ } + +/************************************************************************* +|* +|* Erstelle Symbole fuer Diagrammtypen mit Symbolen +|* +\************************************************************************/ + +/*N*/ SdrObject* ChartModel::CreateSymbol (Point aPoint, +/*N*/ int nRow, +/*N*/ int nColumn, +/*N*/ SfxItemSet &aDataAttr, +/*N*/ long nSymbolSize, +/*N*/ BOOL bInsert) +/*N*/ { +/*N*/ long nWhatSymbol=SVX_SYMBOLTYPE_AUTO; +/*N*/ SdrObject* pObj=NULL; +/*N*/ long nHalfSymbolSizeX = nSymbolSize / 4; +/*N*/ long nHalfSymbolSizeY = nSymbolSize / 4; +/*N*/ Size aSize(1,1); +/*N*/ long n1Pixel=pRefOutDev ? pRefOutDev->PixelToLogic(aSize).Width() : nHalfSymbolSizeY/2; +/*N*/ +/*N*/ if(!bInsert) +/*N*/ n1Pixel=nHalfSymbolSizeY/2; //für Legende vergrößern +/*N*/ +/*N*/ const SfxPoolItem* pPoolItem; +/*N*/ if(aDataAttr.GetItemState(SCHATTR_STYLE_SYMBOL, TRUE, &pPoolItem) == SFX_ITEM_SET) +/*N*/ { +/*N*/ nWhatSymbol = ((const SfxInt32Item*) pPoolItem)->GetValue(); +/*N*/ } +/*N*/ if(nWhatSymbol<0) +/*N*/ { +/*N*/ BOOL bStock=FALSE; +/*N*/ switch(nWhatSymbol) +/*N*/ { +/*N*/ case SVX_SYMBOLTYPE_NONE: +/*N*/ { +/*N*/ // Create a square as symbol. Its fill and line style is +/*N*/ // later to invisible. This does not show the symbol but +/*N*/ // leaves the data point selectable. +/*N*/ XPolygon aPolygon (5); +/*N*/ aPolygon[0].X() = aPoint.X() - nHalfSymbolSizeX; +/*N*/ aPolygon[0].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*N*/ aPolygon[1].X() = aPoint.X() - nHalfSymbolSizeX; +/*N*/ aPolygon[1].Y() = aPoint.Y() + nHalfSymbolSizeY; +/*N*/ aPolygon[2].X() = aPoint.X() + nHalfSymbolSizeX; +/*N*/ aPolygon[2].Y() = aPoint.Y() + nHalfSymbolSizeY; +/*N*/ aPolygon[3].X() = aPoint.X() + nHalfSymbolSizeX; +/*N*/ aPolygon[3].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*N*/ aPolygon[4].X() = aPolygon[0].X(); +/*N*/ aPolygon[4].Y() = aPolygon[0].Y(); +/*N*/ pObj = new SdrPathObj(OBJ_POLY, XPolyPolygon(aPolygon)); +/*N*/ break; +/*N*/ } +/*N*/ case SVX_SYMBOLTYPE_UNKNOWN: +/*N*/ case SVX_SYMBOLTYPE_AUTO: +/*N*/ CHART_TRACE( "creating SVX_SYMBOLTYPE_AUTO" ); +/*N*/ +/*N*/ +/*N*/ switch(eChartStyle) +/*N*/ { +/*N*/ default: +/*N*/ break; +/*N*/ case CHSTYLE_2D_STOCK_2: +/*N*/ case CHSTYLE_2D_STOCK_4: +/*N*/ bStock=TRUE; +/*N*/ nHalfSymbolSizeX=n1Pixel; +/*N*/ break; +/*N*/ case CHSTYLE_2D_STOCK_1: +/*N*/ bStock=TRUE; +/*N*/ if(nRow!=2) +/*N*/ nHalfSymbolSizeX=n1Pixel; +/*N*/ break; +/*N*/ case CHSTYLE_2D_STOCK_3: +/*?*/ bStock=TRUE; +/*?*/ if(nRow!=3) +/*?*/ nHalfSymbolSizeX=n1Pixel; +/*N*/ break; +/*N*/ } +/*N*/ if(bStock) +/*N*/ { +/*N*/ XPolygon aPolygon(2); +/*N*/ +/*N*/ aPolygon[0].X() = aPoint.X(); +/*N*/ aPolygon[0].Y() = aPoint.Y(); +/*N*/ aPolygon[1].X() = aPoint.X() + nHalfSymbolSizeX; +/*N*/ aPolygon[1].Y() = aPoint.Y(); +/*N*/ pObj = new SdrPathObj(OBJ_POLY, XPolyPolygon(aPolygon)); +/*N*/ break; +/*N*/ } +/*N*/ nWhatSymbol=nRow; +/*N*/ aDataAttr.ClearItem(SCHATTR_SYMBOL_BRUSH);//Größe gegebenenfalls löschen +/*N*/ aDataAttr.ClearItem(SCHATTR_SYMBOL_SIZE);//Größe gegebenenfalls löschen +/*N*/ break; +/*N*/ +/*N*/ case SVX_SYMBOLTYPE_BRUSHITEM: +/*N*/ { +/*?*/ if(aDataAttr.GetItemState(SCHATTR_SYMBOL_BRUSH,TRUE,&pPoolItem)==SFX_ITEM_SET) +/*?*/ { +/*?*/ CHART_TRACE( "creating SVX_SYMBOLTYPE_BRUSHITEM" ); +/*?*/ const Graphic* pGraphic = ((const SvxBrushItem *)pPoolItem)->GetGraphic(); +/*?*/ Size aSize; +/*?*/ +/*?*/ if( pGraphic ) +/*?*/ { +/*?*/ if(!pObj && aDataAttr.GetItemState(SCHATTR_SYMBOL_SIZE,TRUE,&pPoolItem)==SFX_ITEM_SET) +/*?*/ { +/*?*/ CHART_TRACE( "Size by Item" ); +/*?*/ aSize=((const SvxSizeItem*)pPoolItem)->GetSize(); +/*?*/ } +/*?*/ else +/*?*/ { +/*?*/ CHART_TRACE( "Size by Graphic" ); +/*?*/ if( pGraphic ) +/*?*/ aSize = ( OutputDevice::LogicToLogic( pGraphic->GetPrefSize(), +/*?*/ pGraphic->GetPrefMapMode(), +/*?*/ MAP_100TH_MM )); +/*?*/ } +/*?*/ +/*?*/ Rectangle aRect(aPoint.X()-aSize.Width()/2,aPoint.Y()-aSize.Height()/2 +/*?*/ ,aPoint.X()+aSize.Width()/2,aPoint.Y()+aSize.Height()/2); +/*?*/ pObj = new SdrGrafObj(*pGraphic); +/*?*/ GetPage(0)->NbcInsertObject(pObj,0); +/*?*/ pObj->NbcSetSnapRect(aRect); +/*?*/ GetPage(0)->RemoveObject(0); +/*?*/ } +/*?*/ } +/*?*/ else +/*?*/ { +/*?*/ CHART_TRACE( "failed in SVX_SYMBOLTYPE_BRUSHITEM" ); +/*?*/ nWhatSymbol=nRow; +/*?*/ } +/*N*/ } +/*N*/ break; +/*N*/ } +/*N*/ } +/*N*/ else +/*N*/ { +/*?*/ CHART_TRACE1( "creating SVX_SYMBOLTYPE = %d", nWhatSymbol ); +/*N*/ } +/*N*/ +/*N*/ +/*N*/ if(!pObj && aDataAttr.GetItemState(SCHATTR_SYMBOL_SIZE,TRUE,&pPoolItem)==SFX_ITEM_SET) +/*N*/ { +/*?*/ Size aSize=((const SvxSizeItem*)pPoolItem)->GetSize(); +/*?*/ nHalfSymbolSizeX = aSize.Width() / 2; +/*?*/ nHalfSymbolSizeY = aSize.Height() / 2; +/*?*/ CHART_TRACE2( "reading SCHATTR_SYMBOL_SIZE -> Size = (%ld, %ld)", aSize.Width(), aSize.Height() ); +/*N*/ } +/*N*/ +/*N*/ if(!pObj) //dann default generieren +/*N*/ { +/*N*/ switch (nWhatSymbol % 8) +/*N*/ { +/*N*/ case 0 : +/*N*/ { +/*N*/ XPolygon aPolygon (5); +/*N*/ +/*N*/ aPolygon[0].X() = aPoint.X() - nHalfSymbolSizeX; +/*N*/ aPolygon[0].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*N*/ aPolygon[1].X() = aPoint.X() - nHalfSymbolSizeX; +/*N*/ aPolygon[1].Y() = aPoint.Y() + nHalfSymbolSizeY; +/*N*/ aPolygon[2].X() = aPoint.X() + nHalfSymbolSizeX; +/*N*/ aPolygon[2].Y() = aPoint.Y() + nHalfSymbolSizeY; +/*N*/ aPolygon[3].X() = aPoint.X() + nHalfSymbolSizeX; +/*N*/ aPolygon[3].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*N*/ aPolygon[4].X() = aPolygon[0].X(); +/*N*/ aPolygon[4].Y() = aPolygon[0].Y(); +/*N*/ +/*N*/ pObj = new SdrPathObj(OBJ_POLY, XPolyPolygon(aPolygon)); +/*N*/ break; +/*N*/ } +/*N*/ +/*N*/ case 1 : +/*N*/ { +/*N*/ XPolygon aPolygon (5); +/*N*/ +/*N*/ aPolygon[0].X() = aPoint.X(); +/*N*/ aPolygon[0].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*N*/ aPolygon[1].X() = aPoint.X() + nHalfSymbolSizeX; +/*N*/ aPolygon[1].Y() = aPoint.Y(); +/*N*/ aPolygon[2].X() = aPoint.X(); +/*N*/ aPolygon[2].Y() = aPoint.Y() + nHalfSymbolSizeY;; +/*N*/ aPolygon[3].X() = aPoint.X() - nHalfSymbolSizeX; +/*N*/ aPolygon[3].Y() = aPoint.Y(); +/*N*/ aPolygon[4].X() = aPolygon[0].X(); +/*N*/ aPolygon[4].Y() = aPolygon[0].Y(); +/*N*/ +/*N*/ pObj = new SdrPathObj(OBJ_POLY, XPolyPolygon(aPolygon)); +/*N*/ break; +/*N*/ } +/*N*/ +/*N*/ case 2 : +/*N*/ { +/*N*/ XPolygon aPolygon (4); +/*N*/ +/*N*/ aPolygon[0].X() = aPoint.X() - nHalfSymbolSizeX; +/*N*/ aPolygon[0].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*N*/ aPolygon[1].X() = aPoint.X() + nHalfSymbolSizeX; +/*N*/ aPolygon[1].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*N*/ aPolygon[2].X() = aPoint.X(); +/*N*/ aPolygon[2].Y() = aPoint.Y() + nHalfSymbolSizeY; +/*N*/ aPolygon[3].X() = aPolygon[0].X(); +/*N*/ aPolygon[3].Y() = aPolygon[0].Y(); +/*N*/ +/*N*/ pObj = new SdrPathObj(OBJ_POLY, XPolyPolygon(aPolygon)); +/*N*/ break; +/*N*/ } +/*N*/ +/*N*/ case 3 : +/*N*/ { +/*N*/ XPolygon aPolygon (4); +/*N*/ +/*N*/ aPolygon[0].X() = aPoint.X() - nHalfSymbolSizeX; +/*N*/ aPolygon[0].Y() = aPoint.Y() + nHalfSymbolSizeY; +/*N*/ aPolygon[1].X() = aPoint.X() + nHalfSymbolSizeX; +/*N*/ aPolygon[1].Y() = aPoint.Y() + nHalfSymbolSizeY; +/*N*/ aPolygon[2].X() = aPoint.X(); +/*N*/ aPolygon[2].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*N*/ aPolygon[3].X() = aPolygon[0].X(); +/*N*/ aPolygon[3].Y() = aPolygon[0].Y(); +/*N*/ +/*N*/ pObj = new SdrPathObj(OBJ_POLY, XPolyPolygon(aPolygon)); +/*N*/ break; +/*N*/ } +/*N*/ +/*N*/ case 4 : +/*N*/ { +/*?*/ XPolygon aPolygon (4); +/*?*/ +/*?*/ aPolygon[0].X() = aPoint.X() - nHalfSymbolSizeX; +/*?*/ aPolygon[0].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*?*/ aPolygon[1].X() = aPoint.X() + nHalfSymbolSizeX; +/*?*/ aPolygon[1].Y() = aPoint.Y(); +/*?*/ aPolygon[2].X() = aPoint.X() - nHalfSymbolSizeX; +/*?*/ aPolygon[2].Y() = aPoint.Y() + nHalfSymbolSizeY; +/*?*/ aPolygon[3].X() = aPolygon[0].X(); +/*?*/ aPolygon[3].Y() = aPolygon[0].Y(); +/*?*/ +/*?*/ pObj = new SdrPathObj(OBJ_POLY, XPolyPolygon(aPolygon)); +/*?*/ break; +/*?*/ } +/*?*/ +/*?*/ case 5 : +/*?*/ { +/*?*/ XPolygon aPolygon (4); +/*?*/ +/*?*/ aPolygon[0].X() = aPoint.X() + nHalfSymbolSizeX; +/*?*/ aPolygon[0].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*?*/ aPolygon[1].X() = aPoint.X() - nHalfSymbolSizeX; +/*?*/ aPolygon[1].Y() = aPoint.Y(); +/*?*/ aPolygon[2].X() = aPoint.X() + nHalfSymbolSizeX; +/*?*/ aPolygon[2].Y() = aPoint.Y() + nHalfSymbolSizeY; +/*?*/ aPolygon[3].X() = aPolygon[0].X(); +/*?*/ aPolygon[3].Y() = aPolygon[0].Y(); +/*?*/ +/*?*/ pObj = new SdrPathObj(OBJ_POLY, XPolyPolygon(aPolygon)); +/*?*/ break; +/*?*/ } +/*?*/ +/*?*/ case 6 : +/*?*/ { +/*?*/ XPolygon aPolygon (5); +/*?*/ +/*?*/ aPolygon[0].X() = aPoint.X() - nHalfSymbolSizeX; +/*?*/ aPolygon[0].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*?*/ aPolygon[1].X() = aPoint.X() + nHalfSymbolSizeX; +/*?*/ aPolygon[1].Y() = aPoint.Y() + nHalfSymbolSizeY; +/*?*/ aPolygon[2].X() = aPoint.X() + nHalfSymbolSizeX; +/*?*/ aPolygon[2].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*?*/ aPolygon[3].X() = aPoint.X() - nHalfSymbolSizeX; +/*?*/ aPolygon[3].Y() = aPoint.Y() + nHalfSymbolSizeY; +/*?*/ aPolygon[4].X() = aPolygon[0].X(); +/*?*/ aPolygon[4].Y() = aPolygon[0].Y(); +/*?*/ +/*?*/ pObj = new SdrPathObj(OBJ_POLY, XPolyPolygon(aPolygon)); +/*?*/ break; +/*?*/ } +/*?*/ +/*?*/ case 7 : +/*?*/ { +/*?*/ XPolygon aPolygon (5); +/*?*/ +/*?*/ aPolygon[0].X() = aPoint.X() - nHalfSymbolSizeX; +/*?*/ aPolygon[0].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*?*/ aPolygon[1].X() = aPoint.X() + nHalfSymbolSizeX; +/*?*/ aPolygon[1].Y() = aPoint.Y() + nHalfSymbolSizeY; +/*?*/ aPolygon[2].X() = aPoint.X() - nHalfSymbolSizeX; +/*?*/ aPolygon[2].Y() = aPoint.Y() + nHalfSymbolSizeY; +/*?*/ aPolygon[3].X() = aPoint.X() + nHalfSymbolSizeX; +/*?*/ aPolygon[3].Y() = aPoint.Y() - nHalfSymbolSizeY; +/*?*/ aPolygon[4].X() = aPolygon[0].X(); +/*?*/ aPolygon[4].Y() = aPolygon[0].Y(); +/*?*/ +/*?*/ pObj = new SdrPathObj(OBJ_POLY, XPolyPolygon(aPolygon)); +/*?*/ break; +/*?*/ } +/*?*/ +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ if (bInsert) //nur in CreateLegend FALSE! +/*N*/ { +/*N*/ SfxItemSet aSymbolAttr(aDataAttr); +/*N*/ GenerateSymbolAttr(aSymbolAttr,nRow,SYMBOLMODE_ROW); +/*N*/ if (nWhatSymbol == SVX_SYMBOLTYPE_NONE) +/*N*/ { +/*N*/ // Don´t show the symbol. It is only needed for selection of the +/*N*/ // data point. +/*N*/ aSymbolAttr.Put(XFillStyleItem (XFILL_NONE)); +/*N*/ aSymbolAttr.Put(XLineStyleItem (XLINE_NONE)); +/*N*/ } + if( pObj ) + { +/*N*/ pObj->SetModel( this ); +/*N*/ pObj = SetObjectAttr (pObj, CHOBJID_DIAGRAM_DATA, TRUE, TRUE, &aSymbolAttr); +/*N*/ pObj->InsertUserData(new SchDataPoint(nColumn, nRow)); + } +/*N*/ +/*N*/ } +/*N*/ +/*N*/ return pObj; +/*N*/ } + +/*N*/ void ChartModel::GenerateSymbolAttr(/*const SfxItemSet& rAttr,*/SfxItemSet& rSymbolAttr,const long nRow,const long nMode) +/*N*/ { +/*N*/ // Symbole immer gleiche Umrandung und Füllfarbe = Linienfarbe, wenn es sich um ein "echtes" +/*N*/ // Symbol handelt (d.h. nicht ein Symbol für Bars/Säulen,Pies etc.) +/*N*/ +/*N*/ switch(nMode) +/*N*/ { +/*N*/ case SYMBOLMODE_LEGEND: +/*N*/ case SYMBOLMODE_ROW: +/*N*/ +/*N*/ if(HasSymbols(nRow) && IsLine(nRow)) //Symbol und Linie => ein echtes Symbol wird angezeigt :) +/*N*/ { +/*N*/ rSymbolAttr.Put(XFillColorItem(String(), +/*N*/ ((XLineColorItem &)rSymbolAttr.Get(XATTR_LINECOLOR)).GetValue())); +/*N*/ +/*N*/ rSymbolAttr.Put(XLineStyleItem(XLINE_SOLID)); +/*N*/ rSymbolAttr.Put(XLineColorItem(String(),RGBColor(COL_BLACK))); +/*N*/ rSymbolAttr.Put(XLineWidthItem (0)); +/*N*/ +/*N*/ } +/*N*/ break; +/*N*/ +/*N*/ case SYMBOLMODE_DESCRIPTION: +/*?*/ if(IsLine(nRow)) +/*?*/ { +/*?*/ rSymbolAttr.Put(XFillColorItem(String(), +/*?*/ ((XLineColorItem &)rSymbolAttr.Get(XATTR_LINECOLOR)).GetValue())); +/*?*/ +/*?*/ rSymbolAttr.Put(XLineStyleItem(XLINE_SOLID)); +/*?*/ rSymbolAttr.Put(XLineColorItem(String(),RGBColor(COL_BLACK))); +/*?*/ rSymbolAttr.Put(XLineWidthItem (0)); +/*?*/ } +/*?*/ else // rectangle with border, if linesytle is NONE +/*?*/ { +/*?*/ XLineStyle eLineStyle = +/*?*/ SAL_STATIC_CAST( const XLineStyleItem *, &(rSymbolAttr.Get( XATTR_LINESTYLE )) )->GetValue(); // bug in Win-C++ compiler: casting to pointer +/*?*/ +/*?*/ if( eLineStyle == XLINE_NONE ) // clear items for defaults to take effect +/*?*/ { +/*?*/ rSymbolAttr.ClearItem( XATTR_LINESTYLE ); +/*?*/ rSymbolAttr.ClearItem( XATTR_LINEWIDTH ); +/*?*/ rSymbolAttr.ClearItem( XATTR_LINECOLOR ); +/*?*/ } +/*N*/ } +/*N*/ +/*N*/ break; +/*N*/ case SYMBOLMODE_LINE: +/*N*/ break; +/*N*/ } +/*N*/ +/*N*/ } + +/************************************************************************* +|* +|* Datenpunkt-Attribute loeschen, die im Itemset (Argument) vorhanden sind +|* +\************************************************************************/ + +/*N*/ void ChartModel::ClearDataPointAttr( long nCol, long nRow, const SfxItemSet& rAttr ) +/*N*/ { +/*N*/ +/*N*/ CHART_TRACE( "ChartModel::ClearDataPointAttr" ); +/*N*/ +/*N*/ ItemSetList* pAttrList = IsDataSwitched() //abhaengig vom Charttyp - statt bSwitchData +/*N*/ ? &aSwitchDataPointAttrList +/*N*/ : &aDataPointAttrList; +/*N*/ +/*N*/ SfxItemSet* pItemSet = pAttrList->GetObject(nCol * GetRowCount() + nRow); +/*N*/ if (pItemSet != NULL) +/*?*/ {DBG_BF_ASSERT(0, "STRIP"); }//STRIP001 ClearDblItems(rAttr,*pItemSet); +/*N*/ } +/************************************************************************* +|* +|* Datenpunkt-Attribute setzen +|* +\************************************************************************/ + +/*N*/ void ChartModel::PutDataPointAttr( long nCol, long nRow,const SfxItemSet& rAttr, BOOL bMerge /*=TRUE*/) +/*N*/ { +/*N*/ CHART_TRACE( "ChartModel::PutDataPointAttr" ); +/*N*/ DBG_ITEMS((SfxItemSet&)rAttr,this); +/*N*/ +/*N*/ ItemSetList* pAttrList = IsDataSwitched() //abhaengig vom Charttyp - statt bSwitchData +/*N*/ ? &aSwitchDataPointAttrList +/*N*/ : &aDataPointAttrList; +/*N*/ +/*N*/ SfxItemSet* pItemSet = pAttrList->GetObject(nCol * GetRowCount() + nRow); +/*N*/ if (pItemSet == NULL) +/*N*/ { +/*N*/ pItemSet = new SfxItemSet(*pItemPool, nRowWhichPairs); +/*N*/ pAttrList->Replace (pItemSet, nCol * GetRowCount() + nRow); +/*N*/ } +/*N*/ if(!bMerge) +/*?*/ pItemSet->ClearItem(); +/*N*/ PutItemSetWithNameCreation( *pItemSet, rAttr ); +/*N*/ } + +// this method exists in analogy to GetFullDataPointAttr +// it is necessary for API (=>XML) and pie charts + +/************************************************************************* +|* +|* Datenpunkt-Attribute ermitteln +|* +\************************************************************************/ + +/*N*/ const SfxItemSet& ChartModel::GetDataPointAttr( long nCol, long nRow) const +/*N*/ { +/*N*/ long nIdx = nCol * GetRowCount() + nRow; +/*N*/ ItemSetList& aAttrList = IsDataSwitched() +/*N*/ ? (class ItemSetList &) aSwitchDataPointAttrList +/*N*/ : (class ItemSetList &) aDataPointAttrList; +/*N*/ +/*N*/ if( nIdx < (long)aAttrList.Count() ) +/*N*/ { +/*N*/ SfxItemSet* pSet = aAttrList.GetObject( nIdx ); +/*N*/ if (pSet == NULL) +/*N*/ return (GetDataRowAttr(nRow)); +/*N*/ else +/*N*/ return *pSet; +/*N*/ } +/*N*/ else +/*N*/ { +/*?*/ DBG_ERROR( "Requested data point attribute is unavailable" ); +/*?*/ +/*?*/ // return something +/*?*/ DBG_ASSERT( pChartAttr, "Invalid Chart-ItemSet" ); +/*?*/ return *pChartAttr; +/*N*/ } +/*N*/ } + + +/*N*/ const SfxItemSet * ChartModel::GetRawDataPointAttr (long nCol,long nRow) const +/*N*/ { +/*N*/ long nIndex = nCol * GetRowCount() + nRow; +/*N*/ ItemSetList & aAttrList = IsDataSwitched() +/*N*/ ? (class ItemSetList &) aSwitchDataPointAttrList +/*N*/ : (class ItemSetList &) aDataPointAttrList; +/*N*/ +/*N*/ if (nIndex < (long)aAttrList.Count()) +/*N*/ return aAttrList.GetObject (nIndex); +/*N*/ else +/*N*/ return NULL; +/*N*/ } + +/************************************************************************* +|* +|* Datenpunkt-Attribute ermitteln +|* +\************************************************************************/ + +/*N*/ SfxItemSet ChartModel::GetFullDataPointAttr( long nCol, long nRow ) const +/*N*/ { +/*N*/ ItemSetList* pAttrList = IsDataSwitched() +/*N*/ ? (class ItemSetList *) & aSwitchDataPointAttrList +/*N*/ : (class ItemSetList *) & aDataPointAttrList; +/*N*/ +/*N*/ if( ! IsPieChart()) +/*N*/ { +/*N*/ // get series' attributes and merge with data-point attributes if available +/*N*/ SfxItemSet aAttr( GetDataRowAttr( nRow )); +/*N*/ SfxItemSet *pObj=pAttrList->GetObject( nCol * GetRowCount() + nRow ); +/*N*/ if( pObj ) +/*N*/ aAttr.Put( *pObj ); +/*N*/ return aAttr; +/*N*/ } + + /* the following code is for pie charts only + + data description attributes (SCHATTR_DATADESCR_DESCR and + SCHATTR_DATADESCR_SHOW_SYM) are contained in data point item set while + all other (graphical) attributes are contained in data series (data row) + item set */ + + // get data description attributes +/*N*/ SfxItemSet aDescrAttrib( *pItemPool, SCHATTR_DATADESCR_START, SCHATTR_DATADESCR_END ); +/*N*/ aDescrAttrib.Put( GetDataRowAttr( 0 )); // a pie chart always has only one series +/*N*/ +/*N*/ // the different pies use series attributes rather than data-point attributes +/*N*/ long nPieCount = GetColCount(); +/*N*/ long nSecondDimension = GetRowCount(); // pie has only one series, but the data may contain more +/*N*/ +/*N*/ SfxItemSet aAttr( GetDataRowAttr( nCol % nPieCount )); +/*N*/ +/*N*/ if( ( nCol >= nPieCount ) && +/*N*/ pDefaultColors ) +/*N*/ { +/*?*/ XColorEntry* pColEntry = SAL_STATIC_CAST( XColorEntry*, pDefaultColors->GetObject( nCol % pDefaultColors->Count())); +/*?*/ aAttr.Put( XFillColorItem( pColEntry->GetName(), pColEntry->GetColor())); +/*N*/ } +/*N*/ +/*N*/ // add description attributes of series +/*N*/ aAttr.ClearItem( SCHATTR_DATADESCR_DESCR ); +/*N*/ aAttr.ClearItem( SCHATTR_DATADESCR_SHOW_SYM ); +/*N*/ aAttr.Put( aDescrAttrib ); +/*N*/ +/*N*/ SfxItemSet* pAttr = pAttrList->GetObject( nCol * nSecondDimension ); +/*N*/ if( ( pAttr != NULL ) && pAttr->Count()) +/*N*/ aAttr.Put( *pAttr ); +/*N*/ +/*N*/ return aAttr; +/*N*/ } + +/************************************************************************* +|* +|* Datenpunkt-Attribute ermitteln +|* +\************************************************************************/ + +/*N*/ SfxItemSet& ChartModel::MergeDataPointAttr( SfxItemSet& rAttr, long nCol, long nRow ) const +/*N*/ { +/*N*/ CHART_TRACE2( "ChartModel::MergeDataPointAttr nCol=%ld, nRow=%ld", nCol, nRow ); +/*N*/ ItemSetList* pAttrList = IsDataSwitched() //abhaengig vom Charttyp - statt bSwitchData +/*N*/ ? (class ItemSetList *) &aSwitchDataPointAttrList +/*N*/ : (class ItemSetList *) &aDataPointAttrList; +/*N*/ +/*N*/ SfxItemSet *pObj=pAttrList->GetObject(nCol * GetRowCount() + nRow); +/*N*/ if(pObj) +/*?*/ rAttr.Put(*pObj); +/*N*/ return rAttr; +/*N*/ } + + + +/*N*/ BOOL ChartModel::IsDataPointAttrSet (long nCol, long nRow) const +/*N*/ { +/*N*/ UINT32 nIndex = nCol * GetRowCount() + nRow; +/*N*/ ItemSetList& aAttrList = IsDataSwitched() +/*N*/ ? (class ItemSetList &) aSwitchDataPointAttrList +/*N*/ : (class ItemSetList &) aDataPointAttrList; +/*N*/ +/*N*/ if (nIndex < static_cast<UINT32>(aAttrList.Count())) +/*N*/ return aAttrList.GetObject (nIndex) != NULL; +/*N*/ else +/*N*/ // Specified data point does not exist. Therefore an item set does not exist also. +/*?*/ return false; +/*N*/ } + + +/************************************************************************* +|* +|* Aendere die Attribute einer Achse +|* +\************************************************************************/ + +/*N*/ void ChartModel::SetAxisAttributes (const SfxItemSet* pAttr,const SdrObjGroup* pAxisObj) +/*N*/ { +/*N*/ if (pAttr && pAxisObj) +/*N*/ { +/*N*/ SfxItemSet aTextAttr(*pItemPool, nTextWhichPairs); +/*N*/ +/*N*/ aTextAttr.Put(*pAttr); +/*N*/ +/*N*/ SdrObjListIter aIterator(*pAxisObj->GetSubList(), IM_FLAT); +/*N*/ while (aIterator.IsMore()) +/*N*/ { +/*N*/ SdrObject *pObj = aIterator.Next(); +/*N*/ SchObjectId *pObjId = GetObjectId(*pObj); +/*N*/ +/*N*/ if (pObjId) +/*N*/ switch (pObjId->GetObjId()) +/*N*/ { +/*N*/ case CHOBJID_LINE : +/*N*/ //-/ pObj->SetAttributes(*pAttr, FALSE); +/*N*/ pObj->SetItemSetAndBroadcast(*pAttr); +/*N*/ break; +/*N*/ +/*N*/ case CHOBJID_TEXT : +/*?*/ SetTextAttr(*(SdrTextObj*)pObj, aTextAttr); +/*N*/ +/*N*/ default : +/*N*/ ; +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ } + +/************************************************************************* +|* +|* Aendere die Attribute einer Achse +|* +\************************************************************************/ + + +/*N*/ void ChartModel::SetTextFromObject( SdrTextObj* pObj,OutlinerParaObject* pTextObject ) +/*N*/ { +/*N*/ DBG_ASSERT( pObj, "ChartModel::SetTextFromObject: Object is NULL" ); +/*N*/ if( !bAttrAutoStorage && pTextObject // not during BuildChart +/*N*/ || !pObj ) +/*N*/ return; +/*N*/ +/*N*/ CHART_TRACE( "ChartModel::SetTextFromObject" ); +/*N*/ +/*N*/ SchObjectId* pObjId = GetObjectId( *pObj ); +/*N*/ +/*N*/ SfxItemSet *pItemSet = NULL; +/*N*/ String* pStrToChange = NULL; +/*N*/ +/*N*/ if( pTextObject ) +/*N*/ { +/*N*/ if( pObjId ) +/*N*/ { +/*N*/ pOutliner->SetText( *pTextObject ); +/*N*/ String aTitle = pOutliner->GetText( pOutliner->GetParagraph( 0 ), pOutliner->GetParagraphCount() ); +/*N*/ pOutliner->Clear(); +/*N*/ +/*N*/ long nId = pObjId->GetObjId(); +/*N*/ switch( nId ) +/*N*/ { +/*N*/ case CHOBJID_DIAGRAM_TITLE_X_AXIS: +/*N*/ pItemSet = pXAxisTitleAttr; +/*N*/ pStrToChange = &aXAxisTitle; +/*N*/ break; +/*N*/ case CHOBJID_DIAGRAM_TITLE_Y_AXIS: +/*N*/ pItemSet = pYAxisTitleAttr; +/*N*/ pStrToChange = &aYAxisTitle; +/*N*/ break; +/*N*/ case CHOBJID_DIAGRAM_TITLE_Z_AXIS: +/*N*/ pItemSet = pZAxisTitleAttr; +/*N*/ pStrToChange = &aZAxisTitle; +/*N*/ break; +/*N*/ case CHOBJID_TITLE_MAIN: +/*N*/ pItemSet = pMainTitleAttr; +/*N*/ pStrToChange = &aMainTitle; +/*N*/ break; +/*N*/ case CHOBJID_TITLE_SUB: +/*N*/ pItemSet = pSubTitleAttr; +/*N*/ pStrToChange = &aSubTitle; +/*N*/ break; +/*N*/ } +/*N*/ +/*N*/ // if stacked is set the string contains linefeeds which have to be removed +/*N*/ const SfxPoolItem* pPoolItem = NULL; +/*N*/ if( pItemSet && +/*N*/ pItemSet->GetItemState( SCHATTR_TEXT_ORIENT, FALSE, &pPoolItem ) == SFX_ITEM_SET && +/*N*/ SAL_STATIC_CAST( const SvxChartTextOrientItem*, pPoolItem )->GetValue() == CHTXTORIENT_STACKED ) +/*N*/ { +/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 aTitle = UnstackString( aTitle ); +/*N*/ } +/*N*/ +/*N*/ if( pStrToChange ) +/*N*/ *(pStrToChange) = aTitle; +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ //Achtung! diese Funktion sollte nur für 3-D-Objekte ausgeführt werden, +/*N*/ //bei z.B. Legendensymbolen führt der Aufruf zu einer Endlos-Schleife !!!!!!!!!!!!! +/*N*/ //Im BuildChart wird ueber bAttrAutoStorage=FALSE doppelte Ausfuehrung unterbunden +/*N*/ void ChartModel::StoreObjectsAttributes(SdrObject* pObj,const SfxItemSet& rAttr, FASTBOOL bReplaceAll) +/*N*/ {//#52277# +/*N*/ if(!bAttrAutoStorage) +/*N*/ return; +/*N*/ bAttrAutoStorage=FALSE; //Rekursionen verhindern +/*N*/ +/*N*/ //Eventuell 3D-Materialfarbe in 2D-Füllfarbe konvertieren: +/* const SfxPoolItem *pPoolItem; + if( SFX_ITEM_SET == rAttr.GetItemState( SID_ATTR_3D_MAT_COLOR, TRUE, &pPoolItem ) ) + { + Color aNew = ( ( const SvxColorItem* ) pPoolItem )->GetValue(); + ((SfxItemSet&)rAttr).Put(XFillColorItem(String(),aNew)); + } +*/ +/*N*/ DBG_ITEMS(((SfxItemSet&)rAttr),this); +/*N*/ +/*N*/ SchObjectId* pObjId = GetObjectId(*pObj); +/*N*/ if(!pObjId) +/*N*/ { +/*?*/ DBG_ERROR("ChartModel::StoreObjectsAttributes failed, no ObjId"); +/*N*/ } +/*N*/ long nId=pObjId->GetObjId(); +/*N*/ +/*N*/ CHART_TRACE2( "ChartModel::StoreObjectsAttributes Id=%s %s", GetCHOBJIDName( nId ), bReplaceAll? "ReplaceAll" : "Merge" ); +/*N*/ +/*N*/ switch(nId) +/*N*/ { +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_SPECIAL_GROUP: +/*N*/ case CHOBJID_DIAGRAM_ROWGROUP: +/*N*/ case CHOBJID_LEGEND_SYMBOL_ROW: +/*N*/ {DBG_BF_ASSERT(0, "STRIP"); //STRIP001 +/*N*/ } +/*?*/ break; +/*?*/ +/*?*/ case CHOBJID_DIAGRAM_DATA: +/*?*/ case CHOBJID_LEGEND_SYMBOL_COL: +/*?*/ {DBG_BF_ASSERT(0, "STRIP"); //STRIP001 +/*N*/ } +/*?*/ break; +/*?*/ +/*?*/ case CHOBJID_DIAGRAM_STATISTICS_GROUP : +/*?*/ case CHOBJID_DIAGRAM_AVERAGEVALUE : +/*?*/ case CHOBJID_DIAGRAM_REGRESSION : +/*?*/ {DBG_BF_ASSERT(0, "STRIP"); }//STRIP001 +/*?*/ break; +/*?*/ +/*N*/ case CHOBJID_DIAGRAM_WALL: +/*N*/ { +/*N*/ //Spezialfall, 2.Wand suchen +/*N*/ ChartScene* pScene=GetScene(); +/*N*/ if(pScene) +/*N*/ { +/*N*/ SdrObjListIter aIterator(*pScene->GetSubList(), IM_FLAT); +/*N*/ while (aIterator.IsMore()) +/*N*/ { +/*N*/ SdrObject *pO = aIterator.Next(); +/*N*/ SchObjectId *pI = GetObjectId(*pO); +/*N*/ if(pI && pI->GetObjId()==CHOBJID_DIAGRAM_WALL && pO!=pObj) +/*N*/ //-/ pO->SetAttributes(rAttr,FALSE); +/*N*/ pO->SetItemSetAndBroadcast(rAttr); +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ if(bReplaceAll) +/*?*/ GetAttr(nId).ClearItem(); +/*N*/ GetAttr(nId).Put(rAttr,TRUE); +/*N*/ break; +/*N*/ default: +/*N*/ if(bReplaceAll) +/*?*/ GetAttr(nId).ClearItem(); +/*N*/ GetAttr(nId).Put(rAttr,TRUE); +/*N*/ break; +/*N*/ } +/*N*/ +/*N*/ bAttrAutoStorage=TRUE; +/*N*/ } + +/************************************************************************* +|* +|* Aendere die Attribute bestimmter Objekte in der Page und im Model, bzw. +|* lokalisiere bestimmte Objekte anhand der Id. +|* Wird derzeit nur fuer UNO verwendet, koennte aber allgemeiner und sollte vor +|* allem vollständiger werden +|* +|* ACHTUNG: es gibt weitere Methoden gleichen/ähnlichen Namens und anderen Argumenten, +|* die ähnlich wie diese Funktionen arbeiten! +|* +\************************************************************************/ + +/*N*/ void ChartModel::SetTitle(const long nId, const String& rTitle) +/*N*/ { +/*N*/ switch(nId) +/*N*/ { +/*N*/ +/*N*/ case CHOBJID_TITLE_MAIN: +/*N*/ MainTitle()=rTitle; +/*N*/ // Replace the current text object with a new one with the given text. +/*N*/ { +/*N*/ SdrObject * pGroupObject = GetObjWithId( CHOBJID_TITLE_MAIN, *GetPage(0) ); +/*N*/ if (pGroupObject != NULL) +/*N*/ { +/*N*/ aTitleTopCenter = pGroupObject->GetBoundRect().TopCenter(); +/*N*/ DeleteObject(pGroupObject); +/*N*/ } +/*N*/ SdrTextObj * pObj = CreateTextObj(CHOBJID_TITLE_MAIN, aTitleTopCenter, +/*N*/ aMainTitle, *pMainTitleAttr, TRUE, CHADJUST_TOP_CENTER); +/*N*/ pObj->SetResizeProtect(TRUE); +/*N*/ GetPage(0)->NbcInsertObject(pObj); +/*N*/ } +/*N*/ break; +/*N*/ case CHOBJID_TITLE_SUB: +/*N*/ SubTitle()=rTitle; +/*N*/ // Replace the current text object with a new one with the given text. +/*N*/ { +/*N*/ +/*N*/ SdrObject * pGroupObject = GetObjWithId( CHOBJID_TITLE_SUB, *GetPage(0) ); +/*N*/ if (pGroupObject != NULL) +/*N*/ { +/*N*/ aSubTitleTopCenter = pGroupObject->GetBoundRect().TopCenter(); +/*N*/ DeleteObject(pGroupObject); +/*N*/ } +/*N*/ SdrTextObj * pObj = CreateTextObj(CHOBJID_TITLE_SUB, aSubTitleTopCenter, +/*N*/ aSubTitle, *pSubTitleAttr, TRUE, CHADJUST_TOP_CENTER); +/*N*/ pObj->SetResizeProtect(TRUE); +/*N*/ GetPage(0)->NbcInsertObject(pObj); +/*N*/ } +/*N*/ break; +/*N*/ case CHOBJID_DIAGRAM_TITLE_X_AXIS: +/*N*/ XAxisTitle()=rTitle; +/*N*/ break; +/*N*/ case CHOBJID_DIAGRAM_TITLE_Y_AXIS: +/*N*/ YAxisTitle()=rTitle; +/*N*/ break; +/*N*/ case CHOBJID_DIAGRAM_TITLE_Z_AXIS: +/*N*/ ZAxisTitle()=rTitle; +/*N*/ break; +/*N*/ default: +/*?*/ CHART_TRACE2( "SetTitle: Title not found by id %ld (%s) ", nId, GetCHOBJIDName( nId )); +/*N*/ break; +/*N*/ } +/*N*/ } + +/*N*/ String ChartModel::GetTitle( const long nId ) +/*N*/ { +/*N*/ switch(nId) +/*N*/ { +/*N*/ case CHOBJID_TITLE_MAIN: +/*N*/ return MainTitle(); +/*N*/ case CHOBJID_TITLE_SUB: +/*N*/ return SubTitle(); +/*N*/ case CHOBJID_DIAGRAM_TITLE_X_AXIS: +/*N*/ return XAxisTitle(); +/*N*/ case CHOBJID_DIAGRAM_TITLE_Y_AXIS: +/*N*/ return YAxisTitle(); +/*N*/ case CHOBJID_DIAGRAM_TITLE_Z_AXIS: +/*N*/ return ZAxisTitle(); +/*N*/ default: +/*?*/ CHART_TRACE2( "GetTitle: Title not found by id %ld (%s) ", nId, GetCHOBJIDName( nId )); +/*?*/ return String(); +/*N*/ } +/*N*/ } + +/*N*/ void ChartModel::SetHasBeenMoved(const long nId,BOOL bMoved) +/*N*/ { +/*N*/ switch(nId) +/*N*/ { +/*N*/ +/*N*/ case CHOBJID_TITLE_MAIN: +/*N*/ SetMainTitleHasBeenMoved(bMoved); +/*N*/ break; +/*N*/ case CHOBJID_TITLE_SUB: +/*N*/ SetSubTitleHasBeenMoved(bMoved); +/*N*/ break; +/*N*/ case CHOBJID_DIAGRAM_TITLE_X_AXIS: +/*N*/ SetXAxisTitleHasBeenMoved(bMoved); +/*N*/ break; +/*N*/ case CHOBJID_DIAGRAM_TITLE_Y_AXIS: +/*N*/ SetYAxisTitleHasBeenMoved(bMoved); +/*N*/ break; +/*N*/ case CHOBJID_DIAGRAM_TITLE_Z_AXIS: +/*N*/ SetZAxisTitleHasBeenMoved(bMoved); +/*N*/ break; +/*N*/ case CHOBJID_LEGEND: +/*N*/ SetLegendHasBeenMoved(bMoved); +/*N*/ break; +/*N*/ default: +/*?*/ CHART_TRACE2( "SetHasBeenMoved: Object not found by id %ld (%s) ", nId, GetCHOBJIDName( nId )); +/*N*/ break; +/*N*/ } +/*N*/ } + +/*N*/ SdrObject* ChartModel::GetObjectWithId(const long nId,const long nCol,const long nRow) +/*N*/ { +/*N*/ //ToDo: Das hier könnte man auch schöner machen (kein DEEP!) +/*N*/ SdrObject* pObj=(GetObjWithId ((USHORT)nId,*GetPage(0),0,IM_DEEPWITHGROUPS)); +/*N*/ #ifdef DBG_UTIL +/*N*/ // there is no DBG_ASSERT2 +/*N*/ if( !pObj ) +/*N*/ DBG_ERROR2( "GetObjWithId: Object not found (id=%ld => %s)", nId, GetCHOBJIDName( nId ) ); +/*N*/ #endif +/*N*/ return pObj; +/*N*/ } + +// GetAttr-Methoden: +//GetAttr(id) Diese Methode sucht anhand der Id den passenden Model-eigenen AttrSet +//Achtung! Wenn zu einer ID kein Set existiert, wird *pDummyAttr returned! +//(ungefährlich, geringer Overhead, wirft daher nur DBG__TRACE) +//Nicht-Singuläre Objekte können nicht an der ID alleine identifiziert werden, +//in diesem Fall muss GetAttr(SdrObject*) statt GetAttr(long id) gerufen werden +// GetAttr(long id, SfxItemSet&) besorgt alle für ein Objekt verfügbaren und +// gültigen Attribute + +/* +Fehlen evtl. noch in GetAttr(ID): + +#define CHOBJID_DIAGRAM 13 +#define CHOBJID_DIAGRAM_X_GRID_MAIN 22 +#define CHOBJID_DIAGRAM_Y_GRID_MAIN 23 +#define CHOBJID_DIAGRAM_Z_GRID_MAIN 24 +#define CHOBJID_DIAGRAM_X_GRID_HELP 25 +#define CHOBJID_DIAGRAM_Y_GRID_HELP 26 +#define CHOBJID_DIAGRAM_Z_GRID_HELP 27 +#define CHOBJID_DIAGRAM_ROWS 29 +#define CHOBJID_DIAGRAM_ROWSLINE 30 +#define CHOBJID_DIAGRAM_DESCRGROUP 32 +#define CHOBJID_DIAGRAM_DESCR_ROW 33 +#define CHOBJID_DIAGRAM_DESCR_COL 38 +#define CHOBJID_DIAGRAM_DESCR_SYMBOL 39 +#define CHOBJID_DIAGRAM_NET 41 +#define CHOBJID_DIAGRAM_STACKEDGROUP 46 +#define CHOBJID_DIAGRAM_STATISTICS_GROUP 48 + + + nur GetAttr(pObj): +#define CHOBJID_DIAGRAM_AVERAGEVALUE 42 +#define CHOBJID_DIAGRAM_REGRESSION 45 +#define CHOBJID_DIAGRAM_ERROR 43 + +#define CHOBJID_LEGEND_SYMBOL_ROW 36 +#define CHOBJID_LEGEND_SYMBOL_COL 37 +#define CHOBJID_DIAGRAM_DATA 31 +#define CHOBJID_DIAGRAM_SPECIAL_GROUP 55 +#define CHOBJID_DIAGRAM_ROWGROUP 28 + + */ + +/*N*/ void ChartModel::SetAttributes(const long nId,const SfxItemSet& rAttr,BOOL bMerge) +/*N*/ { +/*N*/ CHART_TRACE( "ChartModel::SetAttributes" ); +/*N*/ SfxItemSet& rItemSet=GetAttr(nId); +/*N*/ +/*N*/ if(!bMerge) +/*N*/ rItemSet.ClearItem(); + + + //sobald die member bShow*Descr endlich entfallen, kann das hier alles weg +/* if(nId==CHOBJID_DIAGRAM_X_AXIS || nId==CHOBJID_DIAGRAM_Y_AXIS || nId==CHOBJID_DIAGRAM_Z_AXIS) + { + const SfxPoolItem *pPoolItem=NULL; + if( rAttr.GetItemState( SCHATTR_AXIS_SHOWDESCR, FALSE, &pPoolItem ) == SFX_ITEM_SET ) + { + BOOL bShow = ( (const SfxBoolItem*) pPoolItem)->GetValue(); + switch(nId) + { + case CHOBJID_DIAGRAM_X_AXIS: + bShowXDescr=bShow; + break; + case CHOBJID_DIAGRAM_Y_AXIS: + bShowYDescr=bShow; + break; + case CHOBJID_DIAGRAM_Z_AXIS: + bShowZDescr=bShow; + break; + } + } + }*/ + + +/*N*/ rItemSet.Put(rAttr); +/*N*/ } +/*N*/ SfxItemSet& ChartModel::GetAttr(const long nObjId,const long nIndex1/*=-1*/) const +/*N*/ { +/*N*/ CHART_TRACE( "ChartModel::GetAttr(const long nObjId)" ); +/*N*/ +/*N*/ switch(nObjId) +/*N*/ { +/*N*/ case CHOBJID_DIAGRAM_STOCKLINE_GROUP: +/*?*/ return *pStockLineAttr; +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_STOCKPLUS_GROUP: +/*N*/ return *pStockPlusAttr; +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_STOCKLOSS_GROUP: +/*N*/ return *pStockLossAttr; +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_X_GRID_MAIN_GROUP: +/*N*/ return *pXGridMainAttr; +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_Y_GRID_MAIN_GROUP: +/*N*/ return *pYGridMainAttr; +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_Z_GRID_MAIN_GROUP: +/*N*/ return *pZGridMainAttr; +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_X_GRID_HELP_GROUP: +/*?*/ return *pXGridHelpAttr; +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_Y_GRID_HELP_GROUP: +/*?*/ return *pYGridHelpAttr; +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_Z_GRID_HELP_GROUP: +/*?*/ return *pZGridHelpAttr; +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_AREA: +/*N*/ return *pDiagramAreaAttr; +/*N*/ +/*N*/ case CHOBJID_DIAGRAM: //Leider mmehrfache bedeutung, im 2D ist das wohl das selbe +/*N*/ case CHOBJID_DIAGRAM_WALL: +/*N*/ return *pDiagramWallAttr; +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_FLOOR: +/*N*/ return *pDiagramFloorAttr; +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_TITLE_X_AXIS: +/*N*/ return *pXAxisTitleAttr; +/*N*/ case CHOBJID_DIAGRAM_TITLE_Y_AXIS: +/*N*/ return *pYAxisTitleAttr; +/*N*/ case CHOBJID_DIAGRAM_TITLE_Z_AXIS: +/*N*/ return *pZAxisTitleAttr; +/*N*/ +/*N*/ case CHOBJID_TITLE_MAIN: +/*N*/ return *pMainTitleAttr; +/*N*/ case CHOBJID_TITLE_SUB: +/*N*/ return *pSubTitleAttr; +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_X_AXIS: +/*N*/ return *pChartXAxis->GetItemSet(); +/*N*/ case CHOBJID_DIAGRAM_Y_AXIS: +/*N*/ return *pChartYAxis->GetItemSet(); +/*N*/ case CHOBJID_DIAGRAM_Z_AXIS: +/*N*/ return *pChartZAxis->GetItemSet(); +/*N*/ case CHOBJID_DIAGRAM_B_AXIS: +/*N*/ return *pChartBAxis->GetItemSet(); +/*N*/ case CHOBJID_DIAGRAM_A_AXIS: +/*N*/ return *pChartAAxis->GetItemSet(); +/*N*/ +/*N*/ case CHOBJID_LEGEND_BACK: //Achtung, dies ist nur das Drawing-Objekt, normalerweise erhält man die andere ID für das Gruppenobjekt +/*N*/ case CHOBJID_LEGEND: +/*N*/ return *pLegendAttr; +/*N*/ + /*return *pTitleAttr; + return *pAxisAttr; + return *pGridAttr; + return *pChartAttr;*/ +/*N*/ +/*N*/ case CHOBJID_DIAGRAM_REGRESSION: +/*?*/ return *aRegressAttrList.GetObject(nIndex1); +/*N*/ case CHOBJID_DIAGRAM_ERROR: +/*?*/ return *aErrorAttrList.GetObject(nIndex1); +/*N*/ case CHOBJID_DIAGRAM_AVERAGEVALUE: +/*?*/ return *aAverageAttrList.GetObject(nIndex1); +/*N*/ +/*N*/ default: +/*N*/ CHART_TRACE1( "GetAttr illegal Object Id (%ld), returning dummy", nObjId ); +/*N*/ return *pDummyAttr; +/*N*/ } +/*N*/ } + + +// This method fills rAttr with the items stored at the object specified +// by nObjId. Effectively calls GetAttr(long,long) but handles diagram +// axes as special case. +// The item set of the graphical object representation is not merged in +// anymore. +/*N*/ void ChartModel::GetAttr( const long nObjId, SfxItemSet& rAttr, const long nIndex1 /*=-1*/ ) +/*N*/ { +/*N*/ CHART_TRACE( "ChartModel::GetAttr( long nObjId, SfxItemSet& rAttr)" ); +/*N*/ +/*N*/ #if 0 +/*N*/ SdrObject* pObj=NULL; +/*N*/ +/*N*/ //Objektattribute aus der Seite holen +/*N*/ //aber keine indizierten Objekte auf diese Weise suchen ! +/*N*/ if(nIndex1==-1) +/*N*/ { +/*N*/ pObj=(GetObjWithId ((USHORT)nObjId,*GetPage(0),0,IM_DEEPWITHGROUPS)); +/*N*/ if(pObj) +/*N*/ rAttr.Put(pObj->GetItemSet()); +/*N*/ } +/*N*/ #endif +/*N*/ +/*N*/ // items at model (and axis object) +/*N*/ switch( nObjId ) +/*N*/ { +/*N*/ case CHOBJID_DIAGRAM_X_AXIS: +/*N*/ case CHOBJID_DIAGRAM_Y_AXIS: +/*N*/ case CHOBJID_DIAGRAM_A_AXIS: +/*N*/ case CHOBJID_DIAGRAM_B_AXIS: +/*N*/ case CHOBJID_DIAGRAM_Z_AXIS: +/*N*/ { +/*N*/ // general item set +/*N*/ rAttr.Put( *pAxisAttr ); +/*N*/ +/*N*/ // specialized item set and members +/*N*/ ChartAxis* pAxis = GetAxis( nObjId ); +/*N*/ if( pAxis ) +/*N*/ { +/*N*/ rAttr.Put( *(pAxis->GetItemSet())); +/*N*/ pAxis->GetMembersAsAttr( rAttr ); +/*N*/ } +/*N*/ // ChartModel members for axes +/*N*/ GetTextRotation( rAttr ); +/*N*/ switch( nObjId ) +/*N*/ { +/*N*/ case CHOBJID_DIAGRAM_X_AXIS: +/*N*/ case CHOBJID_DIAGRAM_A_AXIS: +/*N*/ rAttr.Put( SfxBoolItem( SID_TEXTBREAK, GetFormatXAxisTextInMultipleLinesIfNecessary() ) ); +/*N*/ break; +/*N*/ case CHOBJID_DIAGRAM_Y_AXIS: +/*N*/ case CHOBJID_DIAGRAM_B_AXIS: +/*N*/ rAttr.Put( SfxBoolItem( SID_TEXTBREAK, GetFormatYAxisTextInMultipleLinesIfNecessary() ) ); +/*N*/ break; +/*N*/ case CHOBJID_DIAGRAM_Z_AXIS: +/*N*/ rAttr.Put( SfxBoolItem( SID_TEXTBREAK, GetFormatZAxisTextInMultipleLinesIfNecessary() ) ); +/*N*/ break; +/*N*/ } +/*N*/ } +/*N*/ break; +/*N*/ +/*N*/ default: +/*N*/ rAttr.Put( GetAttr( nObjId, nIndex1 )); +/*N*/ break; +/*N*/ } +/*N*/ } + +/*N*/ BOOL ChartModel::ChangeAttr(const SfxItemSet& rAttr,const long nId,const long nIndex1/*=-1*/) +/*N*/ { +/*N*/ BOOL bNeedChanges=TRUE; //noch ungenutzt, zur evtl. Optimierung +/*N*/ +/*N*/ +/*N*/ //ToDo: optimieren! klappt wegen XChartView so nicht: +/*N*/ //BOOL bForceBuild=FALSE; +/*N*/ BOOL bForceBuild=TRUE; +/*N*/ +/*N*/ +/*N*/ SdrObject* pObj=NULL; +/*N*/ //Objektattribute am Objekt setzen, falls nicht indiziert +/*N*/ if(nIndex1==-1) +/*N*/ { +/*N*/ pObj=(GetObjWithId ((USHORT)nId,*GetPage(0),0,IM_DEEPWITHGROUPS)); +/*N*/ if(pObj) +/*N*/ //-/ pObj->SetAttributes(rAttr,FALSE); +/*N*/ pObj->SetItemSetAndBroadcast(rAttr); +/*N*/ } +/*N*/ +/*N*/ +/*N*/ //und auch am Model +/*N*/ switch(nId) +/*N*/ { +/*N*/ case CHOBJID_DIAGRAM_X_AXIS: +/*N*/ case CHOBJID_DIAGRAM_Y_AXIS: +/*N*/ case CHOBJID_DIAGRAM_A_AXIS: +/*N*/ case CHOBJID_DIAGRAM_B_AXIS: +/*N*/ case CHOBJID_DIAGRAM_Z_AXIS: +/*N*/ { +/*N*/ const SfxPoolItem *pPoolItem; +/*N*/ if(pObj) +/*N*/ { +/*N*/ ChangeAxisAttr(rAttr,(SdrObjGroup*)pObj); +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ const SfxPoolItem* pPoolItem=NULL; +/*N*/ if(rAttr.GetItemState(SID_ATTR_NUMBERFORMAT_VALUE,TRUE,&pPoolItem)==SFX_ITEM_SET) +/*N*/ { +/*N*/ SfxItemSet aSet(rAttr); +/*N*/ UINT32 nTmp=((const SfxUInt32Item*)pPoolItem)->GetValue(); +/*N*/ aSet.Put(SfxUInt32Item(IsPercentChart() +/*N*/ ? SCHATTR_AXIS_NUMFMTPERCENT : SCHATTR_AXIS_NUMFMT , nTmp)); +/*N*/ SetAttributes(nId,aSet); //im Model +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ SetAttributes(nId,rAttr); //im Model +/*N*/ } +/*N*/ +/*N*/ } +/*N*/ +/*N*/ if( SFX_ITEM_SET == rAttr.GetItemState( SID_TEXTBREAK, TRUE, &pPoolItem ) ) +/*N*/ { +/*N*/ switch(nId) +/*N*/ { +/*N*/ case CHOBJID_DIAGRAM_X_AXIS: +/*N*/ case CHOBJID_DIAGRAM_A_AXIS: +/*N*/ SetFormatXAxisTextInMultipleLinesIfNecessary(((const SfxBoolItem*)pPoolItem)->GetValue()); +/*N*/ break; +/*N*/ case CHOBJID_DIAGRAM_Y_AXIS: +/*N*/ case CHOBJID_DIAGRAM_B_AXIS: +/*N*/ SetFormatYAxisTextInMultipleLinesIfNecessary(((const SfxBoolItem*)pPoolItem)->GetValue()); +/*N*/ break; +/*N*/ case CHOBJID_DIAGRAM_Z_AXIS: +/*N*/ SetFormatZAxisTextInMultipleLinesIfNecessary(((const SfxBoolItem*)pPoolItem)->GetValue()); +/*N*/ break; +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ break; +/*N*/ case CHOBJID_AREA: +/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 ChangeDiagramAreaAttr( rAttr ); +/*?*/ break; +/*N*/ default: +/*N*/ GetAttr(nId,nIndex1).Put(rAttr,TRUE); +/*N*/ break; +/*N*/ } +/*N*/ +/*N*/ // calculate result here because BuildChart will delete pObj (dangling pointer) +/*N*/ BOOL bResult = ( pObj != NULL || nIndex1 != -1 ); +/*N*/ +/*N*/ if(bForceBuild || nIndex1!=-1) +/*N*/ BuildChart(FALSE); +/*N*/ else if(bNeedChanges && IsAttrChangeNeedsBuildChart(rAttr)) +/*?*/ BuildChart(FALSE); +/*N*/ +/*N*/ return bResult; +/*N*/ } +/* Anmerkungen zu GetObjectAttr,SetObjectAttr: + +- das koennte bei get(????) fehlen: + CompareSets (*pYGridMainAttr, *pGridAttr); + CompareSets (*pZGridMainAttr, *pGridAttr); + CompareSets (*pXGridHelpAttr, *pGridAttr); + CompareSets (*pYGridHelpAttr, *pGridAttr); + CompareSets (*pZGridHelpAttr, *pGridAttr); + +- evtl. sollten default-itemwerte erkannt und wieder entfert werden (SET) + +- erweitern auf DataRowPoint! + +- Das koennte man mal alles oben hineintun.... + +#define CHOBJID_TEXT 1 +#define CHOBJID_AREA 2 +#define CHOBJID_LINE 3 + + + +#define CHOBJID_TITLE_MAIN 11 +#define CHOBJID_TITLE_SUB 12 +#define CHOBJID_DIAGRAM 13 + +#define CHOBJID_DIAGRAM_TITLE_X_AXIS 16 +#define CHOBJID_DIAGRAM_TITLE_Y_AXIS 17 +#define CHOBJID_DIAGRAM_TITLE_Z_AXIS 18 + + +#define CHOBJID_DIAGRAM_ROWGROUP 28 +#define CHOBJID_DIAGRAM_ROWS 29 +#define CHOBJID_DIAGRAM_ROWSLINE 30 +#define CHOBJID_DIAGRAM_DATA 31 +#define CHOBJID_DIAGRAM_DESCRGROUP 32 +#define CHOBJID_DIAGRAM_DESCR_ROW 33 +#define CHOBJID_DIAGRAM_DESCR_COL 38 +#define CHOBJID_DIAGRAM_DESCR_SYMBOL 39 +#define CHOBJID_LEGEND 34 +#define CHOBJID_LEGEND_BACK 35 +#define CHOBJID_LEGEND_SYMBOL_ROW 36 +#define CHOBJID_LEGEND_SYMBOL_COL 37 +#define CHOBJID_DIAGRAM_NET 41 +#define CHOBJID_DIAGRAM_AVERAGEVALUE 42 +#define CHOBJID_DIAGRAM_ERROR 43 +#define CHOBJID_DIAGRAM_REGRESSION 45 +#define CHOBJID_DIAGRAM_STACKEDGROUP 46 +#define CHOBJID_DIAGRAM_STATISTICS_GROUP 48 +#define CHOBJID_DIAGRAM_X_GRID_MAIN_GROUP 49 +#define CHOBJID_DIAGRAM_Y_GRID_MAIN_GROUP 50 +#define CHOBJID_DIAGRAM_Z_GRID_MAIN_GROUP 51 +#define CHOBJID_DIAGRAM_X_GRID_HELP_GROUP 52 +#define CHOBJID_DIAGRAM_Y_GRID_HELP_GROUP 53 +#define CHOBJID_DIAGRAM_Z_GRID_HELP_GROUP 54 +#define CHOBJID_DIAGRAM_SPECIAL_GROUP 55 + +pYGridMainAttr->Put(rAttr); +*/ + + + + +/*N*/ UINT32 ChartModel::GetNumFmt(long nObjId,BOOL bPercent) +/*N*/ { +/*N*/ return ((const SfxUInt32Item&)GetAttr(nObjId).Get(bPercent +/*N*/ ? SCHATTR_AXIS_NUMFMTPERCENT:SCHATTR_AXIS_NUMFMT)).GetValue(); +/*N*/ } +/*N*/ void ChartModel::SetNumFmt(long nObjId,UINT32 nFmt,BOOL bPercent) +/*N*/ { +/*N*/ SfxItemSet aSet(*pItemPool,SCHATTR_AXIS_NUMFMT,SCHATTR_AXIS_NUMFMTPERCENT); +/*N*/ aSet.Put(SfxUInt32Item(bPercent? SCHATTR_AXIS_NUMFMTPERCENT:SCHATTR_AXIS_NUMFMT,nFmt)); +/*N*/ SetAttributes(nObjId,aSet); +/*N*/ } + + +// Prerequisite: rOutAttributes is empty but can hold all interesting attributes +// Result: All Items that are contained in all data row item sets are set +// (using the Intersect method of the SfxItemSet) +/*N*/ void ChartModel::GetDataRowAttrAll( SfxItemSet& rOutAttributes ) +/*N*/ { +/*N*/ long nListSize = aDataRowAttrList.Count(); +/*N*/ +/*N*/ // no itemsets => result stays empty +/*N*/ if( nListSize == 0 ) +/*N*/ return; +/*N*/ +/*N*/ // set items of first data row and then intersect with all remaining +/*N*/ rOutAttributes.Put( *aDataRowAttrList.GetObject( 0 )); +/*N*/ for( long nRow = 1; nRow < nListSize; nRow++ ) +/*N*/ rOutAttributes.Intersect( *aDataRowAttrList.GetObject( nRow )); +/*N*/ } + +/*N*/ void ChartModel::SetItemWithNameCreation( SfxItemSet& rDestItemSet, const SfxPoolItem* pNewItem ) +/*N*/ { +/*N*/ if( pNewItem == NULL ) +/*N*/ return; +/*N*/ +/*N*/ const SfxPoolItem* pItemToSet = pNewItem; +/*N*/ +/*N*/ // this code comes from bf_svx/source/svdraw/svdoattr.cxx: SdrAttrObj::ItemChange() +/*N*/ switch( pItemToSet->Which()) +/*N*/ { +/*N*/ case XATTR_FILLBITMAP: +/*N*/ pItemToSet = ((XFillBitmapItem*)pItemToSet)->checkForUniqueItem( this ); +/*N*/ break; +/*N*/ case XATTR_LINEDASH: +/*N*/ pItemToSet = ((XLineDashItem*)pItemToSet)->checkForUniqueItem( this ); +/*N*/ break; +/*N*/ case XATTR_LINESTART: +/*N*/ pItemToSet = ((XLineStartItem*)pItemToSet)->checkForUniqueItem( this ); +/*N*/ break; +/*N*/ case XATTR_LINEEND: +/*N*/ pItemToSet = ((XLineEndItem*)pItemToSet)->checkForUniqueItem( this ); +/*N*/ break; +/*N*/ case XATTR_FILLGRADIENT: +/*N*/ pItemToSet = ((XFillGradientItem*)pItemToSet)->checkForUniqueItem( this ); +/*N*/ break; +/*N*/ case XATTR_FILLFLOATTRANSPARENCE: +/*N*/ pItemToSet = ((XFillFloatTransparenceItem*)pItemToSet)->checkForUniqueItem( this ); +/*N*/ break; +/*N*/ case XATTR_FILLHATCH: +/*N*/ pItemToSet = ((XFillHatchItem*)pItemToSet)->checkForUniqueItem( this ); +/*N*/ break; +/*N*/ } +/*N*/ +/*N*/ if( pItemToSet ) +/*N*/ rDestItemSet.Put( *pItemToSet ); +/*N*/ +/*N*/ // delete item if it was a generated one +/*N*/ if( pNewItem != pItemToSet ) +/*N*/ delete pItemToSet; +/*N*/ } + +/*N*/ void ChartModel::PutItemSetWithNameCreation( SfxItemSet& rDestItemSet, const SfxItemSet& rNewItemSet ) +/*N*/ { +/*N*/ // copy all attributes +/*N*/ rDestItemSet.Put( rNewItemSet ); +/*N*/ +/*N*/ // check for items that need name creation +/*N*/ SfxWhichIter aIter( rNewItemSet ); +/*N*/ sal_uInt16 nWhich = aIter.FirstWhich(); +/*N*/ const SfxPoolItem* pPoolItem = NULL; +/*N*/ +/*N*/ while( nWhich ) +/*N*/ { +/*N*/ switch( nWhich ) +/*N*/ { +/*N*/ case XATTR_FILLBITMAP: +/*N*/ case XATTR_LINEDASH: +/*N*/ case XATTR_LINESTART: +/*N*/ case XATTR_LINEEND: +/*N*/ case XATTR_FILLGRADIENT: +/*N*/ case XATTR_FILLFLOATTRANSPARENCE: +/*N*/ case XATTR_FILLHATCH: +/*N*/ if( SFX_ITEM_SET == rNewItemSet.GetItemState( nWhich, TRUE, &pPoolItem )) +/*N*/ SetItemWithNameCreation( rDestItemSet, pPoolItem ); +/*N*/ } +/*N*/ nWhich = aIter.NextWhich(); +/*N*/ } +/*N*/ } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |