/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" #include "xiview.hxx" #include "document.hxx" #include "scextopt.hxx" #include "viewopti.hxx" #include "xistream.hxx" #include "xihelper.hxx" #include "xistyle.hxx" // Document view settings ===================================================== XclImpDocViewSettings::XclImpDocViewSettings( const XclImpRoot& rRoot ) : XclImpRoot( rRoot ) { } void XclImpDocViewSettings::ReadWindow1( XclImpStream& rStrm ) { rStrm >> maData.mnWinX >> maData.mnWinY >> maData.mnWinWidth >> maData.mnWinHeight >> maData.mnFlags; if( GetBiff() >= EXC_BIFF5 ) { rStrm >> maData.mnDisplXclTab >> maData.mnFirstVisXclTab >> maData.mnXclSelectCnt >> maData.mnTabBarWidth; } } SCTAB XclImpDocViewSettings::GetDisplScTab() const { /* Simply cast Excel index to Calc index. TODO: This may fail if the document contains scenarios. */ sal_uInt16 nMaxXclTab = static_cast< sal_uInt16 >( GetMaxPos().Tab() ); return static_cast< SCTAB >( (maData.mnDisplXclTab <= nMaxXclTab) ? maData.mnDisplXclTab : 0 ); } void XclImpDocViewSettings::Finalize() { ScViewOptions aViewOpt( GetDoc().GetViewOptions() ); aViewOpt.SetOption( VOPT_HSCROLL, ::get_flag( maData.mnFlags, EXC_WIN1_HOR_SCROLLBAR ) ); aViewOpt.SetOption( VOPT_VSCROLL, ::get_flag( maData.mnFlags, EXC_WIN1_VER_SCROLLBAR ) ); aViewOpt.SetOption( VOPT_TABCONTROLS, ::get_flag( maData.mnFlags, EXC_WIN1_TABBAR ) ); GetDoc().SetViewOptions( aViewOpt ); // displayed sheet GetExtDocOptions().GetDocSettings().mnDisplTab = GetDisplScTab(); // width of the tabbar with sheet names if( maData.mnTabBarWidth <= 1000 ) GetExtDocOptions().GetDocSettings().mfTabBarWidth = static_cast< double >( maData.mnTabBarWidth ) / 1000.0; } // Sheet view settings ======================================================== namespace { long lclGetScZoom( sal_uInt16 nXclZoom, sal_uInt16 nDefZoom ) { return static_cast< long >( nXclZoom ? nXclZoom : nDefZoom ); } } // namespace // ---------------------------------------------------------------------------- XclImpTabViewSettings::XclImpTabViewSettings( const XclImpRoot& rRoot ) : XclImpRoot( rRoot ) { Initialize(); } void XclImpTabViewSettings::Initialize() { maData.SetDefaults(); } void XclImpTabViewSettings::ReadTabBgColor( XclImpStream& rStrm, XclImpPalette& rPal ) { DBG_ASSERT_BIFF( GetBiff() >= EXC_BIFF8 ); if( GetBiff() < EXC_BIFF8 ) return; sal_uInt8 ColorIndex; Color TabBgColor; rStrm.Ignore( 16 ); ColorIndex = rStrm.ReaduInt8() & EXC_SHEETEXT_TABCOLOR; //0x7F if ( ColorIndex >= 8 && ColorIndex <= 63 ) //only accept valid index values { TabBgColor = rPal.GetColor( ColorIndex ); maData.maTabBgColor = TabBgColor; } } void XclImpTabViewSettings::ReadWindow2( XclImpStream& rStrm, bool bChart ) { if( GetBiff() == EXC_BIFF2 ) { maData.mbShowFormulas = rStrm.ReaduInt8() != 0; maData.mbShowGrid = rStrm.ReaduInt8() != 0; maData.mbShowHeadings = rStrm.ReaduInt8() != 0; maData.mbFrozenPanes = rStrm.ReaduInt8() != 0; maData.mbShowZeros = rStrm.ReaduInt8() != 0; rStrm >> maData.maFirstXclPos; maData.mbDefGridColor = rStrm.ReaduInt8() != 0; rStrm >> maData.maGridColor; } else { sal_uInt16 nFlags; rStrm >> nFlags >> maData.maFirstXclPos; // #i59590# #158194# real life: Excel ignores some view settings in chart sheets maData.mbSelected = ::get_flag( nFlags, EXC_WIN2_SELECTED ); maData.mbDisplayed = ::get_flag( nFlags, EXC_WIN2_DISPLAYED ); maData.mbMirrored = !bChart && ::get_flag( nFlags, EXC_WIN2_MIRRORED ); maData.mbFrozenPanes = !bChart && ::get_flag( nFlags, EXC_WIN2_FROZEN ); maData.mbPageMode = !bChart && ::get_flag( nFlags, EXC_WIN2_PAGEBREAKMODE ); maData.mbDefGridColor = bChart || ::get_flag( nFlags, EXC_WIN2_DEFGRIDCOLOR ); maData.mbShowFormulas = !bChart && ::get_flag( nFlags, EXC_WIN2_SHOWFORMULAS ); maData.mbShowGrid = bChart || ::get_flag( nFlags, EXC_WIN2_SHOWGRID ); maData.mbShowHeadings = bChart || ::get_flag( nFlags, EXC_WIN2_SHOWHEADINGS ); maData.mbShowZeros = bChart || ::get_flag( nFlags, EXC_WIN2_SHOWZEROS ); maData.mbShowOutline = bChart || ::get_flag( nFlags, EXC_WIN2_SHOWOUTLINE ); switch( GetBiff() ) { case EXC_BIFF3: case EXC_BIFF4: case EXC_BIFF5: rStrm >> maData.maGridColor; break; case EXC_BIFF8: { sal_uInt16 nGridColorIdx; rStrm >> nGridColorIdx; // zoom data not included in chart sheets if( rStrm.GetRecLeft() >= 6 ) { rStrm.Ignore( 2 ); rStrm >> maData.mnPageZoom >> maData.mnNormalZoom; } if( !maData.mbDefGridColor ) maData.maGridColor = GetPalette().GetColor( nGridColorIdx ); } break; default: DBG_ERROR_BIFF(); } } // do not scroll chart sheets if( bChart ) maData.maFirstXclPos.Set( 0, 0 ); } void XclImpTabViewSettings::ReadScl( XclImpStream& rStrm ) { sal_uInt16 nNum, nDenom; rStrm >> nNum >> nDenom; DBG_ASSERT( nDenom > 0, "XclImpPageSettings::ReadScl - invalid denominator" ); if( nDenom > 0 ) maData.mnCurrentZoom = limit_cast< sal_uInt16 >( (nNum * 100) / nDenom ); } void XclImpTabViewSettings::ReadPane( XclImpStream& rStrm ) { rStrm >> maData.mnSplitX >> maData.mnSplitY >> maData.maSecondXclPos >> maData.mnActivePane; } void XclImpTabViewSettings::ReadSelection( XclImpStream& rStrm ) { // pane of this selection sal_uInt8 nPane; rStrm >> nPane; XclSelectionData& rSelData = maData.CreateSelectionData( nPane ); // cursor position and selection rStrm >> rSelData.maXclCursor >> rSelData.mnCursorIdx; rSelData.maXclSelection.Read( rStrm, false ); } void XclImpTabViewSettings::Finalize() { SCTAB nScTab = GetCurrScTab(); ScDocument& rDoc = GetDoc(); XclImpAddressConverter& rAddrConv = GetAddressConverter(); ScExtTabSettings& rTabSett = GetExtDocOptions().GetOrCreateTabSettings( nScTab ); bool bDisplayed = GetDocViewSettings().GetDisplScTab() == nScTab; // *** sheet options: cursor, selection, splits, zoom *** // sheet flags if( maData.mbMirrored ) // do not call this function with sal_False, it would mirror away all drawing objects rDoc.SetLayoutRTL( nScTab, sal_True ); rTabSett.mbSelected = maData.mbSelected || bDisplayed; // first visible cell in top-left pane and in additional pane(s) rTabSett.maFirstVis = rAddrConv.CreateValidAddress( maData.maFirstXclPos, nScTab, false ); rTabSett.maSecondVis = rAddrConv.CreateValidAddress( maData.maSecondXclPos, nScTab, false ); // cursor position and selection if( const XclSelectionData* pSelData = maData.GetSelectionData( maData.mnActivePane ) ) { rTabSett.maCursor = rAddrConv.CreateValidAddress( pSelData->maXclCursor, nScTab, false ); rAddrConv.ConvertRangeList( rTabSett.maSelection, pSelData->maXclSelection, nScTab, false ); } // active pane switch( maData.mnActivePane ) { case EXC_PANE_TOPLEFT: rTabSett.meActivePane = SCEXT_PANE_TOPLEFT; break; case EXC_PANE_TOPRIGHT: rTabSett.meActivePane = SCEXT_PANE_TOPRIGHT; break; case EXC_PANE_BOTTOMLEFT: rTabSett.meActivePane = SCEXT_PANE_BOTTOMLEFT; break; case EXC_PANE_BOTTOMRIGHT: rTabSett.meActivePane = SCEXT_PANE_BOTTOMRIGHT; break; } // freeze/split position rTabSett.mbFrozenPanes = maData.mbFrozenPanes; if( maData.mbFrozenPanes ) { /* Frozen panes: handle split position as row/column positions. #i35812# Excel uses number of visible rows/columns, Calc uses position of freeze. */ if( (maData.mnSplitX > 0) && (maData.maFirstXclPos.mnCol + maData.mnSplitX <= GetScMaxPos().Col()) ) rTabSett.maFreezePos.SetCol( static_cast< SCCOL >( maData.maFirstXclPos.mnCol + maData.mnSplitX ) ); if( (maData.mnSplitY > 0) && (maData.maFirstXclPos.mnRow + maData.mnSplitY <= GetScMaxPos().Row()) ) rTabSett.maFreezePos.SetRow( static_cast< SCROW >( maData.maFirstXclPos.mnRow + maData.mnSplitY ) ); } else { // split window: position is in twips rTabSett.maSplitPos.X() = static_cast< long >( maData.mnSplitX ); rTabSett.maSplitPos.Y() = static_cast< long >( maData.mnSplitY ); } // grid color if( maData.mbDefGridColor ) rTabSett.maGridColor.SetColor( COL_AUTO ); else rTabSett.maGridColor = maData.maGridColor; // view mode and zoom if( maData.mnCurrentZoom != 0 ) (maData.mbPageMode ? maData.mnPageZoom : maData.mnNormalZoom) = maData.mnCurrentZoom; rTabSett.mbPageMode = maData.mbPageMode; rTabSett.mnNormalZoom = lclGetScZoom( maData.mnNormalZoom, EXC_WIN2_NORMALZOOM_DEF ); rTabSett.mnPageZoom = lclGetScZoom( maData.mnPageZoom, EXC_WIN2_PAGEZOOM_DEF ); // *** additional handling for displayed sheet *** if( bDisplayed ) { // set Excel sheet settings globally at Calc document, take settings from displayed sheet ScViewOptions aViewOpt( rDoc.GetViewOptions() ); aViewOpt.SetOption( VOPT_FORMULAS, maData.mbShowFormulas ); aViewOpt.SetOption( VOPT_GRID, maData.mbShowGrid ); aViewOpt.SetOption( VOPT_HEADER, maData.mbShowHeadings ); aViewOpt.SetOption( VOPT_NULLVALS, maData.mbShowZeros ); aViewOpt.SetOption( VOPT_OUTLINER, maData.mbShowOutline ); rDoc.SetViewOptions( aViewOpt ); } // *** set tab bg color if ( !maData.IsDefaultTabBgColor() ) rDoc.SetTabBgColor(nScTab, maData.maTabBgColor); } // ============================================================================