diff options
Diffstat (limited to 'binfilter/bf_sch/source/core/sch_chtmode2.cxx')
-rw-r--r-- | binfilter/bf_sch/source/core/sch_chtmode2.cxx | 2300 |
1 files changed, 2300 insertions, 0 deletions
diff --git a/binfilter/bf_sch/source/core/sch_chtmode2.cxx b/binfilter/bf_sch/source/core/sch_chtmode2.cxx new file mode 100644 index 000000000000..56058be17e70 --- /dev/null +++ b/binfilter/bf_sch/source/core/sch_chtmode2.cxx @@ -0,0 +1,2300 @@ +/* -*- 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. + * + ************************************************************************/ + +#ifndef _STREAM_HXX +// enable stream operators >>/<< for UniString (8 Bit !) +//#ifndef ENABLE_STRING_STREAM_OPERATORS +//#define ENABLE_STRING_STREAM_OPERATORS +//#endif +#endif + +#include "schattr.hxx" +#include "memchrt.hxx" + +#ifndef _SVX_CHRTITEM_HXX //autogen +#define ITEMID_DOUBLE 0 +#define ITEMID_CHARTTEXTORIENT SCHATTR_TEXT_ORIENT +#define ITEMID_CHARTTEXTORDER SCHATTR_TEXT_ORDER +#define ITEMID_CHARTLEGENDPOS SCHATTR_LEGEND_POS + +#include <bf_svtools/eitem.hxx> + +#endif + +#include <bf_svtools/itempool.hxx> + + +#include <bf_svx/svdopath.hxx> + + +#include <bf_svx/xlnclit.hxx> +#include <bf_svx/xlnwtit.hxx> +#ifndef _ZFORLIST_HXX //autogen +#ifndef _ZFORLIST_DECLARE_TABLE +#define _ZFORLIST_DECLARE_TABLE +#endif +#endif +#include <bf_svx/eeitem.hxx> +#include <bf_svtools/zformat.hxx> +// header for getProcessServiceFactory + +#include "chmod3d.hxx" //SchRectObj + +#define ITEMID_FONTHEIGHT EE_CHAR_FONTHEIGHT +#define ITEMID_FONTWIDTH EE_CHAR_FONTWIDTH +#define ITEMID_FONT EE_CHAR_FONTINFO +#include "globfunc.hxx" +#include <bf_svx/svxids.hrc> +#include "schresid.hxx" +#include "schiocmp.hxx" + +#include "strings.hrc" +#include "glob.hrc" + +#include <bf_svx/fhgtitem.hxx> +#include <bf_svx/fontitem.hxx> + +#include <tools/tenccvt.hxx> + +#include "pairs.hxx" +#include "chaxis.hxx" + + +#include <legacysmgr/legacy_binfilters_smgr.hxx> //STRIP002 +namespace binfilter { + + +/************************************************************************/ +const USHORT nCompatAxisWhichPairs[] = +{ + SCHATTR_TEXT_START, SCHATTR_TEXT_END, + SCHATTR_Y_AXIS_START, SCHATTR_Z_AXIS_END, //X-Z! + SCHATTR_AXISTYPE, SCHATTR_AXISTYPE, + SCHATTR_TEXT_DEGREES,SCHATTR_TEXT_DEGREES, + SCHATTR_TEXT_OVERLAP, SCHATTR_TEXT_OVERLAP, + SCHATTR_AXIS_START,SCHATTR_AXIS_END, + XATTR_LINE_FIRST, XATTR_LINE_LAST, + EE_ITEMS_START, EE_ITEMS_END, + SID_TEXTBREAK, SID_TEXTBREAK, + SID_ATTR_NUMBERFORMAT_VALUE, SID_ATTR_NUMBERFORMAT_VALUE, //10.585 + 0 +}; +/************************************************************************/ + +enum ChartStyleV0 +{ + CHART2D_LINE, + CHART2D_STACKEDLINE, + CHART2D_BAR, + CHART2D_STACKEDBAR, + CHART2D_COLUMN, + CHART2D_STACKEDCOLUMN, + CHART2D_AREA, + CHART2D_STACKEDAREA, + CHART2D_PIE, + CHART3D_STRIPE, + CHART3D_BAR, + CHART3D_FLATBAR, + CHART3D_STACKEDFLATBAR, + CHART3D_AREA, + CHART3D_STACKEDAREA, + CHART3D_SURFACE, + CHART3D_PIE +}; + +/************************************************************************* +|* +|* Datenbeschriftung erzeugen +|* +\************************************************************************/ + +//SdrObject* + +/*N*/ USHORT ChartModel::GetRegressStrId( long nRow ) +/*N*/ { +/*N*/ +/*N*/ const SfxItemSet& aDataRowAttr = GetDataRowAttr( nRow ); +/*N*/ USHORT nStringID = 0; +/*N*/ +/*N*/ switch (((const SfxInt32Item &) aDataRowAttr.Get (SCHATTR_STAT_REGRESSTYPE)).GetValue ()) +/*N*/ { +/*N*/ case CHREGRESS_NONE : +/*N*/ break; +/*N*/ +/*N*/ case CHREGRESS_LINEAR : +/*?*/ nStringID = STR_REGRESSION_LINEAR; +/*?*/ break; +/*N*/ +/*?*/ case CHREGRESS_LOG : +/*?*/ nStringID = STR_REGRESSION_LOG; +/*?*/ break; +/*?*/ +/*?*/ case CHREGRESS_EXP : +/*?*/ nStringID = STR_REGRESSION_EXP; +/*?*/ break; +/*?*/ +/*?*/ case CHREGRESS_POWER : +/*?*/ nStringID = STR_REGRESSION_POWER; +/*?*/ +/*N*/ } +/*N*/ return nStringID; +/*N*/ } +/************************************************************************* +|* +|* Diagrammlegende erzeugen +|* +\************************************************************************/ + +/*N*/ SdrObjGroup* ChartModel::CreateLegend(const Rectangle &aRect) +/*N*/ { +/*N*/ // Default ist, dass die Legende nicht breiter als 20% der gesamten Seitenbreite +/*N*/ // verwenden darf, unter der Bedingung, dass sie links oder rechts vom Chart steht. +/*N*/ // wenn sie ueber oder unter dem Chart steht, dann ist die Seitenbreite das Maximum +/*N*/ +/*N*/ //TVM: obiges ist nicht richtig, CreateLegend wurde stets ohne 2.Argument +/*N*/ //aufgerufen, daher galt immer fMax...=0.2, ausserdem bezieht sich die maximale +/*N*/ //Breite auf den Text in der Legende, nicht auf die Legende selbst +/*N*/ //(Test: 1-Zeiliges Chart mit langem Text!) +/*N*/ //Obiges klngt aber durchaus plausibel, also sollte man es mal bei Gelegenheit +/*N*/ //einbauen (ToDo:-Liste) +/*N*/ const double fMaximumWidth=0.2; +/*N*/ +/*N*/ SvxChartLegendPos eLegendPos = ((const SvxChartLegendPosItem&) pLegendAttr->Get(SCHATTR_LEGEND_POS)). +/*N*/ GetValue(); +/*N*/ BOOL bWide = (eLegendPos == CHLEGEND_TOP || eLegendPos == CHLEGEND_BOTTOM); +/*N*/ BOOL bRowLegend = !IsPieChart(); +/*N*/ BOOL bReverse = !bWide && IsStackedChart(); +/*N*/ BOOL bForceSolidLine = FALSE; +/*N*/ +/*N*/ SchObjGroup* pGroup = NULL; +/*N*/ +/*N*/ if (bLegendVisible) +/*N*/ { +/*N*/ +/*N*/ List aTextList; +/*N*/ long i; +/*N*/ long nRowCnt = GetRowCount(); +/*N*/ // FG: nCnt ist die Anzahl Texte! +/*N*/ long nCnt = bRowLegend ? nRowCnt : GetColCount(); +/*N*/ long nMaxX = 0; +/*N*/ long nMaxY = 0; +/*N*/ +/*N*/ long nLineMaxY = 0; //#50082# +/*N*/ +/*N*/ long* pHeightOfEntry = new long[nCnt*2]; // FG: Wirkliche Hoehe der Zeilen +/*N*/ long* pWidthOfEntry = new long[nCnt*2]; // FG: Wirkliche Breite der Zeilen +/*N*/ long nLines = 0; // Anzahl Zeilen +/*N*/ long nActualColumn = 1; // FG: Zaehlt die Anzahl Spalten +/*N*/ +/*N*/ long* pRegressNr = new long [nCnt]; +/*N*/ memset (pRegressNr, 0, sizeof (long) * nCnt); +/*N*/ +/*N*/ SfxItemSet aTextAttr(*pItemPool, nTextWhichPairs); +/*N*/ +/*N*/ aTextAttr.Put(*pLegendAttr); +/*N*/ +/*N*/ // FG: Hier wird einmal die Liste aller Texte durchgegangen um die maximale Hoehe und +/*N*/ // die maximale Breite zu bestimmen. Bei der Gelegenheit merkt man sich auch die +/*N*/ // Ausmasse der einzelnen Eintraege. +/*N*/ for (i = 0; i < nCnt; i++) +/*N*/ { +/*N*/ // FG: Mehr als fMaximumWidth des Charts soll die Legende nie einnehmen +/*N*/ SdrObject *pText = CreateTextObj(CHOBJID_TEXT, Point (), +/*N*/ bRowLegend ? RowText(i) : ColText(i), +/*N*/ aTextAttr, +/*N*/ FALSE, +/*N*/ CHADJUST_TOP_LEFT, //FG: wie der Default +/*N*/ GetPage(0)->GetSize().Width() * fMaximumWidth); +/*N*/ +/*N*/ // FG: Das hier soll verhindern dass der Text in der Legende markiert werden kann +/*N*/ // dazu gibt es ja kein gueltiges Kontextmenue +/*N*/ pText->SetMarkProtect(TRUE); +/*N*/ aTextList.Insert(pText, LIST_APPEND); +/*N*/ +/*N*/ pWidthOfEntry[i] = pText->GetLogicRect().GetWidth(); +/*N*/ pHeightOfEntry[i] = pText->GetLogicRect().GetHeight(); +/*N*/ nMaxX = Max (nMaxX, pWidthOfEntry[i]); +/*N*/ nMaxY = Max (nMaxY, pHeightOfEntry[i]); +/*N*/ } +/*N*/ +/*N*/ if (IsXYChart()) +/*N*/ { +/*N*/ USHORT nStringID; +/*N*/ for( i = 1; i < nCnt; i++ ) +/*N*/ { +/*N*/ nStringID = GetRegressStrId( i ); +/*N*/ if( nStringID ) +/*N*/ { +/*?*/ SchResId aRegId = SchResId( nStringID ); +/*?*/ String aRegressStr( aRegId ); +/*?*/ String aSeriesName( bRowLegend +/*?*/ ? RowText( i ) +/*?*/ : ColText( i )); +/*?*/ String aLegendText( SchResId( STR_STATISTICS_IN_LEGEND )); +/*?*/ +/*?*/ aLegendText.SearchAndReplaceAscii( "$(STATTYP)", aRegressStr ); +/*?*/ aLegendText.SearchAndReplaceAscii( "$(ROWNAME)", aSeriesName ); +/*?*/ +/*?*/ SdrObject *pText = CreateTextObj( CHOBJID_TEXT, Point(), aLegendText, +/*?*/ aTextAttr, FALSE, +/*?*/ CHADJUST_TOP_LEFT, +/*?*/ GetPage( 0 )->GetSize().Width() * fMaximumWidth ); +/*?*/ +/*?*/ pText->SetMarkProtect( TRUE ); +/*?*/ aTextList.Insert(pText, LIST_APPEND); +/*?*/ +/*?*/ pWidthOfEntry[nLines+nCnt] = pText->GetLogicRect().GetWidth(); +/*?*/ pHeightOfEntry[nLines+nCnt] = pText->GetLogicRect().GetHeight(); +/*?*/ nMaxX = Max (nMaxX, pWidthOfEntry[nLines+nCnt]); +/*?*/ nMaxY = Max (nMaxY, pHeightOfEntry[nLines+nCnt]); +/*?*/ +/*?*/ // nMaxX = Max (nMaxX, pText->GetLogicRect().GetWidth()); +/*?*/ // nMaxY = Max (nMaxY, pText->GetLogicRect().GetHeight()); +/*?*/ +/*?*/ pRegressNr [nLines] = i; +/*?*/ nLines ++; +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ if (IsXYChart ()) nCnt --; +/*N*/ nLines += nCnt; +/*N*/ +/*N*/ long nTextRows = 0; +/*N*/ long nTextCols = 0; +/*N*/ long nShows = 0; +/*N*/ +/*N*/ ULONG nLegendHeight = ((SvxFontHeightItem &) pLegendAttr->Get (EE_CHAR_FONTHEIGHT)).GetHeight(); +/*N*/ long nLittleSpace = nLegendHeight / 3; +/*N*/ +/*N*/ // FG: Hier wird berechnet wieviele Spalten und Zeilen die Legende haben soll +/*N*/ if (!bWide) // dann ist die Legende mit den Zeilen untereinander links oder rechts +/*N*/ { +/*N*/ // FG: Die Legende darf maximal 90% der Blatthoehe einnehmen und maximal 50% der Blattbreite +/*N*/ if (nLines * (nMaxY + nLittleSpace) < (aRect.GetHeight() - 0.1 * aRect.GetHeight())) +/*N*/ { +/*N*/ nTextRows = nLines; +/*N*/ nTextCols = 1; // Also eine Spalte +/*N*/ } +/*N*/ else // Es gibt also mehrere Spalten +/*N*/ { +/*?*/ nTextRows = (long) ((aRect.GetHeight() - 0.1 * aRect.GetHeight()) / (nMaxY + nLittleSpace)); +/*?*/ if(!nTextRows) +/*?*/ nTextRows=1; +/*?*/ nTextCols = (long) ((nLines % nTextRows) ? nLines / nTextRows + 1 : nLines / nTextRows); +/*?*/ // FG: Falls die Legende zu breit (mehr als 50% der Chart-Breite) wird muss man nachregeln +/*?*/ if (nTextCols * (nMaxX + nLittleSpace) > aRect.GetWidth()) +/*?*/ { +/*?*/ nTextCols = (long) (aRect.GetWidth() * 0.5 / (nMaxX + nLittleSpace)); +/*?*/ } +/*?*/ } +/*N*/ } +/*N*/ else // die Legende befindet sich also unter oder ueber dem Chart (die wird noch beliebig gross) +/*N*/ { +/*?*/ nTextCols = (nLines * (nMaxX + 2*nLittleSpace + nLegendHeight) + nLittleSpace < aRect.GetWidth()) +/*?*/ ? nLines : (aRect.GetWidth() - nLittleSpace) / (nMaxX + 2*nLittleSpace + nLegendHeight); +/*?*/ nTextRows = nTextCols +/*?*/ ? ((nLines % nTextCols) ? nLines / nTextCols + 1 : nLines / nTextCols) : 0; +/*N*/ } + +/*N*/ if (nTextRows > 0 && nTextCols > 0) +/*N*/ { +/*N*/ pGroup = new SchObjGroup; +/*N*/ pGroup->InsertUserData(new SchObjectId(CHOBJID_LEGEND)); +/*N*/ // pGroup->SetResizeProtect(TRUE); +/*N*/ SdrObject* pObj; +/*N*/ SdrObjList* pObjList = pGroup->GetSubList(); +/*N*/ +/*N*/ Point aTextPos (nLittleSpace, nLegendHeight / 4); +/*N*/ +/*N*/ for (i = 0, nShows = 0; +/*N*/ i < nLines; +/*N*/ i++, nShows ++) +/*N*/ { +/*N*/ // FG: bReverse ist fuer gestapelte Diagramme gedacht, damit die Legendensymbole +/*N*/ // optisch der Reihenfolge des stapelns entsprechen. +/*N*/ long nIndex = (IsXYChart()) +/*N*/ ? i+1 +/*N*/ : (bReverse) +/*N*/ ? nCnt - 1 - i +/*N*/ : i; +/*N*/ +/*N*/ if (i < nCnt) +/*N*/ { +/*N*/ BOOL bIsSymbol = FALSE; +/*N*/ BOOL bIsLine = FALSE; +/*N*/ if(HasSymbols(nIndex)) +/*N*/ { +/*N*/ bIsSymbol = TRUE; +/*N*/ pObj = CreateSymbol (Point (aTextPos.X () + nLegendHeight / 2, +/*N*/ aTextPos.Y () + nLegendHeight / 2 + nLittleSpace / 3), +/*N*/ nIndex, 0, (SfxItemSet &) GetDataRowAttr(nIndex), nLegendHeight, FALSE); +/*N*/ if(pObj) +/*N*/ { +/*N*/ Rectangle aRect(pObj->GetSnapRect()); +/*N*/ if((aRect.GetHeight() > nLegendHeight) && nLegendHeight) +/*N*/ { +/*?*/ Fraction aFract(nLegendHeight,aRect.GetHeight()); +/*?*/ pObj->NbcResize(aRect.Center(),aFract,aFract); +/*N*/ } +/*N*/ } +/*N*/ else //dann Linie als Legendensymbol, sonst geht evtl. garnix mehr +/*N*/ { +/*?*/ XPolygon aLine(2); +/*?*/ aLine [0] = +/*?*/ aLine [1] = aTextPos; +/*?*/ aLine [1].X() += nLegendHeight; +/*?*/ aLine [1].Y() += nLegendHeight; +/*?*/ bIsLine = TRUE; +/*?*/ pObj = new SdrPathObj(OBJ_PLIN, aLine); +/*N*/ } +/*N*/ } +/*N*/ else if (IsLine(nIndex)) +/*N*/ { +/*N*/ XPolygon aLine(2); +/*N*/ +/*N*/ aLine [0] = +/*N*/ aLine [1] = aTextPos; +/*N*/ aLine [1].X() += nLegendHeight; +/*N*/ aLine [1].Y() += nLegendHeight; +/*N*/ +/*N*/ bIsLine = TRUE; +/*N*/ pObj = new SdrPathObj(OBJ_PLIN, aLine); +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ // create rectangular shape as legend symbol +/*N*/ pObj = new SdrRectObj(Rectangle(Point (aTextPos.X(), +/*N*/ aTextPos.Y() + nLittleSpace / 3), +/*N*/ Size(nLegendHeight, nLegendHeight))); +/*N*/ bForceSolidLine = TRUE; +/*N*/ } +/*N*/ // FG: setzen des Symbols neben dem Legendentext +/*N*/ +/*N*/ SfxItemSet *pSymbolAttr; +/*N*/ +/*N*/ if( bRowLegend ) +/*N*/ { +/*N*/ pSymbolAttr = new SfxItemSet( GetDataRowAttr( nIndex ) ); +/*N*/ if( ! bIsLine && pSymbolAttr ) +/*N*/ GenerateSymbolAttr( *pSymbolAttr, nIndex, SYMBOLMODE_LEGEND ); +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ pSymbolAttr = new SfxItemSet( GetFullDataPointAttr( nIndex, 0 ) ); +/*N*/ if( ! bIsLine && pSymbolAttr ) +/*N*/ GenerateSymbolAttr( *pSymbolAttr, 0, SYMBOLMODE_LEGEND ); +/*N*/ } +/*N*/ +/*N*/ if( bForceSolidLine ) +/*N*/ { +/*N*/ XLineStyle eLineStyle = +/*N*/ SAL_STATIC_CAST( const XLineStyleItem *, &(pSymbolAttr->Get( XATTR_LINESTYLE )) )->GetValue(); // bug in Win-C++ compiler: casting to pointer +/*N*/ +/*N*/ if( eLineStyle == XLINE_NONE ) +/*N*/ { +/*N*/ pSymbolAttr->ClearItem( XATTR_LINESTYLE ); +/*N*/ pSymbolAttr->ClearItem( XATTR_LINEWIDTH ); +/*N*/ pSymbolAttr->ClearItem( XATTR_LINECOLOR ); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ //-/ pObj->NbcSetAttributes( *pSymbolAttr, FALSE ); +/*N*/ pObj->SetItemSet(*pSymbolAttr); +/*N*/ +/*N*/ +/*N*/ if(bRowLegend) +/*N*/ { +/*N*/ pObj->InsertUserData(new SchObjectId(CHOBJID_LEGEND_SYMBOL_ROW)); +/*N*/ pObj->InsertUserData(new SchDataRow(nIndex)); +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ pObj->InsertUserData(new SchObjectId(CHOBJID_LEGEND_SYMBOL_COL)); +/*N*/ pObj->InsertUserData(new SchDataPoint(nIndex, 0)); +/*N*/ } +/*N*/ +/*N*/ pObj->SetMoveProtect(TRUE); +/*N*/ pObj->SetResizeProtect(TRUE); +/*N*/ pObjList->NbcInsertObject(pObj); +/*N*/ +/*N*/ SdrObject *pText = (SdrObject*)aTextList.GetObject(nIndex); +/*N*/ +/*N*/ pText->NbcMove(Size(aTextPos.X() + nLittleSpace + nLegendHeight, aTextPos.Y())); +/*N*/ pObjList->NbcInsertObject(pText); +/*N*/ +/*N*/ delete pSymbolAttr; +/*N*/ } +/*N*/ else //i >= nCnt +/*N*/ { +/*?*/ DBG_BF_ASSERT(0, "STRIP"); //STRIP001 if (pRegressNr [i - nCnt]) +/*N*/ } +/*N*/ +/*N*/ // FG: Jetzt wird aTextPos fuer den naechsten Legendeneintrag gesetzt +/*N*/ if (bWide) +/*N*/ { +/*?*/ if (nShows >= nTextCols - 1) +/*?*/ { +/*?*/ nLineMaxY = Max(nLineMaxY,pHeightOfEntry[i]);//#50082# #NACHTRAG# +/*?*/ aTextPos.Y () += nLineMaxY + nLittleSpace;//#50082# +/*?*/ aTextPos.X () = nLittleSpace;//nLegendHeight / 6;//SP3: #49906# +/*?*/ nLineMaxY = 0; //#50082# #NACHTRAG# +/*?*/ nShows = -1; +/*?*/ } +/*?*/ else +/*?*/ { +/*?*/ nLineMaxY = Max(nLineMaxY,pHeightOfEntry[i]);//#50082# +/*?*/ aTextPos.X () += nMaxX + 2 * nLittleSpace + nLegendHeight; +/*?*/ } +/*N*/ } +/*N*/ else if (nShows >= nTextRows - 1) // FG: Die Legende wird in mehrere Spalten umgebrochen +/*N*/ { // also den Spaltenabstand setzen +/*N*/ aTextPos.X () += nMaxX + nLittleSpace + nLegendHeight + 2*nLittleSpace; +/*N*/ aTextPos.Y () = nLegendHeight / 4; +/*N*/ nShows = -1; +/*N*/ if (nActualColumn >= nTextCols) // FG: Dann wird die Legende zu breit! +/*N*/ { +/*N*/ break; // aus der for-Schleife raus, +/*N*/ // es muessen noch Felder deleted werden. +/*N*/ } +/*?*/ nActualColumn++; +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ +/*N*/ aTextPos.Y() += pHeightOfEntry[nIndex] + nLittleSpace; +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ //FG: Jetzt wird das umschliessende Rechteck berechnet. Man fraegt erst das +/*N*/ // BoundingRect des Legenden-Gruppenobjektes ab und addiert an den Raendern ein +/*N*/ // wenig Platz dazu. +/*N*/ Rectangle aLogRect = pGroup->GetLogicRect(); +/*N*/ aLogRect.Left() -= nLittleSpace; +/*N*/ aLogRect.Right() += nLittleSpace; +/*N*/ aLogRect.Top() -= nLittleSpace; +/*N*/ aLogRect.Bottom() += nLittleSpace; +/*N*/ SdrRectObj* pRectObj = new SchRectObj(aLogRect); +/*N*/ // FG: Das hier soll verhindern dass das Rechteck um die Legende markiert werden kann +/*N*/ pRectObj->SetMarkProtect(TRUE); +/*N*/ pRectObj->SetModel( this ); +/*N*/ pObjList->NbcInsertObject(SetObjectAttr(pRectObj, CHOBJID_LEGEND_BACK, +/*N*/ TRUE, TRUE, pLegendAttr), 0); +/*N*/ } +/*N*/ +/*N*/ delete[] pRegressNr; +/*N*/ delete[] pHeightOfEntry; +/*N*/ delete[] pWidthOfEntry; +/*N*/ } +/*N*/ +/*N*/ return pGroup; +/*N*/ } + +/************************************************************************* +|* +|* Diagramm erzeugen +|* +\************************************************************************/ + +/*N*/ SdrObjGroup* ChartModel::CreateChart(const Rectangle &rRect) +/*N*/ { +/*N*/ if( pDocShell ) +/*N*/ pDocShell->SetWaitCursor( TRUE ); +/*N*/ +/*N*/ Rectangle aRect( rRect ); +/*N*/ SdrObjGroup* pGroup; +/*N*/ +/*N*/ switch (eChartStyle) +/*N*/ { +/*N*/ case CHSTYLE_2D_AREA: +/*N*/ case CHSTYLE_2D_STACKEDAREA: +/*N*/ case CHSTYLE_2D_PERCENTAREA: +/*N*/ pGroup = Create2DRowLineChart(aRect);//neu, test! +/*N*/ break; +/*N*/ +/*N*/ case CHSTYLE_2D_LINE: +/*N*/ case CHSTYLE_2D_STACKEDLINE: +/*N*/ case CHSTYLE_2D_PERCENTLINE: +/*N*/ case CHSTYLE_2D_LINESYMBOLS : +/*N*/ case CHSTYLE_2D_STACKEDLINESYM : +/*N*/ case CHSTYLE_2D_PERCENTLINESYM : +/*N*/ case CHSTYLE_2D_CUBIC_SPLINE : +/*N*/ case CHSTYLE_2D_CUBIC_SPLINE_SYMBOL : +/*N*/ case CHSTYLE_2D_B_SPLINE : +/*N*/ case CHSTYLE_2D_B_SPLINE_SYMBOL : +/*N*/ case CHSTYLE_2D_STOCK_1: +/*N*/ case CHSTYLE_2D_STOCK_2: +/*N*/ case CHSTYLE_2D_STOCK_3: +/*N*/ case CHSTYLE_2D_STOCK_4: +/*N*/ pGroup = Create2DRowLineChart(aRect); +/*N*/ break; +/*N*/ +/*N*/ case CHSTYLE_2D_COLUMN: +/*N*/ case CHSTYLE_2D_STACKEDCOLUMN: +/*N*/ case CHSTYLE_2D_PERCENTCOLUMN: +/*N*/ case CHSTYLE_2D_BAR: +/*N*/ case CHSTYLE_2D_STACKEDBAR: +/*N*/ case CHSTYLE_2D_PERCENTBAR: +/*N*/ case CHSTYLE_2D_LINE_COLUMN: +/*N*/ case CHSTYLE_2D_LINE_STACKEDCOLUMN: +/*N*/ pGroup = Create2DColChart(aRect); +/*N*/ break; +/*N*/ +/*N*/ case CHSTYLE_2D_PIE_SEGOF1: +/*N*/ { +/*N*/ for (short i = 1; i < nPieSegCount; i++) +/*N*/ SetPieSegOfs(i, 0); +/*N*/ SetPieSegOfs( 0, 10 ); +/*N*/ pGroup = Create2DPieChart(aRect); +/*N*/ break; +/*N*/ } +/*N*/ +/*N*/ case CHSTYLE_2D_PIE_SEGOFALL: +/*N*/ { +/*N*/ for (short i = 0; i < nPieSegCount; i++) +/*N*/ SetPieSegOfs( i, 10 ); +/*N*/ } +/*N*/ +/*N*/ case CHSTYLE_2D_PIE: +/*N*/ pGroup = Create2DPieChart(aRect); +/*N*/ break; +/*N*/ +/*N*/ case CHSTYLE_2D_DONUT1: //DonutCharts haben jetzt eigenes Create +/*N*/ case CHSTYLE_2D_DONUT2: +/*N*/ pGroup = Create2DDonutChart(aRect); +/*N*/ break; +/*N*/ +/*N*/ case CHSTYLE_2D_XYSYMBOLS : +/*N*/ case CHSTYLE_2D_XY_LINE : +/*N*/ case CHSTYLE_2D_XY : +/*N*/ case CHSTYLE_2D_CUBIC_SPLINE_XY : +/*N*/ case CHSTYLE_2D_CUBIC_SPLINE_SYMBOL_XY : +/*N*/ case CHSTYLE_2D_B_SPLINE_XY : +/*N*/ case CHSTYLE_2D_B_SPLINE_SYMBOL_XY : +/*N*/ pGroup = Create2DXYChart(aRect); +/*N*/ break; +/*N*/ +/*N*/ case CHSTYLE_2D_NET: +/*N*/ case CHSTYLE_2D_NET_SYMBOLS: +/*N*/ case CHSTYLE_2D_NET_STACK: +/*N*/ case CHSTYLE_2D_NET_SYMBOLS_STACK: +/*N*/ case CHSTYLE_2D_NET_PERCENT: +/*N*/ case CHSTYLE_2D_NET_SYMBOLS_PERCENT: +/*N*/ pGroup = Create2DNetChart(aRect); +/*N*/ break; +/*N*/ +/*N*/ case CHSTYLE_3D_COLUMN: +/*N*/ case CHSTYLE_3D_BAR: +/*N*/ case CHSTYLE_3D_STRIPE: +/*N*/ case CHSTYLE_3D_AREA: +/*N*/ case CHSTYLE_3D_SURFACE: +/*N*/ pGroup = Create3DDeepChart(aRect); +/*N*/ break; +/*N*/ +/*N*/ case CHSTYLE_3D_FLATCOLUMN: +/*N*/ case CHSTYLE_3D_STACKEDFLATCOLUMN: +/*N*/ case CHSTYLE_3D_PERCENTFLATCOLUMN: +/*N*/ case CHSTYLE_3D_STACKEDAREA: +/*N*/ case CHSTYLE_3D_PERCENTAREA: +/*N*/ case CHSTYLE_3D_FLATBAR: +/*N*/ case CHSTYLE_3D_STACKEDFLATBAR: +/*N*/ case CHSTYLE_3D_PERCENTFLATBAR: +/*N*/ pGroup = Create3DFlatChart(aRect); +/*N*/ break; +/*N*/ +/*N*/ case CHSTYLE_3D_PIE: +/*N*/ pGroup = Create3DNewPieChart(aRect); +/*N*/ break; +/*N*/ +/*N*/ default: +/*?*/ eChartStyle = CHSTYLE_2D_COLUMN; +/*?*/ pGroup = Create2DColChart(aRect); +/*?*/ break; +/*N*/ } +/*N*/ +/*N*/ if( pDocShell ) +/*N*/ pDocShell->SetWaitCursor( FALSE ); +/*N*/ +/*N*/ SdrPage* pPage=GetPage( 0 ); +/*N*/ SdrObject* pObj = GetObjWithId( CHOBJID_DIAGRAM_AREA, *pPage ); +/*N*/ if( pObj ) +/*N*/ pObj->SetMoveProtect( TRUE ); +/*N*/ +/*N*/ return pGroup; +/*N*/ } + +/*N*/ void ChartModel::PrepareOld3DStorage() +/*N*/ { +/*N*/ SfxItemSet aTmpSet(*pItemPool,nRowWhichPairs); +/*N*/ aTmpSet.Put(XLineStyleItem(XLINE_SOLID)); +/*N*/ aTmpSet.Put(XLineWidthItem(0)); +/*N*/ aTmpSet.Put(XLineColorItem(String(), RGBColor(COL_BLACK))); +/*N*/ +/*N*/ +/*N*/ long i,nCount=aDataRowAttrList.Count(); +/*N*/ for (i=0;i<nCount;i++) +/*N*/ { +/*N*/ SfxItemSet *pDataRowAttr = new SfxItemSet (*pItemPool, nRowWhichPairs); +/*N*/ pDataRowAttr->Put(*(aDataRowAttrList.GetObject(i))); +/*N*/ pDataRowAttr->Put(aTmpSet); +/*N*/ aTmpDataRowAttrList.Insert (pDataRowAttr, LIST_APPEND); +/*N*/ } +/*N*/ +/*N*/ SfxItemSet * pItemSet; +/*N*/ nCount=aDataPointAttrList.Count(); +/*N*/ for (i=0;i<nCount;i++) +/*N*/ { +/*N*/ SfxItemSet* pSet=new SfxItemSet(*pItemPool, nRowWhichPairs); +/*N*/ pItemSet = aDataPointAttrList.GetObject(i); +/*N*/ if (pItemSet != NULL) +/*N*/ pSet->Put(*pItemSet); +/*N*/ pSet->Put(aTmpSet); +/*N*/ aTmpDataPointAttrList.Insert (pSet, LIST_APPEND); +/*N*/ } +/*N*/ +/*N*/ nCount=aSwitchDataPointAttrList.Count(); +/*N*/ for (i=0;i<nCount;i++) +/*N*/ { +/*N*/ SfxItemSet* pSet=new SfxItemSet(*pItemPool, nRowWhichPairs); +/*N*/ pItemSet = aSwitchDataPointAttrList.GetObject(i); +/*N*/ if (pItemSet != NULL) +/*N*/ pSet->Put(*pItemSet); +/*N*/ pSet->Put(aTmpSet); +/*N*/ aTmpSwitchDataPointAttrList.Insert (pSet, LIST_APPEND); +/*N*/ } +/*N*/ } +/*N*/ void ChartModel::CleanupOld3DStorage() +/*N*/ { +/*N*/ long i,nCount = aTmpDataRowAttrList.Count(); +/*N*/ for (i = 0 ; i < nCount; i++) +/*N*/ delete aTmpDataRowAttrList.GetObject(i); +/*N*/ aTmpDataRowAttrList.Clear(); +/*N*/ +/*N*/ nCount = aTmpDataPointAttrList.Count(); +/*N*/ for (i = 0 ; i < nCount; i++) +/*N*/ delete aTmpDataPointAttrList.GetObject(i); +/*N*/ aTmpDataPointAttrList.Clear(); +/*N*/ +/*N*/ nCount = aTmpSwitchDataPointAttrList.Count(); +/*N*/ for (i = 0 ; i < nCount; i++) +/*N*/ delete aTmpSwitchDataPointAttrList.GetObject(i); +/*N*/ aTmpSwitchDataPointAttrList.Clear(); +/*N*/ } +/************************************************************************* +|* +|* Chart-Attribute speichern + +\************************************************************************/ +/*N*/ void ChartModel::PrepareAxisStorage() +/*N*/ { +/*N*/ if(pTmpXItems) +/*?*/ delete pTmpXItems; +/*N*/ if(pTmpYItems) +/*?*/ delete pTmpYItems; +/*N*/ if(pTmpZItems) +/*?*/ delete pTmpZItems; +/*N*/ //Leider muss das ummappen vorm speichern des pools stattfinden +/*N*/ pTmpXItems = new SfxItemSet(*pItemPool,nCompatAxisWhichPairs); +/*N*/ pTmpYItems = new SfxItemSet(*pItemPool,nCompatAxisWhichPairs); +/*N*/ pTmpZItems = new SfxItemSet(*pItemPool,nCompatAxisWhichPairs); +/*N*/ +/*N*/ pTmpXItems->Put(GetAttr(CHOBJID_DIAGRAM_X_AXIS)); +/*N*/ AxisAttrNew2Old(*pTmpXItems,CHOBJID_DIAGRAM_X_AXIS,TRUE); +/*N*/ +/*N*/ pTmpYItems->Put(GetAttr(CHOBJID_DIAGRAM_Y_AXIS)); +/*N*/ AxisAttrNew2Old(*pTmpYItems,CHOBJID_DIAGRAM_Y_AXIS,TRUE); +/*N*/ +/*N*/ pTmpZItems->Put(GetAttr(CHOBJID_DIAGRAM_Z_AXIS)); +/*N*/ AxisAttrNew2Old(*pTmpZItems,CHOBJID_DIAGRAM_Z_AXIS,TRUE); +/*N*/ +/*N*/ +/*N*/ //Achse wird auf Attr-Basis gestreamt! +/*N*/ pChartXAxis->FillItemSet(); +/*N*/ pChartYAxis->FillItemSet(); +/*N*/ pChartZAxis->FillItemSet(); +/*N*/ pChartBAxis->FillItemSet(); +/*N*/ pChartAAxis->FillItemSet(); +/*N*/ } + +/*N*/ void ChartModel::StoreAttributes(SvStream& rOut) const +/*N*/ { +/*N*/ #ifdef DBG_UTIL +/*N*/ ByteString aBStr( aMainTitle, RTL_TEXTENCODING_ASCII_US ); +/*N*/ CHART_TRACE1( "ChartModel::StoreAttributes (%s)", aBStr.GetBuffer() ); +/*N*/ #endif +/*N*/ +/*N*/ rtl_TextEncoding eSysSet = ::GetSOStoreTextEncoding( gsl_getSystemTextEncoding()); +/*N*/ rOut.SetStreamCharSet( eSysSet ); +/*N*/ +/*N*/ SchIOCompat aIO(rOut, STREAM_WRITE, 17); +/*N*/ long nFileFormat = rOut.GetVersion (); +/*N*/ +/*N*/ //#50116# 8->9 +/*N*/ //#54870# ->10 +/*N*/ //12: ChartAchsen +/*N*/ //13 Nachtrag: X-AchsenAttr-default bei XY-Charts (store unveraendert) +/*N*/ //14 Overlap , Gapwith der 2 Y-Achsen +/*N*/ //15 Neues 3D-Pie +/*N*/ //16 Items fuer Achse SCHATTR_AXIS_SHOWDESCR,SCHATTR_AXIS_SHOWAXIS aktiviert, +/*N*/ // bisher nur von pChartBAxis genutzt! +/*N*/ +/*N*/ //FG: 12 - seit 20.02.1997 - Umbruch ja/ein pro Achse hinzu +/*N*/ //FG: 13 - seit 09.03.1997 Alle Variablen mit Tag 13: +/*N*/ //DL: 14 - seit 11.03.1997 aSpotColor & aAmbientColor +/*N*/ // FG + TextausPositionen +/*N*/ //FG: 15 - set 14.03.1997 Textausrichtung +/*N*/ //SOH:16 - seit 04.05.1997 NumberFormatter +/*N*/ +/*N*/ //TODO: konvertieren der Attribute pChartAttr in eChartStyle (Fileversion >=10) +/*N*/ +/*N*/ UINT32 nMoreData = 16; +/*N*/ +/*N*/ short i, nCount; +/*N*/ +/*N*/ rOut << aLightVec->X (); +/*N*/ rOut << aLightVec->Y (); +/*N*/ rOut << aLightVec->Z (); +/*N*/ +/*N*/ if (pChartData) +/*N*/ { +/*N*/ INT16 ID = CHDATAID_MEMCHART; // damit aeltere versionen damit fertig werden +/*N*/ rOut << (INT16) ID; +/*N*/ rOut << *(SchMemChart*)pChartData; +/*N*/ } +/*N*/ else +/*N*/ { +/*?*/ INT16 nInt16 = (INT16)CHDATAID_NONE; rOut << nInt16; +/*N*/ } +/*N*/ +/*N*/ BOOL bDummy = TRUE; // war frueher bOwnChart +/*N*/ rOut << bIsCopied; +/*N*/ rOut << fMinData; +/*N*/ rOut << (INT16)eChartStyle; +/*N*/ +/*N*/ for (i = 0; i < LINE_POINT_COUNT; i++) +/*N*/ rOut << (INT16)eChartLinePoints[i]; +/*N*/ +/*N*/ +/*N*/ // Das ehemalige Member aRowColors[]. Es wird hier simuliert, damit +/*N*/ // alte Codeversionen mit der hier geschriebenen Datei arbeiten koennen. +/*N*/ Color aRowColors[ROW_COLOR_COUNT]; +/*N*/ +/*N*/ aRowColors[0] = Color( 0, 153, 255); +/*N*/ aRowColors[1] = Color(255, 51, 102); +/*N*/ aRowColors[2] = Color(102, 102, 102); +/*N*/ aRowColors[3] = Color( 51, 204, 102); +/*N*/ aRowColors[4] = Color(153, 102, 204); +/*N*/ aRowColors[5] = Color(255, 153, 102); +/*N*/ aRowColors[6] = Color(255, 204, 153); +/*N*/ aRowColors[7] = Color(153, 204, 255); +/*N*/ aRowColors[8] = Color( 0, 204, 204); +/*N*/ aRowColors[9] = Color(153, 0, 153); +/*N*/ aRowColors[10] = Color(255, 51, 51); +/*N*/ +/*N*/ aRowColors[11] = RGBColor(COL_WHITE); +/*N*/ for (i = 0; i < ROW_COLOR_COUNT; i++) +/*N*/ rOut << aRowColors[i]; +/*N*/ +/*N*/ const long nGapWidth = 10; +/*N*/ const long nOverlap = 0; +/*N*/ rOut << (INT32)nGapWidth; +/*N*/ rOut << (INT32)nOverlap; +/*N*/ rOut << (INT32)nMarkLen; //entfaellt demnaechst! -> ChartAxis +/*N*/ rOut << aChartRect; +/*N*/ rOut << (INT32)nPieHeight; +/*N*/ +/*N*/ rOut << (INT16)nPieSegCount; +/*N*/ for (i = 0; i < nPieSegCount; i++) +/*N*/ rOut << (INT32)pPieSegOfs[i]; +/*N*/ +/*N*/ INT16 nXA=nXAngle; +/*N*/ INT16 nYA=nYAngle; +/*N*/ INT16 nZA=nZAngle; +/*N*/ if(IsReal3D() && IsPieChart()) +/*N*/ { +/*N*/ Vector3D aVRot,aVTrans,aVShear,aVScale; +/*N*/ aSceneMatrix.Decompose(aVScale,aVTrans,aVRot,aVShear); +/*N*/ long nAngle= (long)(aVRot.Z() * 1800.0 / F_PI); +/*N*/ nAngle -= 900; +/*N*/ nAngle += 3600; +/*N*/ nAngle %= 3600; +/*N*/ nYA = (INT16)nAngle; +/*N*/ } +/*N*/ +/*N*/ rOut << (INT16)nXA;//anle; +/*N*/ rOut << (INT16)nYA;//ngle; +/*N*/ rOut << (INT16)nZA;//ngle; +/*N*/ +/*N*/ +/*N*/ //neu wegen Achsenrestrukturierung +/*N*/ BOOL bShowXAxis =pChartXAxis->IsVisible(); +/*N*/ BOOL bShowXDescr=pChartXAxis->HasDescription(); +/*N*/ BOOL bShowYAxis =pChartYAxis->IsVisible(); +/*N*/ BOOL bShowYDescr=pChartYAxis->HasDescription(); +/*N*/ BOOL bShowZAxis =pChartZAxis->IsVisible(); +/*N*/ BOOL bShowZDescr=pChartZAxis->HasDescription(); +/*N*/ +/*N*/ +/*N*/ // save unicode strings as ascii-strings for old binary format +/*N*/ rOut << (INT16)eSysSet; +/*N*/ +/*N*/ rOut << bShowMainTitle; +/*N*/ rOut.WriteByteString( aMainTitle ); +/*N*/ rOut << bShowSubTitle; +/*N*/ rOut.WriteByteString( aSubTitle ); +/*N*/ rOut << bShowXAxisTitle; +/*N*/ rOut.WriteByteString( aXAxisTitle ); +/*N*/ rOut << bShowYAxisTitle; +/*N*/ rOut.WriteByteString( aYAxisTitle ); +/*N*/ rOut << bShowZAxisTitle; +/*N*/ rOut.WriteByteString( aZAxisTitle ); +/*N*/ rOut << bShowXAxis; +/*N*/ rOut << bShowXGridMain; +/*N*/ rOut << bShowXGridHelp; +/*N*/ rOut << bShowXDescr; +/*N*/ rOut << bShowYAxis; +/*N*/ rOut << bShowYGridMain; +/*N*/ rOut << bShowYGridHelp; +/*N*/ rOut << bShowYDescr; +/*N*/ rOut << bShowZAxis; +/*N*/ rOut << bShowZGridMain; +/*N*/ rOut << bShowZGridHelp; +/*N*/ rOut << bShowZDescr; +/*N*/ +/*N*/ // In diesem Set koennten ungueltige Items vorhanden sein, da es +/*N*/ // das Set der allgemeinen TitleAttribute (aller Titel) ist +/*N*/ pTitleAttr->ClearInvalidItems(); +/*N*/ pTitleAttr->Store(rOut); +/*N*/ +/*N*/ pMainTitleAttr->Store(rOut); +/*N*/ pSubTitleAttr->Store(rOut); +/*N*/ pXAxisTitleAttr->Store(rOut); +/*N*/ pYAxisTitleAttr->Store(rOut); +/*N*/ pZAxisTitleAttr->Store(rOut); +/*N*/ +/*N*/ pAxisAttr->ClearInvalidItems(); +/*N*/ +/*N*/ pAxisAttr->Store(rOut); +/*N*/ +/*N*/ +/*N*/ +/*N*/ +/*N*/ +/*N*/ //Abwaertskompatibel speichern (this->PrepareAxisStorage()) +/*N*/ pTmpXItems->Store(rOut); +/*N*/ pTmpYItems->Store(rOut); +/*N*/ pTmpZItems->Store(rOut); +/*N*/ +/*N*/ pGridAttr->ClearInvalidItems(); +/*N*/ pGridAttr->Store(rOut); +/*N*/ pXGridMainAttr->Store(rOut); +/*N*/ pYGridMainAttr->Store(rOut); +/*N*/ pZGridMainAttr->Store(rOut); +/*N*/ pXGridHelpAttr->Store(rOut); +/*N*/ pYGridHelpAttr->Store(rOut); +/*N*/ pZGridHelpAttr->Store(rOut); +/*N*/ pDiagramAreaAttr->Store(rOut); +/*N*/ pDiagramWallAttr->Store(rOut); +/*N*/ pDiagramFloorAttr->Store(rOut); +/*N*/ pLegendAttr->Store(rOut); +/*N*/ +/*N*/ +/*N*/ +/*N*/ if (nFileFormat == SOFFICE_FILEFORMAT_31) +/*N*/ { +/*N*/ +/*N*/ SfxItemSet aStoreAttr (*pItemPool, XATTR_LINE_FIRST, XATTR_LINE_LAST, +/*N*/ XATTR_FILL_FIRST, XATTR_FILL_LAST, +/*N*/ //EE_ITEMS_START, EE_ITEMS_END, +/*N*/ SCHATTR_DATADESCR_START, SCHATTR_DATADESCR_END, 0), +/*N*/ aPoolItemSet (*pItemPool, nRowWhichPairs), +/*N*/ *pItemSet; +/*N*/ +/*N*/ // FG: 25.2.97 Das Schreiben im 3.1 Format geht schief wenn man +/*N*/ // in globfunc.cxx die Routine CopyAttributesFrom40to31 verwendet. +/*N*/ // Dort wurden die items per Invalidate und Set einzeln kopiert. (falsch) +/*N*/ nCount = (short)aDataRowAttrList.Count(); +/*N*/ rOut << (INT16)nCount; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ { +/*N*/ SfxItemSet* pSet = aStoreAttr.Clone(); +/*N*/ pSet->Put( *aDataRowAttrList.GetObject(i), TRUE ); +/*N*/ pSet->Store( rOut ); +/*N*/ delete pSet; +/*N*/ } +/*N*/ +/*N*/ nCount = (short)aDataPointAttrList.Count(); +/*N*/ rOut << (INT16)nCount; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ { +/*N*/ SfxItemSet* pSet = aStoreAttr.Clone(); +/*N*/ pItemSet = aDataPointAttrList.GetObject(i); +/*N*/ if (pItemSet != NULL) +/*N*/ pSet->Put (*pItemSet, TRUE ); +/*N*/ else +/*N*/ pSet->Put (aPoolItemSet, TRUE); +/*N*/ pSet->Store(rOut); +/*N*/ delete pSet; +/*N*/ } +/*N*/ +/*N*/ nCount = (short)aSwitchDataPointAttrList.Count(); +/*N*/ rOut << (INT16)nCount; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ { +/*N*/ SfxItemSet* pSet = aStoreAttr.Clone(); +/*N*/ pItemSet = aSwitchDataPointAttrList.GetObject(i); +/*N*/ if (pItemSet != NULL) +/*N*/ pSet->Put (*pItemSet, TRUE ); +/*N*/ else +/*N*/ pSet->Put (aPoolItemSet, TRUE); +/*N*/ pSet->Store(rOut); +/*N*/ delete pSet; +/*N*/ } +/*N*/ } +/*N*/ else if(nFileFormat <= SOFFICE_FILEFORMAT_40 && IsReal3D()) //siehe auch DocShell, Save,SaveAs!!!!! +/*N*/ { +/*N*/ +/*N*/ nCount = (short)aTmpDataRowAttrList.Count(); +/*N*/ rOut << (INT16)nCount; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ aTmpDataRowAttrList.GetObject(i)->Store(rOut); +/*N*/ +/*N*/ nCount = (short)aTmpDataPointAttrList.Count(); +/*N*/ rOut << (INT16)nCount; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ aTmpDataPointAttrList.GetObject(i)->Store(rOut); +/*N*/ +/*N*/ nCount = (short)aTmpSwitchDataPointAttrList.Count(); +/*N*/ rOut << (INT16)nCount; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ aTmpSwitchDataPointAttrList.GetObject(i)->Store(rOut); +/*N*/ +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ SfxItemSet aPoolItemSet (*pItemPool, nRowWhichPairs), +/*N*/ * pItemSet; +/*N*/ +/*N*/ nCount = (short)aDataRowAttrList.Count(); +/*N*/ rOut << (INT16)nCount; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ aDataRowAttrList.GetObject(i)->Store(rOut); +/*N*/ +/*N*/ nCount = (short)aDataPointAttrList.Count(); +/*N*/ rOut << (INT16)nCount; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ { +/*N*/ pItemSet = aDataPointAttrList.GetObject(i); +/*N*/ if (pItemSet != NULL) +/*N*/ pItemSet->Store(rOut); +/*N*/ else +/*N*/ aPoolItemSet.Store(rOut); +/*N*/ } +/*N*/ +/*N*/ nCount = (short)aSwitchDataPointAttrList.Count(); +/*N*/ rOut << (INT16)nCount; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ { +/*N*/ pItemSet = aSwitchDataPointAttrList.GetObject(i); +/*N*/ if (pItemSet != NULL) +/*N*/ pItemSet->Store(rOut); +/*N*/ else +/*N*/ aPoolItemSet.Store(rOut); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ rOut << (INT16)eDataDescr; +/*N*/ rOut << bShowSym; +/*N*/ rOut << bSwitchData; +/*N*/ +/*N*/ UINT32 nTmp; +/*N*/ +/*N*/ nTmp=((ChartModel*)this)->GetNumFmt(CHOBJID_DIAGRAM_Y_AXIS,FALSE); +/*N*/ rOut << nTmp;//nValFormat; +/*N*/ nTmp=((ChartModel*)this)->GetNumFmt(CHOBJID_DIAGRAM_Y_AXIS,TRUE); +/*N*/ rOut << nTmp;//nPercentValFormat; +/*N*/ nTmp=((ChartModel*)this)->GetNumFmt(CHOBJID_DIAGRAM_X_AXIS,FALSE); +/*N*/ rOut << nTmp;//nDescrFormat; +/*N*/ nTmp=((ChartModel*)this)->GetNumFmt(CHOBJID_DIAGRAM_X_AXIS,TRUE); +/*N*/ rOut << nTmp;//nPercentDescrFormat; +/*N*/ +/*N*/ // Achtung : Gravierende Aenderungen an der Datei gegenueber der Auslieferungsversion +/*N*/ // es werden mehr Daten geschrieben : Die alte Version muss (!) das aber auch verkraften +/*N*/ // Die Reihenfolge muss (!!!!) eingehalten werden +/*N*/ pChartYAxis->StoreMemberCompat(rOut); +/*N*/ pChartXAxis->StoreMemberCompat(rOut); +/*N*/ pChartZAxis->StoreMemberCompat(rOut); +/*N*/ +/*N*/ rOut << fMaxData; +/*N*/ +/*N*/ rOut << nMoreData; +/*N*/ +/*N*/ if (nMoreData >= 2) +/*N*/ if (pChartData) +/*N*/ { +/*N*/ rOut.WriteByteString( pChartData->SomeData1() ); +/*N*/ rOut.WriteByteString( pChartData->SomeData2() ); +/*N*/ rOut.WriteByteString( pChartData->SomeData3() ); +/*N*/ rOut.WriteByteString( pChartData->SomeData4() ); +/*N*/ } +/*N*/ else +/*N*/ { +/*?*/ String aEmpty; +/*?*/ +/*?*/ rOut.WriteByteString( aEmpty ); +/*?*/ rOut.WriteByteString( aEmpty ); +/*?*/ rOut.WriteByteString( aEmpty ); +/*?*/ rOut.WriteByteString( aEmpty ); +/*N*/ } +/*N*/ +/*N*/ if (nMoreData >= 3) rOut << fSpotIntensity; +/*N*/ +/*N*/ if (nMoreData >= 4) +/*N*/ { +/*N*/ BOOL bDummy = TRUE; // war frueher bIsRegression +/*N*/ +/*N*/ rOut << bShowAverage; +/*N*/ rOut << (INT16)eErrorKind; +/*N*/ rOut << bDummy; +/*N*/ rOut << (INT16)eIndicate; +/*N*/ rOut << fIndicatePercent; +/*N*/ rOut << fIndicateBigError; +/*N*/ rOut << fIndicatePlus; +/*N*/ rOut << fIndicateMinus; +/*N*/ } +/*N*/ +/*N*/ if (nMoreData >= 5) rOut << (INT16) eRegression; +/*N*/ +/*N*/ if (nMoreData >= 6) +/*N*/ { +/*N*/ rOut << (INT32) nSplineDepth; +/*N*/ rOut << (INT32) nGranularity; +/*N*/ } +/*N*/ +/*N*/ if (nMoreData >= 7) +/*N*/ { +/*N*/ rOut << bLegendVisible; +/*N*/ } +/*N*/ +/*N*/ if (nMoreData >= 8) +/*N*/ { +/*N*/ nCount = (short)aRegressAttrList.Count(); +/*N*/ rOut << (INT16)nCount; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ aRegressAttrList.GetObject(i)->Store(rOut); +/*N*/ +/*N*/ nCount = (short)aAverageAttrList.Count(); +/*N*/ rOut << (INT16)nCount; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ aAverageAttrList.GetObject(i)->Store(rOut); +/*N*/ +/*N*/ nCount = (short)aErrorAttrList.Count(); +/*N*/ rOut << (INT16)nCount; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ aErrorAttrList.GetObject(i)->Store(rOut); +/*N*/ +/*N*/ } +/*N*/ +/*N*/ if (nMoreData >= 9) rOut << fAmbientIntensity; +/*N*/ if (nMoreData >= 10) rOut << bTextScalable; +/*N*/ if (nMoreData >= 11) rOut << aInitialSize; +/*N*/ if (nMoreData >= 12) // FG: Zusaetze wegen des Umruchs von Achsentext und Legendentext 20.02.97 +/*N*/ { +/*N*/ // FG: Vielleicht etwas viel Speicher fuer BOOL, aber es macht nur 8 Byte pro Chart +/*N*/ rOut << (INT16) bFormatXAxisTextInMultipleLinesIfNecessary; +/*N*/ rOut << (INT16) bFormatYAxisTextInMultipleLinesIfNecessary; +/*N*/ rOut << (INT16) bFormatZAxisTextInMultipleLinesIfNecessary; +/*N*/ rOut << (INT16) bFormatLegendTextInMultipleLinesIfNecessary; +/*N*/ } +/*N*/ if (nMoreData >= 13) // FG: 9.3.1997 Zusaetze wegen einer freien Positionierung und einem freien +/*N*/ { // Resize von Gruppenobjekten im Chart. +/*N*/ rOut << (INT16) nXAxisTextMaximumNumberOfLines; +/*N*/ rOut << (INT16) nYAxisTextMaximumNumberOfLines; +/*N*/ rOut << (INT16) nZAxisTextMaximumNumberOfLines; +/*N*/ rOut << (INT32) nWidthOfFirstXAxisText; +/*N*/ rOut << (INT32) nWidthOfLastXAxisText; +/*N*/ rOut << aTitleTopCenter; +/*N*/ rOut << aSubTitleTopCenter; +/*N*/ rOut << aDiagramRectangle; +/*N*/ rOut << aLegendTopLeft; +/*N*/ rOut << aTitleXAxisPosition; +/*N*/ rOut << aTitleYAxisPosition; +/*N*/ rOut << aTitleZAxisPosition; +/*N*/ rOut << (INT16) bUseRelativePositionsForChartGroups; +/*N*/ rOut << (INT16) bAdjustMarginsForLegend; +/*N*/ rOut << (INT16) bAdjustMarginsForMainTitle; +/*N*/ rOut << (INT16) bAdjustMarginsForSubTitle; +/*N*/ rOut << (INT16) bAdjustMarginsForXAxisTitle; +/*N*/ rOut << (INT16) bAdjustMarginsForYAxisTitle; +/*N*/ rOut << (INT16) bAdjustMarginsForZAxisTitle; +/*N*/ } +/*N*/ if (nMoreData >= 14) +/*N*/ { +/*N*/ rOut << aSpotColor; // FG: Von DL, um sich die Farbeinstellungen der 3d-Lichter +/*N*/ rOut << aAmbientColor; // bei 3d-Charts merken zu koennen. +/*N*/ +/*N*/ BOOL bTmp=bDiagramHasBeenMovedOrResized; //neu -> alt: dann immer rearrange +/*N*/ if(IsReal3D() && IsPieChart()) +/*N*/ bTmp=FALSE; +/*N*/ +/*N*/ rOut << bTmp; // FG: 12.3.97, Falls das Chart gespeichert wird +/*N*/ rOut << bMainTitleHasBeenMoved; // soll es immer noch die relativen Positionen +/*N*/ rOut << bSubTitleHasBeenMoved; // der Objektgruppen beachten, falls eine +/*N*/ rOut << bLegendHasBeenMoved; // dieser Gruppen bewegt worden ist. +/*N*/ rOut << bXAxisTitleHasBeenMoved; +/*N*/ rOut << bYAxisTitleHasBeenMoved; +/*N*/ rOut << bZAxisTitleHasBeenMoved; +/*N*/ } +/*N*/ if (nMoreData >= 15) // FG: 14.3.97 Damit bei einem angefassten Text die Position sinnvoll gesetzt werden +/*N*/ { // auch nach einer Schriftgroessenaenderung muss man sich merken wie die Ausrichtung war +/*N*/ rOut << (INT16) eAdjustXAxesTitle; +/*N*/ rOut << (INT16) eAdjustYAxesTitle; +/*N*/ rOut << (INT16) eAdjustZAxesTitle; +/*N*/ } +/*N*/ if (nMoreData >= 16) // NumberFormater waren bisher nicht persistent +/*N*/ { +/*N*/ pNumFormatter->Save( rOut ); +/*N*/ pNumFormatter->Save( rOut ); +/*N*/ pNumFormatter->Save( rOut ); +/*N*/ } +/*N*/ +/*N*/ rOut << (INT16) nBarPercentWidth; //#50116# ist ein long, aber Range von 0..100 +/*N*/ rOut << (INT32) m_nDefaultColorSet;//#50149# +/*N*/ +/*N*/ rOut << (INT32) nNumLinesInColChart;//#50212# +/*N*/ +/*N*/ // #74536# BM use these three former -1 dummies for +/*N*/ // numberformat last set by CALC +/*N*/ rOut << (INT32) nXLastNumFmt; +/*N*/ rOut << (INT32) nYLastNumFmt; +/*N*/ rOut << (INT32) nBLastNumFmt; +/*N*/ +/*N*/ rOut << (INT32)(-1); // dummy +/*N*/ +/*N*/ //IOVer 11 +/*N*/ pStockLineAttr->Store(rOut); +/*N*/ pStockLossAttr->Store(rOut); +/*N*/ pStockPlusAttr->Store(rOut); +/*N*/ +/*N*/ +/*N*/ //IOVer12: +/*N*/ //nAxisId ist die zu ladene/speichernde Achse, +/*N*/ //festgelegt sind in V12 nur 1=X, 2=Y,3=Z und 4=2.Y-Achse (B) +/*N*/ //neu: 5 = 2. X-Achse +/*N*/ //-1 bedeutet KEINE WEITEREN ACHSEN! +/*N*/ //Es MUSS keine Achse gestreamt werden (siehe Lade-Routine) +/*N*/ //Die Reihenfolge ist eigentlich auch egal, jedoch gilt beim Laden: +/*N*/ //erst die primaere und dann die sekundaere (X, bzw. evtl auch Y) Achse +/*N*/ //(um defaults aus der primaeren Achse heraus zu erzeugen) +/*N*/ +/*N*/ INT32 nAxisId=CHART_AXIS_PRIMARY_X; +/*N*/ rOut << nAxisId; +/*N*/ GetAttr(CHOBJID_DIAGRAM_X_AXIS).Store(rOut); +/*N*/ +/*N*/ nAxisId=CHART_AXIS_PRIMARY_Y; +/*N*/ rOut << nAxisId; +/*N*/ GetAttr(CHOBJID_DIAGRAM_Y_AXIS).Store(rOut); +/*N*/ +/*N*/ nAxisId=CHART_AXIS_PRIMARY_Z; +/*N*/ rOut << nAxisId; +/*N*/ GetAttr(CHOBJID_DIAGRAM_Z_AXIS).Store(rOut); +/*N*/ +/*N*/ nAxisId=CHART_AXIS_SECONDARY_Y; +/*N*/ rOut << nAxisId; +/*N*/ GetAttr(CHOBJID_DIAGRAM_B_AXIS).Store(rOut); +/*N*/ +/*N*/ nAxisId=CHART_AXIS_SECONDARY_X; +/*N*/ rOut << nAxisId; +/*N*/ GetAttr(CHOBJID_DIAGRAM_A_AXIS).Store(rOut); +/*N*/ +/*N*/ //Elementar wichtig! Diesen Wert zu streamen ist absolutes Minimum +/*N*/ //die obigen derzeit 4 Achsen kann man dagegen getrost reduzieren oder aufstocken +/*N*/ //ohne dass die Abwaertskompatiblitaet leidet! Genauso lassen sich beliebige +/*N*/ //Achsen mit einer Id>4 dazwischen haengen. In alten Versionen wird bei +/*N*/ //unbekannter id einfach ein Dummy geladen (und weggeschmissen) +/*N*/ nAxisId=-1; +/*N*/ rOut << nAxisId; +/*N*/ //Ende IOVersion 12 +/*N*/ +/*N*/ nTmp = aBarY1.GetGap(); +/*N*/ rOut << nTmp; +/*N*/ nTmp = aBarY1.GetOverlap(); +/*N*/ rOut << nTmp; +/*N*/ nTmp = aBarY2.GetGap(); +/*N*/ rOut << nTmp; +/*N*/ nTmp = aBarY2.GetOverlap(); +/*N*/ rOut << nTmp; +/*N*/ +/*N*/ +/*N*/ // IOVersion 15 +/*N*/ rOut << bDiagramHasBeenMovedOrResized; // FG: 12.3.97, Falls das Chart gespeichert wird +/*N*/ } + +/************************************************************************* +|* +|* Chart-Attribute laden +|* +\************************************************************************/ + +/*N*/ void ChartModel::LoadAttributes(SvStream& rIn) +/*N*/ { +/*N*/ #ifdef DBG_UTIL +/*N*/ ByteString aBStr( aMainTitle, RTL_TEXTENCODING_ASCII_US ); +/*N*/ CHART_TRACE1( "ChartModel::LoadAttributes (%s)", aBStr.GetBuffer() ); +/*N*/ #endif +/*N*/ +/*N*/ // aInfo is a member of SdrModel +/*N*/ // the SdrModel was read before this, so the value is set +/*N*/ rtl_TextEncoding eSysSet = ::GetSOLoadTextEncoding( aInfo.eLastReadCharSet, rIn.GetVersion()); +/*N*/ rIn.SetStreamCharSet( eSysSet ); +/*N*/ // Note: The CharSet is stored in the MemChart and later set again at the stream ! +/*N*/ +/*N*/ SchIOCompat aIO(rIn, STREAM_READ); +/*N*/ +/*N*/ short i, nCount; +/*N*/ INT16 nInt16, nCharSet; +/*N*/ INT32 nInt32; +/*N*/ SfxItemSet* pAttr; +/*N*/ BOOL bNoMore = FALSE; +/*N*/ int nVersion = aIO.GetVersion(); +/*N*/ +/*N*/ rIn >> aLightVec->X (); +/*N*/ rIn >> aLightVec->Y (); +/*N*/ rIn >> aLightVec->Z (); +/*N*/ +/*N*/ if (nVersion >= 3) +/*N*/ { +/*N*/ rIn >> nInt16; +/*N*/ +/*N*/ // fuer den fall, dass initial das diagrammfenster generiert wurde +/*N*/ delete pChartData; +/*N*/ +/*N*/ // Note: The CharSet is stored in the MemChart and set there at the stream ! +/*N*/ switch ((ChartDataId)nInt16) +/*N*/ { +/*N*/ case CHDATAID_MEMCHART_PLUS : +/*?*/ pChartData = new SchMemChart (CHDATAID_MEMCHART_PLUS); +/*?*/ rIn >> *(SchMemChart*)pChartData; +/*?*/ pChartData->IncreaseRefCount(); +/*?*/ break; +/*?*/ +/*?*/ case CHDATAID_DYNCHART: +/*N*/ case CHDATAID_MEMCHART: +/*N*/ pChartData = new SchMemChart (CHDATAID_MEMCHART); +/*N*/ rIn >> *(SchMemChart*)pChartData; +/*N*/ pChartData->IncreaseRefCount(); +/*N*/ break; +/*N*/ +/*N*/ default : +/*N*/ bNoMore = TRUE; +/*N*/ } +/*N*/ +/*N*/ if (nVersion >= 5) rIn >> bIsCopied; +/*N*/ +/*N*/ if (nVersion >= 8) rIn >> fMinData; +/*N*/ else if (pChartData) +/*N*/ { +/*?*/ long nColCnt = GetColCount(); +/*?*/ long nRowCnt = GetRowCount(); +/*?*/ +/*?*/ for (short nCol = 0; nCol < nColCnt; nCol++) +/*?*/ for (short nRow = 0; nRow < nRowCnt; nRow++) +/*?*/ { +/*?*/ double fData = GetData(nCol, nRow); +/*?*/ +/*?*/ if ((nCol == 0) && (nRow == 0)) +/*?*/ { +/*?*/ pChartYAxis->SetMin(fData); +/*?*/ pChartYAxis->SetMax(fData); +/*?*/ } +/*?*/ if (fData < pChartYAxis->GetMin()) +/*?*/ pChartYAxis->SetMin(fData); +/*?*/ if (fData > pChartYAxis->GetMax()) +/*?*/ pChartYAxis->SetMax(fData); +/*?*/ } +/*?*/ +/*?*/ bNoMore = TRUE; +/*?*/ } +/*N*/ } +/*N*/ +/*N*/ rIn >> nInt16; +/*N*/ if (nVersion < 1) +/*N*/ { +/*N*/ switch ((ChartStyleV0)nInt16) +/*N*/ { +/*?*/ case CHART2D_LINE: +/*?*/ eChartStyle = CHSTYLE_2D_LINE; +/*?*/ break; +/*?*/ +/*?*/ case CHART2D_STACKEDLINE: +/*?*/ eChartStyle = CHSTYLE_2D_STACKEDLINE; +/*?*/ break; +/*?*/ +/*?*/ case CHART2D_BAR: +/*?*/ eChartStyle = CHSTYLE_2D_COLUMN; +/*?*/ break; +/*?*/ +/*?*/ case CHART2D_STACKEDBAR: +/*?*/ eChartStyle = CHSTYLE_2D_STACKEDCOLUMN; +/*?*/ break; +/*?*/ +/*?*/ case CHART2D_COLUMN: +/*?*/ eChartStyle = CHSTYLE_2D_BAR; +/*?*/ break; +/*?*/ +/*?*/ case CHART2D_STACKEDCOLUMN: +/*?*/ eChartStyle = CHSTYLE_2D_STACKEDBAR; +/*?*/ break; +/*?*/ +/*?*/ case CHART2D_AREA: +/*?*/ eChartStyle = CHSTYLE_2D_AREA; +/*?*/ break; +/*?*/ +/*?*/ case CHART2D_STACKEDAREA: +/*?*/ eChartStyle = CHSTYLE_2D_STACKEDAREA; +/*?*/ break; +/*?*/ +/*?*/ case CHART2D_PIE: +/*?*/ eChartStyle = CHSTYLE_2D_PIE; +/*?*/ break; +/*?*/ +/*?*/ case CHART3D_STRIPE: +/*?*/ eChartStyle = CHSTYLE_3D_STRIPE; +/*?*/ break; +/*?*/ +/*?*/ case CHART3D_BAR: +/*?*/ eChartStyle = CHSTYLE_3D_COLUMN; +/*?*/ break; +/*?*/ +/*?*/ case CHART3D_FLATBAR: +/*?*/ eChartStyle = CHSTYLE_3D_FLATCOLUMN; +/*?*/ break; +/*?*/ +/*?*/ case CHART3D_STACKEDFLATBAR: +/*?*/ eChartStyle = CHSTYLE_3D_STACKEDFLATCOLUMN; +/*?*/ break; +/*?*/ +/*?*/ case CHART3D_AREA: +/*?*/ eChartStyle = CHSTYLE_3D_AREA; +/*?*/ break; +/*?*/ +/*?*/ case CHART3D_STACKEDAREA: +/*?*/ eChartStyle = CHSTYLE_3D_STACKEDAREA; +/*?*/ break; +/*?*/ +/*?*/ case CHART3D_SURFACE: +/*?*/ eChartStyle = CHSTYLE_3D_SURFACE; +/*?*/ break; +/*?*/ +/*?*/ case CHART3D_PIE: +/*?*/ eChartStyle = CHSTYLE_3D_PIE; +/*?*/ break; +/*?*/ +/*?*/ default : +/*?*/ eChartStyle = CHSTYLE_2D_COLUMN; +/*?*/ break; +/*?*/ } +/*?*/ +/*?*/ bNoMore = TRUE; +/*?*/ } +/*N*/ else +/*N*/ eChartStyle = (SvxChartStyle)nInt16; +/*N*/ +/*N*/ for (i = 0; i < LINE_POINT_COUNT; i++) +/*N*/ { +/*N*/ rIn >> nInt16; eChartLinePoints[i] = nInt16; +/*N*/ } +/*N*/ +/*N*/ // Das ehemalige Member aRowColors[] wird eingelesen. +/*N*/ Color aDummyColor; +/*N*/ for (i = 0; i < ROW_COLOR_COUNT; i++) +/*N*/ rIn >> aDummyColor; +/*N*/ +/*N*/ long nOverlap; +/*N*/ rIn >> nInt32; //nGapWidth = (long)nInt32; +/*N*/ rIn >> nInt32; nOverlap = (long)nInt32; +/*N*/ rIn >> nInt32; +/*N*/ DBG_ASSERT( nInt32 == 100, "LoadAttributes: nMarkLen's value differs from 100 in this stream" ); +/*N*/ +/*N*/ rIn >> aChartRect; +/*N*/ rIn >> nInt32; nPieHeight = (long)nInt32; +/*N*/ +/*N*/ if (nVersion >= 6) +/*N*/ { +/*N*/ rIn >> nInt16; nPieSegCount = (short)nInt16; +/*N*/ pPieSegOfs = new long[nPieSegCount]; +/*N*/ +/*N*/ BOOL bNullify = (nVersion < 17) && eChartStyle == CHSTYLE_2D_PIE; +/*N*/ +/*N*/ for( i = 0; i < nPieSegCount; i++ ) +/*N*/ { +/*N*/ rIn >> nInt32; +/*N*/ pPieSegOfs[ i ] = bNullify? 0: (long)nInt32; +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ rIn >> nInt16; nXAngle = (short)nInt16; +/*N*/ rIn >> nInt16; nYAngle = (short)nInt16; +/*N*/ rIn >> nInt16; nZAngle = (short)nInt16; +/*N*/ +/*N*/ rIn >> nCharSet; + + /************************************************************************** + * So machts der Writer, und so muessen es alle machen: + * Bug 9714: Der CharSet an den Fonts muss geaendert werden, wenn + * es der globale CharSet ist (MT) + **************************************************************************/ +/*N*/ SfxItemPool& rPool = GetItemPool(); +/*N*/ USHORT nMaxItems = rPool.GetItemCount(EE_CHAR_FONTINFO); +/*N*/ SvxFontItem* pItem; +/*N*/ +/*N*/ for (USHORT n = 0; n < nMaxItems; ++n) +/*N*/ { +/*N*/ pItem = (SvxFontItem*) rPool.GetItem(EE_CHAR_FONTINFO, n); +/*N*/ if (pItem && pItem->GetCharSet() == nCharSet) +/*N*/ { +/*N*/ pItem->GetCharSet() = eSysSet; +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ +/*N*/ BOOL bShowXAxis; +/*N*/ BOOL bShowXDescr; +/*N*/ BOOL bShowYAxis; +/*N*/ BOOL bShowYDescr; +/*N*/ BOOL bShowZAxis; +/*N*/ BOOL bShowZDescr; +/*N*/ +/*N*/ rIn >> bShowMainTitle; +/*N*/ rIn.ReadByteString( aMainTitle ); +/*N*/ rIn >> bShowSubTitle; +/*N*/ rIn.ReadByteString( aSubTitle ); +/*N*/ rIn >> bShowXAxisTitle; +/*N*/ rIn.ReadByteString( aXAxisTitle ); +/*N*/ rIn >> bShowYAxisTitle; +/*N*/ rIn.ReadByteString( aYAxisTitle ); +/*N*/ rIn >> bShowZAxisTitle; +/*N*/ rIn.ReadByteString( aZAxisTitle ); +/*N*/ rIn >> bShowXAxis; +/*N*/ rIn >> bShowXGridMain; +/*N*/ rIn >> bShowXGridHelp; +/*N*/ rIn >> bShowXDescr; +/*N*/ rIn >> bShowYAxis; +/*N*/ rIn >> bShowYGridMain; +/*N*/ rIn >> bShowYGridHelp; +/*N*/ rIn >> bShowYDescr; +/*N*/ rIn >> bShowZAxis; +/*N*/ rIn >> bShowZGridMain; +/*N*/ rIn >> bShowZGridHelp; +/*N*/ rIn >> bShowZDescr; +/*N*/ + /************************************************************************** + * Nun werden die Attribut-ItemSets geladen + * Die etwas umstaendliche Art und Weise ist notwendig, da fruehere Charts + * nicht alle Items weggeschrieben haben. Daher wird in ein leeres ItemSet + * gestreamt und dieses in das Default-ItemSet geputtet (damit keine + * Pool-Defaults zum Tragen kommen). + **************************************************************************/ + +/*N*/ SfxItemSet aTitleAttr(*pItemPool, nTitleWhichPairs); +/*N*/ aTitleAttr.Load(rIn); +/*N*/ PutItemSetWithNameCreation( *pTitleAttr, aTitleAttr ); +/*N*/ +/*N*/ SfxItemSet aMainTitleAttr(*pItemPool, nTitleWhichPairs); +/*N*/ aMainTitleAttr.Load(rIn); +/*N*/ PutItemSetWithNameCreation( *pMainTitleAttr, aMainTitleAttr ); +/*N*/ +/*N*/ SfxItemSet aSubTitleAttr(*pItemPool, nTitleWhichPairs); +/*N*/ aSubTitleAttr.Load(rIn); +/*N*/ PutItemSetWithNameCreation( *pSubTitleAttr, aSubTitleAttr ); +/*N*/ +/*N*/ SfxItemSet aXAxisTitleAttr(*pItemPool, nTitleWhichPairs); +/*N*/ aXAxisTitleAttr.Load(rIn); +/*N*/ PutItemSetWithNameCreation( *pXAxisTitleAttr, aXAxisTitleAttr ); +/*N*/ +/*N*/ SfxItemSet aYAxisTitleAttr(*pItemPool, nTitleWhichPairs); +/*N*/ aYAxisTitleAttr.Load(rIn); +/*N*/ PutItemSetWithNameCreation( *pYAxisTitleAttr, aYAxisTitleAttr ); +/*N*/ +/*N*/ SfxItemSet aZAxisTitleAttr(*pItemPool, nTitleWhichPairs); +/*N*/ aZAxisTitleAttr.Load(rIn); +/*N*/ PutItemSetWithNameCreation( *pZAxisTitleAttr, aZAxisTitleAttr ); +/*N*/ +/*N*/ SfxItemSet aAxisAttr(*pItemPool, nAllAxisWhichPairs); +/*N*/ aAxisAttr.Load(rIn); +/*N*/ pAxisAttr->Put(aAxisAttr); +/*N*/ +/*N*/ CHART_TRACE( "LoadAttributes: Debugging load of old axis attr BEFORE conversion" ); +/*N*/ SfxItemSet aXAxisAttr(*pItemPool, nCompatAxisWhichPairs);//nXAxisWhich.... +/*N*/ aXAxisAttr.Load(rIn); +/*N*/ DBG_ITEMS(aXAxisAttr,(ChartModel*)this); +/*N*/ SfxItemSet aYAxisAttr(*pItemPool, nCompatAxisWhichPairs); +/*N*/ aYAxisAttr.Load(rIn); +/*N*/ DBG_ITEMS(aYAxisAttr,(ChartModel*)this); +/*N*/ SfxItemSet aZAxisAttr(*pItemPool, nCompatAxisWhichPairs); +/*N*/ aZAxisAttr.Load(rIn); +/*N*/ DBG_ITEMS(aZAxisAttr,(ChartModel*)this); +/*N*/ +/*N*/ if(nVersion < 12) //sonst wirds eh uebergebuegelt: +/*N*/ { +/*N*/ //konvertieren: +/*N*/ AxisAttrOld2New(aXAxisAttr,TRUE,CHOBJID_DIAGRAM_X_AXIS); +/*N*/ AxisAttrOld2New(aYAxisAttr,TRUE,CHOBJID_DIAGRAM_Y_AXIS); +/*N*/ AxisAttrOld2New(aZAxisAttr,TRUE,CHOBJID_DIAGRAM_Z_AXIS); +/*N*/ pChartXAxis->SetAttributes(aXAxisAttr); +/*N*/ pChartYAxis->SetAttributes(aYAxisAttr); +/*N*/ pChartZAxis->SetAttributes(aZAxisAttr); +/*N*/ CHART_TRACE( "LoadAttributes: Debugging AFTER conversion" ); +/*N*/ DBG_ITEMS(aXAxisAttr,(ChartModel*)this); +/*N*/ DBG_ITEMS(aYAxisAttr,(ChartModel*)this); +/*N*/ DBG_ITEMS(aZAxisAttr,(ChartModel*)this); +/*N*/ } +/*N*/ +/*N*/ SfxItemSet aGridAttr(*pItemPool, nGridWhichPairs); +/*N*/ aGridAttr.Load(rIn); +/*N*/ pGridAttr->Put(aGridAttr); +/*N*/ +/*N*/ SfxItemSet aXGridMainAttr(*pItemPool, nGridWhichPairs); +/*N*/ aXGridMainAttr.Load(rIn); +/*N*/ pXGridMainAttr->Put(aXGridMainAttr); +/*N*/ +/*N*/ SfxItemSet aYGridMainAttr(*pItemPool, nGridWhichPairs); +/*N*/ aYGridMainAttr.Load(rIn); +/*N*/ pYGridMainAttr->Put(aYGridMainAttr); +/*N*/ +/*N*/ SfxItemSet aZGridMainAttr(*pItemPool, nGridWhichPairs); +/*N*/ aZGridMainAttr.Load(rIn); +/*N*/ pZGridMainAttr->Put(aZGridMainAttr); +/*N*/ +/*N*/ SfxItemSet aXGridHelpAttr(*pItemPool, nGridWhichPairs); +/*N*/ aXGridHelpAttr.Load(rIn); +/*N*/ pXGridHelpAttr->Put(aXGridHelpAttr); +/*N*/ +/*N*/ SfxItemSet aYGridHelpAttr(*pItemPool, nGridWhichPairs); +/*N*/ aYGridHelpAttr.Load(rIn); +/*N*/ pYGridHelpAttr->Put(aYGridHelpAttr); +/*N*/ +/*N*/ SfxItemSet aZGridHelpAttr(*pItemPool, nGridWhichPairs); +/*N*/ aZGridHelpAttr.Load(rIn); +/*N*/ pZGridHelpAttr->Put(aZGridHelpAttr); +/*N*/ +/*N*/ SfxItemSet aDiagramAreaAttr(*pItemPool, nDiagramAreaWhichPairs); +/*N*/ aDiagramAreaAttr.Load(rIn); +/*N*/ PutItemSetWithNameCreation( *pDiagramAreaAttr, aDiagramAreaAttr ); +/*N*/ +/*N*/ SfxItemSet aDiagramWallAttr(*pItemPool, nDiagramAreaWhichPairs); +/*N*/ aDiagramWallAttr.Load(rIn); +/*N*/ PutItemSetWithNameCreation( *pDiagramWallAttr, aDiagramWallAttr ); +/*N*/ +/*N*/ SfxItemSet aDiagramFloorAttr(*pItemPool, nDiagramAreaWhichPairs); +/*N*/ aDiagramFloorAttr.Load(rIn); +/*N*/ PutItemSetWithNameCreation( *pDiagramFloorAttr, aDiagramFloorAttr ); +/*N*/ +/*N*/ SfxItemSet aLegendAttr(*pItemPool, nLegendWhichPairs); +/*N*/ aLegendAttr.Load(rIn); +/*N*/ PutItemSetWithNameCreation( *pLegendAttr, aLegendAttr ); +/*N*/ +/*N*/ if (nVersion < 2) +/*N*/ { +/*?*/ pTitleAttr->Put(SvxChartTextOrientItem(CHTXTORIENT_AUTOMATIC)); +/*?*/ pMainTitleAttr->Put(SvxChartTextOrientItem(CHTXTORIENT_AUTOMATIC)); +/*?*/ pSubTitleAttr->Put(SvxChartTextOrientItem(CHTXTORIENT_AUTOMATIC)); +/*?*/ pXAxisTitleAttr->Put(SvxChartTextOrientItem(CHTXTORIENT_AUTOMATIC)); +/*?*/ pYAxisTitleAttr->Put(SvxChartTextOrientItem(CHTXTORIENT_AUTOMATIC)); +/*?*/ pZAxisTitleAttr->Put(SvxChartTextOrientItem(CHTXTORIENT_AUTOMATIC)); +/*?*/ pAxisAttr->Put(SvxChartTextOrientItem(CHTXTORIENT_AUTOMATIC)); +/*?*/ +/*?*/ //Achsen auch fuer V12+ OK, (ToDo: Hier ist recht viel Overhead! ) +/*?*/ aXAxisAttr.ClearItem(); +/*?*/ aYAxisAttr.ClearItem(); +/*?*/ aZAxisAttr.ClearItem(); +/*?*/ aXAxisAttr.Put(SvxChartTextOrientItem(CHTXTORIENT_AUTOMATIC)); +/*?*/ aXAxisAttr.Put(SvxChartTextOrderItem(CHTXTORDER_SIDEBYSIDE)); +/*?*/ aYAxisAttr.Put(SvxChartTextOrientItem(CHTXTORIENT_AUTOMATIC)); +/*?*/ aYAxisAttr.Put(SvxChartTextOrderItem(CHTXTORDER_SIDEBYSIDE)); +/*?*/ aZAxisAttr.Put(SvxChartTextOrientItem(CHTXTORIENT_AUTOMATIC)); +/*?*/ pChartXAxis->SetAttributes(aXAxisAttr); +/*?*/ pChartYAxis->SetAttributes(aYAxisAttr); +/*?*/ pChartZAxis->SetAttributes(aZAxisAttr); +/*?*/ +/*?*/ bNoMore = TRUE; +/*?*/ } +/*N*/ +/*N*/ if (nVersion < 7) +/*N*/ { +/*?*/ GetAttr(CHOBJID_DIAGRAM_Y_AXIS).Put(SfxBoolItem(SCHATTR_AXIS_AUTO_ORIGIN, TRUE)); +/*?*/ GetAttr(CHOBJID_DIAGRAM_Y_AXIS).Put(SvxDoubleItem(0.0, SCHATTR_AXIS_ORIGIN)); +/*?*/ +/*?*/ bNoMore = TRUE; +/*N*/ } +/*N*/ +/*N*/ rIn >> nInt16; nCount = (short)nInt16; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ { +/*N*/ pAttr = new SfxItemSet(*pItemPool, nRowWhichPairs); +/*N*/ +/*N*/ pAttr->Load(rIn); +/*N*/ aDataRowAttrList.Insert(pAttr, LIST_APPEND); +/*N*/ +/*N*/ // Debug-Code +/*N*/ // +/*N*/ // SfxItemState sfx_test_state = aDataRowAttrList.GetObject(i)->GetItemState(XATTR_FILLSTYLE); +/*N*/ // if (sfx_test_state >= SFX_ITEM_AVAILABLE) +/*N*/ // { +/*N*/ // XFillStyleItem& rTest_set = (XFillStyleItem&) aDataRowAttrList.GetObject(i)->Get(XATTR_FILLSTYLE); +/*N*/ // } +/*N*/ // sfx_test_state = aDataRowAttrList.GetObject(i)->GetItemState(XATTR_FILLCOLOR); +/*N*/ // if (sfx_test_state >= SFX_ITEM_AVAILABLE) +/*N*/ // { +/*N*/ // XColorItem& rTest_set = (XColorItem&) aDataRowAttrList.GetObject(i)->Get(XATTR_FILLCOLOR); +/*N*/ // } +/*N*/ } +/*N*/ +/*N*/ rIn >> nInt16; nCount = (short)nInt16; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ { +/*N*/ pAttr = new SfxItemSet(*pItemPool, nRowWhichPairs); +/*N*/ +/*N*/ pAttr->Load(rIn); +/*N*/ if (pAttr->Count() == 0) +/*N*/ { +/*N*/ delete pAttr; +/*N*/ pAttr = NULL; +/*N*/ } +/*N*/ aDataPointAttrList.Insert(pAttr, LIST_APPEND); +/*N*/ } +/*N*/ +/*N*/ if (nVersion < 4) +/*N*/ { +/*?*/ for (i = 0; i < nCount; i++) +/*?*/ { +// SfxItemSet* pDataPointAttr = +// new SfxItemSet(*pItemPool, nRowWhichPairs); +/*?*/ aSwitchDataPointAttrList.Insert(NULL, LIST_APPEND); +/*?*/ } +/*?*/ +/*?*/ bNoMore = TRUE; +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ rIn >> nInt16; nCount = (short)nInt16; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ { +/*N*/ pAttr = new SfxItemSet(*pItemPool, nRowWhichPairs); +/*N*/ +/*N*/ pAttr->Load(rIn); +/*N*/ if (pAttr->Count() == 0) +/*N*/ { +/*N*/ delete pAttr; +/*N*/ pAttr = NULL; +/*N*/ } +/*N*/ aSwitchDataPointAttrList.Insert(pAttr, LIST_APPEND); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ rIn >> nInt16; eDataDescr = (SvxChartDataDescr)nInt16; +/*N*/ rIn >> bShowSym; +/*N*/ rIn >> bSwitchData; +/*N*/ +/*N*/ if (nVersion < 1) +/*N*/ { +/*?*/ BOOL bDataPercent; +/*?*/ rIn >> bDataPercent; +/*?*/ +/*?*/ switch (eChartStyle) +/*?*/ { +/*?*/ case CHSTYLE_2D_LINE: +/*?*/ eChartStyle = CHSTYLE_2D_PERCENTLINE; +/*?*/ break; +/*?*/ +/*?*/ case CHSTYLE_2D_COLUMN: +/*?*/ eChartStyle = CHSTYLE_2D_PERCENTCOLUMN; +/*?*/ break; +/*?*/ +/*?*/ case CHSTYLE_2D_BAR: +/*?*/ eChartStyle = CHSTYLE_2D_PERCENTBAR; +/*?*/ break; +/*?*/ +/*?*/ case CHSTYLE_2D_AREA: +/*?*/ eChartStyle = CHSTYLE_2D_PERCENTAREA; +/*?*/ break; +/*?*/ +/*?*/ case CHSTYLE_3D_FLATCOLUMN: +/*?*/ eChartStyle = CHSTYLE_3D_PERCENTFLATCOLUMN; +/*?*/ break; +/*?*/ +/*?*/ case CHSTYLE_3D_AREA: +/*?*/ eChartStyle = CHSTYLE_3D_PERCENTAREA; +/*?*/ break; +/*?*/ } +/*?*/ +/*?*/ bNoMore = TRUE; +/*N*/ } +/*N*/ +/*N*/ UINT32 nTmp,nDescrFormat,nDescrPercentFormat; +/*N*/ rIn >> nTmp;//nValFo rmat; +/*N*/ SetNumFmt(CHOBJID_DIAGRAM_Y_AXIS,nTmp,FALSE); +/*N*/ rIn >> nTmp;//nPerce ntValFormat; +/*N*/ SetNumFmt(CHOBJID_DIAGRAM_Y_AXIS,nTmp,TRUE); +/*N*/ rIn >> nDescrFormat; +/*N*/ SetNumFmt(CHOBJID_DIAGRAM_X_AXIS,nDescrFormat,FALSE); +/*N*/ rIn >> nDescrPercentFormat; +/*N*/ SetNumFmt(CHOBJID_DIAGRAM_X_AXIS,nDescrPercentFormat,TRUE); +/*N*/ +/*N*/ // Achtung : Gravierende Aenderungen an der Datei gegenueber der Auslieferungsversion +/*N*/ // es werden mehr Daten geschrieben : Die alte Version muss (!) das aber auch verkraften +/*N*/ // Die Reihenfolge muss (!!!!) eingehalten werden +/*N*/ pChartYAxis->LoadMemberCompat(rIn); +/*N*/ pChartXAxis->LoadMemberCompat(rIn); +/*N*/ pChartZAxis->LoadMemberCompat(rIn); +/*N*/ +/*N*/ rIn >> fMaxData; +/*N*/ +/*N*/ if (!bNoMore) +/*N*/ { +/*N*/ UINT32 nMoreData = 0; +/*N*/ rIn >> nMoreData; +/*N*/ +/*N*/ // nMoreData soll als Weiche fuer zukuenftige Versionen dienen, +/*N*/ // insbesondere fuer den Fall, dass weitere Daten geschrieben werden +/*N*/ // muessen. Die Pools duerfen ab dem 19.01.1996 auf gar keinen Fall +/*N*/ // mehr modifiziert oder aufgebohrt werden !!!! +/*N*/ // nMoreData = 1 (Version vom 19.01.1996) +/*N*/ // nMoreData = 2 (Version vom 13.03.1996) +/*N*/ // nMoreData = 3 (Version vom 1.04.1996) +/*N*/ // nMoreData = 4 (Version vom 13.05.1996) +/*N*/ // nMoreData = 5 (Version vom 20.05.1996) +/*N*/ // nMoreData = 6 (Version vom 20.06.1996) +/*N*/ // nMoreData = 7 (Version vom 02.07.1996) +/*N*/ // nMoreData = 8 (Version vom 09.07.1996) +/*N*/ // nMoreData = 9 (Version vom 11.07.1996) +/*N*/ // ... +/*N*/ // nMoreData = 12 (Version vom 20.02.1997) FG (Vobis-Version 4.0) +/*N*/ // nMoreData = 13 (Version vom 9.3.1997) FG Cebit-Version +/*N*/ // .... siehe Text unten +/*N*/ // nMoreData = 15 (Version vom 14.3.1997) FG V4.0 nach Cebit >= 358 +/*N*/ if (nMoreData > 1) +/*N*/ { +/*N*/ ByteString aReadString; +/*N*/ +/*N*/ rIn.ReadByteString( pChartData->SomeData1() ); +/*N*/ rIn.ReadByteString( pChartData->SomeData2() ); +/*N*/ rIn.ReadByteString( pChartData->SomeData3() ); +/*N*/ rIn.ReadByteString( pChartData->SomeData4() ); +/*N*/ +/*N*/ if (nMoreData >= 3) rIn >> fSpotIntensity; +/*N*/ if (nMoreData <= 8) fAmbientIntensity = fSpotIntensity; +/*N*/ +/*N*/ if (nMoreData >= 4) +/*N*/ { +/*N*/ BOOL bDummy; +/*N*/ +/*N*/ rIn >> bShowAverage; +/*N*/ rIn >> nInt16; eErrorKind = (SvxChartKindError) nInt16; +/*N*/ rIn >> bDummy; +/*N*/ rIn >> nInt16; eIndicate = (SvxChartIndicate) nInt16; +/*N*/ rIn >> fIndicatePercent; +/*N*/ rIn >> fIndicateBigError; +/*N*/ rIn >> fIndicatePlus; +/*N*/ rIn >> fIndicateMinus; +/*N*/ } +/*N*/ +/*N*/ if (nMoreData >= 5) +/*N*/ { +/*N*/ rIn >> nInt16; eRegression = (SvxChartRegress) nInt16; +/*N*/ } +/*N*/ +/*N*/ if (nMoreData >= 6) +/*N*/ { +/*N*/ INT32 nInt32; +/*N*/ rIn >> nInt32; nSplineDepth = nInt32; +/*N*/ rIn >> nInt32; nGranularity = nInt32; +/*N*/ } +/*N*/ +/*N*/ if (nMoreData >= 7) +/*N*/ { +/*N*/ rIn >> bLegendVisible; +/*N*/ } +/*N*/ +/*N*/ if (nMoreData >= 8) +/*N*/ { +/*N*/ rIn >> nInt16; nCount = (short)nInt16; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ { +/*N*/ pAttr = new SfxItemSet(*pItemPool, nGridWhichPairs); +/*N*/ +/*N*/ pAttr->Load(rIn); +/*N*/ aRegressAttrList.Insert(pAttr, LIST_APPEND); +/*N*/ } +/*N*/ +/*N*/ rIn >> nInt16; nCount = (short)nInt16; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ { +/*N*/ pAttr = new SfxItemSet(*pItemPool, nGridWhichPairs); +/*N*/ +/*N*/ pAttr->Load(rIn); +/*N*/ aAverageAttrList.Insert(pAttr, LIST_APPEND); +/*N*/ } +/*N*/ +/*N*/ rIn >> nInt16; nCount = (short)nInt16; +/*N*/ for (i = 0; i < nCount; i++) +/*N*/ { +/*N*/ pAttr = new SfxItemSet(*pItemPool, nGridWhichPairs); +/*N*/ +/*N*/ pAttr->Load(rIn); +/*N*/ aErrorAttrList.Insert(pAttr, LIST_APPEND); +/*N*/ } +/*N*/ } +/*N*/ +/*N*/ if (nMoreData >= 9) rIn >> fAmbientIntensity; +/*N*/ if (nMoreData >= 10) rIn >> bTextScalable; +/*N*/ if (nMoreData >= 11) rIn >> aInitialSize; +/*N*/ if (nMoreData >= 12) //FG: 20.2.1997 +/*N*/ { +/*N*/ // FG: Vielleicht etwas viel Speicher fuer BOOL, aber es macht nur 16 Byte pro Chart +/*N*/ rIn >> nInt16; bFormatXAxisTextInMultipleLinesIfNecessary = (BOOL) nInt16; +/*N*/ rIn >> nInt16; bFormatYAxisTextInMultipleLinesIfNecessary = (BOOL) nInt16; +/*N*/ rIn >> nInt16; bFormatZAxisTextInMultipleLinesIfNecessary = (BOOL) nInt16; +/*N*/ rIn >> nInt16; bFormatLegendTextInMultipleLinesIfNecessary = (BOOL) nInt16; +/*N*/ } +/*N*/ if (nMoreData >= 13) // FG: 9.3.1997 Zusaetze wegen einer freien Positionierung und einem freien +/*N*/ { // Resize von Gruppenobjekten im Chart. +/*N*/ rIn >> nInt16; nXAxisTextMaximumNumberOfLines = nInt16; +/*N*/ rIn >> nInt16; nYAxisTextMaximumNumberOfLines = nInt16; +/*N*/ rIn >> nInt16; nZAxisTextMaximumNumberOfLines = nInt16; +/*N*/ rIn >> nInt32; nWidthOfFirstXAxisText = nInt32; +/*N*/ rIn >> nInt32; nWidthOfLastXAxisText = nInt32; +/*N*/ rIn >> aTitleTopCenter; +/*N*/ rIn >> aSubTitleTopCenter; +/*N*/ rIn >> aDiagramRectangle; +/*N*/ rIn >> aLegendTopLeft; +/*N*/ rIn >> aTitleXAxisPosition; // FG: welcher Punkt da jeweils gemeint ist findet +/*N*/ rIn >> aTitleYAxisPosition; // bei nMoreData = 15 +/*N*/ rIn >> aTitleZAxisPosition; +/*N*/ rIn >> nInt16; bUseRelativePositionsForChartGroups = (BOOL) nInt16; +/*N*/ rIn >> nInt16; bAdjustMarginsForLegend = (BOOL) nInt16; +/*N*/ rIn >> nInt16; bAdjustMarginsForMainTitle = (BOOL) nInt16; +/*N*/ rIn >> nInt16; bAdjustMarginsForSubTitle = (BOOL) nInt16; +/*N*/ rIn >> nInt16; bAdjustMarginsForXAxisTitle = (BOOL) nInt16; +/*N*/ rIn >> nInt16; bAdjustMarginsForYAxisTitle = (BOOL) nInt16; +/*N*/ rIn >> nInt16; bAdjustMarginsForZAxisTitle = (BOOL) nInt16; +/*N*/ } +/*N*/ if (nMoreData >= 14) +/*N*/ { +/*N*/ rIn >> aSpotColor; // FG: Aenderung von DL damit sich das 3d-Chart die +/*N*/ rIn >> aAmbientColor; // Farbfilter-Einstellungen merkt. +/*N*/ +/*N*/ rIn >> bDiagramHasBeenMovedOrResized; // FG: 12.3.97, Falls das Chart gespeichert wird +/*N*/ rIn >> bMainTitleHasBeenMoved; // soll es immer noch die relativen Positionen +/*N*/ rIn >> bSubTitleHasBeenMoved; // der Objektgruppen beachten, falls eine +/*N*/ rIn >> bLegendHasBeenMoved; // dieser Gruppen bewegt worden ist. +/*N*/ rIn >> bXAxisTitleHasBeenMoved; +/*N*/ rIn >> bYAxisTitleHasBeenMoved; +/*N*/ rIn >> bZAxisTitleHasBeenMoved; +/*N*/ } +/*N*/ if (nMoreData >= 15) // FG: 14.3.97 Es braucht noch die Information der Ausrichtung +/*N*/ { // damit beim Resize die Texte richtig plaziert werden +/*N*/ rIn >> nInt16; eAdjustXAxesTitle = (ChartAdjust) nInt16; +/*N*/ rIn >> nInt16; eAdjustYAxesTitle = (ChartAdjust) nInt16; +/*N*/ rIn >> nInt16; eAdjustZAxesTitle = (ChartAdjust) nInt16; +/*N*/ } +/*N*/ if (nMoreData >= 16) +/*N*/ { +/*N*/ BOOL bNeedMerge=FALSE; +/*N*/ String aFmtStr; +/*N*/ sal_uInt32 nId; +/*N*/ if(nVersion <= 11)//ab V 12 X=Y=Z-Numberformatter! +/*N*/ { +/*?*/ SvNumberFormatter *pTmp = new SvNumberFormatter( ::legacy_binfilters::getLegacyProcessServiceFactory(), +/*?*/ LANGUAGE_SYSTEM ); +/*?*/ pTmp->Load(rIn); +/*?*/ nId = IsPercentChart() ? nDescrPercentFormat : nDescrFormat; +/*?*/ const SvNumberformat* pFmt=pTmp->GetEntry(nId); +/*?*/ +/*?*/ if(pFmt && (pFmt->GetType() & NUMBERFORMAT_DEFINED)) +/*?*/ { +/*?*/ aFmtStr = pFmt->GetFormatstring(); +/*?*/ bNeedMerge=TRUE; +/*?*/ } +/*?*/ delete pTmp; +/*?*/ } +/*N*/ else +/*N*/ { +/*N*/ pNumFormatter->SkipNumberFormatterInStream( rIn ); //Skip x +/*N*/ } +/*N*/ pOwnNumFormatter->Load( rIn ); // if not skipped load the own formatter ... +/*N*/ pNumFormatter = pOwnNumFormatter; // ... and use it +/*N*/ +/*N*/ // merge user formats of x axis formatter +/*N*/ if(bNeedMerge) +/*N*/ { +/*?*/ xub_StrLen nChk; +/*?*/ short nType; +/*?*/ pNumFormatter->PutEntry(aFmtStr,nChk,nType,nId,LANGUAGE_SYSTEM); +/*?*/ DBG_ASSERT(nChk==0,"Chart:: Converting X-Axis Numformat failed"); +/*?*/ SetNumFmt(CHOBJID_DIAGRAM_X_AXIS,nId,IsPercentChart()); +/*N*/ } +/*N*/ +/*N*/ pNumFormatter->SkipNumberFormatterInStream(rIn);//aTmp.Load( rIn );//pNumFormatterZ //immer wegschmeissen, hatte nie userdef. formats +/*N*/ } +/*N*/ } +/*N*/ aLastDiagramRectangle = aDiagramRectangle; // #68131# (#67459#) +/*N*/ } +/*N*/ +/*N*/ // FG: Das ist notwendig damit in SchChartDocShell::Draw das Chart Initialisiert +/*N*/ // wird, es also die wirkliche Groesse mitbekommt. Zum jetzigen Zeitpunkt nach dem +/*N*/ // Laden gibt es ja noch kein Fenster. Ein Aufruf von BuildChart an dieser Stelle +/*N*/ // geht also nicht. Bei einem Repaint wird in der oben genannten Methode abgefragt +/*N*/ // ob das Chart bereits existiert (bNoBuildChart), falls nicht wird es neu angelegt. +/*N*/ // +/*N*/ // bei den Versionen 4.0 oder hoeher wird die Initialisierung richtig gemacht +/*N*/ // bei Charts die Inplace aus Versionen 3.1 verwendet werden passiert das schon +/*N*/ // richtig. +/*N*/ // +/*N*/ // Dies betrifft nur 3D-Charts, die im Format der Version 3.1 geschrieben wurden. +/*N*/ // +/*N*/ // 21.4. Aenderung: Das Chart kann ja aus allen gespeicheten Daten erzeugt werden. +/*N*/ // um das File klein zu halten und da die Neuberechnung sehr viel schneller +/*N*/ // geworden ist. +/*N*/ if (((rIn.GetVersion() <= SOFFICE_FILEFORMAT_31) && (Is3DChart())) || +/*N*/ bUseRelativePositionsForChartGroups || (rIn.GetVersion() > SOFFICE_FILEFORMAT_31)) +/*N*/ { +/*N*/ bNoBuildChart = TRUE; +/*N*/ } +/*N*/ +/*N*/ +/*N*/ +/*N*/ if (nVersion >= 9)//#50116# Saeulenbreite +/*N*/ { +/*N*/ rIn >> nInt16; SetBarPercentWidth((long)nInt16); +/*N*/ +/*N*/ rIn >> nInt32; m_nDefaultColorSet=nInt32;//#50149# +/*N*/ +/*N*/ rIn >> nInt32; +/*N*/ // #78911# always set to 0 if charttype doesn't support lines +/*N*/ SetNumLinesColChart( ( eChartStyle == CHSTYLE_2D_LINE_COLUMN )? nInt32: 0 ); +/*N*/ +/*N*/ // #74536# BM use these three former -1 dummies for +/*N*/ // numberformat last set by CALC +/*N*/ rIn >> nXLastNumFmt; +/*N*/ rIn >> nYLastNumFmt; +/*N*/ rIn >> nBLastNumFmt; +/*N*/ rIn >> nInt32; // still dummy (-1) +/*N*/ +/*N*/ } +/*N*/ +/*N*/ if(nVersion >= 11)//10 existiert nicht (pChartAttr) +/*N*/ { +/*N*/ +/*N*/ SfxItemSet aAttr(*pItemPool, nRowWhichPairs); +/*N*/ aAttr.Load(rIn); +/*N*/ pStockLineAttr->Put(aAttr); +/*N*/ +/*N*/ aAttr.ClearItem(); +/*N*/ aAttr.Load(rIn); +/*N*/ pStockLossAttr->Put(aAttr); +/*N*/ +/*N*/ aAttr.ClearItem(); +/*N*/ aAttr.Load(rIn); +/*N*/ pStockPlusAttr->Put(aAttr); +/*N*/ } +/*N*/ +/*N*/ InitChartData(FALSE); //weia, beeinflusst die Achsen....also erst ab hier: +/*N*/ +/*N*/ +/*N*/ if(nVersion >= 12) +/*N*/ { +/*N*/ //Achse wird nur noch auf Attr-Basis gestreamt! +/*N*/ +/*N*/ //nAxisId ist die zu ladene/speichernde Achse, +/*N*/ //festgelegt sind in V12 nur 1=X, 2=Y,3=Z und 4=B (2.Y-Achse) +/*N*/ //-1 bedeutet KEINE WEITEREN ACHSEN !!!!!!!!!!! +/*N*/ //Es MUSS keine Achse gestreamt werden (siehe Lade-Routine) +/*N*/ INT32 nAxisId=0; +/*N*/ SfxItemSet aAxisSet(*pItemPool,nAxisWhichPairs); +/*N*/ while(nAxisId != -1)//hier koennen beliebig viele, auch unbekannte Achsen kommen +/*N*/ { +/*N*/ aAxisSet.ClearItem(); +/*N*/ rIn >> nAxisId; +/*N*/ +/*N*/ switch(nAxisId) +/*N*/ { +/*N*/ case CHART_AXIS_PRIMARY_X: +/*N*/ aAxisSet.Load(rIn); +/*N*/ SetAttributes(CHOBJID_DIAGRAM_X_AXIS,aAxisSet,FALSE); +/*N*/ SetAttributes(CHOBJID_DIAGRAM_A_AXIS,aAxisSet,FALSE);//falls nicht spaeter geladen wird, hier neue defaults setzen +/*N*/ pChartAAxis->ShowAxis(FALSE); //default aus +/*N*/ pChartAAxis->ShowDescr(FALSE); +/*N*/ pChartXAxis->Update(); //Ab V12 kann jetzt der ganze LoadMemberCompat...Kram uebergebuegelt werden, in den Attr war alles drin! +/*N*/ pChartAAxis->Update(); +/*N*/ break; +/*N*/ case CHART_AXIS_PRIMARY_Y: +/*N*/ aAxisSet.Load(rIn); +/*N*/ SetAttributes(CHOBJID_DIAGRAM_Y_AXIS,aAxisSet,FALSE); +/*N*/ pChartYAxis->Update(); +/*N*/ break; +/*N*/ case CHART_AXIS_PRIMARY_Z: +/*N*/ aAxisSet.Load(rIn); +/*N*/ SetAttributes(CHOBJID_DIAGRAM_Z_AXIS,aAxisSet,FALSE); +/*N*/ pChartZAxis->Update(); +/*N*/ break; +/*N*/ case CHART_AXIS_SECONDARY_Y: +/*N*/ aAxisSet.Load(rIn); +/*N*/ SetAttributes(CHOBJID_DIAGRAM_B_AXIS,aAxisSet,FALSE); +/*N*/ pChartBAxis->Update(); +/*N*/ break; +/*N*/ case CHART_AXIS_SECONDARY_X: +/*N*/ aAxisSet.Load(rIn); +/*N*/ SetAttributes(CHOBJID_DIAGRAM_A_AXIS,aAxisSet,FALSE); +/*N*/ pChartAAxis->Update(); +/*N*/ break; +/*N*/ case -1: //Ende der Achsen! +/*N*/ break; +/*N*/ default: //Attrset kommt aus der Zukunft! Laden und vernichten: +/*N*/ { +/*?*/ aAxisSet.Load(rIn); +/*N*/ } +/*N*/ break; +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ else //defaults ergaenzen +/*N*/ { +/*?*/ SfxItemSet aSet(*pItemPool,nAxisWhichPairs); +/*?*/ aSet.Put(SfxInt32Item(SCHATTR_AXIS_TICKS,CHAXIS_MARK_OUTER)); +/*?*/ SetAttributes(CHOBJID_DIAGRAM_X_AXIS,aSet); +/*?*/ SetAttributes(CHOBJID_DIAGRAM_Y_AXIS,aSet); +/*N*/ } +/*N*/ //Ende IOVersion 12 +/*N*/ + +/*N*/ if(nVersion >= 14) +/*N*/ { +/*N*/ rIn >> nTmp; +/*N*/ aBarY1.SetGap(nTmp); +/*N*/ rIn >> nTmp; +/*N*/ aBarY1.SetOverlap(nTmp); +/*N*/ rIn >> nTmp; +/*N*/ aBarY2.SetGap(nTmp); +/*N*/ rIn >> nTmp; +/*N*/ aBarY2.SetOverlap(nTmp); +/*N*/ } +/*N*/ else +/*N*/ { +/* aBarY1.SetGap() + aBarY1.SetOverlap(nTmp) + aBarY2.SetGap(nTmp) + aBarY2.SetOverlap(nTmp) + */ +/*N*/ } +/*N*/ +/*N*/ if(nVersion >= 15) +/*N*/ { +/*N*/ SfxItemSet * pAttributes; +/*N*/ bResizePie=FALSE; +/*N*/ rIn >> bDiagramHasBeenMovedOrResized; // FG: 12.3.97, Falls das Chart gespeichert wird +/*N*/ +/*N*/ if(IsReal3D() && (IsPieChart()||IsLine())) //Hack wegen #62363#, double-sided neu defaulten +/*N*/ { +/*N*/ long nMax; +/*N*/ nMax=aDataRowAttrList.Count(); +/*N*/ for(i=0;i<nMax;i++) +/*N*/ //-/ aDataRowAttrList.GetObject(i)->Put(SfxBoolItem(SID_ATTR_3D_DOUBLE_SIDED,TRUE)); +/*N*/ aDataRowAttrList.GetObject(i)->Put(Svx3DDoubleSidedItem(TRUE)); +/*N*/ nMax=aDataPointAttrList.Count(); +/*N*/ for(i=0;i<nMax;i++) +/*N*/ { +/*N*/ pAttributes = aDataPointAttrList.GetObject(i); +/*N*/ if (pAttributes != NULL) +/*?*/ pAttributes->Put(Svx3DDoubleSidedItem(TRUE)); +/*N*/ } +/*N*/ nMax=aSwitchDataPointAttrList.Count(); +/*N*/ for(i=0;i<nMax;i++) +/*N*/ { +/*N*/ pAttributes = aSwitchDataPointAttrList.GetObject(i); +/*N*/ if (pAttributes != NULL) +/*N*/ pAttributes->Put(Svx3DDoubleSidedItem(TRUE)); +/*N*/ } +/*N*/ } +/*N*/ } +/*N*/ else +/*N*/ { +/*N*/ //altes 3D-Pie? +/*?*/ bResizePie=TRUE; +/*?*/ if(IsReal3D() && IsPieChart()) +/*?*/ { +/*?*/ Matrix4D aTmp; //Matrix auf default +/*?*/ +/*?*/ aTmp.RotateZ((900 + nYAngle) * F_PI / 1800); //??? !!! +/*?*/ aTmp.RotateX(-F_PI/3); +/*?*/ +/*?*/ aSceneMatrix=aTmp; +/*?*/ } +/*?*/ +/*?*/ if(IsReal3D()) //#61923# +/*?*/ { +/*?*/ long nMax; +/*?*/ nMax=aDataRowAttrList.Count(); +/*?*/ SfxItemSet * pAttributes; +/*?*/ +/*?*/ for(i=0;i<nMax;i++) +/*?*/ { +/*?*/ if(IsPieChart()||IsLine()) +/*?*/ //-/ aDataRowAttrList.GetObject(i)->Put(SfxBoolItem(SID_ATTR_3D_DOUBLE_SIDED,TRUE)); +/*?*/ aDataRowAttrList.GetObject(i)->Put(Svx3DDoubleSidedItem(TRUE)); +/*?*/ aDataRowAttrList.GetObject(i)->Put(XLineStyleItem(XLINE_NONE)); +/*?*/ } +/*?*/ +/*?*/ nMax=aDataPointAttrList.Count(); +/*?*/ for(i=0;i<nMax;i++) +/*?*/ { +/*?*/ pAttributes = aDataPointAttrList.GetObject(i); +/*?*/ if (pAttributes == NULL) +/*?*/ continue; +/*?*/ if(IsPieChart()||IsLine()) +/*?*/ aDataPointAttrList.GetObject(i)->Put(Svx3DDoubleSidedItem(TRUE)); +/*?*/ aDataPointAttrList.GetObject(i)->Put(XLineStyleItem(XLINE_NONE)); +/*?*/ } +/*?*/ +/*?*/ +/*?*/ nMax=aSwitchDataPointAttrList.Count(); +/*?*/ for(i=0;i<nMax;i++) +/*?*/ { +/*?*/ pAttributes = aSwitchDataPointAttrList.GetObject(i); +/*?*/ if (pAttributes == NULL) +/*?*/ continue; +/*?*/ if(IsPieChart()||IsLine()) +/*?*/ aSwitchDataPointAttrList.GetObject(i)->Put(Svx3DDoubleSidedItem(TRUE)); +/*?*/ aSwitchDataPointAttrList.GetObject(i)->Put(XLineStyleItem(XLINE_NONE)); +/*?*/ } +/*N*/ } +/*N*/ } + + // ******************** LAST READ ******************** + + + // ############# defaults erstellen, falls alte Fileversion #################### + +/*N*/ if(nVersion < 13) +/*N*/ { +/*?*/ if(IsXYChart()) +/*?*/ aDataRowAttrList.GetObject(0)->Put(SfxInt32Item(SCHATTR_AXIS,CHART_AXIS_PRIMARY_X)); +/*N*/ } + //#54870# restaurieren der line-attribute +/*N*/ if( nVersion < 10) +/*N*/ { +/*?*/ SetupLineColors(SETLINES_COMPAT); +/*N*/ } +/*N*/ if( nVersion < 16) //Automatische 2.YAchse in Items umsetzten +/*N*/ { +/*?*/ const SfxPoolItem* pPoolItem=NULL; +/*?*/ for(long n=0;n<GetRowCount();n++) +/*?*/ if(GetDataRowAttr(n).GetItemState(SCHATTR_AXIS,TRUE, &pPoolItem) == SFX_ITEM_SET) +/*?*/ if(((const SfxInt32Item*)pPoolItem)->GetValue()==CHART_AXIS_SECONDARY_Y) +/*?*/ { +/*?*/ n=GetRowCount();//abbruch +/*?*/ pChartBAxis->ShowDescr(TRUE); +/*?*/ pChartBAxis->ShowAxis(TRUE); +/*?*/ } +/*N*/ } +/*N*/ +/*N*/ //dies ist immer moeglich (IoVersion<=16), in Zukunft sollten nur noch die Attr unterstuetzt werden, dann kann hier evtl. mit IOVersion geklammert werden! +/*N*/ pChartXAxis->ShowDescr(bShowXDescr); +/*N*/ pChartXAxis->ShowAxis(bShowXAxis); +/*N*/ pChartYAxis->ShowDescr(bShowYDescr); +/*N*/ pChartYAxis->ShowAxis(bShowYAxis); +/*N*/ pChartZAxis->ShowDescr(bShowZDescr); +/*N*/ pChartZAxis->ShowAxis(bShowZAxis); +/*N*/ +/*N*/ +/*N*/ //Bei unsortierten Charts machts keinen Sinn, nachdem Laden nochmal zu fragen +/*N*/ if( IsXYChart() ) +/*N*/ SETFLAG( nChartStatus, CHS_USER_NOQUERY ); +/*N*/ else +/*N*/ RESETFLAG( nChartStatus, CHS_USER_NOQUERY ); +/*N*/ +/*N*/ CHART_TRACE( "ChartModel::LoadAttributes END" ); +/*N*/ } + +/************************************************************************* +|* +|* Zeigt Legende an bzw. loescht sie. +|* +\************************************************************************/ + +/*N*/ void ChartModel::SetShowLegend(BOOL bShow) +/*N*/ { +/*N*/ pLegendAttr->Put(SvxChartLegendPosItem(bShow +/*N*/ ? CHLEGEND_RIGHT +/*N*/ : CHLEGEND_NONE)); +/*N*/ bLegendVisible = bShow; +/*N*/ } +/************************************************************************* +|* +|* Legenden-Attribute ermitteln +|* +\************************************************************************/ + +/*N*/ SfxItemSet ChartModel::GetFullLegendAttr() const +/*N*/ { +/*N*/ SfxItemSet aAttr(*pItemPool, nLegendWhichPairs); +/*N*/ aAttr.Put(*pLegendAttr); +/*N*/ return aAttr; +/*N*/ } + +/************************************************************************* +|* +|* Legenden-Attribute aendern; +|* Liefert bei geaenderten Attributen TRUE. +|* +\************************************************************************/ + +/************************************************************************* +|* +|* Chart-Attribute aendern; +|* Liefert bei geaenderten Attributen TRUE. +|* +\************************************************************************/ + +/************************************************************************* +|* +|* Erstelle Symbole fuer Diagrammtypen mit Symbolen +|* +\************************************************************************/ + + +/************************************************************************* +|* +|* Aendere die Attribute einer Achse +|* +\************************************************************************/ + + +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |