| /************************************************************** |
| * |
| * 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); |
| } |
| |
| // ============================================================================ |
| |