xref: /trunk/main/sc/source/filter/excel/xeview.cxx (revision b77af630)
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 #include "xeview.hxx"
27 #include "document.hxx"
28 #include "scextopt.hxx"
29 #include "viewopti.hxx"
30 #include "xelink.hxx"
31 #include "xestyle.hxx"
32 
33 using namespace ::oox;
34 
35 using ::rtl::OString;
36 
37 // Workbook view settings records =============================================
38 
XclExpWindow1(const XclExpRoot & rRoot)39 XclExpWindow1::XclExpWindow1( const XclExpRoot& rRoot ) :
40     XclExpRecord( EXC_ID_WINDOW1, 18 ),
41     mnFlags( 0 ),
42     mnTabBarSize( 600 )
43 {
44     const ScViewOptions& rViewOpt = rRoot.GetDoc().GetViewOptions();
45     ::set_flag( mnFlags, EXC_WIN1_HOR_SCROLLBAR,    rViewOpt.GetOption( VOPT_HSCROLL ) );
46     ::set_flag( mnFlags, EXC_WIN1_VER_SCROLLBAR,    rViewOpt.GetOption( VOPT_VSCROLL ) );
47     ::set_flag( mnFlags, EXC_WIN1_TABBAR,           rViewOpt.GetOption( VOPT_TABCONTROLS ) );
48 
49     double fTabBarWidth = rRoot.GetExtDocOptions().GetDocSettings().mfTabBarWidth;
50     if( (0.0 <= fTabBarWidth) && (fTabBarWidth <= 1.0) )
51         mnTabBarSize = static_cast< sal_uInt16 >( fTabBarWidth * 1000.0 + 0.5 );
52 }
53 
SaveXml(XclExpXmlStream & rStrm)54 void XclExpWindow1::SaveXml( XclExpXmlStream& rStrm )
55 {
56     const XclExpTabInfo& rTabInfo = rStrm.GetRoot().GetTabInfo();
57 
58     rStrm.GetCurrentStream()->singleElement( XML_workbookView,
59             // OOXTODO: XML_visibility, // ST_visibilty
60             // OOXTODO: XML_minimized,  // bool
61             XML_showHorizontalScroll,   XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_WIN1_HOR_SCROLLBAR ) ),
62             XML_showVerticalScroll,     XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_WIN1_VER_SCROLLBAR ) ),
63             XML_showSheetTabs,          XclXmlUtils::ToPsz( ::get_flag( mnFlags, EXC_WIN1_TABBAR ) ),
64             XML_xWindow,                "0",
65             XML_yWindow,                "0",
66             XML_windowWidth,            OString::valueOf( (sal_Int32)0x4000 ).getStr(),
67             XML_windowHeight,           OString::valueOf( (sal_Int32)0x2000 ).getStr(),
68             XML_tabRatio,               OString::valueOf( (sal_Int32)mnTabBarSize ).getStr(),
69             XML_firstSheet,             OString::valueOf( (sal_Int32)rTabInfo.GetFirstVisXclTab() ).getStr(),
70             XML_activeTab,              OString::valueOf( (sal_Int32)rTabInfo.GetDisplayedXclTab() ).getStr(),
71             // OOXTODO: XML_autoFilterDateGrouping,     // bool; AUTOFILTER12? 87Eh
72             FSEND );
73 }
74 
WriteBody(XclExpStream & rStrm)75 void XclExpWindow1::WriteBody( XclExpStream& rStrm )
76 {
77     const XclExpTabInfo& rTabInfo = rStrm.GetRoot().GetTabInfo();
78 
79     rStrm   << sal_uInt16( 0 )              // X position of the window
80             << sal_uInt16( 0 )              // Y position of the window
81             << sal_uInt16( 0x4000 )         // width of the window
82             << sal_uInt16( 0x2000 )         // height of the window
83             << mnFlags
84             << rTabInfo.GetDisplayedXclTab()
85             << rTabInfo.GetFirstVisXclTab()
86             << rTabInfo.GetXclSelectedCount()
87             << mnTabBarSize;
88 }
89 
90 // Sheet view settings records ================================================
91 
XclExpWindow2(const XclExpRoot & rRoot,const XclTabViewData & rData,sal_uInt32 nGridColorId)92 XclExpWindow2::XclExpWindow2( const XclExpRoot& rRoot,
93         const XclTabViewData& rData, sal_uInt32 nGridColorId ) :
94     XclExpRecord( EXC_ID_WINDOW2, (rRoot.GetBiff() == EXC_BIFF8) ? 18 : 10 ),
95     maGridColor( rData.maGridColor ),
96     mnGridColorId( nGridColorId ),
97     mnFlags( 0 ),
98     maFirstXclPos( rData.maFirstXclPos ),
99     mnNormalZoom( rData.mnNormalZoom ),
100     mnPageZoom( rData.mnPageZoom )
101 {
102     ::set_flag( mnFlags, EXC_WIN2_SHOWFORMULAS,     rData.mbShowFormulas );
103     ::set_flag( mnFlags, EXC_WIN2_SHOWGRID,         rData.mbShowGrid );
104     ::set_flag( mnFlags, EXC_WIN2_SHOWHEADINGS,     rData.mbShowHeadings );
105     ::set_flag( mnFlags, EXC_WIN2_FROZEN,           rData.mbFrozenPanes );
106     ::set_flag( mnFlags, EXC_WIN2_SHOWZEROS,        rData.mbShowZeros );
107     ::set_flag( mnFlags, EXC_WIN2_DEFGRIDCOLOR,     rData.mbDefGridColor );
108     ::set_flag( mnFlags, EXC_WIN2_MIRRORED,         rData.mbMirrored );
109     ::set_flag( mnFlags, EXC_WIN2_SHOWOUTLINE,      rData.mbShowOutline );
110     ::set_flag( mnFlags, EXC_WIN2_FROZENNOSPLIT,    rData.mbFrozenPanes );
111     ::set_flag( mnFlags, EXC_WIN2_SELECTED,         rData.mbSelected );
112     ::set_flag( mnFlags, EXC_WIN2_DISPLAYED,        rData.mbDisplayed );
113     ::set_flag( mnFlags, EXC_WIN2_PAGEBREAKMODE,    rData.mbPageMode );
114 }
115 
WriteBody(XclExpStream & rStrm)116 void XclExpWindow2::WriteBody( XclExpStream& rStrm )
117 {
118     const XclExpRoot& rRoot = rStrm.GetRoot();
119 
120     rStrm   << mnFlags
121             << maFirstXclPos;
122 
123     switch( rRoot.GetBiff() )
124     {
125         case EXC_BIFF3:
126         case EXC_BIFF4:
127         case EXC_BIFF5:
128             rStrm   << maGridColor;
129         break;
130         case EXC_BIFF8:
131             rStrm   << rRoot.GetPalette().GetColorIndex( mnGridColorId )
132                     << sal_uInt16( 0 )
133                     << mnPageZoom
134                     << mnNormalZoom
135                     << sal_uInt32( 0 );
136         break;
137         default:    DBG_ERROR_BIFF();
138     }
139 }
140 
141 // ----------------------------------------------------------------------------
142 
XclExpScl(sal_uInt16 nZoom)143 XclExpScl::XclExpScl( sal_uInt16 nZoom ) :
144     XclExpRecord( EXC_ID_SCL, 4 ),
145     mnNum( nZoom ),
146     mnDenom( 100 )
147 {
148     Shorten( 2 );
149     Shorten( 5 );
150 }
151 
Shorten(sal_uInt16 nFactor)152 void XclExpScl::Shorten( sal_uInt16 nFactor )
153 {
154     while( (mnNum % nFactor == 0) && (mnDenom % nFactor == 0) )
155     {
156         mnNum = mnNum / nFactor;
157         mnDenom = mnDenom / nFactor;
158     }
159 }
160 
WriteBody(XclExpStream & rStrm)161 void XclExpScl::WriteBody( XclExpStream& rStrm )
162 {
163     DBG_ASSERT_BIFF( rStrm.GetRoot().GetBiff() >= EXC_BIFF4 );
164     rStrm << mnNum << mnDenom;
165 }
166 
167 // ----------------------------------------------------------------------------
168 
XclExpPane(const XclTabViewData & rData)169 XclExpPane::XclExpPane( const XclTabViewData& rData ) :
170     XclExpRecord( EXC_ID_PANE, 10 ),
171     mnSplitX( rData.mnSplitX ),
172     mnSplitY( rData.mnSplitY ),
173     maSecondXclPos( rData.maSecondXclPos ),
174     mnActivePane( rData.mnActivePane )
175 {
176     DBG_ASSERT( rData.IsSplit(), "XclExpPane::XclExpPane - no PANE record for unsplit view" );
177 }
178 
lcl_GetActivePane(sal_uInt8 nActivePane)179 static const char* lcl_GetActivePane( sal_uInt8 nActivePane )
180 {
181     switch( nActivePane )
182     {
183         case EXC_PANE_TOPLEFT:      return "topLeft";       //break;
184         case EXC_PANE_TOPRIGHT:     return "topRight";      //break;
185         case EXC_PANE_BOTTOMLEFT:   return "bottomLeft";    //break;
186         case EXC_PANE_BOTTOMRIGHT:  return "bottomRight";   //break;
187     }
188     return "**error: lcl_GetActivePane";
189 }
190 
SaveXml(XclExpXmlStream & rStrm)191 void XclExpPane::SaveXml( XclExpXmlStream& rStrm )
192 {
193     rStrm.GetCurrentStream()->singleElement( XML_pane,
194             XML_xSplit,         OString::valueOf( (sal_Int32)mnSplitX ).getStr(),
195             XML_ySplit,         OString::valueOf( (sal_Int32)mnSplitY ).getStr(),
196             XML_topLeftCell,    XclXmlUtils::ToOString( maSecondXclPos ).getStr(),
197             XML_activePane,     lcl_GetActivePane( mnActivePane ),
198             // OOXTODO: XML_state,
199             FSEND );
200 }
201 
WriteBody(XclExpStream & rStrm)202 void XclExpPane::WriteBody( XclExpStream& rStrm )
203 {
204     rStrm   << mnSplitX
205             << mnSplitY
206             << maSecondXclPos
207             << mnActivePane;
208     if( rStrm.GetRoot().GetBiff() >= EXC_BIFF5 )
209         rStrm << sal_uInt8( 0 );
210 }
211 
212 // ----------------------------------------------------------------------------
213 
XclExpSelection(const XclTabViewData & rData,sal_uInt8 nPane)214 XclExpSelection::XclExpSelection( const XclTabViewData& rData, sal_uInt8 nPane ) :
215     XclExpRecord( EXC_ID_SELECTION, 15 ),
216     mnPane( nPane )
217 {
218     if( const XclSelectionData* pSelData = rData.GetSelectionData( nPane ) )
219         maSelData = *pSelData;
220 
221     // find the cursor position in the selection list (or add it)
222     XclRangeList& rXclSel = maSelData.maXclSelection;
223     bool bFound = false;
224     for( XclRangeList::const_iterator aIt = rXclSel.begin(), aEnd = rXclSel.end(); !bFound && (aIt != aEnd); ++aIt )
225         if( (bFound = aIt->Contains( maSelData.maXclCursor )) == true )
226             maSelData.mnCursorIdx = static_cast< sal_uInt16 >( aIt - rXclSel.begin() );
227     /*  Cursor cell not found in list? (e.g. inactive pane, or removed in
228         ConvertRangeList(), because Calc cursor on invalid pos)
229         -> insert the valid Excel cursor. */
230     if( !bFound )
231     {
232         maSelData.mnCursorIdx = static_cast< sal_uInt16 >( rXclSel.size() );
233         rXclSel.push_back( XclRange( maSelData.maXclCursor ) );
234     }
235 }
236 
SaveXml(XclExpXmlStream & rStrm)237 void XclExpSelection::SaveXml( XclExpXmlStream& rStrm )
238 {
239     rStrm.GetCurrentStream()->singleElement( XML_selection,
240             XML_pane,           lcl_GetActivePane( mnPane ),
241             XML_activeCell,     XclXmlUtils::ToOString( maSelData.maXclCursor ).getStr(),
242             XML_activeCellId,   OString::valueOf( (sal_Int32) maSelData.mnCursorIdx ).getStr(),
243             XML_sqref,          XclXmlUtils::ToOString( maSelData.maXclSelection ).getStr(),
244             FSEND );
245 }
246 
WriteBody(XclExpStream & rStrm)247 void XclExpSelection::WriteBody( XclExpStream& rStrm )
248 {
249     rStrm   << mnPane                   // pane for this selection
250             << maSelData.maXclCursor    // cell cursor
251             << maSelData.mnCursorIdx;   // index to range containing cursor
252     maSelData.maXclSelection.Write( rStrm, false );
253 }
254 
255 // ----------------------------------------------------------------------------
256 
XclExpTabBgColor(const XclTabViewData & rTabViewData)257 XclExpTabBgColor::XclExpTabBgColor( const XclTabViewData& rTabViewData ) :
258     XclExpRecord( EXC_ID_SHEETEXT, 18 ),
259     mrTabViewData( rTabViewData )
260 {
261 }
262 //TODO Fix savexml...
263 /*void XclExpTabBgColor::SaveXml( XclExpXmlStream& rStrm )
264 {
265 }*/
266 
WriteBody(XclExpStream & rStrm)267 void XclExpTabBgColor::WriteBody( XclExpStream& rStrm )
268 {
269     if ( mrTabViewData.IsDefaultTabBgColor() )
270         return;
271     sal_uInt16 rt = 0x0862; //rt
272     sal_uInt16 grbitFrt = 0x0000; //grbit must be set to 0
273     sal_uInt32 unused = 0x00000000; //Use twice...
274     sal_uInt32 cb = 0x00000014; // Record Size, may be larger in future...
275     sal_uInt16 reserved = 0x0000; //trailing bits are 0
276     sal_uInt16 TabBgColorIndex;
277     XclExpPalette& rPal = rStrm.GetRoot().GetPalette();
278     TabBgColorIndex = rPal.GetColorIndex(mrTabViewData.mnTabBgColorId);
279     if (TabBgColorIndex < 8 || TabBgColorIndex > 63 ) // only numbers 8 - 63 are valid numbers
280         TabBgColorIndex = 127; //Excel specs: 127 makes excel ignore tab color information.
281     rStrm << rt << grbitFrt << unused << unused << cb << TabBgColorIndex << reserved;
282 }
283 
284 // Sheet view settings ========================================================
285 
286 namespace {
287 
288 /** Converts a Calc zoom factor into an Excel zoom factor. Returns 0 for a default zoom value. */
lclGetXclZoom(long nScZoom,sal_uInt16 nDefXclZoom)289 sal_uInt16 lclGetXclZoom( long nScZoom, sal_uInt16 nDefXclZoom )
290 {
291     sal_uInt16 nXclZoom = limit_cast< sal_uInt16 >( nScZoom, EXC_ZOOM_MIN, EXC_ZOOM_MAX );
292     return (nXclZoom == nDefXclZoom) ? 0 : nXclZoom;
293 }
294 
295 } // namespace
296 
297 // ----------------------------------------------------------------------------
298 
XclExpTabViewSettings(const XclExpRoot & rRoot,SCTAB nScTab)299 XclExpTabViewSettings::XclExpTabViewSettings( const XclExpRoot& rRoot, SCTAB nScTab ) :
300     XclExpRoot( rRoot ),
301     mnGridColorId( XclExpPalette::GetColorIdFromIndex( EXC_COLOR_WINDOWTEXT ) )
302 {
303     // *** sheet flags ***
304 
305     const XclExpTabInfo& rTabInfo = GetTabInfo();
306     maData.mbSelected       = rTabInfo.IsSelectedTab( nScTab );
307     maData.mbDisplayed      = rTabInfo.IsDisplayedTab( nScTab );
308     maData.mbMirrored       = rTabInfo.IsMirroredTab( nScTab );
309 
310     const ScViewOptions& rViewOpt = GetDoc().GetViewOptions();
311     maData.mbShowFormulas   = rViewOpt.GetOption( VOPT_FORMULAS );
312     maData.mbShowGrid       = rViewOpt.GetOption( VOPT_GRID );
313     maData.mbShowHeadings   = rViewOpt.GetOption( VOPT_HEADER );
314     maData.mbShowZeros      = rViewOpt.GetOption( VOPT_NULLVALS );
315     maData.mbShowOutline    = rViewOpt.GetOption( VOPT_OUTLINER );
316 
317     // *** sheet options: cursor, selection, splits, grid color, zoom ***
318 
319     if( const ScExtTabSettings* pTabSett = GetExtDocOptions().GetTabSettings( nScTab ) )
320     {
321         const ScExtTabSettings& rTabSett = *pTabSett;
322         XclExpAddressConverter& rAddrConv = GetAddressConverter();
323 
324         // first visible cell in top-left pane
325         if( (rTabSett.maFirstVis.Col() >= 0) && (rTabSett.maFirstVis.Row() >= 0) )
326             maData.maFirstXclPos = rAddrConv.CreateValidAddress( rTabSett.maFirstVis, false );
327 
328         // first visible cell in additional pane(s)
329         if( (rTabSett.maSecondVis.Col() >= 0) && (rTabSett.maSecondVis.Row() >= 0) )
330             maData.maSecondXclPos = rAddrConv.CreateValidAddress( rTabSett.maSecondVis, false );
331 
332         // active pane
333         switch( rTabSett.meActivePane )
334         {
335             case SCEXT_PANE_TOPLEFT:        maData.mnActivePane = EXC_PANE_TOPLEFT;     break;
336             case SCEXT_PANE_TOPRIGHT:       maData.mnActivePane = EXC_PANE_TOPRIGHT;    break;
337             case SCEXT_PANE_BOTTOMLEFT:     maData.mnActivePane = EXC_PANE_BOTTOMLEFT;  break;
338             case SCEXT_PANE_BOTTOMRIGHT:    maData.mnActivePane = EXC_PANE_BOTTOMRIGHT; break;
339         }
340 
341         // freeze/split position
342         maData.mbFrozenPanes = rTabSett.mbFrozenPanes;
343         if( maData.mbFrozenPanes )
344         {
345             /*  Frozen panes: handle split position as row/column positions.
346                 #i35812# Excel uses number of visible rows/columns, Calc uses position of freeze. */
347             SCCOL nFreezeScCol = rTabSett.maFreezePos.Col();
348             if( (0 < nFreezeScCol) && (nFreezeScCol <= GetXclMaxPos().Col()) )
349                 maData.mnSplitX = static_cast< sal_uInt16 >( nFreezeScCol ) - maData.maFirstXclPos.mnCol;
350             SCROW nFreezeScRow = rTabSett.maFreezePos.Row();
351             if( (0 < nFreezeScRow) && (nFreezeScRow <= GetXclMaxPos().Row()) )
352                 maData.mnSplitY = static_cast< sal_uInt16 >( nFreezeScRow ) - maData.maFirstXclPos.mnRow;
353             // if both splits are left out (address overflow), remove the frozen flag
354             maData.mbFrozenPanes = maData.IsSplit();
355 
356             // #i20671# frozen panes: mostright/mostbottom pane is active regardless of cursor position
357             if( maData.HasPane( EXC_PANE_BOTTOMRIGHT ) )
358                 maData.mnActivePane = EXC_PANE_BOTTOMRIGHT;
359             else if( maData.HasPane( EXC_PANE_TOPRIGHT ) )
360                 maData.mnActivePane = EXC_PANE_TOPRIGHT;
361             else if( maData.HasPane( EXC_PANE_BOTTOMLEFT ) )
362                 maData.mnActivePane = EXC_PANE_BOTTOMLEFT;
363         }
364         else
365         {
366             // split window: position is in twips
367             maData.mnSplitX = ulimit_cast< sal_uInt16 >( rTabSett.maSplitPos.X() );
368             maData.mnSplitY = ulimit_cast< sal_uInt16 >( rTabSett.maSplitPos.Y() );
369         }
370 
371         // selection
372         CreateSelectionData( EXC_PANE_TOPLEFT,     rTabSett.maCursor, rTabSett.maSelection );
373         CreateSelectionData( EXC_PANE_TOPRIGHT,    rTabSett.maCursor, rTabSett.maSelection );
374         CreateSelectionData( EXC_PANE_BOTTOMLEFT,  rTabSett.maCursor, rTabSett.maSelection );
375         CreateSelectionData( EXC_PANE_BOTTOMRIGHT, rTabSett.maCursor, rTabSett.maSelection );
376 
377         // grid color
378         const Color& rGridColor = rTabSett.maGridColor;
379         maData.mbDefGridColor = rGridColor.GetColor() == COL_AUTO;
380         if( !maData.mbDefGridColor )
381         {
382             if( GetBiff() == EXC_BIFF8 )
383                 mnGridColorId = GetPalette().InsertColor( rGridColor, EXC_COLOR_GRID );
384             else
385                 maData.maGridColor = rGridColor;
386         }
387 
388         // view mode and zoom
389         maData.mbPageMode       = (GetBiff() == EXC_BIFF8) && rTabSett.mbPageMode;
390         maData.mnNormalZoom     = lclGetXclZoom( rTabSett.mnNormalZoom, EXC_WIN2_NORMALZOOM_DEF );
391         maData.mnPageZoom       = lclGetXclZoom( rTabSett.mnPageZoom, EXC_WIN2_PAGEZOOM_DEF );
392         maData.mnCurrentZoom    = maData.mbPageMode ? maData.mnPageZoom : maData.mnNormalZoom;
393     }
394 
395     // Tab Bg Color
396     if ( GetBiff() == EXC_BIFF8 && !GetDoc().IsDefaultTabBgColor(nScTab) )
397     {
398         XclExpPalette& rPal = GetPalette();
399         maData.maTabBgColor = GetDoc().GetTabBgColor(nScTab);
400         maData.mnTabBgColorId = rPal.InsertColor(maData.maTabBgColor, EXC_COLOR_TABBG, EXC_COLOR_NOTABBG );
401     }
402 }
403 
Save(XclExpStream & rStrm)404 void XclExpTabViewSettings::Save( XclExpStream& rStrm )
405 {
406     WriteWindow2( rStrm );
407     WriteScl( rStrm );
408     WritePane( rStrm );
409     WriteSelection( rStrm, EXC_PANE_TOPLEFT );
410     WriteSelection( rStrm, EXC_PANE_TOPRIGHT );
411     WriteSelection( rStrm, EXC_PANE_BOTTOMLEFT );
412     WriteSelection( rStrm, EXC_PANE_BOTTOMRIGHT );
413     WriteTabBgColor( rStrm );
414 }
415 
lcl_WriteSelection(XclExpXmlStream & rStrm,const XclTabViewData & rData,sal_uInt8 nPane)416 static void lcl_WriteSelection( XclExpXmlStream& rStrm, const XclTabViewData& rData, sal_uInt8 nPane )
417 {
418     if( rData.HasPane( nPane ) )
419         XclExpSelection( rData, nPane ).SaveXml( rStrm );
420 }
421 
lcl_GetZoom(sal_uInt16 nZoom)422 OString lcl_GetZoom( sal_uInt16 nZoom )
423 {
424     if( nZoom )
425         return OString::valueOf( (sal_Int32)nZoom );
426     return OString( "100" );
427 }
428 
SaveXml(XclExpXmlStream & rStrm)429 void XclExpTabViewSettings::SaveXml( XclExpXmlStream& rStrm )
430 {
431     sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
432     rWorksheet->startElement( XML_sheetViews, FSEND );
433     rWorksheet->startElement( XML_sheetView,
434             XML_windowProtection,           XclXmlUtils::ToPsz( maData.mbFrozenPanes ),
435             XML_showFormulas,               XclXmlUtils::ToPsz( maData.mbShowFormulas ),
436             XML_showGridLines,              XclXmlUtils::ToPsz( maData.mbShowGrid ),
437             XML_showRowColHeaders,          XclXmlUtils::ToPsz( maData.mbShowHeadings ),
438             XML_showZeros,                  XclXmlUtils::ToPsz( maData.mbShowZeros ),
439             XML_rightToLeft,                XclXmlUtils::ToPsz( maData.mbMirrored ),
440             XML_tabSelected,                XclXmlUtils::ToPsz( maData.mbSelected ),
441             // OOXTODO: XML_showRuler,
442             XML_showOutlineSymbols,         XclXmlUtils::ToPsz( maData.mbShowOutline ),
443             XML_defaultGridColor,           mnGridColorId == XclExpPalette::GetColorIdFromIndex( EXC_COLOR_WINDOWTEXT ) ? "true" : "false",
444             // OOXTODO: XML_showWhiteSpace,
445             XML_view,                       maData.mbPageMode ? "pageBreakPreview" : "normal",  // OOXTODO: pageLayout
446             XML_topLeftCell,                XclXmlUtils::ToOString( maData.maFirstXclPos ).getStr(),
447             XML_colorId,                    OString::valueOf( (sal_Int32) rStrm.GetRoot().GetPalette().GetColorIndex( mnGridColorId ) ).getStr(),
448             XML_zoomScale,                  lcl_GetZoom( maData.mnCurrentZoom ).getStr(),
449             XML_zoomScaleNormal,            lcl_GetZoom( maData.mnNormalZoom ).getStr(),
450             // OOXTODO: XML_zoomScaleSheetLayoutView,
451             XML_zoomScalePageLayoutView,    lcl_GetZoom( maData.mnPageZoom ).getStr(),
452             XML_workbookViewId,             "0",    // OOXTODO? 0-based index of document(xl/workbook.xml)/workbook/bookviews/workbookView
453                                                     //          should always be 0, as we only generate 1 such element.
454             FSEND );
455     if( maData.IsSplit() )
456     {
457         XclExpPane aPane( maData );
458         aPane.SaveXml( rStrm );
459     }
460     lcl_WriteSelection( rStrm, maData, EXC_PANE_TOPLEFT );
461     lcl_WriteSelection( rStrm, maData, EXC_PANE_TOPRIGHT );
462     lcl_WriteSelection( rStrm, maData, EXC_PANE_BOTTOMLEFT );
463     lcl_WriteSelection( rStrm, maData, EXC_PANE_BOTTOMRIGHT );
464     rWorksheet->endElement( XML_sheetView );
465     // OOXTODO: XML_extLst
466     rWorksheet->endElement( XML_sheetViews );
467 }
468 
469 // private --------------------------------------------------------------------
470 
CreateSelectionData(sal_uInt8 nPane,const ScAddress & rCursor,const ScRangeList & rSelection)471 void XclExpTabViewSettings::CreateSelectionData( sal_uInt8 nPane,
472         const ScAddress& rCursor, const ScRangeList& rSelection )
473 {
474     if( maData.HasPane( nPane ) )
475     {
476         XclSelectionData& rSelData = maData.CreateSelectionData( nPane );
477 
478         // first step: use top-left visible cell as cursor
479         rSelData.maXclCursor.mnCol = ((nPane == EXC_PANE_TOPLEFT) || (nPane == EXC_PANE_BOTTOMLEFT)) ?
480             maData.maFirstXclPos.mnCol : maData.maSecondXclPos.mnCol;
481         rSelData.maXclCursor.mnRow = ((nPane == EXC_PANE_TOPLEFT) || (nPane == EXC_PANE_TOPRIGHT)) ?
482             maData.maFirstXclPos.mnRow : maData.maSecondXclPos.mnRow;
483 
484         // second step, active pane: create actual selection data with current cursor position
485         if( nPane == maData.mnActivePane )
486         {
487             XclExpAddressConverter& rAddrConv = GetAddressConverter();
488             // cursor position (keep top-left pane position from above, if rCursor is invalid)
489             if( (rCursor.Col() >= 0) && (rCursor.Row() >= 0) )
490                 rSelData.maXclCursor = rAddrConv.CreateValidAddress( rCursor, false );
491             // selection
492             rAddrConv.ConvertRangeList( rSelData.maXclSelection, rSelection, false );
493         }
494     }
495 }
496 
WriteWindow2(XclExpStream & rStrm) const497 void XclExpTabViewSettings::WriteWindow2( XclExpStream& rStrm ) const
498 {
499 //  #i43553# GCC 3.3 parse error
500 //    XclExpWindow2( GetRoot(), maData, mnGridColorId ).Save( rStrm );
501     XclExpWindow2 aWindow2( GetRoot(), maData, mnGridColorId );
502     aWindow2.Save( rStrm );
503 }
504 
WriteScl(XclExpStream & rStrm) const505 void XclExpTabViewSettings::WriteScl( XclExpStream& rStrm ) const
506 {
507     if( maData.mnCurrentZoom != 0 )
508         XclExpScl( maData.mnCurrentZoom ).Save( rStrm );
509 }
510 
WritePane(XclExpStream & rStrm) const511 void XclExpTabViewSettings::WritePane( XclExpStream& rStrm ) const
512 {
513     if( maData.IsSplit() )
514 //  #i43553# GCC 3.3 parse error
515 //        XclExpPane( GetRoot(), maData ).Save( rStrm );
516     {
517         XclExpPane aPane( maData );
518         aPane.Save( rStrm );
519     }
520 }
521 
WriteSelection(XclExpStream & rStrm,sal_uInt8 nPane) const522 void XclExpTabViewSettings::WriteSelection( XclExpStream& rStrm, sal_uInt8 nPane ) const
523 {
524     if( maData.HasPane( nPane ) )
525         XclExpSelection( maData, nPane ).Save( rStrm );
526 }
527 
WriteTabBgColor(XclExpStream & rStrm) const528 void XclExpTabViewSettings::WriteTabBgColor( XclExpStream& rStrm ) const
529 {
530     if ( !maData.IsDefaultTabBgColor() )
531         XclExpTabBgColor( maData ).Save( rStrm );
532 }
533 // ============================================================================
534 
535