bump product version to 4.1.6.2
[LibreOffice.git] / sc / source / filter / excel / xeview.cxx
blob37d409097c096b1d167d010bc14843b579958e93
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "xeview.hxx"
21 #include "document.hxx"
22 #include "scextopt.hxx"
23 #include "viewopti.hxx"
24 #include "xelink.hxx"
25 #include "xestyle.hxx"
27 using namespace ::oox;
30 // Workbook view settings records =============================================
32 XclExpWindow1::XclExpWindow1( const XclExpRoot& rRoot ) :
33 XclExpRecord( EXC_ID_WINDOW1, 18 ),
34 mnFlags( 0 ),
35 mnTabBarSize( 600 )
37 const ScViewOptions& rViewOpt = rRoot.GetDoc().GetViewOptions();
38 ::set_flag( mnFlags, EXC_WIN1_HOR_SCROLLBAR, rViewOpt.GetOption( VOPT_HSCROLL ) );
39 ::set_flag( mnFlags, EXC_WIN1_VER_SCROLLBAR, rViewOpt.GetOption( VOPT_VSCROLL ) );
40 ::set_flag( mnFlags, EXC_WIN1_TABBAR, rViewOpt.GetOption( VOPT_TABCONTROLS ) );
42 double fTabBarWidth = rRoot.GetExtDocOptions().GetDocSettings().mfTabBarWidth;
43 if( (0.0 <= fTabBarWidth) && (fTabBarWidth <= 1.0) )
44 mnTabBarSize = static_cast< sal_uInt16 >( fTabBarWidth * 1000.0 + 0.5 );
47 void XclExpWindow1::SaveXml( XclExpXmlStream& rStrm )
49 const XclExpTabInfo& rTabInfo = rStrm.GetRoot().GetTabInfo();
51 rStrm.GetCurrentStream()->singleElement( XML_workbookView,
52 // OOXTODO: XML_visibility, // ST_visibilty
53 // OOXTODO: XML_minimized, // bool
54 XML_showHorizontalScroll, XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_WIN1_HOR_SCROLLBAR ) ),
55 XML_showVerticalScroll, XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_WIN1_VER_SCROLLBAR ) ),
56 XML_showSheetTabs, XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_WIN1_TABBAR ) ),
57 XML_xWindow, "0",
58 XML_yWindow, "0",
59 XML_windowWidth, OString::valueOf( (sal_Int32)0x4000 ).getStr(),
60 XML_windowHeight, OString::valueOf( (sal_Int32)0x2000 ).getStr(),
61 XML_tabRatio, OString::valueOf( (sal_Int32)mnTabBarSize ).getStr(),
62 XML_firstSheet, OString::valueOf( (sal_Int32)rTabInfo.GetFirstVisXclTab() ).getStr(),
63 XML_activeTab, OString::valueOf( (sal_Int32)rTabInfo.GetDisplayedXclTab() ).getStr(),
64 // OOXTODO: XML_autoFilterDateGrouping, // bool; AUTOFILTER12? 87Eh
65 FSEND );
68 void XclExpWindow1::WriteBody( XclExpStream& rStrm )
70 const XclExpTabInfo& rTabInfo = rStrm.GetRoot().GetTabInfo();
72 rStrm << sal_uInt16( 0 ) // X position of the window
73 << sal_uInt16( 0 ) // Y position of the window
74 << sal_uInt16( 0x4000 ) // width of the window
75 << sal_uInt16( 0x2000 ) // height of the window
76 << mnFlags
77 << rTabInfo.GetDisplayedXclTab()
78 << rTabInfo.GetFirstVisXclTab()
79 << rTabInfo.GetXclSelectedCount()
80 << mnTabBarSize;
83 // Sheet view settings records ================================================
85 XclExpWindow2::XclExpWindow2( const XclExpRoot& rRoot,
86 const XclTabViewData& rData, sal_uInt32 nGridColorId ) :
87 XclExpRecord( EXC_ID_WINDOW2, (rRoot.GetBiff() == EXC_BIFF8) ? 18 : 10 ),
88 maGridColor( rData.maGridColor ),
89 mnGridColorId( nGridColorId ),
90 mnFlags( 0 ),
91 maFirstXclPos( rData.maFirstXclPos ),
92 mnNormalZoom( rData.mnNormalZoom ),
93 mnPageZoom( rData.mnPageZoom )
95 ::set_flag( mnFlags, EXC_WIN2_SHOWFORMULAS, rData.mbShowFormulas );
96 ::set_flag( mnFlags, EXC_WIN2_SHOWGRID, rData.mbShowGrid );
97 ::set_flag( mnFlags, EXC_WIN2_SHOWHEADINGS, rData.mbShowHeadings );
98 ::set_flag( mnFlags, EXC_WIN2_FROZEN, rData.mbFrozenPanes );
99 ::set_flag( mnFlags, EXC_WIN2_SHOWZEROS, rData.mbShowZeros );
100 ::set_flag( mnFlags, EXC_WIN2_DEFGRIDCOLOR, rData.mbDefGridColor );
101 ::set_flag( mnFlags, EXC_WIN2_MIRRORED, rData.mbMirrored );
102 ::set_flag( mnFlags, EXC_WIN2_SHOWOUTLINE, rData.mbShowOutline );
103 ::set_flag( mnFlags, EXC_WIN2_FROZENNOSPLIT, rData.mbFrozenPanes );
104 ::set_flag( mnFlags, EXC_WIN2_SELECTED, rData.mbSelected );
105 ::set_flag( mnFlags, EXC_WIN2_DISPLAYED, rData.mbDisplayed );
106 ::set_flag( mnFlags, EXC_WIN2_PAGEBREAKMODE, rData.mbPageMode );
109 void XclExpWindow2::WriteBody( XclExpStream& rStrm )
111 const XclExpRoot& rRoot = rStrm.GetRoot();
113 rStrm << mnFlags
114 << maFirstXclPos;
116 switch( rRoot.GetBiff() )
118 case EXC_BIFF3:
119 case EXC_BIFF4:
120 case EXC_BIFF5:
121 rStrm << maGridColor;
122 break;
123 case EXC_BIFF8:
124 rStrm << rRoot.GetPalette().GetColorIndex( mnGridColorId )
125 << sal_uInt16( 0 )
126 << mnPageZoom
127 << mnNormalZoom
128 << sal_uInt32( 0 );
129 break;
130 default: DBG_ERROR_BIFF();
134 // ----------------------------------------------------------------------------
136 XclExpScl::XclExpScl( sal_uInt16 nZoom ) :
137 XclExpRecord( EXC_ID_SCL, 4 ),
138 mnNum( nZoom ),
139 mnDenom( 100 )
141 Shorten( 2 );
142 Shorten( 5 );
145 void XclExpScl::Shorten( sal_uInt16 nFactor )
147 while( (mnNum % nFactor == 0) && (mnDenom % nFactor == 0) )
149 mnNum = mnNum / nFactor;
150 mnDenom = mnDenom / nFactor;
154 void XclExpScl::WriteBody( XclExpStream& rStrm )
156 OSL_ENSURE_BIFF( rStrm.GetRoot().GetBiff() >= EXC_BIFF4 );
157 rStrm << mnNum << mnDenom;
160 // ----------------------------------------------------------------------------
162 XclExpPane::XclExpPane( const XclTabViewData& rData ) :
163 XclExpRecord( EXC_ID_PANE, 10 ),
164 mnSplitX( rData.mnSplitX ),
165 mnSplitY( rData.mnSplitY ),
166 maSecondXclPos( rData.maSecondXclPos ),
167 mnActivePane( rData.mnActivePane ),
168 mbFrozenPanes( rData.mbFrozenPanes )
170 OSL_ENSURE( rData.IsSplit(), "XclExpPane::XclExpPane - no PANE record for unsplit view" );
173 static const char* lcl_GetActivePane( sal_uInt8 nActivePane )
175 switch( nActivePane )
177 case EXC_PANE_TOPLEFT: return "topLeft"; //break;
178 case EXC_PANE_TOPRIGHT: return "topRight"; //break;
179 case EXC_PANE_BOTTOMLEFT: return "bottomLeft"; //break;
180 case EXC_PANE_BOTTOMRIGHT: return "bottomRight"; //break;
182 return "**error: lcl_GetActivePane";
185 void XclExpPane::SaveXml( XclExpXmlStream& rStrm )
187 rStrm.GetCurrentStream()->singleElement( XML_pane,
188 XML_xSplit, OString::valueOf( (sal_Int32)mnSplitX ).getStr(),
189 XML_ySplit, OString::valueOf( (sal_Int32)mnSplitY ).getStr(),
190 XML_topLeftCell, XclXmlUtils::ToOString( maSecondXclPos ).getStr(),
191 XML_activePane, lcl_GetActivePane( mnActivePane ),
192 XML_state, mbFrozenPanes ? "frozen" : "split",
193 FSEND );
196 void XclExpPane::WriteBody( XclExpStream& rStrm )
198 rStrm << mnSplitX
199 << static_cast<sal_uInt16>( mnSplitY )
200 << maSecondXclPos
201 << mnActivePane;
202 if( rStrm.GetRoot().GetBiff() >= EXC_BIFF5 )
203 rStrm << sal_uInt8( 0 );
206 // ----------------------------------------------------------------------------
208 XclExpSelection::XclExpSelection( const XclTabViewData& rData, sal_uInt8 nPane ) :
209 XclExpRecord( EXC_ID_SELECTION, 15 ),
210 mnPane( nPane )
212 if( const XclSelectionData* pSelData = rData.GetSelectionData( nPane ) )
213 maSelData = *pSelData;
215 // find the cursor position in the selection list (or add it)
216 XclRangeList& rXclSel = maSelData.maXclSelection;
217 bool bFound = false;
218 for( XclRangeList::const_iterator aIt = rXclSel.begin(), aEnd = rXclSel.end(); !bFound && (aIt != aEnd); ++aIt )
219 if( (bFound = aIt->Contains( maSelData.maXclCursor )) == true )
220 maSelData.mnCursorIdx = static_cast< sal_uInt16 >( aIt - rXclSel.begin() );
221 /* Cursor cell not found in list? (e.g. inactive pane, or removed in
222 ConvertRangeList(), because Calc cursor on invalid pos)
223 -> insert the valid Excel cursor. */
224 if( !bFound )
226 maSelData.mnCursorIdx = static_cast< sal_uInt16 >( rXclSel.size() );
227 rXclSel.push_back( XclRange( maSelData.maXclCursor ) );
231 void XclExpSelection::SaveXml( XclExpXmlStream& rStrm )
233 rStrm.GetCurrentStream()->singleElement( XML_selection,
234 XML_pane, lcl_GetActivePane( mnPane ),
235 XML_activeCell, XclXmlUtils::ToOString( maSelData.maXclCursor ).getStr(),
236 XML_activeCellId, OString::valueOf( (sal_Int32) maSelData.mnCursorIdx ).getStr(),
237 XML_sqref, XclXmlUtils::ToOString( maSelData.maXclSelection ).getStr(),
238 FSEND );
241 void XclExpSelection::WriteBody( XclExpStream& rStrm )
243 rStrm << mnPane // pane for this selection
244 << maSelData.maXclCursor // cell cursor
245 << maSelData.mnCursorIdx; // index to range containing cursor
246 maSelData.maXclSelection.Write( rStrm, false );
249 // ----------------------------------------------------------------------------
251 XclExpTabBgColor::XclExpTabBgColor( const XclTabViewData& rTabViewData ) :
252 XclExpRecord( EXC_ID_SHEETEXT, 18 ),
253 mrTabViewData( rTabViewData )
256 //TODO Fix savexml...
257 /*void XclExpTabBgColor::SaveXml( XclExpXmlStream& rStrm )
261 void XclExpTabBgColor::WriteBody( XclExpStream& rStrm )
263 if ( mrTabViewData.IsDefaultTabBgColor() )
264 return;
265 sal_uInt16 rt = 0x0862; //rt
266 sal_uInt16 grbitFrt = 0x0000; //grbit must be set to 0
267 sal_uInt32 unused = 0x00000000; //Use twice...
268 sal_uInt32 cb = 0x00000014; // Record Size, may be larger in future...
269 sal_uInt16 reserved = 0x0000; //trailing bits are 0
270 sal_uInt16 TabBgColorIndex;
271 XclExpPalette& rPal = rStrm.GetRoot().GetPalette();
272 TabBgColorIndex = rPal.GetColorIndex(mrTabViewData.mnTabBgColorId);
273 if (TabBgColorIndex < 8 || TabBgColorIndex > 63 ) // only numbers 8 - 63 are valid numbers
274 TabBgColorIndex = 127; //Excel specs: 127 makes excel ignore tab color information.
275 rStrm << rt << grbitFrt << unused << unused << cb << TabBgColorIndex << reserved;
278 // Sheet view settings ========================================================
280 namespace {
282 /** Converts a Calc zoom factor into an Excel zoom factor. Returns 0 for a default zoom value. */
283 sal_uInt16 lclGetXclZoom( long nScZoom, sal_uInt16 nDefXclZoom )
285 sal_uInt16 nXclZoom = limit_cast< sal_uInt16 >( nScZoom, EXC_ZOOM_MIN, EXC_ZOOM_MAX );
286 return (nXclZoom == nDefXclZoom) ? 0 : nXclZoom;
289 } // namespace
291 // ----------------------------------------------------------------------------
293 XclExpTabViewSettings::XclExpTabViewSettings( const XclExpRoot& rRoot, SCTAB nScTab ) :
294 XclExpRoot( rRoot ),
295 mnGridColorId( XclExpPalette::GetColorIdFromIndex( EXC_COLOR_WINDOWTEXT ) )
297 // *** sheet flags ***
299 const XclExpTabInfo& rTabInfo = GetTabInfo();
300 maData.mbSelected = rTabInfo.IsSelectedTab( nScTab );
301 maData.mbDisplayed = rTabInfo.IsDisplayedTab( nScTab );
302 maData.mbMirrored = rTabInfo.IsMirroredTab( nScTab );
304 const ScViewOptions& rViewOpt = GetDoc().GetViewOptions();
305 maData.mbShowFormulas = rViewOpt.GetOption( VOPT_FORMULAS );
306 maData.mbShowHeadings = rViewOpt.GetOption( VOPT_HEADER );
307 maData.mbShowZeros = rViewOpt.GetOption( VOPT_NULLVALS );
308 maData.mbShowOutline = rViewOpt.GetOption( VOPT_OUTLINER );
310 // *** sheet options: cursor, selection, splits, grid color, zoom ***
312 if( const ScExtTabSettings* pTabSett = GetExtDocOptions().GetTabSettings( nScTab ) )
314 const ScExtTabSettings& rTabSett = *pTabSett;
315 XclExpAddressConverter& rAddrConv = GetAddressConverter();
317 // first visible cell in top-left pane
318 if( (rTabSett.maFirstVis.Col() >= 0) && (rTabSett.maFirstVis.Row() >= 0) )
319 maData.maFirstXclPos = rAddrConv.CreateValidAddress( rTabSett.maFirstVis, false );
321 // first visible cell in additional pane(s)
322 if( (rTabSett.maSecondVis.Col() >= 0) && (rTabSett.maSecondVis.Row() >= 0) )
323 maData.maSecondXclPos = rAddrConv.CreateValidAddress( rTabSett.maSecondVis, false );
325 // active pane
326 switch( rTabSett.meActivePane )
328 case SCEXT_PANE_TOPLEFT: maData.mnActivePane = EXC_PANE_TOPLEFT; break;
329 case SCEXT_PANE_TOPRIGHT: maData.mnActivePane = EXC_PANE_TOPRIGHT; break;
330 case SCEXT_PANE_BOTTOMLEFT: maData.mnActivePane = EXC_PANE_BOTTOMLEFT; break;
331 case SCEXT_PANE_BOTTOMRIGHT: maData.mnActivePane = EXC_PANE_BOTTOMRIGHT; break;
334 // freeze/split position
335 maData.mbFrozenPanes = rTabSett.mbFrozenPanes;
336 if( maData.mbFrozenPanes )
338 /* Frozen panes: handle split position as row/column positions.
339 #i35812# Excel uses number of visible rows/columns, Calc uses position of freeze. */
340 SCCOL nFreezeScCol = rTabSett.maFreezePos.Col();
341 if( (0 < nFreezeScCol) && (nFreezeScCol <= GetXclMaxPos().Col()) )
342 maData.mnSplitX = static_cast< sal_uInt16 >( nFreezeScCol ) - maData.maFirstXclPos.mnCol;
343 SCROW nFreezeScRow = rTabSett.maFreezePos.Row();
344 if( (0 < nFreezeScRow) && (nFreezeScRow <= GetXclMaxPos().Row()) )
345 maData.mnSplitY = static_cast< sal_uInt32 >( nFreezeScRow ) - maData.maFirstXclPos.mnRow;
346 // if both splits are left out (address overflow), remove the frozen flag
347 maData.mbFrozenPanes = maData.IsSplit();
349 // #i20671# frozen panes: mostright/mostbottom pane is active regardless of cursor position
350 if( maData.HasPane( EXC_PANE_BOTTOMRIGHT ) )
351 maData.mnActivePane = EXC_PANE_BOTTOMRIGHT;
352 else if( maData.HasPane( EXC_PANE_TOPRIGHT ) )
353 maData.mnActivePane = EXC_PANE_TOPRIGHT;
354 else if( maData.HasPane( EXC_PANE_BOTTOMLEFT ) )
355 maData.mnActivePane = EXC_PANE_BOTTOMLEFT;
357 else
359 // split window: position is in twips
360 maData.mnSplitX = static_cast<sal_uInt16>(rTabSett.maSplitPos.X());
361 maData.mnSplitY = static_cast<sal_uInt32>(rTabSett.maSplitPos.Y());
364 // selection
365 CreateSelectionData( EXC_PANE_TOPLEFT, rTabSett.maCursor, rTabSett.maSelection );
366 CreateSelectionData( EXC_PANE_TOPRIGHT, rTabSett.maCursor, rTabSett.maSelection );
367 CreateSelectionData( EXC_PANE_BOTTOMLEFT, rTabSett.maCursor, rTabSett.maSelection );
368 CreateSelectionData( EXC_PANE_BOTTOMRIGHT, rTabSett.maCursor, rTabSett.maSelection );
370 // grid color
371 const Color& rGridColor = rTabSett.maGridColor;
372 maData.mbDefGridColor = rGridColor.GetColor() == COL_AUTO;
373 if( !maData.mbDefGridColor )
375 if( GetBiff() == EXC_BIFF8 )
376 mnGridColorId = GetPalette().InsertColor( rGridColor, EXC_COLOR_GRID );
377 else
378 maData.maGridColor = rGridColor;
380 maData.mbShowGrid = rTabSett.mbShowGrid;
382 // view mode and zoom
383 maData.mbPageMode = (GetBiff() == EXC_BIFF8) && rTabSett.mbPageMode;
384 maData.mnNormalZoom = lclGetXclZoom( rTabSett.mnNormalZoom, EXC_WIN2_NORMALZOOM_DEF );
385 maData.mnPageZoom = lclGetXclZoom( rTabSett.mnPageZoom, EXC_WIN2_PAGEZOOM_DEF );
386 maData.mnCurrentZoom = maData.mbPageMode ? maData.mnPageZoom : maData.mnNormalZoom;
389 // Tab Bg Color
390 if ( GetBiff() == EXC_BIFF8 && !GetDoc().IsDefaultTabBgColor(nScTab) )
392 XclExpPalette& rPal = GetPalette();
393 maData.maTabBgColor = GetDoc().GetTabBgColor(nScTab);
394 maData.mnTabBgColorId = rPal.InsertColor(maData.maTabBgColor, EXC_COLOR_TABBG, EXC_COLOR_NOTABBG );
398 void XclExpTabViewSettings::Save( XclExpStream& rStrm )
400 WriteWindow2( rStrm );
401 WriteScl( rStrm );
402 WritePane( rStrm );
403 WriteSelection( rStrm, EXC_PANE_TOPLEFT );
404 WriteSelection( rStrm, EXC_PANE_TOPRIGHT );
405 WriteSelection( rStrm, EXC_PANE_BOTTOMLEFT );
406 WriteSelection( rStrm, EXC_PANE_BOTTOMRIGHT );
407 WriteTabBgColor( rStrm );
410 static void lcl_WriteSelection( XclExpXmlStream& rStrm, const XclTabViewData& rData, sal_uInt8 nPane )
412 if( rData.HasPane( nPane ) )
413 XclExpSelection( rData, nPane ).SaveXml( rStrm );
416 static OString lcl_GetZoom( sal_uInt16 nZoom )
418 if( nZoom )
419 return OString::valueOf( (sal_Int32)nZoom );
420 return OString( "100" );
423 void XclExpTabViewSettings::SaveXml( XclExpXmlStream& rStrm )
425 sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
426 rWorksheet->startElement( XML_sheetViews, FSEND );
427 rWorksheet->startElement( XML_sheetView,
428 XML_windowProtection, XclXmlUtils::ToPsz( maData.mbFrozenPanes ),
429 XML_showFormulas, XclXmlUtils::ToPsz( maData.mbShowFormulas ),
430 XML_showGridLines, XclXmlUtils::ToPsz( maData.mbShowGrid ),
431 XML_showRowColHeaders, XclXmlUtils::ToPsz( maData.mbShowHeadings ),
432 XML_showZeros, XclXmlUtils::ToPsz( maData.mbShowZeros ),
433 XML_rightToLeft, XclXmlUtils::ToPsz( maData.mbMirrored ),
434 XML_tabSelected, XclXmlUtils::ToPsz( maData.mbSelected ),
435 // OOXTODO: XML_showRuler,
436 XML_showOutlineSymbols, XclXmlUtils::ToPsz( maData.mbShowOutline ),
437 XML_defaultGridColor, mnGridColorId == XclExpPalette::GetColorIdFromIndex( EXC_COLOR_WINDOWTEXT ) ? "true" : "false",
438 // OOXTODO: XML_showWhiteSpace,
439 XML_view, maData.mbPageMode ? "pageBreakPreview" : "normal", // OOXTODO: pageLayout
440 XML_topLeftCell, XclXmlUtils::ToOString( maData.maFirstXclPos ).getStr(),
441 XML_colorId, OString::valueOf( (sal_Int32) rStrm.GetRoot().GetPalette().GetColorIndex( mnGridColorId ) ).getStr(),
442 XML_zoomScale, lcl_GetZoom( maData.mnCurrentZoom ).getStr(),
443 XML_zoomScaleNormal, lcl_GetZoom( maData.mnNormalZoom ).getStr(),
444 // OOXTODO: XML_zoomScaleSheetLayoutView,
445 XML_zoomScalePageLayoutView, lcl_GetZoom( maData.mnPageZoom ).getStr(),
446 XML_workbookViewId, "0", // OOXTODO? 0-based index of document(xl/workbook.xml)/workbook/bookviews/workbookView
447 // should always be 0, as we only generate 1 such element.
448 FSEND );
449 if( maData.IsSplit() )
451 XclExpPane aPane( maData );
452 aPane.SaveXml( rStrm );
454 lcl_WriteSelection( rStrm, maData, EXC_PANE_TOPLEFT );
455 lcl_WriteSelection( rStrm, maData, EXC_PANE_TOPRIGHT );
456 lcl_WriteSelection( rStrm, maData, EXC_PANE_BOTTOMLEFT );
457 lcl_WriteSelection( rStrm, maData, EXC_PANE_BOTTOMRIGHT );
458 rWorksheet->endElement( XML_sheetView );
459 // OOXTODO: XML_extLst
460 rWorksheet->endElement( XML_sheetViews );
463 // private --------------------------------------------------------------------
465 void XclExpTabViewSettings::CreateSelectionData( sal_uInt8 nPane,
466 const ScAddress& rCursor, const ScRangeList& rSelection )
468 if( maData.HasPane( nPane ) )
470 XclSelectionData& rSelData = maData.CreateSelectionData( nPane );
472 // first step: use top-left visible cell as cursor
473 rSelData.maXclCursor.mnCol = ((nPane == EXC_PANE_TOPLEFT) || (nPane == EXC_PANE_BOTTOMLEFT)) ?
474 maData.maFirstXclPos.mnCol : maData.maSecondXclPos.mnCol;
475 rSelData.maXclCursor.mnRow = ((nPane == EXC_PANE_TOPLEFT) || (nPane == EXC_PANE_TOPRIGHT)) ?
476 maData.maFirstXclPos.mnRow : maData.maSecondXclPos.mnRow;
478 // second step, active pane: create actual selection data with current cursor position
479 if( nPane == maData.mnActivePane )
481 XclExpAddressConverter& rAddrConv = GetAddressConverter();
482 // cursor position (keep top-left pane position from above, if rCursor is invalid)
483 if( (rCursor.Col() >= 0) && (rCursor.Row() >= 0) )
484 rSelData.maXclCursor = rAddrConv.CreateValidAddress( rCursor, false );
485 // selection
486 rAddrConv.ConvertRangeList( rSelData.maXclSelection, rSelection, false );
491 void XclExpTabViewSettings::WriteWindow2( XclExpStream& rStrm ) const
493 // #i43553# GCC 3.3 parse error
494 // XclExpWindow2( GetRoot(), maData, mnGridColorId ).Save( rStrm );
495 XclExpWindow2 aWindow2( GetRoot(), maData, mnGridColorId );
496 aWindow2.Save( rStrm );
499 void XclExpTabViewSettings::WriteScl( XclExpStream& rStrm ) const
501 if( maData.mnCurrentZoom != 0 )
502 XclExpScl( maData.mnCurrentZoom ).Save( rStrm );
505 void XclExpTabViewSettings::WritePane( XclExpStream& rStrm ) const
507 if( maData.IsSplit() )
508 // #i43553# GCC 3.3 parse error
509 // XclExpPane( GetRoot(), maData ).Save( rStrm );
511 XclExpPane aPane( maData );
512 aPane.Save( rStrm );
516 void XclExpTabViewSettings::WriteSelection( XclExpStream& rStrm, sal_uInt8 nPane ) const
518 if( maData.HasPane( nPane ) )
519 XclExpSelection( maData, nPane ).Save( rStrm );
522 void XclExpTabViewSettings::WriteTabBgColor( XclExpStream& rStrm ) const
524 if ( !maData.IsDefaultTabBgColor() )
525 XclExpTabBgColor( maData ).Save( rStrm );
527 // ============================================================================
529 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */