/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_scfilt.hxx" // INCLUDE --------------------------------------------------------------- #include "scitems.hxx" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "global.hxx" #include "sc.hrc" #include "attrib.hxx" #include "patattr.hxx" #include "docpool.hxx" #include "document.hxx" #include "collect.hxx" #include "rangenam.hxx" #include "dbcolect.hxx" #include "stlsheet.hxx" #include "stlpool.hxx" #include "filter.hxx" #include "scflt.hxx" #include "cell.hxx" #include "scfobj.hxx" #include "docoptio.hxx" #include "viewopti.hxx" #include "postit.hxx" #include "globstr.hrc" #include "ftools.hxx" #include "tabprotection.hxx" #include "fprogressbar.hxx" using namespace com::sun::star; #define DEFCHARSET RTL_TEXTENCODING_MS_1252 #define SC10TOSTRING(p) String((p),DEFCHARSET) const SCCOL SC10MAXCOL = 255; // #i85906# don't try to load more columns than there are in the file /** Those strings are used with SC10TOSTRING() and strcmp() and such, hence need to be 0-terminated. */ static void lcl_ReadFixedString( SvStream& rStream, void* pData, size_t nLen ) { sal_Char* pBuf = static_cast(pData); if (!nLen) pBuf[0] = 0; else { rStream.Read( pBuf, nLen); pBuf[nLen-1] = 0; } } static void lcl_ReadFileHeader(SvStream& rStream, Sc10FileHeader& rFileHeader) { lcl_ReadFixedString( rStream, &rFileHeader.CopyRight, sizeof(rFileHeader.CopyRight)); rStream >> rFileHeader.Version; rStream.Read(&rFileHeader.Reserved, sizeof(rFileHeader.Reserved)); } static void lcl_ReadTabProtect(SvStream& rStream, Sc10TableProtect& rProtect) { lcl_ReadFixedString( rStream, &rProtect.PassWord, sizeof(rProtect.PassWord)); rStream >> rProtect.Flags; rStream >> rProtect.Protect; } static void lcl_ReadSheetProtect(SvStream& rStream, Sc10SheetProtect& rProtect) { lcl_ReadFixedString( rStream, &rProtect.PassWord, sizeof(rProtect.PassWord)); rStream >> rProtect.Flags; rStream >> rProtect.Protect; } static void lcl_ReadRGB(SvStream& rStream, Sc10Color& rColor) { rStream >> rColor.Dummy; rStream >> rColor.Blue; rStream >> rColor.Green; rStream >> rColor.Red; } static void lcl_ReadPalette(SvStream& rStream, Sc10Color* pPalette) { for (sal_uInt16 i = 0; i < 16; i++) lcl_ReadRGB(rStream, pPalette[i]); } static void lcl_ReadValueFormat(SvStream& rStream, Sc10ValueFormat& rFormat) { rStream >> rFormat.Format; rStream >> rFormat.Info; } static void lcl_ReadLogFont(SvStream& rStream, Sc10LogFont& rFont) { rStream >> rFont.lfHeight; rStream >> rFont.lfWidth; rStream >> rFont.lfEscapement; rStream >> rFont.lfOrientation; rStream >> rFont.lfWeight; rStream >> rFont.lfItalic; rStream >> rFont.lfUnderline; rStream >> rFont.lfStrikeOut; rStream >> rFont.lfCharSet; rStream >> rFont.lfOutPrecision; rStream >> rFont.lfClipPrecision; rStream >> rFont.lfQuality; rStream >> rFont.lfPitchAndFamily; lcl_ReadFixedString( rStream, &rFont.lfFaceName, sizeof(rFont.lfFaceName)); } static void lcl_ReadBlockRect(SvStream& rStream, Sc10BlockRect& rBlock) { rStream >> rBlock.x1; rStream >> rBlock.y1; rStream >> rBlock.x2; rStream >> rBlock.y2; } static void lcl_ReadHeadFootLine(SvStream& rStream, Sc10HeadFootLine& rLine) { lcl_ReadFixedString( rStream, &rLine.Title, sizeof(rLine.Title)); lcl_ReadLogFont(rStream, rLine.LogFont); rStream >> rLine.HorJustify; rStream >> rLine.VerJustify; rStream >> rLine.Raster; rStream >> rLine.Frame; lcl_ReadRGB(rStream, rLine.TextColor); lcl_ReadRGB(rStream, rLine.BackColor); lcl_ReadRGB(rStream, rLine.RasterColor); rStream >> rLine.FrameColor; rStream >> rLine.Reserved; } static void lcl_ReadPageFormat(SvStream& rStream, Sc10PageFormat& rFormat) { lcl_ReadHeadFootLine(rStream, rFormat.HeadLine); lcl_ReadHeadFootLine(rStream, rFormat.FootLine); rStream >> rFormat.Orientation; rStream >> rFormat.Width; rStream >> rFormat.Height; rStream >> rFormat.NonPrintableX; rStream >> rFormat.NonPrintableY; rStream >> rFormat.Left; rStream >> rFormat.Top; rStream >> rFormat.Right; rStream >> rFormat.Bottom; rStream >> rFormat.Head; rStream >> rFormat.Foot; rStream >> rFormat.HorCenter; rStream >> rFormat.VerCenter; rStream >> rFormat.PrintGrid; rStream >> rFormat.PrintColRow; rStream >> rFormat.PrintNote; rStream >> rFormat.TopBottomDir; lcl_ReadFixedString( rStream, &rFormat.PrintAreaName, sizeof(rFormat.PrintAreaName)); lcl_ReadBlockRect(rStream, rFormat.PrintArea); rStream.Read(&rFormat.PrnZoom, sizeof(rFormat.PrnZoom)); rStream >> rFormat.FirstPageNo; rStream >> rFormat.RowRepeatStart; rStream >> rFormat.RowRepeatEnd; rStream >> rFormat.ColRepeatStart; rStream >> rFormat.ColRepeatEnd; rStream.Read(&rFormat.Reserved, sizeof(rFormat.Reserved)); } static void lcl_ReadGraphHeader(SvStream& rStream, Sc10GraphHeader& rHeader) { rStream >> rHeader.Typ; rStream >> rHeader.CarretX; rStream >> rHeader.CarretY; rStream >> rHeader.CarretZ; rStream >> rHeader.x; rStream >> rHeader.y; rStream >> rHeader.w; rStream >> rHeader.h; rStream >> rHeader.IsRelPos; rStream >> rHeader.DoPrint; rStream >> rHeader.FrameType; rStream >> rHeader.IsTransparent; lcl_ReadRGB(rStream, rHeader.FrameColor); lcl_ReadRGB(rStream, rHeader.BackColor); rStream.Read(&rHeader.Reserved, sizeof(rHeader.Reserved)); } static void lcl_ReadImageHeaer(SvStream& rStream, Sc10ImageHeader& rHeader) { lcl_ReadFixedString( rStream, &rHeader.FileName, sizeof(rHeader.FileName)); rStream >> rHeader.Typ; rStream >> rHeader.Linked; rStream >> rHeader.x1; rStream >> rHeader.y1; rStream >> rHeader.x2; rStream >> rHeader.y2; rStream >> rHeader.Size; } static void lcl_ReadChartHeader(SvStream& rStream, Sc10ChartHeader& rHeader) { rStream >> rHeader.MM; rStream >> rHeader.xExt; rStream >> rHeader.yExt; rStream >> rHeader.Size; } static void lcl_ReadChartSheetData(SvStream& rStream, Sc10ChartSheetData& rSheetData) { rStream >> rSheetData.HasTitle; rStream >> rSheetData.TitleX; rStream >> rSheetData.TitleY; rStream >> rSheetData.HasSubTitle; rStream >> rSheetData.SubTitleX; rStream >> rSheetData.SubTitleY; rStream >> rSheetData.HasLeftTitle; rStream >> rSheetData.LeftTitleX; rStream >> rSheetData.LeftTitleY; rStream >> rSheetData.HasLegend; rStream >> rSheetData.LegendX1; rStream >> rSheetData.LegendY1; rStream >> rSheetData.LegendX2; rStream >> rSheetData.LegendY2; rStream >> rSheetData.HasLabel; rStream >> rSheetData.LabelX1; rStream >> rSheetData.LabelY1; rStream >> rSheetData.LabelX2; rStream >> rSheetData.LabelY2; rStream >> rSheetData.DataX1; rStream >> rSheetData.DataY1; rStream >> rSheetData.DataX2; rStream >> rSheetData.DataY2; rStream.Read(&rSheetData.Reserved, sizeof(rSheetData.Reserved)); } static void lcl_ReadChartTypeData(SvStream& rStream, Sc10ChartTypeData& rTypeData) { rStream >> rTypeData.NumSets; rStream >> rTypeData.NumPoints; rStream >> rTypeData.DrawMode; rStream >> rTypeData.GraphType; rStream >> rTypeData.GraphStyle; lcl_ReadFixedString( rStream, &rTypeData.GraphTitle, sizeof(rTypeData.GraphTitle)); lcl_ReadFixedString( rStream, &rTypeData.BottomTitle, sizeof(rTypeData.BottomTitle)); sal_uInt16 i; for (i = 0; i < 256; i++) rStream >> rTypeData.SymbolData[i]; for (i = 0; i < 256; i++) rStream >> rTypeData.ColorData[i]; for (i = 0; i < 256; i++) rStream >> rTypeData.ThickLines[i]; for (i = 0; i < 256; i++) rStream >> rTypeData.PatternData[i]; for (i = 0; i < 256; i++) rStream >> rTypeData.LinePatternData[i]; for (i = 0; i < 11; i++) rStream >> rTypeData.NumGraphStyles[i]; rStream >> rTypeData.ShowLegend; for (i = 0; i < 256; i++) lcl_ReadFixedString( rStream, &rTypeData.LegendText[i], sizeof(Sc10ChartText)); rStream >> rTypeData.ExplodePie; rStream >> rTypeData.FontUse; for (i = 0; i < 5; i++) rStream >> rTypeData.FontFamily[i]; for (i = 0; i < 5; i++) rStream >> rTypeData.FontStyle[i]; for (i = 0; i < 5; i++) rStream >> rTypeData.FontSize[i]; rStream >> rTypeData.GridStyle; rStream >> rTypeData.Labels; rStream >> rTypeData.LabelEvery; for (i = 0; i < 50; i++) lcl_ReadFixedString( rStream, &rTypeData.LabelText[i], sizeof(Sc10ChartText)); lcl_ReadFixedString( rStream, &rTypeData.LeftTitle, sizeof(rTypeData.LeftTitle)); rStream.Read(&rTypeData.Reserved, sizeof(rTypeData.Reserved)); } double lcl_PascalToDouble(sal_Char* tp6) { sal_uInt8* pnUnsigned = reinterpret_cast< sal_uInt8* >( tp6 ); // biased exponent sal_uInt8 be = pnUnsigned[ 0 ]; // lower 16 bits of mantissa sal_uInt16 v1 = static_cast< sal_uInt16 >( pnUnsigned[ 2 ] * 256 + pnUnsigned[ 1 ] ); // next 16 bits of mantissa sal_uInt16 v2 = static_cast< sal_uInt16 >( pnUnsigned[ 4 ] * 256 + pnUnsigned[ 3 ] ); // upper 7 bits of mantissa sal_uInt8 v3 = static_cast< sal_uInt8 >( pnUnsigned[ 5 ] & 0x7F ); // sign bit bool s = (pnUnsigned[ 5 ] & 0x80) != 0; if (be == 0) return 0.0; return (((((128 + v3) * 65536.0) + v2) * 65536.0 + v1) * ldexp ((s ? -1.0 : 1.0), be - (129+39))); } static void lcl_ChangeColor( sal_uInt16 nIndex, Color& rColor ) { ColorData aCol; switch( nIndex ) { case 1: aCol = COL_RED; break; case 2: aCol = COL_GREEN; break; case 3: aCol = COL_BROWN; break; case 4: aCol = COL_BLUE; break; case 5: aCol = COL_MAGENTA; break; case 6: aCol = COL_CYAN; break; case 7: aCol = COL_GRAY; break; case 8: aCol = COL_LIGHTGRAY; break; case 9: aCol = COL_LIGHTRED; break; case 10: aCol = COL_LIGHTGREEN; break; case 11: aCol = COL_YELLOW; break; case 12: aCol = COL_LIGHTBLUE; break; case 13: aCol = COL_LIGHTMAGENTA; break; case 14: aCol = COL_LIGHTCYAN; break; case 15: aCol = COL_WHITE; break; default: aCol = COL_BLACK; } rColor.SetColor( aCol ); } String lcl_MakeOldPageStyleFormatName( sal_uInt16 i ) { String aName = ScGlobal::GetRscString( STR_PAGESTYLE ); aName.AppendAscii( " " ); aName += String::CreateFromInt32( i + 1 ); return aName; } template < typename T > sal_uLong insert_new( ScCollection* pCollection, SvStream& rStream ) { T* pData = new (::std::nothrow) T( rStream); sal_uLong nError = rStream.GetError(); if (pData) { if (nError) delete pData; else pCollection->Insert( pData); } else nError = errOutOfMemory; return nError; } //-------------------------------------------- // Font //-------------------------------------------- Sc10FontData::Sc10FontData(SvStream& rStream) { rStream >> Height; rStream >> CharSet; rStream >> PitchAndFamily; sal_uInt16 nLen; rStream >> nLen; if (nLen < sizeof(FaceName)) rStream.Read(FaceName, nLen); else rStream.SetError(ERRCODE_IO_WRONGFORMAT); } Sc10FontCollection::Sc10FontCollection(SvStream& rStream) : ScCollection (4, 4), nError (0) { sal_uInt16 ID; rStream >> ID; if (ID == FontID) { sal_uInt16 nAnz; rStream >> nAnz; for (sal_uInt16 i=0; (i < nAnz) && (nError == 0); i++) { nError = insert_new( this, rStream); } } else { DBG_ERROR( "FontID" ); nError = errUnknownID; } } //-------------------------------------------- // Benannte-Bereiche //-------------------------------------------- Sc10NameData::Sc10NameData(SvStream& rStream) { sal_uInt8 nLen; rStream >> nLen; rStream.Read(Name, sizeof(Name) - 1); if (nLen >= sizeof(Name)) nLen = sizeof(Name) - 1; Name[nLen] = 0; rStream >> nLen; rStream.Read(Reference, sizeof(Reference) - 1); if (nLen >= sizeof(Reference)) nLen = sizeof(Reference) - 1; Reference[nLen] = 0; rStream.Read(Reserved, sizeof(Reserved)); } Sc10NameCollection::Sc10NameCollection(SvStream& rStream) : ScCollection (4, 4), nError (0) { sal_uInt16 ID; rStream >> ID; if (ID == NameID) { sal_uInt16 nAnz; rStream >> nAnz; for (sal_uInt16 i=0; (i < nAnz) && (nError == 0); i++) { nError = insert_new( this, rStream); } } else { DBG_ERROR( "NameID" ); nError = errUnknownID; } } //-------------------------------------------- // Vorlagen //-------------------------------------------- Sc10PatternData::Sc10PatternData(SvStream& rStream) { lcl_ReadFixedString( rStream, Name, sizeof(Name)); lcl_ReadValueFormat(rStream, ValueFormat); lcl_ReadLogFont(rStream, LogFont); rStream >> Attr; rStream >> Justify; rStream >> Frame; rStream >> Raster; rStream >> nColor; rStream >> FrameColor; rStream >> Flags; rStream >> FormatFlags; rStream.Read(Reserved, sizeof(Reserved)); } Sc10PatternCollection::Sc10PatternCollection(SvStream& rStream) : ScCollection (4, 4), nError (0) { sal_uInt16 ID; rStream >> ID; if (ID == PatternID) { sal_uInt16 nAnz; rStream >> nAnz; for (sal_uInt16 i=0; (i < nAnz) && (nError == 0); i++) { nError = insert_new( this, rStream); } } else { DBG_ERROR( "PatternID" ); nError = errUnknownID; } } //-------------------------------------------- // Datenbank //-------------------------------------------- Sc10DataBaseData::Sc10DataBaseData(SvStream& rStream) { lcl_ReadFixedString( rStream, &DataBaseRec.Name, sizeof(DataBaseRec.Name)); rStream >> DataBaseRec.Tab; lcl_ReadBlockRect(rStream, DataBaseRec.Block); rStream >> DataBaseRec.RowHeader; rStream >> DataBaseRec.SortField0; rStream >> DataBaseRec.SortUpOrder0; rStream >> DataBaseRec.SortField1; rStream >> DataBaseRec.SortUpOrder1; rStream >> DataBaseRec.SortField2; rStream >> DataBaseRec.SortUpOrder2; rStream >> DataBaseRec.IncludeFormat; rStream >> DataBaseRec.QueryField0; rStream >> DataBaseRec.QueryOp0; rStream >> DataBaseRec.QueryByString0; lcl_ReadFixedString( rStream, &DataBaseRec.QueryString0, sizeof(DataBaseRec.QueryString0)); DataBaseRec.QueryValue0 = ScfTools::ReadLongDouble(rStream); rStream >> DataBaseRec.QueryConnect1; rStream >> DataBaseRec.QueryField1; rStream >> DataBaseRec.QueryOp1; rStream >> DataBaseRec.QueryByString1; lcl_ReadFixedString( rStream, &DataBaseRec.QueryString1, sizeof(DataBaseRec.QueryString1)); DataBaseRec.QueryValue1 = ScfTools::ReadLongDouble(rStream); rStream >> DataBaseRec.QueryConnect2; rStream >> DataBaseRec.QueryField2; rStream >> DataBaseRec.QueryOp2; rStream >> DataBaseRec.QueryByString2; lcl_ReadFixedString( rStream, &DataBaseRec.QueryString2, sizeof(DataBaseRec.QueryString2)); DataBaseRec.QueryValue2 = ScfTools::ReadLongDouble(rStream); } Sc10DataBaseCollection::Sc10DataBaseCollection(SvStream& rStream) : ScCollection (4, 4), nError (0) { sal_uInt16 ID; rStream >> ID; if (ID == DataBaseID) { lcl_ReadFixedString( rStream, ActName, sizeof(ActName)); sal_uInt16 nAnz; rStream >> nAnz; for (sal_uInt16 i=0; (i < nAnz) && (nError == 0); i++) { nError = insert_new( this, rStream); } } else { DBG_ERROR( "DataBaseID" ); nError = errUnknownID; } } int Sc10LogFont::operator==( const Sc10LogFont& rData ) const { return !strcmp( lfFaceName, rData.lfFaceName ) && lfHeight == rData.lfHeight && lfWidth == rData.lfWidth && lfEscapement == rData.lfEscapement && lfOrientation == rData.lfOrientation && lfWeight == rData.lfWeight && lfItalic == rData.lfItalic && lfUnderline == rData.lfUnderline && lfStrikeOut == rData.lfStrikeOut && lfCharSet == rData.lfCharSet && lfOutPrecision == rData.lfOutPrecision && lfClipPrecision == rData.lfClipPrecision && lfQuality == rData.lfQuality && lfPitchAndFamily == rData.lfPitchAndFamily; } int Sc10Color::operator==( const Sc10Color& rColor ) const { return ((Red == rColor.Red) && (Green == rColor.Green) && (Blue == rColor.Blue)); } int Sc10HeadFootLine::operator==( const Sc10HeadFootLine& rData ) const { return !strcmp(Title, rData.Title) && LogFont == rData.LogFont && HorJustify == rData.HorJustify && VerJustify == rData.VerJustify && Raster == rData.Raster && Frame == rData.Frame && TextColor == rData.TextColor && BackColor == rData.BackColor && RasterColor == rData.RasterColor && FrameColor == rData.FrameColor && Reserved == rData.Reserved; } int Sc10PageFormat::operator==( const Sc10PageFormat& rData ) const { return !strcmp(PrintAreaName, rData.PrintAreaName) && HeadLine == rData.HeadLine && FootLine == rData.FootLine && Orientation == rData.Orientation && Width == rData.Width && Height == rData.Height && NonPrintableX == rData.NonPrintableX && NonPrintableY == rData.NonPrintableY && Left == rData.Left && Top == rData.Top && Right == rData.Right && Bottom == rData.Bottom && Head == rData.Head && Foot == rData.Foot && HorCenter == rData.HorCenter && VerCenter == rData.VerCenter && PrintGrid == rData.PrintGrid && PrintColRow == rData.PrintColRow && PrintNote == rData.PrintNote && TopBottomDir == rData.TopBottomDir && FirstPageNo == rData.FirstPageNo && RowRepeatStart == rData.RowRepeatStart && RowRepeatEnd == rData.RowRepeatEnd && ColRepeatStart == rData.ColRepeatStart && ColRepeatEnd == rData.ColRepeatEnd && !memcmp( PrnZoom, rData.PrnZoom, sizeof(PrnZoom) ) && !memcmp( &PrintArea, &rData.PrintArea, sizeof(PrintArea) ); } sal_uInt16 Sc10PageCollection::InsertFormat( const Sc10PageFormat& rData ) { for (sal_uInt16 i=0; iaPageFormat == rData) return i; Insert( new Sc10PageData(rData) ); return nCount-1; } static inline sal_uInt8 GetMixedCol( const sal_uInt8 nB, const sal_uInt8 nF, const sal_uInt16 nFak ) { sal_Int32 nT = nB - nF; nT *= ( sal_Int32 ) nFak; nT /= 0xFFFF; nT += nF; return ( sal_uInt8 ) nT; } static inline Color GetMixedColor( const Color& rFore, const Color& rBack, sal_uInt16 nFact ) { return Color( GetMixedCol( rBack.GetRed(), rFore.GetRed(), nFact ), GetMixedCol( rBack.GetGreen(), rFore.GetGreen(), nFact ), GetMixedCol( rBack.GetBlue(), rFore.GetBlue(), nFact ) ); } void Sc10PageCollection::PutToDoc( ScDocument* pDoc ) { ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); EditEngine aEditEngine( pDoc->GetEnginePool() ); EditTextObject* pEmptyObject = aEditEngine.CreateTextObject(); for (sal_uInt16 i=0; iaPageFormat; pPage->Width = (short) ( pPage->Width * ( 72.0 / 72.27 ) + 0.5 ); pPage->Height = (short) ( pPage->Height * ( 72.0 / 72.27 ) + 0.5 ); pPage->Top = (short) ( pPage->Top * ( 72.0 / 72.27 ) + 0.5 ); pPage->Bottom = (short) ( pPage->Bottom * ( 72.0 / 72.27 ) + 0.5 ); pPage->Left = (short) ( pPage->Left * ( 72.0 / 72.27 ) + 0.5 ); pPage->Right = (short) ( pPage->Right * ( 72.0 / 72.27 ) + 0.5 ); pPage->Head = (short) ( pPage->Head * ( 72.0 / 72.27 ) + 0.5 ); pPage->Foot = (short) ( pPage->Foot * ( 72.0 / 72.27 ) + 0.5 ); String aName = lcl_MakeOldPageStyleFormatName( i ); ScStyleSheet* pSheet = (ScStyleSheet*) &pStylePool->Make( aName, SFX_STYLE_FAMILY_PAGE, SFXSTYLEBIT_USERDEF | SCSTYLEBIT_STANDARD ); // #i68483# set page style name at sheet... pDoc->SetPageStyle( static_cast< SCTAB >( i ), aName ); SfxItemSet* pSet = &pSheet->GetItemSet(); for (sal_uInt16 nHeadFoot=0; nHeadFoot<2; nHeadFoot++) { Sc10HeadFootLine* pHeadFootLine = nHeadFoot ? &pPage->FootLine : &pPage->HeadLine; SfxItemSet aEditAttribs(aEditEngine.GetEmptyItemSet()); FontFamily eFam = FAMILY_DONTKNOW; switch (pPage->HeadLine.LogFont.lfPitchAndFamily & 0xF0) { case ffDontCare: eFam = FAMILY_DONTKNOW; break; case ffRoman: eFam = FAMILY_ROMAN; break; case ffSwiss: eFam = FAMILY_SWISS; break; case ffModern: eFam = FAMILY_MODERN; break; case ffScript: eFam = FAMILY_SCRIPT; break; case ffDecorative: eFam = FAMILY_DECORATIVE; break; default: eFam = FAMILY_DONTKNOW; break; } aEditAttribs.Put( SvxFontItem( eFam, SC10TOSTRING( pHeadFootLine->LogFont.lfFaceName ), EMPTY_STRING, PITCH_DONTKNOW, RTL_TEXTENCODING_DONTKNOW, EE_CHAR_FONTINFO ), EE_CHAR_FONTINFO ); aEditAttribs.Put( SvxFontHeightItem( Abs( pHeadFootLine->LogFont.lfHeight ), 100, EE_CHAR_FONTHEIGHT ), EE_CHAR_FONTHEIGHT); Sc10Color nColor = pHeadFootLine->TextColor; Color TextColor( nColor.Red, nColor.Green, nColor.Blue ); aEditAttribs.Put(SvxColorItem(TextColor, EE_CHAR_COLOR), EE_CHAR_COLOR); // FontAttr if (pHeadFootLine->LogFont.lfWeight != fwNormal) aEditAttribs.Put(SvxWeightItem(WEIGHT_BOLD, EE_CHAR_WEIGHT), EE_CHAR_WEIGHT); if (pHeadFootLine->LogFont.lfItalic != 0) aEditAttribs.Put(SvxPostureItem(ITALIC_NORMAL, EE_CHAR_ITALIC), EE_CHAR_ITALIC); if (pHeadFootLine->LogFont.lfUnderline != 0) aEditAttribs.Put(SvxUnderlineItem(UNDERLINE_SINGLE, EE_CHAR_UNDERLINE), EE_CHAR_UNDERLINE); if (pHeadFootLine->LogFont.lfStrikeOut != 0) aEditAttribs.Put(SvxCrossedOutItem(STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT), EE_CHAR_STRIKEOUT); String aText( pHeadFootLine->Title, DEFCHARSET ); aEditEngine.SetText( aText ); aEditEngine.QuickSetAttribs( aEditAttribs, ESelection( 0, 0, 0, aText.Len() ) ); EditTextObject* pObject = aEditEngine.CreateTextObject(); ScPageHFItem aHeaderItem(nHeadFoot ? ATTR_PAGE_FOOTERRIGHT : ATTR_PAGE_HEADERRIGHT); switch (pHeadFootLine->HorJustify) { case hjCenter: aHeaderItem.SetLeftArea(*pEmptyObject); aHeaderItem.SetCenterArea(*pObject); aHeaderItem.SetRightArea(*pEmptyObject); break; case hjRight: aHeaderItem.SetLeftArea(*pEmptyObject); aHeaderItem.SetCenterArea(*pEmptyObject); aHeaderItem.SetRightArea(*pObject); break; default: aHeaderItem.SetLeftArea(*pObject); aHeaderItem.SetCenterArea(*pEmptyObject); aHeaderItem.SetRightArea(*pEmptyObject); break; } delete pObject; pSet->Put( aHeaderItem ); SfxItemSet aSetItemItemSet( *pDoc->GetPool(), ATTR_BACKGROUND, ATTR_BACKGROUND, ATTR_BORDER, ATTR_SHADOW, ATTR_PAGE_SIZE, ATTR_PAGE_SIZE, ATTR_LRSPACE, ATTR_ULSPACE, ATTR_PAGE_ON, ATTR_PAGE_SHARED, 0 ); nColor = pHeadFootLine->BackColor; Color aBColor( nColor.Red, nColor.Green, nColor.Blue ); nColor = pHeadFootLine->RasterColor; Color aRColor( nColor.Red, nColor.Green, nColor.Blue ); sal_uInt16 nFact; sal_Bool bSwapCol = sal_False; switch (pHeadFootLine->Raster) { case raNone: nFact = 0xffff; bSwapCol = sal_True; break; case raGray12: nFact = (0xffff / 100) * 12; break; case raGray25: nFact = (0xffff / 100) * 25; break; case raGray50: nFact = (0xffff / 100) * 50; break; case raGray75: nFact = (0xffff / 100) * 75; break; default: nFact = 0xffff; } if( bSwapCol ) aSetItemItemSet.Put( SvxBrushItem( GetMixedColor( aBColor, aRColor, nFact ), ATTR_BACKGROUND ) ); else aSetItemItemSet.Put( SvxBrushItem( GetMixedColor( aRColor, aBColor, nFact ), ATTR_BACKGROUND ) ); if (pHeadFootLine->Frame != 0) { sal_uInt16 nLeft = 0; sal_uInt16 nTop = 0; sal_uInt16 nRight = 0; sal_uInt16 nBottom = 0; sal_uInt16 fLeft = (pHeadFootLine->Frame & 0x000F); sal_uInt16 fTop = (pHeadFootLine->Frame & 0x00F0) / 0x0010; sal_uInt16 fRight = (pHeadFootLine->Frame & 0x0F00) / 0x0100; sal_uInt16 fBottom = (pHeadFootLine->Frame & 0xF000) / 0x1000; if (fLeft > 1) nLeft = 50; else if (fLeft > 0) nLeft = 20; if (fTop > 1) nTop = 50; else if (fTop > 0) nTop = 20; if (fRight > 1) nRight = 50; else if (fRight > 0) nRight = 20; if (fBottom > 1) nBottom = 50; else if (fBottom > 0) nBottom = 20; Color ColorLeft(COL_BLACK); Color ColorTop(COL_BLACK); Color ColorRight(COL_BLACK); Color ColorBottom(COL_BLACK); sal_uInt16 cLeft = (pHeadFootLine->FrameColor & 0x000F); sal_uInt16 cTop = (pHeadFootLine->FrameColor & 0x00F0) >> 4; sal_uInt16 cRight = (pHeadFootLine->FrameColor & 0x0F00) >> 8; sal_uInt16 cBottom = (pHeadFootLine->FrameColor & 0xF000) >> 12; lcl_ChangeColor(cLeft, ColorLeft); lcl_ChangeColor(cTop, ColorTop); lcl_ChangeColor(cRight, ColorRight); lcl_ChangeColor(cBottom, ColorBottom); SvxBorderLine aLine; SvxBoxItem aBox( ATTR_BORDER ); aLine.SetOutWidth(nLeft); aLine.SetColor(ColorLeft); aBox.SetLine(&aLine, BOX_LINE_LEFT); aLine.SetOutWidth(nTop); aLine.SetColor(ColorTop); aBox.SetLine(&aLine, BOX_LINE_TOP); aLine.SetOutWidth(nRight); aLine.SetColor(ColorRight); aBox.SetLine(&aLine, BOX_LINE_RIGHT); aLine.SetOutWidth(nBottom); aLine.SetColor(ColorBottom); aBox.SetLine(&aLine, BOX_LINE_BOTTOM); aSetItemItemSet.Put(aBox); } pSet->Put( SvxULSpaceItem( 0, 0, ATTR_ULSPACE ) ); if (nHeadFoot==0) aSetItemItemSet.Put( SvxSizeItem( ATTR_PAGE_SIZE, Size( 0, pPage->Top - pPage->Head ) ) ); else aSetItemItemSet.Put( SvxSizeItem( ATTR_PAGE_SIZE, Size( 0, pPage->Bottom - pPage->Foot ) ) ); aSetItemItemSet.Put(SfxBoolItem( ATTR_PAGE_ON, sal_True )); aSetItemItemSet.Put(SfxBoolItem( ATTR_PAGE_DYNAMIC, sal_False )); aSetItemItemSet.Put(SfxBoolItem( ATTR_PAGE_SHARED, sal_True )); pSet->Put( SvxSetItem( nHeadFoot ? ATTR_PAGE_FOOTERSET : ATTR_PAGE_HEADERSET, aSetItemItemSet ) ); } SvxPageItem aPageItem(ATTR_PAGE); aPageItem.SetPageUsage( SVX_PAGE_ALL ); aPageItem.SetLandscape( pPage->Orientation != 1 ); aPageItem.SetNumType( SVX_ARABIC ); pSet->Put(aPageItem); pSet->Put(SvxLRSpaceItem( pPage->Left, pPage->Right, 0,0, ATTR_LRSPACE )); pSet->Put(SvxULSpaceItem( pPage->Top, pPage->Bottom, ATTR_ULSPACE )); pSet->Put(SfxBoolItem( ATTR_PAGE_HORCENTER, pPage->HorCenter )); pSet->Put(SfxBoolItem( ATTR_PAGE_VERCENTER, pPage->VerCenter )); //---------------- // Area-Parameter: //---------------- { ScRange* pRepeatRow = NULL; ScRange* pRepeatCol = NULL; if ( pPage->ColRepeatStart >= 0 ) pRepeatCol = new ScRange( static_cast (pPage->ColRepeatStart), 0, 0 ); if ( pPage->RowRepeatStart >= 0 ) pRepeatRow = new ScRange( 0, static_cast (pPage->RowRepeatStart), 0 ); if ( pRepeatRow || pRepeatCol ) { // // an allen Tabellen setzen // for ( SCTAB nTab = 0, nTabCount = pDoc->GetTableCount(); nTab < nTabCount; ++nTab ) { pDoc->SetRepeatColRange( nTab, pRepeatCol ); pDoc->SetRepeatRowRange( nTab, pRepeatRow ); } } delete pRepeatRow; delete pRepeatCol; } //----------------- // Table-Parameter: //----------------- pSet->Put( SfxBoolItem( ATTR_PAGE_NOTES, pPage->PrintNote ) ); pSet->Put( SfxBoolItem( ATTR_PAGE_GRID, pPage->PrintGrid ) ); pSet->Put( SfxBoolItem( ATTR_PAGE_HEADERS, pPage->PrintColRow ) ); pSet->Put( SfxBoolItem( ATTR_PAGE_TOPDOWN, pPage->TopBottomDir ) ); pSet->Put( ScViewObjectModeItem( ATTR_PAGE_CHARTS, VOBJ_MODE_SHOW ) ); pSet->Put( ScViewObjectModeItem( ATTR_PAGE_OBJECTS, VOBJ_MODE_SHOW ) ); pSet->Put( ScViewObjectModeItem( ATTR_PAGE_DRAWINGS, VOBJ_MODE_SHOW ) ); pSet->Put( SfxUInt16Item( ATTR_PAGE_SCALE, (sal_uInt16)( lcl_PascalToDouble( pPage->PrnZoom ) * 100 ) ) ); pSet->Put( SfxUInt16Item( ATTR_PAGE_FIRSTPAGENO, 1 ) ); pSet->Put( SvxSizeItem( ATTR_PAGE_SIZE, Size( pPage->Width, pPage->Height ) ) ); } delete pEmptyObject; } ScDataObject* Sc10PageData::Clone() const { return new Sc10PageData(aPageFormat); } //-------------------------------------------- // Import //-------------------------------------------- Sc10Import::Sc10Import(SvStream& rStr, ScDocument* pDocument ) : rStream (rStr), pDoc (pDocument), pFontCollection (NULL), pNameCollection (NULL), pPatternCollection (NULL), pDataBaseCollection (NULL), nError (0), nShowTab (0) { pPrgrsBar = NULL; } Sc10Import::~Sc10Import() { pDoc->CalcAfterLoad(); pDoc->UpdateAllCharts(); delete pFontCollection; delete pNameCollection; delete pPatternCollection; delete pDataBaseCollection; DBG_ASSERT( pPrgrsBar == NULL, "*Sc10Import::Sc10Import(): Progressbar lebt noch!?" ); } sal_uLong Sc10Import::Import() { pPrgrsBar = new ScfStreamProgressBar( rStream, pDoc->GetDocumentShell() ); ScDocOptions aOpt = pDoc->GetDocOptions(); aOpt.SetDate( 1, 1, 1900 ); aOpt.SetYear2000( 18 + 1901 ); // ab SO51 src513e vierstellig pDoc->SetDocOptions( aOpt ); pDoc->GetFormatTable()->ChangeNullDate( 1, 1, 1900 ); LoadFileHeader(); pPrgrsBar->Progress(); if (!nError) { LoadFileInfo(); pPrgrsBar->Progress(); } if (!nError) { LoadEditStateInfo(); pPrgrsBar->Progress(); } if (!nError) { LoadProtect(); pPrgrsBar->Progress(); } if (!nError) { LoadViewColRowBar(); pPrgrsBar->Progress(); } if (!nError) { LoadScrZoom(); pPrgrsBar->Progress(); } if (!nError) { LoadPalette(); pPrgrsBar->Progress(); } if (!nError) { LoadFontCollection(); pPrgrsBar->Progress(); } if (!nError) { LoadNameCollection(); pPrgrsBar->Progress(); } if (!nError) { LoadPatternCollection(); pPrgrsBar->Progress(); } if (!nError) { LoadDataBaseCollection(); pPrgrsBar->Progress(); } if (!nError) { LoadTables(); pPrgrsBar->Progress(); } if (!nError) { LoadObjects(); pPrgrsBar->Progress(); } if (!nError) { ImportNameCollection(); pPrgrsBar->Progress(); } pDoc->SetViewOptions( aSc30ViewOpt ); #ifdef DBG_UTIL if (nError) { DBG_ERROR( ByteString::CreateFromInt32( nError ).GetBuffer() ); } #endif delete pPrgrsBar; #ifdef DBG_UTIL pPrgrsBar = NULL; #endif return nError; } void Sc10Import::LoadFileHeader() { Sc10FileHeader FileHeader; lcl_ReadFileHeader(rStream, FileHeader); nError = rStream.GetError(); if ( nError == 0 ) { sal_Char Sc10CopyRight[32]; strcpy(Sc10CopyRight, "Blaise-Tabelle"); // #100211# - checked Sc10CopyRight[14] = 10; Sc10CopyRight[15] = 13; Sc10CopyRight[16] = 0; if ((strcmp(FileHeader.CopyRight, Sc10CopyRight) != 0) || (FileHeader.Version < 101) || (FileHeader.Version > 102)) nError = errUnknownFormat; } } void Sc10Import::LoadFileInfo() { Sc10FileInfo FileInfo; rStream.Read(&FileInfo, sizeof(FileInfo)); nError = rStream.GetError(); // Achtung Info Uebertragen } void Sc10Import::LoadEditStateInfo() { Sc10EditStateInfo EditStateInfo; rStream.Read(&EditStateInfo, sizeof(EditStateInfo)); nError = rStream.GetError(); nShowTab = static_cast(EditStateInfo.DeltaZ); // Achtung Cursorposition und Offset der Tabelle Uebertragen (soll man das machen??) } void Sc10Import::LoadProtect() { lcl_ReadSheetProtect(rStream, SheetProtect); nError = rStream.GetError(); ScDocProtection aProtection; aProtection.setProtected(static_cast(SheetProtect.Protect)); aProtection.setPassword(SC10TOSTRING(SheetProtect.PassWord)); pDoc->SetDocProtection(&aProtection); } void Sc10Import::LoadViewColRowBar() { sal_uInt8 ViewColRowBar; rStream >> ViewColRowBar; nError = rStream.GetError(); aSc30ViewOpt.SetOption( VOPT_HEADER, (sal_Bool)ViewColRowBar ); } void Sc10Import::LoadScrZoom() { // Achtung Zoom ist leider eine 6Byte TP real Zahl (keine Ahnung wie die Umzusetzen ist) sal_Char cZoom[6]; rStream.Read(cZoom, sizeof(cZoom)); nError = rStream.GetError(); } void Sc10Import::LoadPalette() { lcl_ReadPalette(rStream, TextPalette); lcl_ReadPalette(rStream, BackPalette); lcl_ReadPalette(rStream, RasterPalette); lcl_ReadPalette(rStream, FramePalette); nError = rStream.GetError(); } void Sc10Import::LoadFontCollection() { pFontCollection = new Sc10FontCollection(rStream); if (!nError) nError = pFontCollection->GetError(); } void Sc10Import::LoadNameCollection() { pNameCollection = new Sc10NameCollection(rStream); if (!nError) nError = pNameCollection->GetError(); } void Sc10Import::ImportNameCollection() { ScRangeName* pRN = pDoc->GetRangeName(); for (sal_uInt16 i = 0; i < pNameCollection->GetCount(); i++) { Sc10NameData* pName = pNameCollection->At( i ); pRN->Insert( new ScRangeData( pDoc, SC10TOSTRING( pName->Name ), SC10TOSTRING( pName->Reference ) ) ); } } void Sc10Import::LoadPatternCollection() { pPatternCollection = new Sc10PatternCollection( rStream ); if (!nError) nError = pPatternCollection->GetError(); if (nError == errOutOfMemory) return; // hopeless ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); for( sal_uInt16 i = 0 ; i < pPatternCollection->GetCount() ; i++ ) { Sc10PatternData* pPattern = pPatternCollection->At( i ); String aName( pPattern->Name, DEFCHARSET ); SfxStyleSheetBase* pStyle = pStylePool->Find( aName, SFX_STYLE_FAMILY_PARA ); if( pStyle == NULL ) pStylePool->Make( aName, SFX_STYLE_FAMILY_PARA ); else { pPattern->Name[ 27 ] = 0; strcat( pPattern->Name, "_Old" ); // #100211# - checked aName = SC10TOSTRING( pPattern->Name ); pStylePool->Make( aName, SFX_STYLE_FAMILY_PARA ); } pStyle = pStylePool->Find( aName, SFX_STYLE_FAMILY_PARA ); if( pStyle != NULL ) { SfxItemSet &rItemSet = pStyle->GetItemSet(); // Font if( ( pPattern->FormatFlags & pfFont ) == pfFont ) { FontFamily eFam = FAMILY_DONTKNOW; switch( pPattern->LogFont.lfPitchAndFamily & 0xF0 ) { case ffDontCare : eFam = FAMILY_DONTKNOW; break; case ffRoman : eFam = FAMILY_ROMAN; break; case ffSwiss : eFam = FAMILY_SWISS; break; case ffModern : eFam = FAMILY_MODERN; break; case ffScript : eFam = FAMILY_SCRIPT; break; case ffDecorative : eFam = FAMILY_DECORATIVE; break; default: eFam = FAMILY_DONTKNOW; break; } rItemSet.Put( SvxFontItem( eFam, SC10TOSTRING( pPattern->LogFont.lfFaceName ), EMPTY_STRING, PITCH_DONTKNOW, RTL_TEXTENCODING_DONTKNOW, ATTR_FONT ) ); rItemSet.Put( SvxFontHeightItem( Abs( pPattern->LogFont.lfHeight ), 100, ATTR_FONT_HEIGHT ) ); Color TextColor( COL_BLACK ); lcl_ChangeColor( ( pPattern->nColor & 0x000F ), TextColor ); rItemSet.Put( SvxColorItem( TextColor, ATTR_FONT_COLOR ) ); // FontAttr if( pPattern->LogFont.lfWeight != fwNormal ) rItemSet.Put( SvxWeightItem( WEIGHT_BOLD, ATTR_FONT_WEIGHT ) ); if( pPattern->LogFont.lfItalic != 0 ) rItemSet.Put( SvxPostureItem( ITALIC_NORMAL, ATTR_FONT_POSTURE ) ); if( pPattern->LogFont.lfUnderline != 0 ) rItemSet.Put( SvxUnderlineItem( UNDERLINE_SINGLE, ATTR_FONT_UNDERLINE ) ); if( pPattern->LogFont.lfStrikeOut != 0 ) rItemSet.Put( SvxCrossedOutItem( STRIKEOUT_SINGLE, ATTR_FONT_CROSSEDOUT ) ); } // Ausrichtung if( ( pPattern->FormatFlags & pfJustify ) == pfJustify ) { sal_uInt16 HorJustify = ( pPattern->Justify & 0x000F ); sal_uInt16 VerJustify = ( pPattern->Justify & 0x00F0 ) >> 4; sal_uInt16 OJustify = ( pPattern->Justify & 0x0F00 ) >> 8; sal_uInt16 EJustify = ( pPattern->Justify & 0xF000 ) >> 12; if( HorJustify != 0 ) switch( HorJustify ) { case hjLeft: rItemSet.Put( SvxHorJustifyItem( SVX_HOR_JUSTIFY_LEFT, ATTR_HOR_JUSTIFY ) ); break; case hjCenter: rItemSet.Put( SvxHorJustifyItem( SVX_HOR_JUSTIFY_CENTER, ATTR_HOR_JUSTIFY ) ); break; case hjRight: rItemSet.Put( SvxHorJustifyItem( SVX_HOR_JUSTIFY_RIGHT, ATTR_HOR_JUSTIFY ) ); break; } if( VerJustify != 0 ) switch( VerJustify ) { case vjTop: rItemSet.Put( SvxVerJustifyItem( SVX_VER_JUSTIFY_TOP, ATTR_VER_JUSTIFY ) ); break; case vjCenter: rItemSet.Put( SvxVerJustifyItem( SVX_VER_JUSTIFY_CENTER, ATTR_VER_JUSTIFY ) ); break; case vjBottom: rItemSet.Put( SvxVerJustifyItem( SVX_VER_JUSTIFY_BOTTOM, ATTR_VER_JUSTIFY ) ); break; } if( ( OJustify & ojWordBreak ) == ojWordBreak ) rItemSet.Put( SfxBoolItem( sal_True ) ); if( ( OJustify & ojBottomTop ) == ojBottomTop ) rItemSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 9000 ) ); else if( ( OJustify & ojTopBottom ) == ojTopBottom ) rItemSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 27000 ) ); sal_Int16 Margin = Max( ( sal_uInt16 ) 20, ( sal_uInt16 ) ( EJustify * 20 ) ); if( ( ( OJustify & ojBottomTop ) == ojBottomTop ) ) rItemSet.Put( SvxMarginItem( 20, Margin, 20, Margin, ATTR_MARGIN ) ); else rItemSet.Put( SvxMarginItem( Margin, 20, Margin, 20, ATTR_MARGIN ) ); } // Frame if( ( pPattern->FormatFlags & pfFrame ) == pfFrame ) { if( pPattern->Frame != 0 ) { sal_uInt16 nLeft = 0; sal_uInt16 nTop = 0; sal_uInt16 nRight = 0; sal_uInt16 nBottom = 0; sal_uInt16 fLeft = ( pPattern->Frame & 0x000F ); sal_uInt16 fTop = ( pPattern->Frame & 0x00F0 ) / 0x0010; sal_uInt16 fRight = ( pPattern->Frame & 0x0F00 ) / 0x0100; sal_uInt16 fBottom = ( pPattern->Frame & 0xF000 ) / 0x1000; if( fLeft > 1 ) nLeft = 50; else if( fLeft > 0 ) nLeft = 20; if( fTop > 1 ) nTop = 50; else if( fTop > 0 ) nTop = 20; if( fRight > 1 ) nRight = 50; else if( fRight > 0 ) nRight = 20; if( fBottom > 1 ) nBottom = 50; else if( fBottom > 0 ) nBottom = 20; Color ColorLeft( COL_BLACK ); Color ColorTop( COL_BLACK ); Color ColorRight( COL_BLACK ); Color ColorBottom( COL_BLACK ); sal_uInt16 cLeft = ( pPattern->FrameColor & 0x000F ); sal_uInt16 cTop = ( pPattern->FrameColor & 0x00F0 ) >> 4; sal_uInt16 cRight = ( pPattern->FrameColor & 0x0F00 ) >> 8; sal_uInt16 cBottom = ( pPattern->FrameColor & 0xF000 ) >> 12; lcl_ChangeColor( cLeft, ColorLeft ); lcl_ChangeColor( cTop, ColorTop ); lcl_ChangeColor( cRight, ColorRight ); lcl_ChangeColor( cBottom, ColorBottom ); SvxBorderLine aLine; SvxBoxItem aBox( ATTR_BORDER ); aLine.SetOutWidth( nLeft ); aLine.SetColor( ColorLeft ); aBox.SetLine( &aLine, BOX_LINE_LEFT ); aLine.SetOutWidth( nTop ); aLine.SetColor( ColorTop ); aBox.SetLine( &aLine, BOX_LINE_TOP ); aLine.SetOutWidth( nRight ); aLine.SetColor( ColorRight ); aBox.SetLine( &aLine, BOX_LINE_RIGHT ); aLine.SetOutWidth( nBottom ); aLine.SetColor( ColorBottom ); aBox.SetLine( &aLine, BOX_LINE_BOTTOM ); rItemSet.Put( aBox ); } } // Raster if( ( pPattern->FormatFlags & pfRaster ) == pfRaster ) { if( pPattern->Raster != 0 ) { sal_uInt16 nBColor = ( pPattern->nColor & 0x00F0 ) >> 4; sal_uInt16 nRColor = ( pPattern->nColor & 0x0F00 ) >> 8; Color aBColor( COL_BLACK ); lcl_ChangeColor( nBColor, aBColor ); if( nBColor == 0 ) aBColor.SetColor( COL_WHITE ); else if( nBColor == 15 ) aBColor.SetColor( COL_BLACK ); Color aRColor( COL_BLACK ); lcl_ChangeColor( nRColor, aRColor ); sal_uInt16 nFact; sal_Bool bSwapCol = sal_False; sal_Bool bSetItem = sal_True; switch (pPattern->Raster) { case raNone: nFact = 0xffff; bSwapCol = sal_True; bSetItem = (nBColor > 0); break; case raGray12: nFact = (0xffff / 100) * 12; break; case raGray25: nFact = (0xffff / 100) * 25; break; case raGray50: nFact = (0xffff / 100) * 50; break; case raGray75: nFact = (0xffff / 100) * 75; break; default: nFact = 0xffff; bSetItem = (nRColor < 15); } if ( bSetItem ) { if( bSwapCol ) rItemSet.Put( SvxBrushItem( GetMixedColor( aBColor, aRColor, nFact ), ATTR_BACKGROUND ) ); else rItemSet.Put( SvxBrushItem( GetMixedColor( aRColor, aBColor, nFact ), ATTR_BACKGROUND ) ); } } } // ZahlenFormate if( ( pPattern->ValueFormat.Format != 0 ) && ( ( pPattern->FormatFlags & pfValue ) == pfValue ) ) { sal_uLong nKey = 0; ChangeFormat( pPattern->ValueFormat.Format, pPattern->ValueFormat.Info, nKey ); rItemSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, ( sal_uInt32 ) nKey ) ); } // Zellattribute (Schutz, Versteckt...) if( ( pPattern->Flags != 0 ) && ( ( pPattern->FormatFlags & pfProtection ) == pfProtection ) ) { sal_Bool bProtect = ( ( pPattern->Flags & paProtect ) == paProtect ); sal_Bool bHFormula = ( ( pPattern->Flags & paHideFormula ) == paHideFormula ); sal_Bool bHCell = ( ( pPattern->Flags & paHideAll ) == paHideAll ); sal_Bool bHPrint = ( ( pPattern->Flags & paHidePrint ) == paHidePrint ); rItemSet.Put( ScProtectionAttr( bProtect, bHFormula, bHCell, bHPrint ) ); } } // if Style != 0 } // for (i = 0; i < GetCount() } void Sc10Import::LoadDataBaseCollection() { pDataBaseCollection = new Sc10DataBaseCollection(rStream); if (!nError) nError = pDataBaseCollection->GetError(); if (nError == errOutOfMemory) return; // hopeless for( sal_uInt16 i = 0 ; i < pDataBaseCollection->GetCount() ; i++ ) { Sc10DataBaseData* pOldData = pDataBaseCollection->At(i); ScDBData* pNewData = new ScDBData( SC10TOSTRING( pOldData->DataBaseRec.Name ), ( SCTAB ) pOldData->DataBaseRec.Tab, ( SCCOL ) pOldData->DataBaseRec.Block.x1, ( SCROW ) pOldData->DataBaseRec.Block.y1, ( SCCOL ) pOldData->DataBaseRec.Block.x2, ( SCROW ) pOldData->DataBaseRec.Block.y2, sal_True, ( sal_Bool) pOldData->DataBaseRec.RowHeader ); pDoc->GetDBCollection()->Insert( pNewData ); } } void Sc10Import::LoadTables() { Sc10PageCollection aPageCollection; sal_Int16 nTabCount; rStream >> nTabCount; for (sal_Int16 Tab = 0; (Tab < nTabCount) && (nError == 0); Tab++) { Sc10PageFormat PageFormat; sal_Int16 DataBaseIndex; Sc10TableProtect TabProtect; sal_Int16 TabNo; sal_Char TabName[128]; sal_uInt16 Display; sal_uInt8 Visible; sal_uInt16 ID; sal_uInt16 DataCount; sal_uInt16 DataStart; sal_uInt16 DataEnd; sal_uInt16 DataValue; sal_uInt16 Count; sal_uInt16 i; String aStr; // Universal-Konvertierungs-String lcl_ReadPageFormat(rStream, PageFormat); sal_uInt16 nAt = aPageCollection.InsertFormat(PageFormat); String aPageName = lcl_MakeOldPageStyleFormatName( nAt ); pPrgrsBar->Progress(); rStream >> DataBaseIndex; lcl_ReadTabProtect(rStream, TabProtect); ScTableProtection aProtection; aProtection.setProtected(static_cast(TabProtect.Protect)); aProtection.setPassword(SC10TOSTRING(TabProtect.PassWord)); pDoc->SetTabProtection(static_cast(Tab), &aProtection); rStream >> TabNo; sal_uInt8 nLen; rStream >> nLen; rStream.Read(TabName, sizeof(TabName) - 1); if (nLen >= sizeof(TabName)) nLen = sizeof(TabName) - 1; TabName[nLen] = 0; //---------------------------------------------------------- rStream >> Display; if ( Tab == (sal_Int16)nShowTab ) { ScVObjMode eObjMode = VOBJ_MODE_SHOW; aSc30ViewOpt.SetOption( VOPT_FORMULAS, IS_SET(dfFormula,Display) ); aSc30ViewOpt.SetOption( VOPT_NULLVALS, IS_SET(dfZerro,Display) ); aSc30ViewOpt.SetOption( VOPT_SYNTAX, IS_SET(dfSyntax,Display) ); aSc30ViewOpt.SetOption( VOPT_NOTES, IS_SET(dfNoteMark,Display) ); aSc30ViewOpt.SetOption( VOPT_VSCROLL, sal_True ); aSc30ViewOpt.SetOption( VOPT_HSCROLL, sal_True ); aSc30ViewOpt.SetOption( VOPT_TABCONTROLS, sal_True ); aSc30ViewOpt.SetOption( VOPT_OUTLINER, sal_True ); aSc30ViewOpt.SetOption( VOPT_GRID, IS_SET(dfGrid,Display) ); // VOPT_HEADER wird in LoadViewColRowBar() gesetzt if ( IS_SET(dfObjectAll,Display) ) // Objekte anzeigen eObjMode = VOBJ_MODE_SHOW; else if ( IS_SET(dfObjectFrame,Display) ) // Objekte als Platzhalter eObjMode = VOBJ_MODE_SHOW; else if ( IS_SET(dfObjectNone,Display) ) // Objekte nicht anzeigen eObjMode = VOBJ_MODE_HIDE; aSc30ViewOpt.SetObjMode( VOBJ_TYPE_OLE, eObjMode ); aSc30ViewOpt.SetObjMode( VOBJ_TYPE_CHART, eObjMode ); aSc30ViewOpt.SetObjMode( VOBJ_TYPE_DRAW, eObjMode ); } /* wofuer wird das benoetigt? Da in SC 1.0 die Anzeigeflags pro Tabelle gelten und nicht pro View Dieses Flag in die ViewOptions eintragen bei Gelegenheit, Sollte der Stephan Olk machen sal_uInt16 nDisplayMask = 0xFFFF; sal_uInt16 nDisplayValue = 0; if (Tab == 0) nDisplayValue = Display; else { sal_uInt16 nDiff = Display ^ nDisplayValue; nDisplayMask &= ~nDiff; } */ //-------------------------------------------------------------------- rStream >> Visible; nError = rStream.GetError(); if (nError != 0) return; if (TabNo == 0) pDoc->RenameTab(static_cast (TabNo), SC10TOSTRING( TabName ), sal_False); else pDoc->InsertTab(SC_TAB_APPEND, SC10TOSTRING( TabName ) ); pDoc->SetPageStyle( static_cast(Tab), aPageName ); if (Visible == 0) pDoc->SetVisible(static_cast (TabNo), sal_False); // ColWidth rStream >> ID; if (ID != ColWidthID) { DBG_ERROR( "ColWidthID" ); nError = errUnknownID; return; } rStream >> DataCount; DataStart = 0; for (i=0; i < DataCount; i++) { rStream >> DataEnd; rStream >> DataValue; for (SCCOL j = static_cast(DataStart); j <= static_cast(DataEnd); j++) pDoc->SetColWidth(j, static_cast (TabNo), DataValue); DataStart = DataEnd + 1; } pPrgrsBar->Progress(); // ColAttr rStream >> ID; if (ID != ColAttrID) { DBG_ERROR( "ColAttrID" ); nError = errUnknownID; return; } rStream >> DataCount; DataStart = 0; for (i=0; i < DataCount; i++) { rStream >> DataEnd; rStream >> DataValue; if (DataValue != 0) { bool bPageBreak = ((DataValue & crfSoftBreak) == crfSoftBreak); bool bManualBreak = ((DataValue & crfHardBreak) == crfHardBreak); bool bHidden = ((DataValue & crfHidden) == crfHidden); for (SCCOL k = static_cast(DataStart); k <= static_cast(DataEnd); k++) { pDoc->SetColHidden(k, k, static_cast(TabNo), bHidden); pDoc->SetColBreak(k, static_cast (TabNo), bPageBreak, bManualBreak); } } DataStart = DataEnd + 1; } pPrgrsBar->Progress(); // RowHeight rStream >> ID; if (ID != RowHeightID) { DBG_ERROR( "RowHeightID" ); nError = errUnknownID; return; } rStream >> DataCount; DataStart = 0; for (i=0; i < DataCount; i++) { rStream >> DataEnd; rStream >> DataValue; pDoc->SetRowHeightRange(static_cast (DataStart), static_cast (DataEnd), static_cast (TabNo), DataValue); DataStart = DataEnd + 1; } pPrgrsBar->Progress(); // RowAttr rStream >> ID; if (ID != RowAttrID) { DBG_ERROR( "RowAttrID" ); nError = errUnknownID; return; } rStream >> DataCount; DataStart = 0; for (i=0; i < DataCount; i++) { rStream >> DataEnd; rStream >> DataValue; if (DataValue != 0) { bool bPageBreak = ((DataValue & crfSoftBreak) == crfSoftBreak); bool bManualBreak = ((DataValue & crfHardBreak) == crfHardBreak); bool bHidden = ((DataValue & crfHidden) == crfHidden); for (SCROW l = static_cast(DataStart); l <= static_cast(DataEnd); l++) { pDoc->SetRowHidden(l, l, static_cast (TabNo), bHidden); pDoc->SetRowBreak(l, static_cast (TabNo), bPageBreak, bManualBreak); } } DataStart = DataEnd + 1; } pPrgrsBar->Progress(); // DataTable rStream >> ID; if (ID != TableID) { DBG_ERROR( "TableID" ); nError = errUnknownID; return; } for (SCCOL Col = 0; (Col <= SC10MAXCOL) && (nError == 0); Col++) { rStream >> Count; nError = rStream.GetError(); if ((Count != 0) && (nError == 0)) LoadCol(Col, static_cast (TabNo)); } DBG_ASSERT( nError == 0, "Stream" ); } pPrgrsBar->Progress(); aPageCollection.PutToDoc( pDoc ); } void Sc10Import::LoadCol(SCCOL Col, SCTAB Tab) { LoadColAttr(Col, Tab); sal_uInt16 CellCount; sal_uInt8 CellType; sal_uInt16 Row; rStream >> CellCount; SCROW nScCount = static_cast< SCROW >( CellCount ); if (nScCount > MAXROW) nError = errUnknownFormat; for (sal_uInt16 i = 0; (i < CellCount) && (nError == 0); i++) { rStream >> CellType; rStream >> Row; nError = rStream.GetError(); if (nError == 0) { switch (CellType) { case ctValue : { const SfxPoolItem* pValueFormat = pDoc->GetAttr(Col, static_cast (Row), Tab, ATTR_VALUE_FORMAT); sal_uLong nFormat = ((SfxUInt32Item*)pValueFormat)->GetValue(); double Value = ScfTools::ReadLongDouble(rStream); // Achtung hier ist eine Anpassung Notwendig wenn Ihr das Basisdatum aendert // In StarCalc 1.0 entspricht 0 dem 01.01.1900 // if ((nFormat >= 30) && (nFormat <= 35)) // Value += 0; if ((nFormat >= 40) && (nFormat <= 45)) Value /= 86400.0; pDoc->SetValue(Col, static_cast (Row), Tab, Value); break; } case ctString : { sal_uInt8 Len; sal_Char s[256]; rStream >> Len; rStream.Read(s, Len); s[Len] = 0; pDoc->SetString( Col, static_cast (Row), Tab, SC10TOSTRING( s ) ); break; } case ctFormula : { /*double Value =*/ ScfTools::ReadLongDouble(rStream); sal_uInt8 Len; sal_Char s[256+1]; rStream >> Len; rStream.Read(&s[1], Len); s[0] = '='; s[Len + 1] = 0; ScFormulaCell* pCell = new ScFormulaCell( pDoc, ScAddress( Col, static_cast (Row), Tab ) ); pCell->SetHybridFormula( SC10TOSTRING( s ),formula::FormulaGrammar::GRAM_NATIVE ); pDoc->PutCell( Col, static_cast (Row), Tab, pCell, (sal_Bool)sal_True ); break; } case ctNote : break; default : nError = errUnknownFormat; break; } sal_uInt16 NoteLen; rStream >> NoteLen; if (NoteLen != 0) { sal_Char* pNote = new sal_Char[NoteLen+1]; rStream.Read(pNote, NoteLen); pNote[NoteLen] = 0; String aNoteText( SC10TOSTRING(pNote)); delete [] pNote; ScAddress aPos( Col, static_cast(Row), Tab ); ScNoteUtil::CreateNoteFromString( *pDoc, aPos, aNoteText, false, false ); } } pPrgrsBar->Progress(); } } void Sc10Import::LoadColAttr(SCCOL Col, SCTAB Tab) { Sc10ColAttr aFont; Sc10ColAttr aAttr; Sc10ColAttr aJustify; Sc10ColAttr aFrame; Sc10ColAttr aRaster; Sc10ColAttr aValue; Sc10ColAttr aColor; Sc10ColAttr aFrameColor; Sc10ColAttr aFlag; Sc10ColAttr aPattern; if (nError == 0) LoadAttr(aFont); if (nError == 0) LoadAttr(aAttr); if (nError == 0) LoadAttr(aJustify); if (nError == 0) LoadAttr(aFrame); if (nError == 0) LoadAttr(aRaster); if (nError == 0) LoadAttr(aValue); if (nError == 0) LoadAttr(aColor); if (nError == 0) LoadAttr(aFrameColor); if (nError == 0) LoadAttr(aFlag); if (nError == 0) LoadAttr(aPattern); if (nError == 0) { SCROW nStart; SCROW nEnd; sal_uInt16 i; sal_uInt16 nLimit; sal_uInt16 nValue1; Sc10ColData *pColData; // Font (Name, Groesse) nStart = 0; nEnd = 0; nLimit = aFont.Count; pColData = aFont.pData; for( i = 0 ; i < nLimit ; i++, pColData++ ) { nEnd = static_cast(pColData->Row); if ((nStart <= nEnd) && (pColData->Value)) { FontFamily eFam = FAMILY_DONTKNOW; Sc10FontData* pFont = pFontCollection->At(pColData->Value); if (pFont) { switch (pFont->PitchAndFamily & 0xF0) { case ffDontCare : eFam = FAMILY_DONTKNOW; break; case ffRoman : eFam = FAMILY_ROMAN; break; case ffSwiss : eFam = FAMILY_SWISS; break; case ffModern : eFam = FAMILY_MODERN; break; case ffScript : eFam = FAMILY_SCRIPT; break; case ffDecorative : eFam = FAMILY_DECORATIVE; break; default: eFam = FAMILY_DONTKNOW; break; } ScPatternAttr aScPattern(pDoc->GetPool()); aScPattern.GetItemSet().Put(SvxFontItem(eFam, SC10TOSTRING( pFont->FaceName ), EMPTY_STRING, PITCH_DONTKNOW, RTL_TEXTENCODING_DONTKNOW, ATTR_FONT )); aScPattern.GetItemSet().Put(SvxFontHeightItem(Abs(pFont->Height), 100, ATTR_FONT_HEIGHT )); pDoc->ApplyPatternAreaTab(Col, nStart, Col, nEnd, Tab, aScPattern); } } nStart = nEnd + 1; } // Fontfarbe nStart = 0; nEnd = 0; nLimit = aColor.Count; pColData = aColor.pData; for( i = 0 ; i < nLimit ; i++, pColData++ ) { nEnd = static_cast(pColData->Row); if ((nStart <= nEnd) && (pColData->Value)) { Color TextColor(COL_BLACK); lcl_ChangeColor((pColData->Value & 0x000F), TextColor); ScPatternAttr aScPattern(pDoc->GetPool()); aScPattern.GetItemSet().Put(SvxColorItem(TextColor, ATTR_FONT_COLOR )); pDoc->ApplyPatternAreaTab(Col, nStart, Col, nEnd, Tab, aScPattern); } nStart = nEnd + 1; } // Fontattribute (Fett, Kursiv...) nStart = 0; nEnd = 0; nLimit = aAttr.Count; pColData = aAttr.pData; for( i = 0 ; i < nLimit ; i++, pColData++ ) { nEnd = static_cast(pColData->Row); nValue1 = pColData->Value; if ((nStart <= nEnd) && (nValue1)) { ScPatternAttr aScPattern(pDoc->GetPool()); if ((nValue1 & atBold) == atBold) aScPattern.GetItemSet().Put(SvxWeightItem(WEIGHT_BOLD, ATTR_FONT_WEIGHT)); if ((nValue1 & atItalic) == atItalic) aScPattern.GetItemSet().Put(SvxPostureItem(ITALIC_NORMAL, ATTR_FONT_POSTURE)); if ((nValue1 & atUnderline) == atUnderline) aScPattern.GetItemSet().Put(SvxUnderlineItem(UNDERLINE_SINGLE, ATTR_FONT_UNDERLINE)); if ((nValue1 & atStrikeOut) == atStrikeOut) aScPattern.GetItemSet().Put(SvxCrossedOutItem(STRIKEOUT_SINGLE, ATTR_FONT_CROSSEDOUT)); pDoc->ApplyPatternAreaTab(Col, nStart, Col, nEnd, Tab, aScPattern); } nStart = nEnd + 1; } // Zellausrichtung nStart = 0; nEnd = 0; nLimit = aJustify.Count; pColData = aJustify.pData; for( i = 0 ; i < nLimit ; i++, pColData++ ) { nEnd = static_cast(pColData->Row); nValue1 = pColData->Value; if ((nStart <= nEnd) && (nValue1)) { ScPatternAttr aScPattern(pDoc->GetPool()); sal_uInt16 HorJustify = (nValue1 & 0x000F); sal_uInt16 VerJustify = (nValue1 & 0x00F0) >> 4; sal_uInt16 OJustify = (nValue1 & 0x0F00) >> 8; sal_uInt16 EJustify = (nValue1 & 0xF000) >> 12; switch (HorJustify) { case hjLeft: aScPattern.GetItemSet().Put(SvxHorJustifyItem(SVX_HOR_JUSTIFY_LEFT, ATTR_HOR_JUSTIFY)); break; case hjCenter: aScPattern.GetItemSet().Put(SvxHorJustifyItem(SVX_HOR_JUSTIFY_CENTER, ATTR_HOR_JUSTIFY)); break; case hjRight: aScPattern.GetItemSet().Put(SvxHorJustifyItem(SVX_HOR_JUSTIFY_RIGHT, ATTR_HOR_JUSTIFY)); break; } switch (VerJustify) { case vjTop: aScPattern.GetItemSet().Put(SvxVerJustifyItem(SVX_VER_JUSTIFY_TOP, ATTR_VER_JUSTIFY)); break; case vjCenter: aScPattern.GetItemSet().Put(SvxVerJustifyItem(SVX_VER_JUSTIFY_CENTER, ATTR_VER_JUSTIFY)); break; case vjBottom: aScPattern.GetItemSet().Put(SvxVerJustifyItem(SVX_VER_JUSTIFY_BOTTOM, ATTR_VER_JUSTIFY)); break; } if (OJustify & ojWordBreak) aScPattern.GetItemSet().Put(SfxBoolItem(sal_True)); if (OJustify & ojBottomTop) aScPattern.GetItemSet().Put(SfxInt32Item(ATTR_ROTATE_VALUE,9000)); else if (OJustify & ojTopBottom) aScPattern.GetItemSet().Put(SfxInt32Item(ATTR_ROTATE_VALUE,27000)); sal_Int16 Margin = Max((sal_uInt16)20, (sal_uInt16)(EJustify * 20)); if (((OJustify & ojBottomTop) == ojBottomTop) || ((OJustify & ojBottomTop) == ojBottomTop)) aScPattern.GetItemSet().Put(SvxMarginItem(20, Margin, 20, Margin, ATTR_MARGIN)); else aScPattern.GetItemSet().Put(SvxMarginItem(Margin, 20, Margin, 20, ATTR_MARGIN)); pDoc->ApplyPatternAreaTab(Col, nStart, Col, nEnd, Tab, aScPattern); } nStart = nEnd + 1; } // Umrandung sal_Bool bEnd = sal_False; sal_uInt16 nColorIndex = 0; sal_uInt16 nFrameIndex = 0; // Special Fix... const sal_uInt32 nHelpMeStart = 100; sal_uInt32 nHelpMe = nHelpMeStart; sal_uInt16 nColorIndexOld = nColorIndex; sal_uInt16 nFrameIndexOld = nColorIndex; nEnd = 0; nStart = 0; while( !bEnd && nHelpMe ) { pColData = &aFrame.pData[ nFrameIndex ]; sal_uInt16 nValue = pColData->Value; sal_uInt16 nLeft = 0; sal_uInt16 nTop = 0; sal_uInt16 nRight = 0; sal_uInt16 nBottom = 0; sal_uInt16 fLeft = ( nValue & 0x000F ); sal_uInt16 fTop = ( nValue & 0x00F0 ) >> 4; sal_uInt16 fRight = ( nValue & 0x0F00 ) >> 8; sal_uInt16 fBottom = ( nValue & 0xF000 ) >> 12; if( fLeft > 1 ) nLeft = 50; else if( fLeft > 0 ) nLeft = 20; if( fTop > 1 ) nTop = 50; else if( fTop > 0 ) nTop = 20; if( fRight > 1 ) nRight = 50; else if( fRight > 0 ) nRight = 20; if( fBottom > 1 ) nBottom = 50; else if( fBottom > 0 ) nBottom = 20; Color ColorLeft( COL_BLACK ); Color ColorTop( COL_BLACK ); Color ColorRight( COL_BLACK ); Color ColorBottom( COL_BLACK ); sal_uInt16 nFrmColVal = aFrameColor.pData[ nColorIndex ].Value; SCROW nFrmColRow = static_cast(aFrameColor.pData[ nColorIndex ].Row); sal_uInt16 cLeft = ( nFrmColVal & 0x000F ); sal_uInt16 cTop = ( nFrmColVal & 0x00F0 ) >> 4; sal_uInt16 cRight = ( nFrmColVal & 0x0F00 ) >> 8; sal_uInt16 cBottom = ( nFrmColVal & 0xF000 ) >> 12; lcl_ChangeColor( cLeft, ColorLeft ); lcl_ChangeColor( cTop, ColorTop ); lcl_ChangeColor( cRight, ColorRight ); lcl_ChangeColor( cBottom, ColorBottom ); if( static_cast(pColData->Row) < nFrmColRow ) { nEnd = static_cast(pColData->Row); if( nFrameIndex < ( aFrame.Count - 1 ) ) nFrameIndex++; } else if( static_cast(pColData->Row) > nFrmColRow ) { nEnd = static_cast(aFrameColor.pData[ nColorIndex ].Row); if( nColorIndex < ( aFrameColor.Count - 1 ) ) nColorIndex++; } else { nEnd = nFrmColRow; if( nFrameIndex < (aFrame.Count - 1 ) ) nFrameIndex++; if( nColorIndex < ( aFrameColor.Count - 1 ) ) nColorIndex++; } if( ( nStart <= nEnd ) && ( nValue != 0 ) ) { ScPatternAttr aScPattern(pDoc->GetPool()); SvxBorderLine aLine; SvxBoxItem aBox( ATTR_BORDER ); aLine.SetOutWidth( nLeft ); aLine.SetColor( ColorLeft ); aBox.SetLine( &aLine, BOX_LINE_LEFT ); aLine.SetOutWidth( nTop ); aLine.SetColor( ColorTop ); aBox.SetLine( &aLine, BOX_LINE_TOP ); aLine.SetOutWidth( nRight ); aLine.SetColor( ColorRight ); aBox.SetLine( &aLine, BOX_LINE_RIGHT ); aLine.SetOutWidth( nBottom ); aLine.SetColor( ColorBottom ); aBox.SetLine( &aLine, BOX_LINE_BOTTOM ); aScPattern.GetItemSet().Put( aBox ); pDoc->ApplyPatternAreaTab( Col, nStart, Col, nEnd, Tab, aScPattern ); } nStart = nEnd + 1; bEnd = ( nFrameIndex == ( aFrame.Count - 1 ) ) && ( nColorIndex == ( aFrameColor.Count - 1 ) ); if( nColorIndexOld != nColorIndex || nFrameIndexOld != nFrameIndex ) { nColorIndexOld = nColorIndex; nFrameIndexOld = nFrameIndex; nHelpMe = nHelpMeStart; } else nHelpMe--; pColData++; } // ACHTUNG: Code bis hier ueberarbeitet ... jetzt hab' ich keinen Bock mehr! (GT) // Hintergrund (Farbe, Raster) sal_uInt16 nRasterIndex = 0; bEnd = sal_False; nColorIndex = 0; nEnd = 0; nStart = 0; // Special Fix... nHelpMe = nHelpMeStart; sal_uInt16 nRasterIndexOld = nRasterIndex; while( !bEnd && nHelpMe ) { sal_uInt16 nBColor = ( aColor.pData[ nColorIndex ].Value & 0x00F0 ) >> 4; sal_uInt16 nRColor = ( aColor.pData[ nColorIndex ].Value & 0x0F00 ) >> 8; Color aBColor( COL_BLACK ); lcl_ChangeColor( nBColor, aBColor ); if( nBColor == 0 ) aBColor.SetColor( COL_WHITE ); else if( nBColor == 15 ) aBColor.SetColor( COL_BLACK ); Color aRColor( COL_BLACK ); lcl_ChangeColor( nRColor, aRColor ); ScPatternAttr aScPattern( pDoc->GetPool() ); sal_uInt16 nFact; sal_Bool bSwapCol = sal_False; sal_Bool bSetItem = sal_True; switch ( aRaster.pData[ nRasterIndex ].Value ) { case raNone: nFact = 0xffff; bSwapCol = sal_True; bSetItem = (nBColor > 0); break; case raGray12: nFact = (0xffff / 100) * 12; break; case raGray25: nFact = (0xffff / 100) * 25; break; case raGray50: nFact = (0xffff / 100) * 50; break; case raGray75: nFact = (0xffff / 100) * 75; break; default: nFact = 0xffff; bSetItem = (nRColor < 15); } if ( bSetItem ) { if( bSwapCol ) aScPattern.GetItemSet().Put( SvxBrushItem( GetMixedColor( aBColor, aRColor, nFact ), ATTR_BACKGROUND ) ); else aScPattern.GetItemSet().Put( SvxBrushItem( GetMixedColor( aRColor, aBColor, nFact ), ATTR_BACKGROUND ) ); } if( aRaster.pData[ nRasterIndex ].Row < aColor.pData[ nColorIndex ].Row ) { nEnd = static_cast(aRaster.pData[ nRasterIndex ].Row); if( nRasterIndex < ( aRaster.Count - 1 ) ) nRasterIndex++; } else if( aRaster.pData[ nRasterIndex ].Row > aColor.pData[ nColorIndex ].Row ) { nEnd = static_cast(aColor.pData[ nColorIndex ].Row); if( nColorIndex < ( aColor.Count - 1 ) ) nColorIndex++; } else { nEnd = static_cast(aColor.pData[ nColorIndex ].Row); if( nRasterIndex < ( aRaster.Count - 1 ) ) nRasterIndex++; if( nColorIndex < ( aColor.Count - 1 ) ) nColorIndex++; } if( nStart <= nEnd ) pDoc->ApplyPatternAreaTab( Col, nStart, Col, nEnd, Tab, aScPattern ); nStart = nEnd + 1; bEnd = ( nRasterIndex == ( aRaster.Count - 1 ) ) && ( nColorIndex == ( aColor.Count - 1 ) ); if( nColorIndexOld != nColorIndex || nRasterIndexOld != nRasterIndex ) { nColorIndexOld = nColorIndex; nRasterIndexOld = nRasterIndex; nHelpMe = nHelpMeStart; } else nHelpMe--; nHelpMe--; } // Zahlenformate nStart = 0; nEnd = 0; nLimit = aValue.Count; pColData = aValue.pData; for (i=0; i(pColData->Row); nValue1 = pColData->Value; if ((nStart <= nEnd) && (nValue1)) { sal_uLong nKey = 0; sal_uInt16 nFormat = (nValue1 & 0x00FF); sal_uInt16 nInfo = (nValue1 & 0xFF00) >> 8; ChangeFormat(nFormat, nInfo, nKey); ScPatternAttr aScPattern(pDoc->GetPool()); aScPattern.GetItemSet().Put(SfxUInt32Item(ATTR_VALUE_FORMAT, (sal_uInt32)nKey)); pDoc->ApplyPatternAreaTab(Col, nStart, Col, nEnd, Tab, aScPattern); } nStart = nEnd + 1; } // Zellattribute (Schutz, Versteckt...) nStart = 0; nEnd = 0; for (i=0; i(aFlag.pData[i].Row); if ((nStart <= nEnd) && (aFlag.pData[i].Value != 0)) { sal_Bool bProtect = ((aFlag.pData[i].Value & paProtect) == paProtect); sal_Bool bHFormula = ((aFlag.pData[i].Value & paHideFormula) == paHideFormula); sal_Bool bHCell = ((aFlag.pData[i].Value & paHideAll) == paHideAll); sal_Bool bHPrint = ((aFlag.pData[i].Value & paHidePrint) == paHidePrint); ScPatternAttr aScPattern(pDoc->GetPool()); aScPattern.GetItemSet().Put(ScProtectionAttr(bProtect, bHFormula, bHCell, bHPrint)); pDoc->ApplyPatternAreaTab(Col, nStart, Col, nEnd, Tab, aScPattern); } nStart = nEnd + 1; } // ZellVorlagen nStart = 0; nEnd = 0; ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool(); for (i=0; i(aPattern.pData[i].Row); if ((nStart <= nEnd) && (aPattern.pData[i].Value != 0)) { sal_uInt16 nPatternIndex = (aPattern.pData[i].Value & 0x00FF) - 1; Sc10PatternData* pPattern = pPatternCollection->At(nPatternIndex); if (pPattern != NULL) { ScStyleSheet* pStyle = (ScStyleSheet*) pStylePool->Find( SC10TOSTRING( pPattern->Name ), SFX_STYLE_FAMILY_PARA); if (pStyle != NULL) pDoc->ApplyStyleAreaTab(Col, nStart, Col, nEnd, Tab, *pStyle); } } nStart = nEnd + 1; } } } void Sc10Import::LoadAttr(Sc10ColAttr& rAttr) { // rAttr is not reused, otherwise we'd have to delete [] rAttr.pData; rStream >> rAttr.Count; if (rAttr.Count) { rAttr.pData = new (::std::nothrow) Sc10ColData[rAttr.Count]; if (rAttr.pData != NULL) { for (sal_uInt16 i = 0; i < rAttr.Count; i++) { rStream >> rAttr.pData[i].Row; rStream >> rAttr.pData[i].Value; } nError = rStream.GetError(); } else { nError = errOutOfMemory; rAttr.Count = 0; } } } void Sc10Import::ChangeFormat(sal_uInt16 nFormat, sal_uInt16 nInfo, sal_uLong& nKey) { // Achtung: Die Formate werden nur auf die StarCalc 3.0 internen Formate gemappt // Korrekterweise muessten zum Teil neue Formate erzeugt werden (sollte Stephan sich ansehen) nKey = 0; switch (nFormat) { case vfStandard : if (nInfo > 0) nKey = 2; break; case vfMoney : if (nInfo > 0) nKey = 21; else nKey = 20; break; case vfThousend : if (nInfo > 0) nKey = 4; else nKey = 5; break; case vfPercent : if (nInfo > 0) nKey = 11; else nKey = 10; break; case vfExponent : nKey = 60; break; case vfZerro : // Achtung kein Aequivalent break; case vfDate : switch (nInfo) { case df_NDMY_Long : nKey = 31; break; case df_DMY_Long : nKey = 30; break; case df_MY_Long : nKey = 32; break; case df_NDM_Long : nKey = 31; break; case df_DM_Long : nKey = 33; break; case df_M_Long : nKey = 34; break; case df_NDMY_Short : nKey = 31; break; case df_DMY_Short : nKey = 30; break; case df_MY_Short : nKey = 32; break; case df_NDM_Short : nKey = 31; break; case df_DM_Short : nKey = 33; break; case df_M_Short : nKey = 34; break; case df_Q_Long : nKey = 35; break; case df_Q_Short : nKey = 35; break; default : nKey = 30; break; } break; case vfTime : switch (nInfo) { case tf_HMS_Long : nKey = 41; break; case tf_HM_Long : nKey = 40; break; case tf_HMS_Short : nKey = 43; break; case tf_HM_Short : nKey = 42; break; default : nKey = 41; break; } break; case vfBoolean : nKey = 99; break; case vfStandardRed : if (nInfo > 0) nKey = 2; break; case vfMoneyRed : if (nInfo > 0) nKey = 23; else nKey = 22; break; case vfThousendRed : if (nInfo > 0) nKey = 4; else nKey = 5; break; case vfPercentRed : if (nInfo > 0) nKey = 11; else nKey = 10; break; case vfExponentRed : nKey = 60; break; case vfFormula : break; case vfString : break; default : break; } } void Sc10Import::LoadObjects() { sal_uInt16 ID; rStream >> ID; if (rStream.IsEof()) return; if (ID == ObjectID) { #ifdef SC10_SHOW_OBJECTS // Achtung nur zu Debugzwecken //----------------------------------- pDoc->InsertTab(SC_TAB_APPEND, "GraphObjects"); SCCOL nCol = 0; SCROW nRow = 0; SCTAB nTab = 0; pDoc->GetTable("GraphObjects", nTab); pDoc->SetString(nCol++, nRow, nTab, "ObjectTyp"); pDoc->SetString(nCol++, nRow, nTab, "Col"); pDoc->SetString(nCol++, nRow, nTab, "Row"); pDoc->SetString(nCol++, nRow, nTab, "Tab"); pDoc->SetString(nCol++, nRow, nTab, "X"); pDoc->SetString(nCol++, nRow, nTab, "Y"); pDoc->SetString(nCol++, nRow, nTab, "W"); pDoc->SetString(nCol++, nRow, nTab, "H"); //----------------------------------- #endif sal_uInt16 nAnz; rStream >> nAnz; sal_Char Reserved[32]; rStream.Read(Reserved, sizeof(Reserved)); nError = rStream.GetError(); if ((nAnz > 0) && (nError == 0)) { sal_uInt8 ObjectType; Sc10GraphHeader GraphHeader; sal_Bool IsOleObject = sal_False; // Achtung dies ist nur ein Notnagel for (sal_uInt16 i = 0; (i < nAnz) && (nError == 0) && !rStream.IsEof() && !IsOleObject; i++) { rStream >> ObjectType; lcl_ReadGraphHeader(rStream, GraphHeader); double nPPTX = ScGlobal::nScreenPPTX; double nPPTY = ScGlobal::nScreenPPTY; long nStartX = 0; for (SCsCOL nX=0; nXGetColWidth(nX, static_cast(GraphHeader.CarretZ)); nStartX = (long) ( nStartX * HMM_PER_TWIPS ); nStartX += (long) ( GraphHeader.x / nPPTX * HMM_PER_TWIPS ); long nSizeX = (long) ( GraphHeader.w / nPPTX * HMM_PER_TWIPS ); long nStartY = pDoc->GetRowHeight( 0, static_cast(GraphHeader.CarretY) - 1, static_cast(GraphHeader.CarretZ)); nStartY = (long) ( nStartY * HMM_PER_TWIPS ); nStartY += (long) ( GraphHeader.y / nPPTY * HMM_PER_TWIPS ); long nSizeY = (long) ( GraphHeader.h / nPPTY * HMM_PER_TWIPS ); #ifdef SC10_SHOW_OBJECTS // Achtung nur zu Debugzwecken //----------------------------------- nCol = 0; nRow++; switch (ObjectType) { case otOle : pDoc->SetString(nCol++, nRow, nTab, "Ole-Object"); break; case otImage : pDoc->SetString(nCol++, nRow, nTab, "Image-Object"); break; case otChart : pDoc->SetString(nCol++, nRow, nTab, "Chart-Object"); break; default : pDoc->SetString(nCol++, nRow, nTab, "ERROR"); break; } pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.CarretX); pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.CarretY); pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.CarretZ); pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.x); pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.y); pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.w); pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.h); //----------------------------------- #endif switch (ObjectType) { case otOle : // Achtung hier muss sowas wie OleLoadFromStream passieren IsOleObject = sal_True; break; case otImage : { Sc10ImageHeader ImageHeader; lcl_ReadImageHeaer(rStream, ImageHeader); // Achtung nun kommen die Daten (Bitmap oder Metafile) // Typ = 1 Device Dependend Bitmap DIB // Typ = 2 MetaFile rStream.SeekRel(ImageHeader.Size); if( ImageHeader.Typ != 1 && ImageHeader.Typ != 2 ) nError = errUnknownFormat; break; } case otChart : { Sc10ChartHeader ChartHeader; Sc10ChartSheetData ChartSheetData; Sc10ChartTypeData* pTypeData = new (::std::nothrow) Sc10ChartTypeData; if (!pTypeData) nError = errOutOfMemory; else { lcl_ReadChartHeader(rStream, ChartHeader); //! altes Metafile verwenden ?? rStream.SeekRel(ChartHeader.Size); lcl_ReadChartSheetData(rStream, ChartSheetData); lcl_ReadChartTypeData(rStream, *pTypeData); Rectangle aRect( Point(nStartX,nStartY), Size(nSizeX,nSizeY) ); Sc10InsertObject::InsertChart( pDoc, static_cast(GraphHeader.CarretZ), aRect, static_cast(GraphHeader.CarretZ), ChartSheetData.DataX1, ChartSheetData.DataY1, ChartSheetData.DataX2, ChartSheetData.DataY2 ); delete pTypeData; } } break; default : nError = errUnknownFormat; break; } nError = rStream.GetError(); } } } else { DBG_ERROR( "ObjectID" ); nError = errUnknownID; } } //----------------------------------------------------------------------------------------------- FltError ScFormatFilterPluginImpl::ScImportStarCalc10( SvStream& rStream, ScDocument* pDocument ) { rStream.Seek( 0UL ); Sc10Import aImport( rStream, pDocument ); return ( FltError ) aImport.Import(); }