1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_scfilt.hxx"
26
27
28
29 // INCLUDE ---------------------------------------------------------------
30
31 #include "scitems.hxx"
32 #include <editeng/eeitem.hxx>
33
34 #include <svx/algitem.hxx>
35 #include <editeng/boxitem.hxx>
36 #include <editeng/brshitem.hxx>
37 #include <editeng/colritem.hxx>
38 #include <editeng/crsditem.hxx>
39 #include <editeng/editdata.hxx>
40 #include <editeng/editeng.hxx>
41 #include <editeng/editobj.hxx>
42 #include <editeng/fhgtitem.hxx>
43 #include <editeng/fontitem.hxx>
44 #include <editeng/lrspitem.hxx>
45 #include <svx/pageitem.hxx>
46 #include <editeng/postitem.hxx>
47 #include <editeng/sizeitem.hxx>
48 #include <editeng/udlnitem.hxx>
49 #include <editeng/ulspitem.hxx>
50 #include <editeng/wghtitem.hxx>
51 #include <svl/zforlist.hxx>
52 #include <svl/PasswordHelper.hxx>
53 #include <stdio.h>
54 #include <math.h>
55 #include <string.h>
56
57 #include "global.hxx"
58 #include "sc.hrc"
59 #include "attrib.hxx"
60 #include "patattr.hxx"
61 #include "docpool.hxx"
62 #include "document.hxx"
63 #include "collect.hxx"
64 #include "rangenam.hxx"
65 #include "dbcolect.hxx"
66 #include "stlsheet.hxx"
67 #include "stlpool.hxx"
68 #include "filter.hxx"
69 #include "scflt.hxx"
70 #include "cell.hxx"
71 #include "scfobj.hxx"
72 #include "docoptio.hxx"
73 #include "viewopti.hxx"
74 #include "postit.hxx"
75 #include "globstr.hrc"
76 #include "ftools.hxx"
77 #include "tabprotection.hxx"
78
79 #include "fprogressbar.hxx"
80
81 using namespace com::sun::star;
82
83 #define DEFCHARSET RTL_TEXTENCODING_MS_1252
84
85 #define SC10TOSTRING(p) String((p),DEFCHARSET)
86
87 const SCCOL SC10MAXCOL = 255; // #i85906# don't try to load more columns than there are in the file
88
89
90 /** Those strings are used with SC10TOSTRING() and strcmp() and such, hence
91 need to be 0-terminated. */
lcl_ReadFixedString(SvStream & rStream,void * pData,size_t nLen)92 static void lcl_ReadFixedString( SvStream& rStream, void* pData, size_t nLen )
93 {
94 sal_Char* pBuf = static_cast<sal_Char*>(pData);
95 if (!nLen)
96 pBuf[0] = 0;
97 else
98 {
99 rStream.Read( pBuf, nLen);
100 pBuf[nLen-1] = 0;
101 }
102 }
103
104
lcl_ReadFileHeader(SvStream & rStream,Sc10FileHeader & rFileHeader)105 static void lcl_ReadFileHeader(SvStream& rStream, Sc10FileHeader& rFileHeader)
106 {
107 lcl_ReadFixedString( rStream, &rFileHeader.CopyRight, sizeof(rFileHeader.CopyRight));
108 rStream >> rFileHeader.Version;
109 rStream.Read(&rFileHeader.Reserved, sizeof(rFileHeader.Reserved));
110 }
111
112
lcl_ReadTabProtect(SvStream & rStream,Sc10TableProtect & rProtect)113 static void lcl_ReadTabProtect(SvStream& rStream, Sc10TableProtect& rProtect)
114 {
115 lcl_ReadFixedString( rStream, &rProtect.PassWord, sizeof(rProtect.PassWord));
116 rStream >> rProtect.Flags;
117 rStream >> rProtect.Protect;
118 }
119
120
lcl_ReadSheetProtect(SvStream & rStream,Sc10SheetProtect & rProtect)121 static void lcl_ReadSheetProtect(SvStream& rStream, Sc10SheetProtect& rProtect)
122 {
123 lcl_ReadFixedString( rStream, &rProtect.PassWord, sizeof(rProtect.PassWord));
124 rStream >> rProtect.Flags;
125 rStream >> rProtect.Protect;
126 }
127
128
lcl_ReadRGB(SvStream & rStream,Sc10Color & rColor)129 static void lcl_ReadRGB(SvStream& rStream, Sc10Color& rColor)
130 {
131 rStream >> rColor.Dummy;
132 rStream >> rColor.Blue;
133 rStream >> rColor.Green;
134 rStream >> rColor.Red;
135 }
136
137
lcl_ReadPalette(SvStream & rStream,Sc10Color * pPalette)138 static void lcl_ReadPalette(SvStream& rStream, Sc10Color* pPalette)
139 {
140 for (sal_uInt16 i = 0; i < 16; i++)
141 lcl_ReadRGB(rStream, pPalette[i]);
142 }
143
144
lcl_ReadValueFormat(SvStream & rStream,Sc10ValueFormat & rFormat)145 static void lcl_ReadValueFormat(SvStream& rStream, Sc10ValueFormat& rFormat)
146 {
147 rStream >> rFormat.Format;
148 rStream >> rFormat.Info;
149 }
150
151
lcl_ReadLogFont(SvStream & rStream,Sc10LogFont & rFont)152 static void lcl_ReadLogFont(SvStream& rStream, Sc10LogFont& rFont)
153 {
154 rStream >> rFont.lfHeight;
155 rStream >> rFont.lfWidth;
156 rStream >> rFont.lfEscapement;
157 rStream >> rFont.lfOrientation;
158 rStream >> rFont.lfWeight;
159 rStream >> rFont.lfItalic;
160 rStream >> rFont.lfUnderline;
161 rStream >> rFont.lfStrikeOut;
162 rStream >> rFont.lfCharSet;
163 rStream >> rFont.lfOutPrecision;
164 rStream >> rFont.lfClipPrecision;
165 rStream >> rFont.lfQuality;
166 rStream >> rFont.lfPitchAndFamily;
167 lcl_ReadFixedString( rStream, &rFont.lfFaceName, sizeof(rFont.lfFaceName));
168 }
169
170
lcl_ReadBlockRect(SvStream & rStream,Sc10BlockRect & rBlock)171 static void lcl_ReadBlockRect(SvStream& rStream, Sc10BlockRect& rBlock)
172 {
173 rStream >> rBlock.x1;
174 rStream >> rBlock.y1;
175 rStream >> rBlock.x2;
176 rStream >> rBlock.y2;
177 }
178
179
lcl_ReadHeadFootLine(SvStream & rStream,Sc10HeadFootLine & rLine)180 static void lcl_ReadHeadFootLine(SvStream& rStream, Sc10HeadFootLine& rLine)
181 {
182 lcl_ReadFixedString( rStream, &rLine.Title, sizeof(rLine.Title));
183 lcl_ReadLogFont(rStream, rLine.LogFont);
184 rStream >> rLine.HorJustify;
185 rStream >> rLine.VerJustify;
186 rStream >> rLine.Raster;
187 rStream >> rLine.Frame;
188 lcl_ReadRGB(rStream, rLine.TextColor);
189 lcl_ReadRGB(rStream, rLine.BackColor);
190 lcl_ReadRGB(rStream, rLine.RasterColor);
191 rStream >> rLine.FrameColor;
192 rStream >> rLine.Reserved;
193 }
194
195
lcl_ReadPageFormat(SvStream & rStream,Sc10PageFormat & rFormat)196 static void lcl_ReadPageFormat(SvStream& rStream, Sc10PageFormat& rFormat)
197 {
198 lcl_ReadHeadFootLine(rStream, rFormat.HeadLine);
199 lcl_ReadHeadFootLine(rStream, rFormat.FootLine);
200 rStream >> rFormat.Orientation;
201 rStream >> rFormat.Width;
202 rStream >> rFormat.Height;
203 rStream >> rFormat.NonPrintableX;
204 rStream >> rFormat.NonPrintableY;
205 rStream >> rFormat.Left;
206 rStream >> rFormat.Top;
207 rStream >> rFormat.Right;
208 rStream >> rFormat.Bottom;
209 rStream >> rFormat.Head;
210 rStream >> rFormat.Foot;
211 rStream >> rFormat.HorCenter;
212 rStream >> rFormat.VerCenter;
213 rStream >> rFormat.PrintGrid;
214 rStream >> rFormat.PrintColRow;
215 rStream >> rFormat.PrintNote;
216 rStream >> rFormat.TopBottomDir;
217 lcl_ReadFixedString( rStream, &rFormat.PrintAreaName, sizeof(rFormat.PrintAreaName));
218 lcl_ReadBlockRect(rStream, rFormat.PrintArea);
219 rStream.Read(&rFormat.PrnZoom, sizeof(rFormat.PrnZoom));
220 rStream >> rFormat.FirstPageNo;
221 rStream >> rFormat.RowRepeatStart;
222 rStream >> rFormat.RowRepeatEnd;
223 rStream >> rFormat.ColRepeatStart;
224 rStream >> rFormat.ColRepeatEnd;
225 rStream.Read(&rFormat.Reserved, sizeof(rFormat.Reserved));
226 }
227
228
lcl_ReadGraphHeader(SvStream & rStream,Sc10GraphHeader & rHeader)229 static void lcl_ReadGraphHeader(SvStream& rStream, Sc10GraphHeader& rHeader)
230 {
231 rStream >> rHeader.Typ;
232 rStream >> rHeader.CarretX;
233 rStream >> rHeader.CarretY;
234 rStream >> rHeader.CarretZ;
235 rStream >> rHeader.x;
236 rStream >> rHeader.y;
237 rStream >> rHeader.w;
238 rStream >> rHeader.h;
239 rStream >> rHeader.IsRelPos;
240 rStream >> rHeader.DoPrint;
241 rStream >> rHeader.FrameType;
242 rStream >> rHeader.IsTransparent;
243 lcl_ReadRGB(rStream, rHeader.FrameColor);
244 lcl_ReadRGB(rStream, rHeader.BackColor);
245 rStream.Read(&rHeader.Reserved, sizeof(rHeader.Reserved));
246 }
247
248
lcl_ReadImageHeaer(SvStream & rStream,Sc10ImageHeader & rHeader)249 static void lcl_ReadImageHeaer(SvStream& rStream, Sc10ImageHeader& rHeader)
250 {
251 lcl_ReadFixedString( rStream, &rHeader.FileName, sizeof(rHeader.FileName));
252 rStream >> rHeader.Typ;
253 rStream >> rHeader.Linked;
254 rStream >> rHeader.x1;
255 rStream >> rHeader.y1;
256 rStream >> rHeader.x2;
257 rStream >> rHeader.y2;
258 rStream >> rHeader.Size;
259 }
260
261
lcl_ReadChartHeader(SvStream & rStream,Sc10ChartHeader & rHeader)262 static void lcl_ReadChartHeader(SvStream& rStream, Sc10ChartHeader& rHeader)
263 {
264 rStream >> rHeader.MM;
265 rStream >> rHeader.xExt;
266 rStream >> rHeader.yExt;
267 rStream >> rHeader.Size;
268 }
269
270
lcl_ReadChartSheetData(SvStream & rStream,Sc10ChartSheetData & rSheetData)271 static void lcl_ReadChartSheetData(SvStream& rStream, Sc10ChartSheetData& rSheetData)
272 {
273 rStream >> rSheetData.HasTitle;
274 rStream >> rSheetData.TitleX;
275 rStream >> rSheetData.TitleY;
276 rStream >> rSheetData.HasSubTitle;
277 rStream >> rSheetData.SubTitleX;
278 rStream >> rSheetData.SubTitleY;
279 rStream >> rSheetData.HasLeftTitle;
280 rStream >> rSheetData.LeftTitleX;
281 rStream >> rSheetData.LeftTitleY;
282 rStream >> rSheetData.HasLegend;
283 rStream >> rSheetData.LegendX1;
284 rStream >> rSheetData.LegendY1;
285 rStream >> rSheetData.LegendX2;
286 rStream >> rSheetData.LegendY2;
287 rStream >> rSheetData.HasLabel;
288 rStream >> rSheetData.LabelX1;
289 rStream >> rSheetData.LabelY1;
290 rStream >> rSheetData.LabelX2;
291 rStream >> rSheetData.LabelY2;
292 rStream >> rSheetData.DataX1;
293 rStream >> rSheetData.DataY1;
294 rStream >> rSheetData.DataX2;
295 rStream >> rSheetData.DataY2;
296 rStream.Read(&rSheetData.Reserved, sizeof(rSheetData.Reserved));
297 }
298
299
lcl_ReadChartTypeData(SvStream & rStream,Sc10ChartTypeData & rTypeData)300 static void lcl_ReadChartTypeData(SvStream& rStream, Sc10ChartTypeData& rTypeData)
301 {
302 rStream >> rTypeData.NumSets;
303 rStream >> rTypeData.NumPoints;
304 rStream >> rTypeData.DrawMode;
305 rStream >> rTypeData.GraphType;
306 rStream >> rTypeData.GraphStyle;
307 lcl_ReadFixedString( rStream, &rTypeData.GraphTitle, sizeof(rTypeData.GraphTitle));
308 lcl_ReadFixedString( rStream, &rTypeData.BottomTitle, sizeof(rTypeData.BottomTitle));
309 sal_uInt16 i;
310 for (i = 0; i < 256; i++)
311 rStream >> rTypeData.SymbolData[i];
312 for (i = 0; i < 256; i++)
313 rStream >> rTypeData.ColorData[i];
314 for (i = 0; i < 256; i++)
315 rStream >> rTypeData.ThickLines[i];
316 for (i = 0; i < 256; i++)
317 rStream >> rTypeData.PatternData[i];
318 for (i = 0; i < 256; i++)
319 rStream >> rTypeData.LinePatternData[i];
320 for (i = 0; i < 11; i++)
321 rStream >> rTypeData.NumGraphStyles[i];
322 rStream >> rTypeData.ShowLegend;
323 for (i = 0; i < 256; i++)
324 lcl_ReadFixedString( rStream, &rTypeData.LegendText[i], sizeof(Sc10ChartText));
325 rStream >> rTypeData.ExplodePie;
326 rStream >> rTypeData.FontUse;
327 for (i = 0; i < 5; i++)
328 rStream >> rTypeData.FontFamily[i];
329 for (i = 0; i < 5; i++)
330 rStream >> rTypeData.FontStyle[i];
331 for (i = 0; i < 5; i++)
332 rStream >> rTypeData.FontSize[i];
333 rStream >> rTypeData.GridStyle;
334 rStream >> rTypeData.Labels;
335 rStream >> rTypeData.LabelEvery;
336 for (i = 0; i < 50; i++)
337 lcl_ReadFixedString( rStream, &rTypeData.LabelText[i], sizeof(Sc10ChartText));
338 lcl_ReadFixedString( rStream, &rTypeData.LeftTitle, sizeof(rTypeData.LeftTitle));
339 rStream.Read(&rTypeData.Reserved, sizeof(rTypeData.Reserved));
340 }
341
lcl_PascalToDouble(sal_Char * tp6)342 double lcl_PascalToDouble(sal_Char* tp6)
343 {
344 sal_uInt8* pnUnsigned = reinterpret_cast< sal_uInt8* >( tp6 );
345 // biased exponent
346 sal_uInt8 be = pnUnsigned[ 0 ];
347 // lower 16 bits of mantissa
348 sal_uInt16 v1 = static_cast< sal_uInt16 >( pnUnsigned[ 2 ] * 256 + pnUnsigned[ 1 ] );
349 // next 16 bits of mantissa
350 sal_uInt16 v2 = static_cast< sal_uInt16 >( pnUnsigned[ 4 ] * 256 + pnUnsigned[ 3 ] );
351 // upper 7 bits of mantissa
352 sal_uInt8 v3 = static_cast< sal_uInt8 >( pnUnsigned[ 5 ] & 0x7F );
353 // sign bit
354 bool s = (pnUnsigned[ 5 ] & 0x80) != 0;
355
356 if (be == 0)
357 return 0.0;
358 return (((((128 + v3) * 65536.0) + v2) * 65536.0 + v1) *
359 ldexp ((s ? -1.0 : 1.0), be - (129+39)));
360 }
361
362
lcl_ChangeColor(sal_uInt16 nIndex,Color & rColor)363 static void lcl_ChangeColor( sal_uInt16 nIndex, Color& rColor )
364 {
365 ColorData aCol;
366
367 switch( nIndex )
368 {
369 case 1: aCol = COL_RED; break;
370 case 2: aCol = COL_GREEN; break;
371 case 3: aCol = COL_BROWN; break;
372 case 4: aCol = COL_BLUE; break;
373 case 5: aCol = COL_MAGENTA; break;
374 case 6: aCol = COL_CYAN; break;
375 case 7: aCol = COL_GRAY; break;
376 case 8: aCol = COL_LIGHTGRAY; break;
377 case 9: aCol = COL_LIGHTRED; break;
378 case 10: aCol = COL_LIGHTGREEN; break;
379 case 11: aCol = COL_YELLOW; break;
380 case 12: aCol = COL_LIGHTBLUE; break;
381 case 13: aCol = COL_LIGHTMAGENTA; break;
382 case 14: aCol = COL_LIGHTCYAN; break;
383 case 15: aCol = COL_WHITE; break;
384 default: aCol = COL_BLACK;
385 }
386
387 rColor.SetColor( aCol );
388 }
389
lcl_MakeOldPageStyleFormatName(sal_uInt16 i)390 String lcl_MakeOldPageStyleFormatName( sal_uInt16 i )
391 {
392 String aName = ScGlobal::GetRscString( STR_PAGESTYLE );
393 aName.AppendAscii( " " );
394 aName += String::CreateFromInt32( i + 1 );
395
396 return aName;
397 }
398
399
insert_new(ScCollection * pCollection,SvStream & rStream)400 template < typename T > sal_uLong insert_new( ScCollection* pCollection, SvStream& rStream )
401 {
402 T* pData = new (::std::nothrow) T( rStream);
403 sal_uLong nError = rStream.GetError();
404 if (pData)
405 {
406 if (nError)
407 delete pData;
408 else
409 pCollection->Insert( pData);
410 }
411 else
412 nError = errOutOfMemory;
413 return nError;
414 }
415
416 //--------------------------------------------
417 // Font
418 //--------------------------------------------
419
420
Sc10FontData(SvStream & rStream)421 Sc10FontData::Sc10FontData(SvStream& rStream)
422 {
423 rStream >> Height;
424 rStream >> CharSet;
425 rStream >> PitchAndFamily;
426 sal_uInt16 nLen;
427 rStream >> nLen;
428 if (nLen < sizeof(FaceName))
429 rStream.Read(FaceName, nLen);
430 else
431 rStream.SetError(ERRCODE_IO_WRONGFORMAT);
432 }
433
434
Sc10FontCollection(SvStream & rStream)435 Sc10FontCollection::Sc10FontCollection(SvStream& rStream) :
436 ScCollection (4, 4),
437 nError (0)
438 {
439 sal_uInt16 ID;
440 rStream >> ID;
441 if (ID == FontID)
442 {
443 sal_uInt16 nAnz;
444 rStream >> nAnz;
445 for (sal_uInt16 i=0; (i < nAnz) && (nError == 0); i++)
446 {
447 nError = insert_new<Sc10FontData>( this, rStream);
448 }
449 }
450 else
451 {
452 DBG_ERROR( "FontID" );
453 nError = errUnknownID;
454 }
455 }
456
457
458 //--------------------------------------------
459 // Benannte-Bereiche
460 //--------------------------------------------
461
462
Sc10NameData(SvStream & rStream)463 Sc10NameData::Sc10NameData(SvStream& rStream)
464 {
465 sal_uInt8 nLen;
466 rStream >> nLen;
467 rStream.Read(Name, sizeof(Name) - 1);
468 if (nLen >= sizeof(Name))
469 nLen = sizeof(Name) - 1;
470 Name[nLen] = 0;
471
472 rStream >> nLen;
473 rStream.Read(Reference, sizeof(Reference) - 1);
474 if (nLen >= sizeof(Reference))
475 nLen = sizeof(Reference) - 1;
476 Reference[nLen] = 0;
477 rStream.Read(Reserved, sizeof(Reserved));
478 }
479
480
Sc10NameCollection(SvStream & rStream)481 Sc10NameCollection::Sc10NameCollection(SvStream& rStream) :
482 ScCollection (4, 4),
483 nError (0)
484 {
485 sal_uInt16 ID;
486 rStream >> ID;
487 if (ID == NameID)
488 {
489 sal_uInt16 nAnz;
490 rStream >> nAnz;
491 for (sal_uInt16 i=0; (i < nAnz) && (nError == 0); i++)
492 {
493 nError = insert_new<Sc10NameData>( this, rStream);
494 }
495 }
496 else
497 {
498 DBG_ERROR( "NameID" );
499 nError = errUnknownID;
500 }
501 }
502
503 //--------------------------------------------
504 // Vorlagen
505 //--------------------------------------------
506
507
Sc10PatternData(SvStream & rStream)508 Sc10PatternData::Sc10PatternData(SvStream& rStream)
509 {
510 lcl_ReadFixedString( rStream, Name, sizeof(Name));
511 lcl_ReadValueFormat(rStream, ValueFormat);
512 lcl_ReadLogFont(rStream, LogFont);
513
514 rStream >> Attr;
515 rStream >> Justify;
516 rStream >> Frame;
517 rStream >> Raster;
518 rStream >> nColor;
519 rStream >> FrameColor;
520 rStream >> Flags;
521 rStream >> FormatFlags;
522 rStream.Read(Reserved, sizeof(Reserved));
523 }
524
525
Sc10PatternCollection(SvStream & rStream)526 Sc10PatternCollection::Sc10PatternCollection(SvStream& rStream) :
527 ScCollection (4, 4),
528 nError (0)
529 {
530 sal_uInt16 ID;
531 rStream >> ID;
532 if (ID == PatternID)
533 {
534 sal_uInt16 nAnz;
535 rStream >> nAnz;
536 for (sal_uInt16 i=0; (i < nAnz) && (nError == 0); i++)
537 {
538 nError = insert_new<Sc10PatternData>( this, rStream);
539 }
540 }
541 else
542 {
543 DBG_ERROR( "PatternID" );
544 nError = errUnknownID;
545 }
546 }
547
548
549 //--------------------------------------------
550 // Datenbank
551 //--------------------------------------------
552
553
Sc10DataBaseData(SvStream & rStream)554 Sc10DataBaseData::Sc10DataBaseData(SvStream& rStream)
555 {
556 lcl_ReadFixedString( rStream, &DataBaseRec.Name, sizeof(DataBaseRec.Name));
557 rStream >> DataBaseRec.Tab;
558 lcl_ReadBlockRect(rStream, DataBaseRec.Block);
559 rStream >> DataBaseRec.RowHeader;
560 rStream >> DataBaseRec.SortField0;
561 rStream >> DataBaseRec.SortUpOrder0;
562 rStream >> DataBaseRec.SortField1;
563 rStream >> DataBaseRec.SortUpOrder1;
564 rStream >> DataBaseRec.SortField2;
565 rStream >> DataBaseRec.SortUpOrder2;
566 rStream >> DataBaseRec.IncludeFormat;
567
568 rStream >> DataBaseRec.QueryField0;
569 rStream >> DataBaseRec.QueryOp0;
570 rStream >> DataBaseRec.QueryByString0;
571 lcl_ReadFixedString( rStream, &DataBaseRec.QueryString0, sizeof(DataBaseRec.QueryString0));
572 DataBaseRec.QueryValue0 = ScfTools::ReadLongDouble(rStream);
573
574 rStream >> DataBaseRec.QueryConnect1;
575 rStream >> DataBaseRec.QueryField1;
576 rStream >> DataBaseRec.QueryOp1;
577 rStream >> DataBaseRec.QueryByString1;
578 lcl_ReadFixedString( rStream, &DataBaseRec.QueryString1, sizeof(DataBaseRec.QueryString1));
579 DataBaseRec.QueryValue1 = ScfTools::ReadLongDouble(rStream);
580
581 rStream >> DataBaseRec.QueryConnect2;
582 rStream >> DataBaseRec.QueryField2;
583 rStream >> DataBaseRec.QueryOp2;
584 rStream >> DataBaseRec.QueryByString2;
585 lcl_ReadFixedString( rStream, &DataBaseRec.QueryString2, sizeof(DataBaseRec.QueryString2));
586 DataBaseRec.QueryValue2 = ScfTools::ReadLongDouble(rStream);
587 }
588
589
Sc10DataBaseCollection(SvStream & rStream)590 Sc10DataBaseCollection::Sc10DataBaseCollection(SvStream& rStream) :
591 ScCollection (4, 4),
592 nError (0)
593 {
594 sal_uInt16 ID;
595 rStream >> ID;
596 if (ID == DataBaseID)
597 {
598 lcl_ReadFixedString( rStream, ActName, sizeof(ActName));
599 sal_uInt16 nAnz;
600 rStream >> nAnz;
601 for (sal_uInt16 i=0; (i < nAnz) && (nError == 0); i++)
602 {
603 nError = insert_new<Sc10DataBaseData>( this, rStream);
604 }
605 }
606 else
607 {
608 DBG_ERROR( "DataBaseID" );
609 nError = errUnknownID;
610 }
611 }
612
613
operator ==(const Sc10LogFont & rData) const614 int Sc10LogFont::operator==( const Sc10LogFont& rData ) const
615 {
616 return !strcmp( lfFaceName, rData.lfFaceName )
617 && lfHeight == rData.lfHeight
618 && lfWidth == rData.lfWidth
619 && lfEscapement == rData.lfEscapement
620 && lfOrientation == rData.lfOrientation
621 && lfWeight == rData.lfWeight
622 && lfItalic == rData.lfItalic
623 && lfUnderline == rData.lfUnderline
624 && lfStrikeOut == rData.lfStrikeOut
625 && lfCharSet == rData.lfCharSet
626 && lfOutPrecision == rData.lfOutPrecision
627 && lfClipPrecision == rData.lfClipPrecision
628 && lfQuality == rData.lfQuality
629 && lfPitchAndFamily == rData.lfPitchAndFamily;
630 }
631
632
operator ==(const Sc10Color & rColor) const633 int Sc10Color::operator==( const Sc10Color& rColor ) const
634 {
635 return ((Red == rColor.Red) && (Green == rColor.Green) && (Blue == rColor.Blue));
636 }
637
638
operator ==(const Sc10HeadFootLine & rData) const639 int Sc10HeadFootLine::operator==( const Sc10HeadFootLine& rData ) const
640 {
641 return !strcmp(Title, rData.Title)
642 && LogFont == rData.LogFont
643 && HorJustify == rData.HorJustify
644 && VerJustify == rData.VerJustify
645 && Raster == rData.Raster
646 && Frame == rData.Frame
647 && TextColor == rData.TextColor
648 && BackColor == rData.BackColor
649 && RasterColor == rData.RasterColor
650 && FrameColor == rData.FrameColor
651 && Reserved == rData.Reserved;
652 }
653
654
operator ==(const Sc10PageFormat & rData) const655 int Sc10PageFormat::operator==( const Sc10PageFormat& rData ) const
656 {
657 return !strcmp(PrintAreaName, rData.PrintAreaName)
658 && HeadLine == rData.HeadLine
659 && FootLine == rData.FootLine
660 && Orientation == rData.Orientation
661 && Width == rData.Width
662 && Height == rData.Height
663 && NonPrintableX == rData.NonPrintableX
664 && NonPrintableY == rData.NonPrintableY
665 && Left == rData.Left
666 && Top == rData.Top
667 && Right == rData.Right
668 && Bottom == rData.Bottom
669 && Head == rData.Head
670 && Foot == rData.Foot
671 && HorCenter == rData.HorCenter
672 && VerCenter == rData.VerCenter
673 && PrintGrid == rData.PrintGrid
674 && PrintColRow == rData.PrintColRow
675 && PrintNote == rData.PrintNote
676 && TopBottomDir == rData.TopBottomDir
677 && FirstPageNo == rData.FirstPageNo
678 && RowRepeatStart == rData.RowRepeatStart
679 && RowRepeatEnd == rData.RowRepeatEnd
680 && ColRepeatStart == rData.ColRepeatStart
681 && ColRepeatEnd == rData.ColRepeatEnd
682 && !memcmp( PrnZoom, rData.PrnZoom, sizeof(PrnZoom) )
683 && !memcmp( &PrintArea, &rData.PrintArea, sizeof(PrintArea) );
684 }
685
686
InsertFormat(const Sc10PageFormat & rData)687 sal_uInt16 Sc10PageCollection::InsertFormat( const Sc10PageFormat& rData )
688 {
689 for (sal_uInt16 i=0; i<nCount; i++)
690 if (At(i)->aPageFormat == rData)
691 return i;
692
693 Insert( new Sc10PageData(rData) );
694
695 return nCount-1;
696 }
697
698
GetMixedCol(const sal_uInt8 nB,const sal_uInt8 nF,const sal_uInt16 nFak)699 static inline sal_uInt8 GetMixedCol( const sal_uInt8 nB, const sal_uInt8 nF, const sal_uInt16 nFak )
700 {
701 sal_Int32 nT = nB - nF;
702 nT *= ( sal_Int32 ) nFak;
703 nT /= 0xFFFF;
704 nT += nF;
705 return ( sal_uInt8 ) nT;
706 }
GetMixedColor(const Color & rFore,const Color & rBack,sal_uInt16 nFact)707 static inline Color GetMixedColor( const Color& rFore, const Color& rBack, sal_uInt16 nFact )
708 {
709 return Color( GetMixedCol( rBack.GetRed(), rFore.GetRed(), nFact ),
710 GetMixedCol( rBack.GetGreen(), rFore.GetGreen(), nFact ),
711 GetMixedCol( rBack.GetBlue(), rFore.GetBlue(), nFact ) );
712 }
713
714
PutToDoc(ScDocument * pDoc)715 void Sc10PageCollection::PutToDoc( ScDocument* pDoc )
716 {
717 ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
718 EditEngine aEditEngine( pDoc->GetEnginePool() );
719 EditTextObject* pEmptyObject = aEditEngine.CreateTextObject();
720
721 for (sal_uInt16 i=0; i<nCount; i++)
722 {
723 Sc10PageFormat* pPage = &At(i)->aPageFormat;
724
725 pPage->Width = (short) ( pPage->Width * ( 72.0 / 72.27 ) + 0.5 );
726 pPage->Height = (short) ( pPage->Height * ( 72.0 / 72.27 ) + 0.5 );
727 pPage->Top = (short) ( pPage->Top * ( 72.0 / 72.27 ) + 0.5 );
728 pPage->Bottom = (short) ( pPage->Bottom * ( 72.0 / 72.27 ) + 0.5 );
729 pPage->Left = (short) ( pPage->Left * ( 72.0 / 72.27 ) + 0.5 );
730 pPage->Right = (short) ( pPage->Right * ( 72.0 / 72.27 ) + 0.5 );
731 pPage->Head = (short) ( pPage->Head * ( 72.0 / 72.27 ) + 0.5 );
732 pPage->Foot = (short) ( pPage->Foot * ( 72.0 / 72.27 ) + 0.5 );
733
734 String aName = lcl_MakeOldPageStyleFormatName( i );
735
736 ScStyleSheet* pSheet = (ScStyleSheet*) &pStylePool->Make( aName,
737 SFX_STYLE_FAMILY_PAGE,
738 SFXSTYLEBIT_USERDEF | SCSTYLEBIT_STANDARD );
739 // #i68483# set page style name at sheet...
740 pDoc->SetPageStyle( static_cast< SCTAB >( i ), aName );
741
742 SfxItemSet* pSet = &pSheet->GetItemSet();
743
744 for (sal_uInt16 nHeadFoot=0; nHeadFoot<2; nHeadFoot++)
745 {
746 Sc10HeadFootLine* pHeadFootLine = nHeadFoot ? &pPage->FootLine : &pPage->HeadLine;
747
748 SfxItemSet aEditAttribs(aEditEngine.GetEmptyItemSet());
749 FontFamily eFam = FAMILY_DONTKNOW;
750 switch (pPage->HeadLine.LogFont.lfPitchAndFamily & 0xF0)
751 {
752 case ffDontCare: eFam = FAMILY_DONTKNOW; break;
753 case ffRoman: eFam = FAMILY_ROMAN; break;
754 case ffSwiss: eFam = FAMILY_SWISS; break;
755 case ffModern: eFam = FAMILY_MODERN; break;
756 case ffScript: eFam = FAMILY_SCRIPT; break;
757 case ffDecorative: eFam = FAMILY_DECORATIVE; break;
758 default: eFam = FAMILY_DONTKNOW; break;
759 }
760 aEditAttribs.Put( SvxFontItem(
761 eFam,
762 SC10TOSTRING( pHeadFootLine->LogFont.lfFaceName ), EMPTY_STRING,
763 PITCH_DONTKNOW, RTL_TEXTENCODING_DONTKNOW, EE_CHAR_FONTINFO ),
764 EE_CHAR_FONTINFO );
765 aEditAttribs.Put( SvxFontHeightItem( Abs( pHeadFootLine->LogFont.lfHeight ), 100, EE_CHAR_FONTHEIGHT ),
766 EE_CHAR_FONTHEIGHT);
767
768 Sc10Color nColor = pHeadFootLine->TextColor;
769 Color TextColor( nColor.Red, nColor.Green, nColor.Blue );
770 aEditAttribs.Put(SvxColorItem(TextColor, EE_CHAR_COLOR), EE_CHAR_COLOR);
771 // FontAttr
772 if (pHeadFootLine->LogFont.lfWeight != fwNormal)
773 aEditAttribs.Put(SvxWeightItem(WEIGHT_BOLD, EE_CHAR_WEIGHT), EE_CHAR_WEIGHT);
774 if (pHeadFootLine->LogFont.lfItalic != 0)
775 aEditAttribs.Put(SvxPostureItem(ITALIC_NORMAL, EE_CHAR_ITALIC), EE_CHAR_ITALIC);
776 if (pHeadFootLine->LogFont.lfUnderline != 0)
777 aEditAttribs.Put(SvxUnderlineItem(UNDERLINE_SINGLE, EE_CHAR_UNDERLINE), EE_CHAR_UNDERLINE);
778 if (pHeadFootLine->LogFont.lfStrikeOut != 0)
779 aEditAttribs.Put(SvxCrossedOutItem(STRIKEOUT_SINGLE, EE_CHAR_STRIKEOUT), EE_CHAR_STRIKEOUT);
780 String aText( pHeadFootLine->Title, DEFCHARSET );
781 aEditEngine.SetText( aText );
782 aEditEngine.QuickSetAttribs( aEditAttribs, ESelection( 0, 0, 0, aText.Len() ) );
783
784 EditTextObject* pObject = aEditEngine.CreateTextObject();
785 ScPageHFItem aHeaderItem(nHeadFoot ? ATTR_PAGE_FOOTERRIGHT : ATTR_PAGE_HEADERRIGHT);
786 switch (pHeadFootLine->HorJustify)
787 {
788 case hjCenter:
789 aHeaderItem.SetLeftArea(*pEmptyObject);
790 aHeaderItem.SetCenterArea(*pObject);
791 aHeaderItem.SetRightArea(*pEmptyObject);
792 break;
793 case hjRight:
794 aHeaderItem.SetLeftArea(*pEmptyObject);
795 aHeaderItem.SetCenterArea(*pEmptyObject);
796 aHeaderItem.SetRightArea(*pObject);
797 break;
798 default:
799 aHeaderItem.SetLeftArea(*pObject);
800 aHeaderItem.SetCenterArea(*pEmptyObject);
801 aHeaderItem.SetRightArea(*pEmptyObject);
802 break;
803 }
804 delete pObject;
805 pSet->Put( aHeaderItem );
806
807 SfxItemSet aSetItemItemSet( *pDoc->GetPool(),
808 ATTR_BACKGROUND, ATTR_BACKGROUND,
809 ATTR_BORDER, ATTR_SHADOW,
810 ATTR_PAGE_SIZE, ATTR_PAGE_SIZE,
811 ATTR_LRSPACE, ATTR_ULSPACE,
812 ATTR_PAGE_ON, ATTR_PAGE_SHARED,
813 0 );
814 nColor = pHeadFootLine->BackColor;
815 Color aBColor( nColor.Red, nColor.Green, nColor.Blue );
816 nColor = pHeadFootLine->RasterColor;
817 Color aRColor( nColor.Red, nColor.Green, nColor.Blue );
818
819 sal_uInt16 nFact;
820 sal_Bool bSwapCol = sal_False;
821 switch (pHeadFootLine->Raster)
822 {
823 case raNone: nFact = 0xffff; bSwapCol = sal_True; break;
824 case raGray12: nFact = (0xffff / 100) * 12; break;
825 case raGray25: nFact = (0xffff / 100) * 25; break;
826 case raGray50: nFact = (0xffff / 100) * 50; break;
827 case raGray75: nFact = (0xffff / 100) * 75; break;
828 default: nFact = 0xffff;
829 }
830 if( bSwapCol )
831 aSetItemItemSet.Put( SvxBrushItem( GetMixedColor( aBColor, aRColor, nFact ), ATTR_BACKGROUND ) );
832 else
833 aSetItemItemSet.Put( SvxBrushItem( GetMixedColor( aRColor, aBColor, nFact ), ATTR_BACKGROUND ) );
834
835 if (pHeadFootLine->Frame != 0)
836 {
837 sal_uInt16 nLeft = 0;
838 sal_uInt16 nTop = 0;
839 sal_uInt16 nRight = 0;
840 sal_uInt16 nBottom = 0;
841 sal_uInt16 fLeft = (pHeadFootLine->Frame & 0x000F);
842 sal_uInt16 fTop = (pHeadFootLine->Frame & 0x00F0) / 0x0010;
843 sal_uInt16 fRight = (pHeadFootLine->Frame & 0x0F00) / 0x0100;
844 sal_uInt16 fBottom = (pHeadFootLine->Frame & 0xF000) / 0x1000;
845 if (fLeft > 1)
846 nLeft = 50;
847 else if (fLeft > 0)
848 nLeft = 20;
849 if (fTop > 1)
850 nTop = 50;
851 else if (fTop > 0)
852 nTop = 20;
853 if (fRight > 1)
854 nRight = 50;
855 else if (fRight > 0)
856 nRight = 20;
857 if (fBottom > 1)
858 nBottom = 50;
859 else if (fBottom > 0)
860 nBottom = 20;
861 Color ColorLeft(COL_BLACK);
862 Color ColorTop(COL_BLACK);
863 Color ColorRight(COL_BLACK);
864 Color ColorBottom(COL_BLACK);
865 sal_uInt16 cLeft = (pHeadFootLine->FrameColor & 0x000F);
866 sal_uInt16 cTop = (pHeadFootLine->FrameColor & 0x00F0) >> 4;
867 sal_uInt16 cRight = (pHeadFootLine->FrameColor & 0x0F00) >> 8;
868 sal_uInt16 cBottom = (pHeadFootLine->FrameColor & 0xF000) >> 12;
869 lcl_ChangeColor(cLeft, ColorLeft);
870 lcl_ChangeColor(cTop, ColorTop);
871 lcl_ChangeColor(cRight, ColorRight);
872 lcl_ChangeColor(cBottom, ColorBottom);
873 SvxBorderLine aLine;
874 SvxBoxItem aBox( ATTR_BORDER );
875 aLine.SetOutWidth(nLeft);
876 aLine.SetColor(ColorLeft);
877 aBox.SetLine(&aLine, BOX_LINE_LEFT);
878 aLine.SetOutWidth(nTop);
879 aLine.SetColor(ColorTop);
880 aBox.SetLine(&aLine, BOX_LINE_TOP);
881 aLine.SetOutWidth(nRight);
882 aLine.SetColor(ColorRight);
883 aBox.SetLine(&aLine, BOX_LINE_RIGHT);
884 aLine.SetOutWidth(nBottom);
885 aLine.SetColor(ColorBottom);
886 aBox.SetLine(&aLine, BOX_LINE_BOTTOM);
887
888 aSetItemItemSet.Put(aBox);
889 }
890
891 pSet->Put( SvxULSpaceItem( 0, 0, ATTR_ULSPACE ) );
892
893 if (nHeadFoot==0)
894 aSetItemItemSet.Put( SvxSizeItem( ATTR_PAGE_SIZE, Size( 0, pPage->Top - pPage->Head ) ) );
895 else
896 aSetItemItemSet.Put( SvxSizeItem( ATTR_PAGE_SIZE, Size( 0, pPage->Bottom - pPage->Foot ) ) );
897
898 aSetItemItemSet.Put(SfxBoolItem( ATTR_PAGE_ON, sal_True ));
899 aSetItemItemSet.Put(SfxBoolItem( ATTR_PAGE_DYNAMIC, sal_False ));
900 aSetItemItemSet.Put(SfxBoolItem( ATTR_PAGE_SHARED, sal_True ));
901
902 pSet->Put( SvxSetItem( nHeadFoot ? ATTR_PAGE_FOOTERSET : ATTR_PAGE_HEADERSET,
903 aSetItemItemSet ) );
904 }
905
906 SvxPageItem aPageItem(ATTR_PAGE);
907 aPageItem.SetPageUsage( SVX_PAGE_ALL );
908 aPageItem.SetLandscape( pPage->Orientation != 1 );
909 aPageItem.SetNumType( SVX_ARABIC );
910 pSet->Put(aPageItem);
911
912 pSet->Put(SvxLRSpaceItem( pPage->Left, pPage->Right, 0,0, ATTR_LRSPACE ));
913 pSet->Put(SvxULSpaceItem( pPage->Top, pPage->Bottom, ATTR_ULSPACE ));
914
915 pSet->Put(SfxBoolItem( ATTR_PAGE_HORCENTER, pPage->HorCenter ));
916 pSet->Put(SfxBoolItem( ATTR_PAGE_VERCENTER, pPage->VerCenter ));
917
918 //----------------
919 // Area-Parameter:
920 //----------------
921 {
922 ScRange* pRepeatRow = NULL;
923 ScRange* pRepeatCol = NULL;
924
925 if ( pPage->ColRepeatStart >= 0 )
926 pRepeatCol = new ScRange( static_cast<SCCOL> (pPage->ColRepeatStart), 0, 0 );
927 if ( pPage->RowRepeatStart >= 0 )
928 pRepeatRow = new ScRange( 0, static_cast<SCROW> (pPage->RowRepeatStart), 0 );
929
930
931 if ( pRepeatRow || pRepeatCol )
932 {
933 //
934 // an allen Tabellen setzen
935 //
936 for ( SCTAB nTab = 0, nTabCount = pDoc->GetTableCount(); nTab < nTabCount; ++nTab )
937 {
938 pDoc->SetRepeatColRange( nTab, pRepeatCol );
939 pDoc->SetRepeatRowRange( nTab, pRepeatRow );
940 }
941 }
942
943 delete pRepeatRow;
944 delete pRepeatCol;
945 }
946
947 //-----------------
948 // Table-Parameter:
949 //-----------------
950 pSet->Put( SfxBoolItem( ATTR_PAGE_NOTES, pPage->PrintNote ) );
951 pSet->Put( SfxBoolItem( ATTR_PAGE_GRID, pPage->PrintGrid ) );
952 pSet->Put( SfxBoolItem( ATTR_PAGE_HEADERS, pPage->PrintColRow ) );
953 pSet->Put( SfxBoolItem( ATTR_PAGE_TOPDOWN, pPage->TopBottomDir ) );
954 pSet->Put( ScViewObjectModeItem( ATTR_PAGE_CHARTS, VOBJ_MODE_SHOW ) );
955 pSet->Put( ScViewObjectModeItem( ATTR_PAGE_OBJECTS, VOBJ_MODE_SHOW ) );
956 pSet->Put( ScViewObjectModeItem( ATTR_PAGE_DRAWINGS, VOBJ_MODE_SHOW ) );
957 pSet->Put( SfxUInt16Item( ATTR_PAGE_SCALE,
958 (sal_uInt16)( lcl_PascalToDouble( pPage->PrnZoom ) * 100 ) ) );
959 pSet->Put( SfxUInt16Item( ATTR_PAGE_FIRSTPAGENO, 1 ) );
960
961 pSet->Put( SvxSizeItem( ATTR_PAGE_SIZE, Size( pPage->Width, pPage->Height ) ) );
962 }
963
964 delete pEmptyObject;
965 }
966
967
Clone() const968 ScDataObject* Sc10PageData::Clone() const
969 {
970 return new Sc10PageData(aPageFormat);
971 }
972
973
974 //--------------------------------------------
975 // Import
976 //--------------------------------------------
977
978
Sc10Import(SvStream & rStr,ScDocument * pDocument)979 Sc10Import::Sc10Import(SvStream& rStr, ScDocument* pDocument ) :
980 rStream (rStr),
981 pDoc (pDocument),
982 pFontCollection (NULL),
983 pNameCollection (NULL),
984 pPatternCollection (NULL),
985 pDataBaseCollection (NULL),
986 nError (0),
987 nShowTab (0)
988 {
989 pPrgrsBar = NULL;
990 }
991
992
~Sc10Import()993 Sc10Import::~Sc10Import()
994 {
995 pDoc->CalcAfterLoad();
996 pDoc->UpdateAllCharts();
997
998 delete pFontCollection;
999 delete pNameCollection;
1000 delete pPatternCollection;
1001 delete pDataBaseCollection;
1002
1003 DBG_ASSERT( pPrgrsBar == NULL,
1004 "*Sc10Import::Sc10Import(): Progressbar lebt noch!?" );
1005 }
1006
1007
Import()1008 sal_uLong Sc10Import::Import()
1009 {
1010 pPrgrsBar = new ScfStreamProgressBar( rStream, pDoc->GetDocumentShell() );
1011
1012 ScDocOptions aOpt = pDoc->GetDocOptions();
1013 aOpt.SetDate( 1, 1, 1900 );
1014 aOpt.SetYear2000( 18 + 1901 ); // ab SO51 src513e vierstellig
1015 pDoc->SetDocOptions( aOpt );
1016 pDoc->GetFormatTable()->ChangeNullDate( 1, 1, 1900 );
1017
1018 LoadFileHeader(); pPrgrsBar->Progress();
1019 if (!nError) { LoadFileInfo(); pPrgrsBar->Progress(); }
1020 if (!nError) { LoadEditStateInfo(); pPrgrsBar->Progress(); }
1021 if (!nError) { LoadProtect(); pPrgrsBar->Progress(); }
1022 if (!nError) { LoadViewColRowBar(); pPrgrsBar->Progress(); }
1023 if (!nError) { LoadScrZoom(); pPrgrsBar->Progress(); }
1024 if (!nError) { LoadPalette(); pPrgrsBar->Progress(); }
1025 if (!nError) { LoadFontCollection(); pPrgrsBar->Progress(); }
1026 if (!nError) { LoadNameCollection(); pPrgrsBar->Progress(); }
1027 if (!nError) { LoadPatternCollection(); pPrgrsBar->Progress(); }
1028 if (!nError) { LoadDataBaseCollection(); pPrgrsBar->Progress(); }
1029 if (!nError) { LoadTables(); pPrgrsBar->Progress(); }
1030 if (!nError) { LoadObjects(); pPrgrsBar->Progress(); }
1031 if (!nError) { ImportNameCollection(); pPrgrsBar->Progress(); }
1032 pDoc->SetViewOptions( aSc30ViewOpt );
1033
1034 #ifdef DBG_UTIL
1035 if (nError)
1036 {
1037 DBG_ERROR( ByteString::CreateFromInt32( nError ).GetBuffer() );
1038 }
1039 #endif
1040
1041 delete pPrgrsBar;
1042 #ifdef DBG_UTIL
1043 pPrgrsBar = NULL;
1044 #endif
1045
1046 return nError;
1047 }
1048
1049
LoadFileHeader()1050 void Sc10Import::LoadFileHeader()
1051 {
1052 Sc10FileHeader FileHeader;
1053 lcl_ReadFileHeader(rStream, FileHeader);
1054
1055 nError = rStream.GetError();
1056 if ( nError == 0 )
1057 {
1058 sal_Char Sc10CopyRight[32];
1059 strcpy(Sc10CopyRight, "Blaise-Tabelle"); // #100211# - checked
1060 Sc10CopyRight[14] = 10;
1061 Sc10CopyRight[15] = 13;
1062 Sc10CopyRight[16] = 0;
1063 if ((strcmp(FileHeader.CopyRight, Sc10CopyRight) != 0)
1064 || (FileHeader.Version < 101)
1065 || (FileHeader.Version > 102))
1066 nError = errUnknownFormat;
1067 }
1068 }
1069
1070
LoadFileInfo()1071 void Sc10Import::LoadFileInfo()
1072 {
1073 Sc10FileInfo FileInfo;
1074 rStream.Read(&FileInfo, sizeof(FileInfo));
1075
1076 nError = rStream.GetError();
1077 // Achtung Info Uebertragen
1078 }
1079
1080
1081
LoadEditStateInfo()1082 void Sc10Import::LoadEditStateInfo()
1083 {
1084 Sc10EditStateInfo EditStateInfo;
1085 rStream.Read(&EditStateInfo, sizeof(EditStateInfo));
1086
1087 nError = rStream.GetError();
1088 nShowTab = static_cast<SCTAB>(EditStateInfo.DeltaZ);
1089 // Achtung Cursorposition und Offset der Tabelle Uebertragen (soll man das machen??)
1090 }
1091
1092
LoadProtect()1093 void Sc10Import::LoadProtect()
1094 {
1095 lcl_ReadSheetProtect(rStream, SheetProtect);
1096 nError = rStream.GetError();
1097
1098 ScDocProtection aProtection;
1099 aProtection.setProtected(static_cast<bool>(SheetProtect.Protect));
1100 aProtection.setPassword(SC10TOSTRING(SheetProtect.PassWord));
1101 pDoc->SetDocProtection(&aProtection);
1102 }
1103
1104
LoadViewColRowBar()1105 void Sc10Import::LoadViewColRowBar()
1106 {
1107 sal_uInt8 ViewColRowBar;
1108 rStream >> ViewColRowBar;
1109 nError = rStream.GetError();
1110 aSc30ViewOpt.SetOption( VOPT_HEADER, (sal_Bool)ViewColRowBar );
1111 }
1112
1113
LoadScrZoom()1114 void Sc10Import::LoadScrZoom()
1115 {
1116 // Achtung Zoom ist leider eine 6Byte TP real Zahl (keine Ahnung wie die Umzusetzen ist)
1117 sal_Char cZoom[6];
1118 rStream.Read(cZoom, sizeof(cZoom));
1119 nError = rStream.GetError();
1120 }
1121
1122
LoadPalette()1123 void Sc10Import::LoadPalette()
1124 {
1125 lcl_ReadPalette(rStream, TextPalette);
1126 lcl_ReadPalette(rStream, BackPalette);
1127 lcl_ReadPalette(rStream, RasterPalette);
1128 lcl_ReadPalette(rStream, FramePalette);
1129
1130 nError = rStream.GetError();
1131 }
1132
1133
LoadFontCollection()1134 void Sc10Import::LoadFontCollection()
1135 {
1136 pFontCollection = new Sc10FontCollection(rStream);
1137 if (!nError)
1138 nError = pFontCollection->GetError();
1139 }
1140
1141
LoadNameCollection()1142 void Sc10Import::LoadNameCollection()
1143 {
1144 pNameCollection = new Sc10NameCollection(rStream);
1145 if (!nError)
1146 nError = pNameCollection->GetError();
1147 }
1148
1149
ImportNameCollection()1150 void Sc10Import::ImportNameCollection()
1151 {
1152 ScRangeName* pRN = pDoc->GetRangeName();
1153
1154 for (sal_uInt16 i = 0; i < pNameCollection->GetCount(); i++)
1155 {
1156 Sc10NameData* pName = pNameCollection->At( i );
1157 pRN->Insert( new ScRangeData( pDoc,
1158 SC10TOSTRING( pName->Name ),
1159 SC10TOSTRING( pName->Reference ) ) );
1160 }
1161 }
1162
1163
LoadPatternCollection()1164 void Sc10Import::LoadPatternCollection()
1165 {
1166 pPatternCollection = new Sc10PatternCollection( rStream );
1167 if (!nError)
1168 nError = pPatternCollection->GetError();
1169 if (nError == errOutOfMemory)
1170 return; // hopeless
1171 ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
1172 for( sal_uInt16 i = 0 ; i < pPatternCollection->GetCount() ; i++ )
1173 {
1174 Sc10PatternData* pPattern = pPatternCollection->At( i );
1175 String aName( pPattern->Name, DEFCHARSET );
1176 SfxStyleSheetBase* pStyle = pStylePool->Find( aName, SFX_STYLE_FAMILY_PARA );
1177 if( pStyle == NULL )
1178 pStylePool->Make( aName, SFX_STYLE_FAMILY_PARA );
1179 else
1180 {
1181 pPattern->Name[ 27 ] = 0;
1182 strcat( pPattern->Name, "_Old" ); // #100211# - checked
1183 aName = SC10TOSTRING( pPattern->Name );
1184 pStylePool->Make( aName, SFX_STYLE_FAMILY_PARA );
1185 }
1186 pStyle = pStylePool->Find( aName, SFX_STYLE_FAMILY_PARA );
1187 if( pStyle != NULL )
1188 {
1189 SfxItemSet &rItemSet = pStyle->GetItemSet();
1190 // Font
1191 if( ( pPattern->FormatFlags & pfFont ) == pfFont )
1192 {
1193 FontFamily eFam = FAMILY_DONTKNOW;
1194 switch( pPattern->LogFont.lfPitchAndFamily & 0xF0 )
1195 {
1196 case ffDontCare : eFam = FAMILY_DONTKNOW; break;
1197 case ffRoman : eFam = FAMILY_ROMAN; break;
1198 case ffSwiss : eFam = FAMILY_SWISS; break;
1199 case ffModern : eFam = FAMILY_MODERN; break;
1200 case ffScript : eFam = FAMILY_SCRIPT; break;
1201 case ffDecorative : eFam = FAMILY_DECORATIVE; break;
1202 default: eFam = FAMILY_DONTKNOW; break;
1203 }
1204 rItemSet.Put( SvxFontItem( eFam, SC10TOSTRING( pPattern->LogFont.lfFaceName ), EMPTY_STRING,
1205 PITCH_DONTKNOW, RTL_TEXTENCODING_DONTKNOW, ATTR_FONT ) );
1206 rItemSet.Put( SvxFontHeightItem( Abs( pPattern->LogFont.lfHeight ), 100, ATTR_FONT_HEIGHT ) );
1207 Color TextColor( COL_BLACK );
1208 lcl_ChangeColor( ( pPattern->nColor & 0x000F ), TextColor );
1209 rItemSet.Put( SvxColorItem( TextColor, ATTR_FONT_COLOR ) );
1210 // FontAttr
1211 if( pPattern->LogFont.lfWeight != fwNormal )
1212 rItemSet.Put( SvxWeightItem( WEIGHT_BOLD, ATTR_FONT_WEIGHT ) );
1213 if( pPattern->LogFont.lfItalic != 0 )
1214 rItemSet.Put( SvxPostureItem( ITALIC_NORMAL, ATTR_FONT_POSTURE ) );
1215 if( pPattern->LogFont.lfUnderline != 0 )
1216 rItemSet.Put( SvxUnderlineItem( UNDERLINE_SINGLE, ATTR_FONT_UNDERLINE ) );
1217 if( pPattern->LogFont.lfStrikeOut != 0 )
1218 rItemSet.Put( SvxCrossedOutItem( STRIKEOUT_SINGLE, ATTR_FONT_CROSSEDOUT ) );
1219 }
1220 // Ausrichtung
1221 if( ( pPattern->FormatFlags & pfJustify ) == pfJustify )
1222 {
1223 sal_uInt16 HorJustify = ( pPattern->Justify & 0x000F );
1224 sal_uInt16 VerJustify = ( pPattern->Justify & 0x00F0 ) >> 4;
1225 sal_uInt16 OJustify = ( pPattern->Justify & 0x0F00 ) >> 8;
1226 sal_uInt16 EJustify = ( pPattern->Justify & 0xF000 ) >> 12;
1227 if( HorJustify != 0 )
1228 switch( HorJustify )
1229 {
1230 case hjLeft:
1231 rItemSet.Put( SvxHorJustifyItem( SVX_HOR_JUSTIFY_LEFT, ATTR_HOR_JUSTIFY ) );
1232 break;
1233 case hjCenter:
1234 rItemSet.Put( SvxHorJustifyItem( SVX_HOR_JUSTIFY_CENTER, ATTR_HOR_JUSTIFY ) );
1235 break;
1236 case hjRight:
1237 rItemSet.Put( SvxHorJustifyItem( SVX_HOR_JUSTIFY_RIGHT, ATTR_HOR_JUSTIFY ) );
1238 break;
1239 }
1240 if( VerJustify != 0 )
1241 switch( VerJustify )
1242 {
1243 case vjTop:
1244 rItemSet.Put( SvxVerJustifyItem( SVX_VER_JUSTIFY_TOP, ATTR_VER_JUSTIFY ) );
1245 break;
1246 case vjCenter:
1247 rItemSet.Put( SvxVerJustifyItem( SVX_VER_JUSTIFY_CENTER, ATTR_VER_JUSTIFY ) );
1248 break;
1249 case vjBottom:
1250 rItemSet.Put( SvxVerJustifyItem( SVX_VER_JUSTIFY_BOTTOM, ATTR_VER_JUSTIFY ) );
1251 break;
1252 }
1253
1254 if( ( OJustify & ojWordBreak ) == ojWordBreak )
1255 rItemSet.Put( SfxBoolItem( sal_True ) );
1256 if( ( OJustify & ojBottomTop ) == ojBottomTop )
1257 rItemSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 9000 ) );
1258 else if( ( OJustify & ojTopBottom ) == ojTopBottom )
1259 rItemSet.Put( SfxInt32Item( ATTR_ROTATE_VALUE, 27000 ) );
1260
1261 sal_Int16 Margin = Max( ( sal_uInt16 ) 20, ( sal_uInt16 ) ( EJustify * 20 ) );
1262 if( ( ( OJustify & ojBottomTop ) == ojBottomTop ) )
1263 rItemSet.Put( SvxMarginItem( 20, Margin, 20, Margin, ATTR_MARGIN ) );
1264 else
1265 rItemSet.Put( SvxMarginItem( Margin, 20, Margin, 20, ATTR_MARGIN ) );
1266 }
1267
1268 // Frame
1269 if( ( pPattern->FormatFlags & pfFrame ) == pfFrame )
1270 {
1271 if( pPattern->Frame != 0 )
1272 {
1273 sal_uInt16 nLeft = 0;
1274 sal_uInt16 nTop = 0;
1275 sal_uInt16 nRight = 0;
1276 sal_uInt16 nBottom = 0;
1277 sal_uInt16 fLeft = ( pPattern->Frame & 0x000F );
1278 sal_uInt16 fTop = ( pPattern->Frame & 0x00F0 ) / 0x0010;
1279 sal_uInt16 fRight = ( pPattern->Frame & 0x0F00 ) / 0x0100;
1280 sal_uInt16 fBottom = ( pPattern->Frame & 0xF000 ) / 0x1000;
1281
1282 if( fLeft > 1 )
1283 nLeft = 50;
1284 else if( fLeft > 0 )
1285 nLeft = 20;
1286
1287 if( fTop > 1 )
1288 nTop = 50;
1289 else if( fTop > 0 )
1290 nTop = 20;
1291
1292 if( fRight > 1 )
1293 nRight = 50;
1294 else if( fRight > 0 )
1295 nRight = 20;
1296
1297 if( fBottom > 1 )
1298 nBottom = 50;
1299 else if( fBottom > 0 )
1300 nBottom = 20;
1301
1302 Color ColorLeft( COL_BLACK );
1303 Color ColorTop( COL_BLACK );
1304 Color ColorRight( COL_BLACK );
1305 Color ColorBottom( COL_BLACK );
1306
1307 sal_uInt16 cLeft = ( pPattern->FrameColor & 0x000F );
1308 sal_uInt16 cTop = ( pPattern->FrameColor & 0x00F0 ) >> 4;
1309 sal_uInt16 cRight = ( pPattern->FrameColor & 0x0F00 ) >> 8;
1310 sal_uInt16 cBottom = ( pPattern->FrameColor & 0xF000 ) >> 12;
1311
1312 lcl_ChangeColor( cLeft, ColorLeft );
1313 lcl_ChangeColor( cTop, ColorTop );
1314 lcl_ChangeColor( cRight, ColorRight );
1315 lcl_ChangeColor( cBottom, ColorBottom );
1316
1317 SvxBorderLine aLine;
1318 SvxBoxItem aBox( ATTR_BORDER );
1319
1320 aLine.SetOutWidth( nLeft );
1321 aLine.SetColor( ColorLeft );
1322 aBox.SetLine( &aLine, BOX_LINE_LEFT );
1323 aLine.SetOutWidth( nTop );
1324 aLine.SetColor( ColorTop );
1325 aBox.SetLine( &aLine, BOX_LINE_TOP );
1326 aLine.SetOutWidth( nRight );
1327 aLine.SetColor( ColorRight );
1328 aBox.SetLine( &aLine, BOX_LINE_RIGHT );
1329 aLine.SetOutWidth( nBottom );
1330 aLine.SetColor( ColorBottom );
1331 aBox.SetLine( &aLine, BOX_LINE_BOTTOM );
1332 rItemSet.Put( aBox );
1333 }
1334 }
1335 // Raster
1336 if( ( pPattern->FormatFlags & pfRaster ) == pfRaster )
1337 {
1338 if( pPattern->Raster != 0 )
1339 {
1340 sal_uInt16 nBColor = ( pPattern->nColor & 0x00F0 ) >> 4;
1341 sal_uInt16 nRColor = ( pPattern->nColor & 0x0F00 ) >> 8;
1342 Color aBColor( COL_BLACK );
1343
1344 lcl_ChangeColor( nBColor, aBColor );
1345
1346 if( nBColor == 0 )
1347 aBColor.SetColor( COL_WHITE );
1348 else if( nBColor == 15 )
1349 aBColor.SetColor( COL_BLACK );
1350
1351 Color aRColor( COL_BLACK );
1352 lcl_ChangeColor( nRColor, aRColor );
1353 sal_uInt16 nFact;
1354 sal_Bool bSwapCol = sal_False;
1355 sal_Bool bSetItem = sal_True;
1356 switch (pPattern->Raster)
1357 {
1358 case raNone: nFact = 0xffff; bSwapCol = sal_True; bSetItem = (nBColor > 0); break;
1359 case raGray12: nFact = (0xffff / 100) * 12; break;
1360 case raGray25: nFact = (0xffff / 100) * 25; break;
1361 case raGray50: nFact = (0xffff / 100) * 50; break;
1362 case raGray75: nFact = (0xffff / 100) * 75; break;
1363 default: nFact = 0xffff; bSetItem = (nRColor < 15);
1364 }
1365 if ( bSetItem )
1366 {
1367 if( bSwapCol )
1368 rItemSet.Put( SvxBrushItem( GetMixedColor( aBColor, aRColor, nFact ), ATTR_BACKGROUND ) );
1369 else
1370 rItemSet.Put( SvxBrushItem( GetMixedColor( aRColor, aBColor, nFact ), ATTR_BACKGROUND ) );
1371 }
1372 }
1373 }
1374 // ZahlenFormate
1375 if( ( pPattern->ValueFormat.Format != 0 ) &&
1376 ( ( pPattern->FormatFlags & pfValue ) == pfValue ) )
1377 {
1378 sal_uLong nKey = 0;
1379 ChangeFormat( pPattern->ValueFormat.Format, pPattern->ValueFormat.Info, nKey );
1380 rItemSet.Put( SfxUInt32Item( ATTR_VALUE_FORMAT, ( sal_uInt32 ) nKey ) );
1381 }
1382
1383 // Zellattribute (Schutz, Versteckt...)
1384 if( ( pPattern->Flags != 0 ) &&
1385 ( ( pPattern->FormatFlags & pfProtection ) == pfProtection ) )
1386 {
1387 sal_Bool bProtect = ( ( pPattern->Flags & paProtect ) == paProtect );
1388 sal_Bool bHFormula = ( ( pPattern->Flags & paHideFormula ) == paHideFormula );
1389 sal_Bool bHCell = ( ( pPattern->Flags & paHideAll ) == paHideAll );
1390 sal_Bool bHPrint = ( ( pPattern->Flags & paHidePrint ) == paHidePrint );
1391 rItemSet.Put( ScProtectionAttr( bProtect, bHFormula, bHCell, bHPrint ) );
1392 }
1393 } // if Style != 0
1394 } // for (i = 0; i < GetCount()
1395 }
1396
1397
LoadDataBaseCollection()1398 void Sc10Import::LoadDataBaseCollection()
1399 {
1400 pDataBaseCollection = new Sc10DataBaseCollection(rStream);
1401 if (!nError)
1402 nError = pDataBaseCollection->GetError();
1403 if (nError == errOutOfMemory)
1404 return; // hopeless
1405 for( sal_uInt16 i = 0 ; i < pDataBaseCollection->GetCount() ; i++ )
1406 {
1407 Sc10DataBaseData* pOldData = pDataBaseCollection->At(i);
1408 ScDBData* pNewData = new ScDBData( SC10TOSTRING( pOldData->DataBaseRec.Name ),
1409 ( SCTAB ) pOldData->DataBaseRec.Tab,
1410 ( SCCOL ) pOldData->DataBaseRec.Block.x1,
1411 ( SCROW ) pOldData->DataBaseRec.Block.y1,
1412 ( SCCOL ) pOldData->DataBaseRec.Block.x2,
1413 ( SCROW ) pOldData->DataBaseRec.Block.y2,
1414 sal_True,
1415 ( sal_Bool) pOldData->DataBaseRec.RowHeader );
1416 pDoc->GetDBCollection()->Insert( pNewData );
1417 }
1418 }
1419
1420
LoadTables()1421 void Sc10Import::LoadTables()
1422 {
1423 Sc10PageCollection aPageCollection;
1424
1425 sal_Int16 nTabCount;
1426 rStream >> nTabCount;
1427 for (sal_Int16 Tab = 0; (Tab < nTabCount) && (nError == 0); Tab++)
1428 {
1429 Sc10PageFormat PageFormat;
1430 sal_Int16 DataBaseIndex;
1431 Sc10TableProtect TabProtect;
1432 sal_Int16 TabNo;
1433 sal_Char TabName[128];
1434 sal_uInt16 Display;
1435 sal_uInt8 Visible;
1436 sal_uInt16 ID;
1437 sal_uInt16 DataCount;
1438 sal_uInt16 DataStart;
1439 sal_uInt16 DataEnd;
1440 sal_uInt16 DataValue;
1441 sal_uInt16 Count;
1442 sal_uInt16 i;
1443 String aStr; // Universal-Konvertierungs-String
1444
1445
1446 lcl_ReadPageFormat(rStream, PageFormat);
1447
1448 sal_uInt16 nAt = aPageCollection.InsertFormat(PageFormat);
1449 String aPageName = lcl_MakeOldPageStyleFormatName( nAt );
1450
1451 pPrgrsBar->Progress();
1452
1453 rStream >> DataBaseIndex;
1454
1455 lcl_ReadTabProtect(rStream, TabProtect);
1456
1457 ScTableProtection aProtection;
1458 aProtection.setProtected(static_cast<bool>(TabProtect.Protect));
1459 aProtection.setPassword(SC10TOSTRING(TabProtect.PassWord));
1460 pDoc->SetTabProtection(static_cast<SCTAB>(Tab), &aProtection);
1461
1462 rStream >> TabNo;
1463
1464 sal_uInt8 nLen;
1465 rStream >> nLen;
1466 rStream.Read(TabName, sizeof(TabName) - 1);
1467 if (nLen >= sizeof(TabName))
1468 nLen = sizeof(TabName) - 1;
1469 TabName[nLen] = 0;
1470
1471 //----------------------------------------------------------
1472 rStream >> Display;
1473
1474 if ( Tab == (sal_Int16)nShowTab )
1475 {
1476 ScVObjMode eObjMode = VOBJ_MODE_SHOW;
1477
1478 aSc30ViewOpt.SetOption( VOPT_FORMULAS, IS_SET(dfFormula,Display) );
1479 aSc30ViewOpt.SetOption( VOPT_NULLVALS, IS_SET(dfZerro,Display) );
1480 aSc30ViewOpt.SetOption( VOPT_SYNTAX, IS_SET(dfSyntax,Display) );
1481 aSc30ViewOpt.SetOption( VOPT_NOTES, IS_SET(dfNoteMark,Display) );
1482 aSc30ViewOpt.SetOption( VOPT_VSCROLL, sal_True );
1483 aSc30ViewOpt.SetOption( VOPT_HSCROLL, sal_True );
1484 aSc30ViewOpt.SetOption( VOPT_TABCONTROLS, sal_True );
1485 aSc30ViewOpt.SetOption( VOPT_OUTLINER, sal_True );
1486 aSc30ViewOpt.SetOption( VOPT_GRID, IS_SET(dfGrid,Display) );
1487
1488 // VOPT_HEADER wird in LoadViewColRowBar() gesetzt
1489
1490 if ( IS_SET(dfObjectAll,Display) ) // Objekte anzeigen
1491 eObjMode = VOBJ_MODE_SHOW;
1492 else if ( IS_SET(dfObjectFrame,Display) ) // Objekte als Platzhalter
1493 eObjMode = VOBJ_MODE_SHOW;
1494 else if ( IS_SET(dfObjectNone,Display) ) // Objekte nicht anzeigen
1495 eObjMode = VOBJ_MODE_HIDE;
1496
1497 aSc30ViewOpt.SetObjMode( VOBJ_TYPE_OLE, eObjMode );
1498 aSc30ViewOpt.SetObjMode( VOBJ_TYPE_CHART, eObjMode );
1499 aSc30ViewOpt.SetObjMode( VOBJ_TYPE_DRAW, eObjMode );
1500 }
1501
1502 /* wofuer wird das benoetigt? Da in SC 1.0 die Anzeigeflags pro Tabelle gelten und nicht pro View
1503 Dieses Flag in die ViewOptions eintragen bei Gelegenheit, Sollte der Stephan Olk machen
1504 sal_uInt16 nDisplayMask = 0xFFFF;
1505 sal_uInt16 nDisplayValue = 0;
1506 if (Tab == 0)
1507 nDisplayValue = Display;
1508 else
1509 {
1510 sal_uInt16 nDiff = Display ^ nDisplayValue;
1511 nDisplayMask &= ~nDiff;
1512 }
1513 */
1514 //--------------------------------------------------------------------
1515 rStream >> Visible;
1516
1517 nError = rStream.GetError();
1518 if (nError != 0) return;
1519
1520 if (TabNo == 0)
1521 pDoc->RenameTab(static_cast<SCTAB> (TabNo), SC10TOSTRING( TabName ), sal_False);
1522 else
1523 pDoc->InsertTab(SC_TAB_APPEND, SC10TOSTRING( TabName ) );
1524
1525 pDoc->SetPageStyle( static_cast<SCTAB>(Tab), aPageName );
1526
1527 if (Visible == 0) pDoc->SetVisible(static_cast<SCTAB> (TabNo), sal_False);
1528
1529 // ColWidth
1530 rStream >> ID;
1531 if (ID != ColWidthID)
1532 {
1533 DBG_ERROR( "ColWidthID" );
1534 nError = errUnknownID;
1535 return;
1536 }
1537 rStream >> DataCount;
1538 DataStart = 0;
1539 for (i=0; i < DataCount; i++)
1540 {
1541 rStream >> DataEnd;
1542 rStream >> DataValue;
1543 for (SCCOL j = static_cast<SCCOL>(DataStart); j <= static_cast<SCCOL>(DataEnd); j++) pDoc->SetColWidth(j, static_cast<SCTAB> (TabNo), DataValue);
1544 DataStart = DataEnd + 1;
1545 }
1546 pPrgrsBar->Progress();
1547
1548 // ColAttr
1549 rStream >> ID;
1550 if (ID != ColAttrID)
1551 {
1552 DBG_ERROR( "ColAttrID" );
1553 nError = errUnknownID;
1554 return;
1555 }
1556
1557 rStream >> DataCount;
1558 DataStart = 0;
1559 for (i=0; i < DataCount; i++)
1560 {
1561 rStream >> DataEnd;
1562 rStream >> DataValue;
1563 if (DataValue != 0)
1564 {
1565 bool bPageBreak = ((DataValue & crfSoftBreak) == crfSoftBreak);
1566 bool bManualBreak = ((DataValue & crfHardBreak) == crfHardBreak);
1567 bool bHidden = ((DataValue & crfHidden) == crfHidden);
1568 for (SCCOL k = static_cast<SCCOL>(DataStart); k <= static_cast<SCCOL>(DataEnd); k++)
1569 {
1570 pDoc->SetColHidden(k, k, static_cast<SCTAB>(TabNo), bHidden);
1571 pDoc->SetColBreak(k, static_cast<SCTAB> (TabNo), bPageBreak, bManualBreak);
1572 }
1573 }
1574 DataStart = DataEnd + 1;
1575 }
1576 pPrgrsBar->Progress();
1577
1578 // RowHeight
1579 rStream >> ID;
1580 if (ID != RowHeightID)
1581 {
1582 DBG_ERROR( "RowHeightID" );
1583 nError = errUnknownID;
1584 return;
1585 }
1586
1587 rStream >> DataCount;
1588 DataStart = 0;
1589 for (i=0; i < DataCount; i++)
1590 {
1591 rStream >> DataEnd;
1592 rStream >> DataValue;
1593 pDoc->SetRowHeightRange(static_cast<SCROW> (DataStart), static_cast<SCROW> (DataEnd), static_cast<SCTAB> (TabNo), DataValue);
1594 DataStart = DataEnd + 1;
1595 }
1596 pPrgrsBar->Progress();
1597
1598 // RowAttr
1599 rStream >> ID;
1600 if (ID != RowAttrID)
1601 {
1602 DBG_ERROR( "RowAttrID" );
1603 nError = errUnknownID;
1604 return;
1605 }
1606
1607 rStream >> DataCount;
1608 DataStart = 0;
1609 for (i=0; i < DataCount; i++)
1610 {
1611 rStream >> DataEnd;
1612 rStream >> DataValue;
1613 if (DataValue != 0)
1614 {
1615 bool bPageBreak = ((DataValue & crfSoftBreak) == crfSoftBreak);
1616 bool bManualBreak = ((DataValue & crfHardBreak) == crfHardBreak);
1617 bool bHidden = ((DataValue & crfHidden) == crfHidden);
1618 for (SCROW l = static_cast<SCROW>(DataStart); l <= static_cast<SCROW>(DataEnd); l++)
1619 {
1620 pDoc->SetRowHidden(l, l, static_cast<SCTAB> (TabNo), bHidden);
1621 pDoc->SetRowBreak(l, static_cast<SCTAB> (TabNo), bPageBreak, bManualBreak);
1622 }
1623 }
1624 DataStart = DataEnd + 1;
1625 }
1626 pPrgrsBar->Progress();
1627
1628 // DataTable
1629 rStream >> ID;
1630 if (ID != TableID)
1631 {
1632 DBG_ERROR( "TableID" );
1633 nError = errUnknownID;
1634 return;
1635 }
1636 for (SCCOL Col = 0; (Col <= SC10MAXCOL) && (nError == 0); Col++)
1637 {
1638 rStream >> Count;
1639 nError = rStream.GetError();
1640 if ((Count != 0) && (nError == 0))
1641 LoadCol(Col, static_cast<SCTAB> (TabNo));
1642 }
1643 DBG_ASSERT( nError == 0, "Stream" );
1644 }
1645 pPrgrsBar->Progress();
1646
1647 aPageCollection.PutToDoc( pDoc );
1648 }
1649
1650
LoadCol(SCCOL Col,SCTAB Tab)1651 void Sc10Import::LoadCol(SCCOL Col, SCTAB Tab)
1652 {
1653 LoadColAttr(Col, Tab);
1654
1655 sal_uInt16 CellCount;
1656 sal_uInt8 CellType;
1657 sal_uInt16 Row;
1658 rStream >> CellCount;
1659 SCROW nScCount = static_cast< SCROW >( CellCount );
1660 if (nScCount > MAXROW) nError = errUnknownFormat;
1661 for (sal_uInt16 i = 0; (i < CellCount) && (nError == 0); i++)
1662 {
1663 rStream >> CellType;
1664 rStream >> Row;
1665 nError = rStream.GetError();
1666 if (nError == 0)
1667 {
1668 switch (CellType)
1669 {
1670 case ctValue :
1671 {
1672 const SfxPoolItem* pValueFormat = pDoc->GetAttr(Col, static_cast<SCROW> (Row), Tab, ATTR_VALUE_FORMAT);
1673 sal_uLong nFormat = ((SfxUInt32Item*)pValueFormat)->GetValue();
1674 double Value = ScfTools::ReadLongDouble(rStream);
1675
1676 // Achtung hier ist eine Anpassung Notwendig wenn Ihr das Basisdatum aendert
1677 // In StarCalc 1.0 entspricht 0 dem 01.01.1900
1678 // if ((nFormat >= 30) && (nFormat <= 35))
1679 // Value += 0;
1680 if ((nFormat >= 40) && (nFormat <= 45))
1681 Value /= 86400.0;
1682 pDoc->SetValue(Col, static_cast<SCROW> (Row), Tab, Value);
1683 break;
1684 }
1685 case ctString :
1686 {
1687 sal_uInt8 Len;
1688 sal_Char s[256];
1689 rStream >> Len;
1690 rStream.Read(s, Len);
1691 s[Len] = 0;
1692
1693 pDoc->SetString( Col, static_cast<SCROW> (Row), Tab, SC10TOSTRING( s ) );
1694 break;
1695 }
1696 case ctFormula :
1697 {
1698 /*double Value =*/ ScfTools::ReadLongDouble(rStream);
1699 sal_uInt8 Len;
1700 sal_Char s[256+1];
1701 rStream >> Len;
1702 rStream.Read(&s[1], Len);
1703 s[0] = '=';
1704 s[Len + 1] = 0;
1705 ScFormulaCell* pCell = new ScFormulaCell( pDoc, ScAddress( Col, static_cast<SCROW> (Row), Tab ) );
1706 pCell->SetHybridFormula( SC10TOSTRING( s ),formula::FormulaGrammar::GRAM_NATIVE );
1707 pDoc->PutCell( Col, static_cast<SCROW> (Row), Tab, pCell, (sal_Bool)sal_True );
1708 break;
1709 }
1710 case ctNote :
1711 break;
1712 default :
1713 nError = errUnknownFormat;
1714 break;
1715 }
1716 sal_uInt16 NoteLen;
1717 rStream >> NoteLen;
1718 if (NoteLen != 0)
1719 {
1720 sal_Char* pNote = new sal_Char[NoteLen+1];
1721 rStream.Read(pNote, NoteLen);
1722 pNote[NoteLen] = 0;
1723 String aNoteText( SC10TOSTRING(pNote));
1724 delete [] pNote;
1725 ScAddress aPos( Col, static_cast<SCROW>(Row), Tab );
1726 ScNoteUtil::CreateNoteFromString( *pDoc, aPos, aNoteText, false, false );
1727 }
1728 }
1729 pPrgrsBar->Progress();
1730 }
1731 }
1732
1733
LoadColAttr(SCCOL Col,SCTAB Tab)1734 void Sc10Import::LoadColAttr(SCCOL Col, SCTAB Tab)
1735 {
1736 Sc10ColAttr aFont;
1737 Sc10ColAttr aAttr;
1738 Sc10ColAttr aJustify;
1739 Sc10ColAttr aFrame;
1740 Sc10ColAttr aRaster;
1741 Sc10ColAttr aValue;
1742 Sc10ColAttr aColor;
1743 Sc10ColAttr aFrameColor;
1744 Sc10ColAttr aFlag;
1745 Sc10ColAttr aPattern;
1746
1747 if (nError == 0) LoadAttr(aFont);
1748 if (nError == 0) LoadAttr(aAttr);
1749 if (nError == 0) LoadAttr(aJustify);
1750 if (nError == 0) LoadAttr(aFrame);
1751 if (nError == 0) LoadAttr(aRaster);
1752 if (nError == 0) LoadAttr(aValue);
1753 if (nError == 0) LoadAttr(aColor);
1754 if (nError == 0) LoadAttr(aFrameColor);
1755 if (nError == 0) LoadAttr(aFlag);
1756 if (nError == 0) LoadAttr(aPattern);
1757
1758 if (nError == 0)
1759 {
1760 SCROW nStart;
1761 SCROW nEnd;
1762 sal_uInt16 i;
1763 sal_uInt16 nLimit;
1764 sal_uInt16 nValue1;
1765 Sc10ColData *pColData;
1766
1767 // Font (Name, Groesse)
1768 nStart = 0;
1769 nEnd = 0;
1770 nLimit = aFont.Count;
1771 pColData = aFont.pData;
1772 for( i = 0 ; i < nLimit ; i++, pColData++ )
1773 {
1774 nEnd = static_cast<SCROW>(pColData->Row);
1775 if ((nStart <= nEnd) && (pColData->Value))
1776 {
1777 FontFamily eFam = FAMILY_DONTKNOW;
1778 Sc10FontData* pFont = pFontCollection->At(pColData->Value);
1779 if (pFont)
1780 {
1781 switch (pFont->PitchAndFamily & 0xF0)
1782 {
1783 case ffDontCare : eFam = FAMILY_DONTKNOW; break;
1784 case ffRoman : eFam = FAMILY_ROMAN; break;
1785 case ffSwiss : eFam = FAMILY_SWISS; break;
1786 case ffModern : eFam = FAMILY_MODERN; break;
1787 case ffScript : eFam = FAMILY_SCRIPT; break;
1788 case ffDecorative : eFam = FAMILY_DECORATIVE; break;
1789 default: eFam = FAMILY_DONTKNOW; break;
1790 }
1791 ScPatternAttr aScPattern(pDoc->GetPool());
1792 aScPattern.GetItemSet().Put(SvxFontItem(eFam, SC10TOSTRING( pFont->FaceName ), EMPTY_STRING,
1793 PITCH_DONTKNOW, RTL_TEXTENCODING_DONTKNOW, ATTR_FONT ));
1794 aScPattern.GetItemSet().Put(SvxFontHeightItem(Abs(pFont->Height), 100, ATTR_FONT_HEIGHT ));
1795 pDoc->ApplyPatternAreaTab(Col, nStart, Col, nEnd, Tab, aScPattern);
1796 }
1797 }
1798 nStart = nEnd + 1;
1799 }
1800
1801 // Fontfarbe
1802 nStart = 0;
1803 nEnd = 0;
1804 nLimit = aColor.Count;
1805 pColData = aColor.pData;
1806 for( i = 0 ; i < nLimit ; i++, pColData++ )
1807 {
1808 nEnd = static_cast<SCROW>(pColData->Row);
1809 if ((nStart <= nEnd) && (pColData->Value))
1810 {
1811 Color TextColor(COL_BLACK);
1812 lcl_ChangeColor((pColData->Value & 0x000F), TextColor);
1813 ScPatternAttr aScPattern(pDoc->GetPool());
1814 aScPattern.GetItemSet().Put(SvxColorItem(TextColor, ATTR_FONT_COLOR ));
1815 pDoc->ApplyPatternAreaTab(Col, nStart, Col, nEnd, Tab, aScPattern);
1816 }
1817 nStart = nEnd + 1;
1818 }
1819
1820 // Fontattribute (Fett, Kursiv...)
1821 nStart = 0;
1822 nEnd = 0;
1823 nLimit = aAttr.Count;
1824 pColData = aAttr.pData;
1825 for( i = 0 ; i < nLimit ; i++, pColData++ )
1826 {
1827 nEnd = static_cast<SCROW>(pColData->Row);
1828 nValue1 = pColData->Value;
1829 if ((nStart <= nEnd) && (nValue1))
1830 {
1831 ScPatternAttr aScPattern(pDoc->GetPool());
1832 if ((nValue1 & atBold) == atBold)
1833 aScPattern.GetItemSet().Put(SvxWeightItem(WEIGHT_BOLD, ATTR_FONT_WEIGHT));
1834 if ((nValue1 & atItalic) == atItalic)
1835 aScPattern.GetItemSet().Put(SvxPostureItem(ITALIC_NORMAL, ATTR_FONT_POSTURE));
1836 if ((nValue1 & atUnderline) == atUnderline)
1837 aScPattern.GetItemSet().Put(SvxUnderlineItem(UNDERLINE_SINGLE, ATTR_FONT_UNDERLINE));
1838 if ((nValue1 & atStrikeOut) == atStrikeOut)
1839 aScPattern.GetItemSet().Put(SvxCrossedOutItem(STRIKEOUT_SINGLE, ATTR_FONT_CROSSEDOUT));
1840 pDoc->ApplyPatternAreaTab(Col, nStart, Col, nEnd, Tab, aScPattern);
1841 }
1842 nStart = nEnd + 1;
1843 }
1844
1845 // Zellausrichtung
1846 nStart = 0;
1847 nEnd = 0;
1848 nLimit = aJustify.Count;
1849 pColData = aJustify.pData;
1850 for( i = 0 ; i < nLimit ; i++, pColData++ )
1851 {
1852 nEnd = static_cast<SCROW>(pColData->Row);
1853 nValue1 = pColData->Value;
1854 if ((nStart <= nEnd) && (nValue1))
1855 {
1856 ScPatternAttr aScPattern(pDoc->GetPool());
1857 sal_uInt16 HorJustify = (nValue1 & 0x000F);
1858 sal_uInt16 VerJustify = (nValue1 & 0x00F0) >> 4;
1859 sal_uInt16 OJustify = (nValue1 & 0x0F00) >> 8;
1860 sal_uInt16 EJustify = (nValue1 & 0xF000) >> 12;
1861
1862 switch (HorJustify)
1863 {
1864 case hjLeft:
1865 aScPattern.GetItemSet().Put(SvxHorJustifyItem(SVX_HOR_JUSTIFY_LEFT, ATTR_HOR_JUSTIFY));
1866 break;
1867 case hjCenter:
1868 aScPattern.GetItemSet().Put(SvxHorJustifyItem(SVX_HOR_JUSTIFY_CENTER, ATTR_HOR_JUSTIFY));
1869 break;
1870 case hjRight:
1871 aScPattern.GetItemSet().Put(SvxHorJustifyItem(SVX_HOR_JUSTIFY_RIGHT, ATTR_HOR_JUSTIFY));
1872 break;
1873 }
1874
1875 switch (VerJustify)
1876 {
1877 case vjTop:
1878 aScPattern.GetItemSet().Put(SvxVerJustifyItem(SVX_VER_JUSTIFY_TOP, ATTR_VER_JUSTIFY));
1879 break;
1880 case vjCenter:
1881 aScPattern.GetItemSet().Put(SvxVerJustifyItem(SVX_VER_JUSTIFY_CENTER, ATTR_VER_JUSTIFY));
1882 break;
1883 case vjBottom:
1884 aScPattern.GetItemSet().Put(SvxVerJustifyItem(SVX_VER_JUSTIFY_BOTTOM, ATTR_VER_JUSTIFY));
1885 break;
1886 }
1887
1888 if (OJustify & ojWordBreak)
1889 aScPattern.GetItemSet().Put(SfxBoolItem(sal_True));
1890 if (OJustify & ojBottomTop)
1891 aScPattern.GetItemSet().Put(SfxInt32Item(ATTR_ROTATE_VALUE,9000));
1892 else if (OJustify & ojTopBottom)
1893 aScPattern.GetItemSet().Put(SfxInt32Item(ATTR_ROTATE_VALUE,27000));
1894
1895 sal_Int16 Margin = Max((sal_uInt16)20, (sal_uInt16)(EJustify * 20));
1896 if (((OJustify & ojBottomTop) == ojBottomTop) || ((OJustify & ojBottomTop) == ojBottomTop))
1897 aScPattern.GetItemSet().Put(SvxMarginItem(20, Margin, 20, Margin, ATTR_MARGIN));
1898 else
1899 aScPattern.GetItemSet().Put(SvxMarginItem(Margin, 20, Margin, 20, ATTR_MARGIN));
1900 pDoc->ApplyPatternAreaTab(Col, nStart, Col, nEnd, Tab, aScPattern);
1901 }
1902 nStart = nEnd + 1;
1903 }
1904 // Umrandung
1905 sal_Bool bEnd = sal_False;
1906 sal_uInt16 nColorIndex = 0;
1907 sal_uInt16 nFrameIndex = 0;
1908
1909 // Special Fix...
1910 const sal_uInt32 nHelpMeStart = 100;
1911 sal_uInt32 nHelpMe = nHelpMeStart;
1912 sal_uInt16 nColorIndexOld = nColorIndex;
1913 sal_uInt16 nFrameIndexOld = nColorIndex;
1914
1915 nEnd = 0;
1916 nStart = 0;
1917 while( !bEnd && nHelpMe )
1918 {
1919 pColData = &aFrame.pData[ nFrameIndex ];
1920
1921 sal_uInt16 nValue = pColData->Value;
1922 sal_uInt16 nLeft = 0;
1923 sal_uInt16 nTop = 0;
1924 sal_uInt16 nRight = 0;
1925 sal_uInt16 nBottom = 0;
1926 sal_uInt16 fLeft = ( nValue & 0x000F );
1927 sal_uInt16 fTop = ( nValue & 0x00F0 ) >> 4;
1928 sal_uInt16 fRight = ( nValue & 0x0F00 ) >> 8;
1929 sal_uInt16 fBottom = ( nValue & 0xF000 ) >> 12;
1930
1931 if( fLeft > 1 )
1932 nLeft = 50;
1933 else if( fLeft > 0 )
1934 nLeft = 20;
1935
1936 if( fTop > 1 )
1937 nTop = 50;
1938 else if( fTop > 0 )
1939 nTop = 20;
1940
1941 if( fRight > 1 )
1942 nRight = 50;
1943 else if( fRight > 0 )
1944 nRight = 20;
1945
1946 if( fBottom > 1 )
1947 nBottom = 50;
1948 else if( fBottom > 0 )
1949 nBottom = 20;
1950
1951 Color ColorLeft( COL_BLACK );
1952 Color ColorTop( COL_BLACK );
1953 Color ColorRight( COL_BLACK );
1954 Color ColorBottom( COL_BLACK );
1955 sal_uInt16 nFrmColVal = aFrameColor.pData[ nColorIndex ].Value;
1956 SCROW nFrmColRow = static_cast<SCROW>(aFrameColor.pData[ nColorIndex ].Row);
1957 sal_uInt16 cLeft = ( nFrmColVal & 0x000F );
1958 sal_uInt16 cTop = ( nFrmColVal & 0x00F0 ) >> 4;
1959 sal_uInt16 cRight = ( nFrmColVal & 0x0F00 ) >> 8;
1960 sal_uInt16 cBottom = ( nFrmColVal & 0xF000 ) >> 12;
1961
1962 lcl_ChangeColor( cLeft, ColorLeft );
1963 lcl_ChangeColor( cTop, ColorTop );
1964 lcl_ChangeColor( cRight, ColorRight );
1965 lcl_ChangeColor( cBottom, ColorBottom );
1966
1967 if( static_cast<SCROW>(pColData->Row) < nFrmColRow )
1968 {
1969 nEnd = static_cast<SCROW>(pColData->Row);
1970 if( nFrameIndex < ( aFrame.Count - 1 ) )
1971 nFrameIndex++;
1972 }
1973 else if( static_cast<SCROW>(pColData->Row) > nFrmColRow )
1974 {
1975 nEnd = static_cast<SCROW>(aFrameColor.pData[ nColorIndex ].Row);
1976 if( nColorIndex < ( aFrameColor.Count - 1 ) )
1977 nColorIndex++;
1978 }
1979 else
1980 {
1981 nEnd = nFrmColRow;
1982 if( nFrameIndex < (aFrame.Count - 1 ) )
1983 nFrameIndex++;
1984 if( nColorIndex < ( aFrameColor.Count - 1 ) )
1985 nColorIndex++;
1986 }
1987 if( ( nStart <= nEnd ) && ( nValue != 0 ) )
1988 {
1989 ScPatternAttr aScPattern(pDoc->GetPool());
1990 SvxBorderLine aLine;
1991 SvxBoxItem aBox( ATTR_BORDER );
1992
1993 aLine.SetOutWidth( nLeft );
1994 aLine.SetColor( ColorLeft );
1995 aBox.SetLine( &aLine, BOX_LINE_LEFT );
1996
1997 aLine.SetOutWidth( nTop );
1998 aLine.SetColor( ColorTop );
1999 aBox.SetLine( &aLine, BOX_LINE_TOP );
2000
2001 aLine.SetOutWidth( nRight );
2002 aLine.SetColor( ColorRight );
2003 aBox.SetLine( &aLine, BOX_LINE_RIGHT );
2004
2005 aLine.SetOutWidth( nBottom );
2006 aLine.SetColor( ColorBottom );
2007 aBox.SetLine( &aLine, BOX_LINE_BOTTOM );
2008
2009 aScPattern.GetItemSet().Put( aBox );
2010 pDoc->ApplyPatternAreaTab( Col, nStart, Col, nEnd, Tab, aScPattern );
2011 }
2012 nStart = nEnd + 1;
2013
2014 bEnd = ( nFrameIndex == ( aFrame.Count - 1 ) ) && ( nColorIndex == ( aFrameColor.Count - 1 ) );
2015
2016 if( nColorIndexOld != nColorIndex || nFrameIndexOld != nFrameIndex )
2017 {
2018 nColorIndexOld = nColorIndex;
2019 nFrameIndexOld = nFrameIndex;
2020 nHelpMe = nHelpMeStart;
2021 }
2022 else
2023 nHelpMe--;
2024
2025 pColData++;
2026 }
2027
2028 // ACHTUNG: Code bis hier ueberarbeitet ... jetzt hab' ich keinen Bock mehr! (GT)
2029
2030 // Hintergrund (Farbe, Raster)
2031 sal_uInt16 nRasterIndex = 0;
2032 bEnd = sal_False;
2033 nColorIndex = 0;
2034 nEnd = 0;
2035 nStart = 0;
2036
2037 // Special Fix...
2038 nHelpMe = nHelpMeStart;
2039 sal_uInt16 nRasterIndexOld = nRasterIndex;
2040
2041 while( !bEnd && nHelpMe )
2042 {
2043 sal_uInt16 nBColor = ( aColor.pData[ nColorIndex ].Value & 0x00F0 ) >> 4;
2044 sal_uInt16 nRColor = ( aColor.pData[ nColorIndex ].Value & 0x0F00 ) >> 8;
2045 Color aBColor( COL_BLACK );
2046
2047 lcl_ChangeColor( nBColor, aBColor );
2048
2049 if( nBColor == 0 )
2050 aBColor.SetColor( COL_WHITE );
2051 else if( nBColor == 15 )
2052 aBColor.SetColor( COL_BLACK );
2053
2054 Color aRColor( COL_BLACK );
2055
2056 lcl_ChangeColor( nRColor, aRColor );
2057
2058 ScPatternAttr aScPattern( pDoc->GetPool() );
2059
2060 sal_uInt16 nFact;
2061 sal_Bool bSwapCol = sal_False;
2062 sal_Bool bSetItem = sal_True;
2063 switch ( aRaster.pData[ nRasterIndex ].Value )
2064 {
2065 case raNone: nFact = 0xffff; bSwapCol = sal_True; bSetItem = (nBColor > 0); break;
2066 case raGray12: nFact = (0xffff / 100) * 12; break;
2067 case raGray25: nFact = (0xffff / 100) * 25; break;
2068 case raGray50: nFact = (0xffff / 100) * 50; break;
2069 case raGray75: nFact = (0xffff / 100) * 75; break;
2070 default: nFact = 0xffff; bSetItem = (nRColor < 15);
2071 }
2072 if ( bSetItem )
2073 {
2074 if( bSwapCol )
2075 aScPattern.GetItemSet().Put( SvxBrushItem( GetMixedColor( aBColor, aRColor, nFact ), ATTR_BACKGROUND ) );
2076 else
2077 aScPattern.GetItemSet().Put( SvxBrushItem( GetMixedColor( aRColor, aBColor, nFact ), ATTR_BACKGROUND ) );
2078 }
2079 if( aRaster.pData[ nRasterIndex ].Row < aColor.pData[ nColorIndex ].Row )
2080 {
2081 nEnd = static_cast<SCROW>(aRaster.pData[ nRasterIndex ].Row);
2082 if( nRasterIndex < ( aRaster.Count - 1 ) )
2083 nRasterIndex++;
2084 }
2085 else if( aRaster.pData[ nRasterIndex ].Row > aColor.pData[ nColorIndex ].Row )
2086 {
2087 nEnd = static_cast<SCROW>(aColor.pData[ nColorIndex ].Row);
2088 if( nColorIndex < ( aColor.Count - 1 ) )
2089 nColorIndex++;
2090 }
2091 else
2092 {
2093 nEnd = static_cast<SCROW>(aColor.pData[ nColorIndex ].Row);
2094 if( nRasterIndex < ( aRaster.Count - 1 ) )
2095 nRasterIndex++;
2096 if( nColorIndex < ( aColor.Count - 1 ) )
2097 nColorIndex++;
2098 }
2099 if( nStart <= nEnd )
2100 pDoc->ApplyPatternAreaTab( Col, nStart, Col, nEnd, Tab, aScPattern );
2101
2102 nStart = nEnd + 1;
2103
2104 bEnd = ( nRasterIndex == ( aRaster.Count - 1 ) ) && ( nColorIndex == ( aColor.Count - 1 ) );
2105
2106 if( nColorIndexOld != nColorIndex || nRasterIndexOld != nRasterIndex )
2107 {
2108 nColorIndexOld = nColorIndex;
2109 nRasterIndexOld = nRasterIndex;
2110 nHelpMe = nHelpMeStart;
2111 }
2112 else
2113 nHelpMe--;
2114
2115 nHelpMe--;
2116 }
2117
2118 // Zahlenformate
2119 nStart = 0;
2120 nEnd = 0;
2121 nLimit = aValue.Count;
2122 pColData = aValue.pData;
2123 for (i=0; i<nLimit; i++, pColData++)
2124 {
2125 nEnd = static_cast<SCROW>(pColData->Row);
2126 nValue1 = pColData->Value;
2127 if ((nStart <= nEnd) && (nValue1))
2128 {
2129 sal_uLong nKey = 0;
2130 sal_uInt16 nFormat = (nValue1 & 0x00FF);
2131 sal_uInt16 nInfo = (nValue1 & 0xFF00) >> 8;
2132 ChangeFormat(nFormat, nInfo, nKey);
2133 ScPatternAttr aScPattern(pDoc->GetPool());
2134 aScPattern.GetItemSet().Put(SfxUInt32Item(ATTR_VALUE_FORMAT, (sal_uInt32)nKey));
2135 pDoc->ApplyPatternAreaTab(Col, nStart, Col, nEnd, Tab, aScPattern);
2136 }
2137 nStart = nEnd + 1;
2138 }
2139
2140 // Zellattribute (Schutz, Versteckt...)
2141 nStart = 0;
2142 nEnd = 0;
2143 for (i=0; i<aFlag.Count; i++)
2144 {
2145 nEnd = static_cast<SCROW>(aFlag.pData[i].Row);
2146 if ((nStart <= nEnd) && (aFlag.pData[i].Value != 0))
2147 {
2148 sal_Bool bProtect = ((aFlag.pData[i].Value & paProtect) == paProtect);
2149 sal_Bool bHFormula = ((aFlag.pData[i].Value & paHideFormula) == paHideFormula);
2150 sal_Bool bHCell = ((aFlag.pData[i].Value & paHideAll) == paHideAll);
2151 sal_Bool bHPrint = ((aFlag.pData[i].Value & paHidePrint) == paHidePrint);
2152 ScPatternAttr aScPattern(pDoc->GetPool());
2153 aScPattern.GetItemSet().Put(ScProtectionAttr(bProtect, bHFormula, bHCell, bHPrint));
2154 pDoc->ApplyPatternAreaTab(Col, nStart, Col, nEnd, Tab, aScPattern);
2155 }
2156 nStart = nEnd + 1;
2157 }
2158
2159 // ZellVorlagen
2160 nStart = 0;
2161 nEnd = 0;
2162 ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
2163 for (i=0; i<aPattern.Count; i++)
2164 {
2165 nEnd = static_cast<SCROW>(aPattern.pData[i].Row);
2166 if ((nStart <= nEnd) && (aPattern.pData[i].Value != 0))
2167 {
2168 sal_uInt16 nPatternIndex = (aPattern.pData[i].Value & 0x00FF) - 1;
2169 Sc10PatternData* pPattern = pPatternCollection->At(nPatternIndex);
2170 if (pPattern != NULL)
2171 {
2172 ScStyleSheet* pStyle = (ScStyleSheet*) pStylePool->Find(
2173 SC10TOSTRING( pPattern->Name ), SFX_STYLE_FAMILY_PARA);
2174
2175 if (pStyle != NULL)
2176 pDoc->ApplyStyleAreaTab(Col, nStart, Col, nEnd, Tab, *pStyle);
2177 }
2178 }
2179 nStart = nEnd + 1;
2180 }
2181 }
2182 }
2183
2184
LoadAttr(Sc10ColAttr & rAttr)2185 void Sc10Import::LoadAttr(Sc10ColAttr& rAttr)
2186 {
2187 // rAttr is not reused, otherwise we'd have to delete [] rAttr.pData;
2188 rStream >> rAttr.Count;
2189 if (rAttr.Count)
2190 {
2191 rAttr.pData = new (::std::nothrow) Sc10ColData[rAttr.Count];
2192 if (rAttr.pData != NULL)
2193 {
2194 for (sal_uInt16 i = 0; i < rAttr.Count; i++)
2195 {
2196 rStream >> rAttr.pData[i].Row;
2197 rStream >> rAttr.pData[i].Value;
2198 }
2199 nError = rStream.GetError();
2200 }
2201 else
2202 {
2203 nError = errOutOfMemory;
2204 rAttr.Count = 0;
2205 }
2206 }
2207 }
2208
2209
ChangeFormat(sal_uInt16 nFormat,sal_uInt16 nInfo,sal_uLong & nKey)2210 void Sc10Import::ChangeFormat(sal_uInt16 nFormat, sal_uInt16 nInfo, sal_uLong& nKey)
2211 {
2212 // Achtung: Die Formate werden nur auf die StarCalc 3.0 internen Formate gemappt
2213 // Korrekterweise muessten zum Teil neue Formate erzeugt werden (sollte Stephan sich ansehen)
2214 nKey = 0;
2215 switch (nFormat)
2216 {
2217 case vfStandard :
2218 if (nInfo > 0)
2219 nKey = 2;
2220 break;
2221 case vfMoney :
2222 if (nInfo > 0)
2223 nKey = 21;
2224 else
2225 nKey = 20;
2226 break;
2227 case vfThousend :
2228 if (nInfo > 0)
2229 nKey = 4;
2230 else
2231 nKey = 5;
2232 break;
2233 case vfPercent :
2234 if (nInfo > 0)
2235 nKey = 11;
2236 else
2237 nKey = 10;
2238 break;
2239 case vfExponent :
2240 nKey = 60;
2241 break;
2242 case vfZerro :
2243 // Achtung kein Aequivalent
2244 break;
2245 case vfDate :
2246 switch (nInfo)
2247 {
2248 case df_NDMY_Long :
2249 nKey = 31;
2250 break;
2251 case df_DMY_Long :
2252 nKey = 30;
2253 break;
2254 case df_MY_Long :
2255 nKey = 32;
2256 break;
2257 case df_NDM_Long :
2258 nKey = 31;
2259 break;
2260 case df_DM_Long :
2261 nKey = 33;
2262 break;
2263 case df_M_Long :
2264 nKey = 34;
2265 break;
2266 case df_NDMY_Short :
2267 nKey = 31;
2268 break;
2269 case df_DMY_Short :
2270 nKey = 30;
2271 break;
2272 case df_MY_Short :
2273 nKey = 32;
2274 break;
2275 case df_NDM_Short :
2276 nKey = 31;
2277 break;
2278 case df_DM_Short :
2279 nKey = 33;
2280 break;
2281 case df_M_Short :
2282 nKey = 34;
2283 break;
2284 case df_Q_Long :
2285 nKey = 35;
2286 break;
2287 case df_Q_Short :
2288 nKey = 35;
2289 break;
2290 default :
2291 nKey = 30;
2292 break;
2293 }
2294 break;
2295 case vfTime :
2296 switch (nInfo)
2297 {
2298 case tf_HMS_Long :
2299 nKey = 41;
2300 break;
2301 case tf_HM_Long :
2302 nKey = 40;
2303 break;
2304 case tf_HMS_Short :
2305 nKey = 43;
2306 break;
2307 case tf_HM_Short :
2308 nKey = 42;
2309 break;
2310 default :
2311 nKey = 41;
2312 break;
2313 }
2314 break;
2315 case vfBoolean :
2316 nKey = 99;
2317 break;
2318 case vfStandardRed :
2319 if (nInfo > 0)
2320 nKey = 2;
2321 break;
2322 case vfMoneyRed :
2323 if (nInfo > 0)
2324 nKey = 23;
2325 else
2326 nKey = 22;
2327 break;
2328 case vfThousendRed :
2329 if (nInfo > 0)
2330 nKey = 4;
2331 else
2332 nKey = 5;
2333 break;
2334 case vfPercentRed :
2335 if (nInfo > 0)
2336 nKey = 11;
2337 else
2338 nKey = 10;
2339 break;
2340 case vfExponentRed :
2341 nKey = 60;
2342 break;
2343 case vfFormula :
2344 break;
2345 case vfString :
2346 break;
2347 default :
2348 break;
2349 }
2350 }
2351
2352
LoadObjects()2353 void Sc10Import::LoadObjects()
2354 {
2355 sal_uInt16 ID;
2356 rStream >> ID;
2357 if (rStream.IsEof()) return;
2358 if (ID == ObjectID)
2359 {
2360 #ifdef SC10_SHOW_OBJECTS
2361 // Achtung nur zu Debugzwecken
2362 //-----------------------------------
2363 pDoc->InsertTab(SC_TAB_APPEND, "GraphObjects");
2364 SCCOL nCol = 0;
2365 SCROW nRow = 0;
2366 SCTAB nTab = 0;
2367 pDoc->GetTable("GraphObjects", nTab);
2368 pDoc->SetString(nCol++, nRow, nTab, "ObjectTyp");
2369 pDoc->SetString(nCol++, nRow, nTab, "Col");
2370 pDoc->SetString(nCol++, nRow, nTab, "Row");
2371 pDoc->SetString(nCol++, nRow, nTab, "Tab");
2372 pDoc->SetString(nCol++, nRow, nTab, "X");
2373 pDoc->SetString(nCol++, nRow, nTab, "Y");
2374 pDoc->SetString(nCol++, nRow, nTab, "W");
2375 pDoc->SetString(nCol++, nRow, nTab, "H");
2376 //-----------------------------------
2377 #endif
2378
2379 sal_uInt16 nAnz;
2380 rStream >> nAnz;
2381 sal_Char Reserved[32];
2382 rStream.Read(Reserved, sizeof(Reserved));
2383 nError = rStream.GetError();
2384 if ((nAnz > 0) && (nError == 0))
2385 {
2386 sal_uInt8 ObjectType;
2387 Sc10GraphHeader GraphHeader;
2388 sal_Bool IsOleObject = sal_False; // Achtung dies ist nur ein Notnagel
2389 for (sal_uInt16 i = 0; (i < nAnz) && (nError == 0) && !rStream.IsEof() && !IsOleObject; i++)
2390 {
2391 rStream >> ObjectType;
2392 lcl_ReadGraphHeader(rStream, GraphHeader);
2393
2394 double nPPTX = ScGlobal::nScreenPPTX;
2395 double nPPTY = ScGlobal::nScreenPPTY;
2396
2397 long nStartX = 0;
2398 for (SCsCOL nX=0; nX<GraphHeader.CarretX; nX++)
2399 nStartX += pDoc->GetColWidth(nX, static_cast<SCTAB>(GraphHeader.CarretZ));
2400 nStartX = (long) ( nStartX * HMM_PER_TWIPS );
2401 nStartX += (long) ( GraphHeader.x / nPPTX * HMM_PER_TWIPS );
2402 long nSizeX = (long) ( GraphHeader.w / nPPTX * HMM_PER_TWIPS );
2403 long nStartY = pDoc->GetRowHeight( 0,
2404 static_cast<SCsROW>(GraphHeader.CarretY) - 1,
2405 static_cast<SCTAB>(GraphHeader.CarretZ));
2406 nStartY = (long) ( nStartY * HMM_PER_TWIPS );
2407 nStartY += (long) ( GraphHeader.y / nPPTY * HMM_PER_TWIPS );
2408 long nSizeY = (long) ( GraphHeader.h / nPPTY * HMM_PER_TWIPS );
2409
2410 #ifdef SC10_SHOW_OBJECTS
2411 // Achtung nur zu Debugzwecken
2412 //-----------------------------------
2413 nCol = 0;
2414 nRow++;
2415 switch (ObjectType)
2416 {
2417 case otOle :
2418 pDoc->SetString(nCol++, nRow, nTab, "Ole-Object");
2419 break;
2420 case otImage :
2421 pDoc->SetString(nCol++, nRow, nTab, "Image-Object");
2422 break;
2423 case otChart :
2424 pDoc->SetString(nCol++, nRow, nTab, "Chart-Object");
2425 break;
2426 default :
2427 pDoc->SetString(nCol++, nRow, nTab, "ERROR");
2428 break;
2429 }
2430 pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.CarretX);
2431 pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.CarretY);
2432 pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.CarretZ);
2433 pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.x);
2434 pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.y);
2435 pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.w);
2436 pDoc->SetValue(nCol++, nRow, nTab, GraphHeader.h);
2437 //-----------------------------------
2438 #endif
2439
2440 switch (ObjectType)
2441 {
2442 case otOle :
2443 // Achtung hier muss sowas wie OleLoadFromStream passieren
2444 IsOleObject = sal_True;
2445 break;
2446 case otImage :
2447 {
2448 Sc10ImageHeader ImageHeader;
2449 lcl_ReadImageHeaer(rStream, ImageHeader);
2450
2451 // Achtung nun kommen die Daten (Bitmap oder Metafile)
2452 // Typ = 1 Device Dependend Bitmap DIB
2453 // Typ = 2 MetaFile
2454 rStream.SeekRel(ImageHeader.Size);
2455
2456 if( ImageHeader.Typ != 1 && ImageHeader.Typ != 2 )
2457 nError = errUnknownFormat;
2458 break;
2459 }
2460 case otChart :
2461 {
2462 Sc10ChartHeader ChartHeader;
2463 Sc10ChartSheetData ChartSheetData;
2464 Sc10ChartTypeData* pTypeData = new (::std::nothrow) Sc10ChartTypeData;
2465 if (!pTypeData)
2466 nError = errOutOfMemory;
2467 else
2468 {
2469 lcl_ReadChartHeader(rStream, ChartHeader);
2470
2471 //! altes Metafile verwenden ??
2472 rStream.SeekRel(ChartHeader.Size);
2473
2474 lcl_ReadChartSheetData(rStream, ChartSheetData);
2475
2476 lcl_ReadChartTypeData(rStream, *pTypeData);
2477
2478 Rectangle aRect( Point(nStartX,nStartY), Size(nSizeX,nSizeY) );
2479 Sc10InsertObject::InsertChart( pDoc, static_cast<SCTAB>(GraphHeader.CarretZ), aRect,
2480 static_cast<SCTAB>(GraphHeader.CarretZ),
2481 ChartSheetData.DataX1, ChartSheetData.DataY1,
2482 ChartSheetData.DataX2, ChartSheetData.DataY2 );
2483
2484 delete pTypeData;
2485 }
2486 }
2487 break;
2488 default :
2489 nError = errUnknownFormat;
2490 break;
2491 }
2492 nError = rStream.GetError();
2493 }
2494 }
2495 }
2496 else
2497 {
2498 DBG_ERROR( "ObjectID" );
2499 nError = errUnknownID;
2500 }
2501 }
2502
2503
2504
2505
2506 //-----------------------------------------------------------------------------------------------
2507
ScImportStarCalc10(SvStream & rStream,ScDocument * pDocument)2508 FltError ScFormatFilterPluginImpl::ScImportStarCalc10( SvStream& rStream, ScDocument* pDocument )
2509 {
2510 rStream.Seek( 0UL );
2511 Sc10Import aImport( rStream, pDocument );
2512 return ( FltError ) aImport.Import();
2513 }
2514
2515
2516
2517