blob: 40bd552805a92a32ca3fc6535c93bdd44ad1ba79 [file] [log] [blame]
/**************************************************************
*
* 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 ---------------------------------------------------------------
#define _ZFORLIST_DECLARE_TABLE
#include "scitems.hxx"
#include <svl/stritem.hxx>
#include <svl/whiter.hxx>
#include <svl/zformat.hxx>
#include <editeng/boxitem.hxx>
#include <svx/numinf.hxx>
#include <svl/srchitem.hxx>
#include <svx/zoomslideritem.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/request.hxx>
#include <vcl/msgbox.hxx>
#include "global.hxx"
#include "attrib.hxx"
#include "patattr.hxx"
#include "document.hxx"
#include "cell.hxx" // Input Status Edit-Zellen
#include "globstr.hrc"
#include "scmod.hxx"
#include "inputhdl.hxx"
#include "inputwin.hxx"
#include "docsh.hxx"
#include "viewdata.hxx"
//CHINA001 #include "attrdlg.hxx"
#include "appoptio.hxx"
#include "sc.hrc"
#include "stlpool.hxx"
#include "tabvwsh.hxx"
#include "dwfunctr.hxx"
#include "scabstdlg.hxx" //CHINA001
#include "compiler.hxx"
sal_Bool ScTabViewShell::GetFunction( String& rFuncStr, sal_uInt16 nErrCode )
{
String aStr;
ScSubTotalFunc eFunc = (ScSubTotalFunc) SC_MOD()->GetAppOptions().GetStatusFunc();
ScViewData* pViewData = GetViewData();
ScMarkData& rMark = pViewData->GetMarkData();
bool bIgnoreError = (rMark.IsMarked() || rMark.IsMultiMarked());
if (bIgnoreError && (eFunc == SUBTOTAL_FUNC_CNT || eFunc == SUBTOTAL_FUNC_CNT2))
nErrCode = 0;
if (nErrCode)
{
rFuncStr = ScGlobal::GetLongErrorString(nErrCode);
return true;
}
sal_uInt16 nGlobStrId = 0;
switch (eFunc)
{
case SUBTOTAL_FUNC_AVE: nGlobStrId = STR_FUN_TEXT_AVG; break;
case SUBTOTAL_FUNC_CNT: nGlobStrId = STR_FUN_TEXT_COUNT; break;
case SUBTOTAL_FUNC_CNT2: nGlobStrId = STR_FUN_TEXT_COUNT2; break;
case SUBTOTAL_FUNC_MAX: nGlobStrId = STR_FUN_TEXT_MAX; break;
case SUBTOTAL_FUNC_MIN: nGlobStrId = STR_FUN_TEXT_MIN; break;
case SUBTOTAL_FUNC_SUM: nGlobStrId = STR_FUN_TEXT_SUM; break;
default:
{
// added to avoid warnings
}
}
if (nGlobStrId)
{
ScDocument* pDoc = pViewData->GetDocument();
SCCOL nPosX = pViewData->GetCurX();
SCROW nPosY = pViewData->GetCurY();
SCTAB nTab = pViewData->GetTabNo();
aStr = ScGlobal::GetRscString(nGlobStrId);
aStr += '=';
ScAddress aCursor( nPosX, nPosY, nTab );
double nVal;
if ( pDoc->GetSelectionFunction( eFunc, aCursor, rMark, nVal ) )
{
if ( nVal == 0.0 )
aStr += '0';
else
{
// Anzahl im Standardformat, die anderen nach Cursorposition
SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
sal_uInt32 nNumFmt = 0;
if ( eFunc != SUBTOTAL_FUNC_CNT && eFunc != SUBTOTAL_FUNC_CNT2 )
{
// Zahlformat aus Attributen oder Formel
pDoc->GetNumberFormat( nPosX, nPosY, nTab, nNumFmt );
if ( (nNumFmt % SV_COUNTRY_LANGUAGE_OFFSET) == 0 )
{
ScBaseCell* pCell;
pDoc->GetCell( nPosX, nPosY, nTab, pCell );
if (pCell && pCell->GetCellType() == CELLTYPE_FORMULA)
{
nNumFmt = ((ScFormulaCell*)pCell)->GetStandardFormat(*pFormatter, nNumFmt );
}
}
}
String aValStr;
Color* pDummy;
pFormatter->GetOutputString( nVal, nNumFmt, aValStr, &pDummy );
aStr += aValStr;
}
}
rFuncStr = aStr;
return sal_True;
}
return sal_False;
}
// Funktionen, die je nach Selektion disabled sind
// Default:
// SID_DELETE,
// SID_DELETE_CONTENTS,
// FID_DELETE_CELL
// FID_VALIDATION
void __EXPORT ScTabViewShell::GetState( SfxItemSet& rSet )
{
ScViewData* pViewData = GetViewData();
ScDocument* pDoc = pViewData->GetDocument();
ScDocShell* pDocShell = pViewData->GetDocShell();
ScMarkData& rMark = pViewData->GetMarkData();
SCCOL nPosX = pViewData->GetCurX();
SCROW nPosY = pViewData->GetCurY();
SCTAB nTab = pViewData->GetTabNo();
sal_uInt16 nMyId = 0;
SfxViewFrame* pThisFrame = GetViewFrame();
sal_Bool bOle = GetViewFrame()->GetFrame().IsInPlace();
SCTAB nTabCount = pDoc->GetTableCount();
SCTAB nTabSelCount = rMark.GetSelectCount();
SfxWhichIter aIter(rSet);
sal_uInt16 nWhich = aIter.FirstWhich();
while ( nWhich )
{
switch ( nWhich )
{
case FID_CHG_COMMENT:
{
ScDocShell* pDocSh = GetViewData()->GetDocShell();
ScAddress aPos( nPosX, nPosY, nTab );
if ( pDocSh->IsReadOnly() || !pDocSh->GetChangeAction(aPos) || pDocSh->IsDocShared() )
rSet.DisableItem( nWhich );
}
break;
case SID_OPENDLG_EDIT_PRINTAREA:
case SID_ADD_PRINTAREA:
case SID_DEFINE_PRINTAREA:
{
if ( pDocShell && pDocShell->IsDocShared() )
{
rSet.DisableItem( nWhich );
}
}
break;
case SID_DELETE_PRINTAREA:
if ( nTabSelCount > 1 )
{
// #i22589# also take "Print Entire Sheet" into account here
sal_Bool bHas = sal_False;
for (SCTAB i=0; !bHas && i<nTabCount; i++)
bHas = rMark.GetTableSelect(i) && (pDoc->GetPrintRangeCount(i) || pDoc->IsPrintEntireSheet(i));
if (!bHas)
rSet.DisableItem( nWhich );
}
else if ( !pDoc->GetPrintRangeCount( nTab ) && !pDoc->IsPrintEntireSheet( nTab ) )
rSet.DisableItem( nWhich );
if ( pDocShell && pDocShell->IsDocShared() )
{
rSet.DisableItem( nWhich );
}
break;
case SID_STATUS_PAGESTYLE:
case SID_HFEDIT:
GetViewData()->GetDocShell()->GetStatePageStyle( *this, rSet, nTab );
break;
case SID_SEARCH_ITEM:
rSet.Put( ScGlobal::GetSearchItem() );
break;
case SID_SEARCH_OPTIONS:
{
sal_uInt16 nOptions = 0xffff; // alles erlaubt
// wenn ReadOnly, kein Ersetzen:
if (GetViewData()->GetDocShell()->IsReadOnly())
nOptions &= ~( SEARCH_OPTIONS_REPLACE | SEARCH_OPTIONS_REPLACE_ALL );
rSet.Put( SfxUInt16Item( nWhich, nOptions ) );
}
break;
case SID_CURRENTCELL:
{
ScAddress aScAddress( GetViewData()->GetCurX(), GetViewData()->GetCurY(), 0 );
String aAddr;
aScAddress.Format( aAddr, SCA_ABS, NULL, pDoc->GetAddressConvention() );
SfxStringItem aPosItem( SID_CURRENTCELL, aAddr );
rSet.Put( aPosItem );
}
break;
case SID_CURRENTTAB:
// Tabelle fuer Basic ist 1-basiert
rSet.Put( SfxUInt16Item( nWhich, static_cast<sal_uInt16>(GetViewData()->GetTabNo()) + 1 ) );
break;
case SID_CURRENTDOC:
rSet.Put( SfxStringItem( nWhich, GetViewData()->GetDocShell()->GetTitle() ) );
break;
case FID_TOGGLEINPUTLINE:
{
sal_uInt16 nId = ScInputWindowWrapper::GetChildWindowId();
if ( pThisFrame->KnowsChildWindow( nId ) )
{
SfxChildWindow* pWnd = pThisFrame->GetChildWindow( nId );
rSet.Put( SfxBoolItem( nWhich, pWnd ? sal_True : sal_False ) );
}
else
rSet.DisableItem( nWhich );
}
break;
case FID_DEL_MANUALBREAKS:
if (!pDoc->HasManualBreaks(nTab))
rSet.DisableItem( nWhich );
break;
case FID_RESET_PRINTZOOM:
{
// disablen, wenn schon Default eingestellt
String aStyleName = pDoc->GetPageStyle( nTab );
ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStyleName,
SFX_STYLE_FAMILY_PAGE );
DBG_ASSERT( pStyleSheet, "PageStyle not found" );
if ( pStyleSheet )
{
SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
sal_uInt16 nScale = ((const SfxUInt16Item&)
rStyleSet.Get(ATTR_PAGE_SCALE)).GetValue();
sal_uInt16 nPages = ((const SfxUInt16Item&)
rStyleSet.Get(ATTR_PAGE_SCALETOPAGES)).GetValue();
if ( nScale == 100 && nPages == 0 )
rSet.DisableItem( nWhich );
}
}
break;
case FID_SCALE:
case SID_ATTR_ZOOM:
if ( bOle )
rSet.DisableItem( nWhich );
else
{
const Fraction& rOldY = GetViewData()->GetZoomY();
sal_uInt16 nZoom = (sal_uInt16)(( rOldY.GetNumerator() * 100 )
/ rOldY.GetDenominator());
rSet.Put( SvxZoomItem( SVX_ZOOM_PERCENT, nZoom, nWhich ) );
}
break;
case SID_ATTR_ZOOMSLIDER:
{
if ( bOle )
rSet.DisableItem( nWhich );
else
{
const Fraction& rOldY = GetViewData()->GetZoomY();
sal_uInt16 nCurrentZoom = (sal_uInt16)(( rOldY.GetNumerator() * 100 ) / rOldY.GetDenominator());
if( nCurrentZoom )
{
SvxZoomSliderItem aZoomSliderItem( nCurrentZoom, MINZOOM, MAXZOOM, SID_ATTR_ZOOMSLIDER );
aZoomSliderItem.AddSnappingPoint( 100 );
rSet.Put( aZoomSliderItem );
}
}
}
break;
case FID_TOGGLESYNTAX:
rSet.Put(SfxBoolItem(nWhich, GetViewData()->IsSyntaxMode()));
break;
case FID_TOGGLEHEADERS:
rSet.Put(SfxBoolItem(nWhich, GetViewData()->IsHeaderMode()));
break;
case FID_TOGGLEFORMULA:
{
const ScViewOptions& rOpts = pViewData->GetOptions();
sal_Bool bFormulaMode = rOpts.GetOption( VOPT_FORMULAS );
rSet.Put(SfxBoolItem(nWhich, bFormulaMode ));
}
break;
case FID_NORMALVIEWMODE:
case FID_PAGEBREAKMODE:
// always handle both slots - they exclude each other
if ( bOle )
{
rSet.DisableItem( FID_NORMALVIEWMODE );
rSet.DisableItem( FID_PAGEBREAKMODE );
}
else
{
rSet.Put(SfxBoolItem(FID_NORMALVIEWMODE, !GetViewData()->IsPagebreakMode()));
rSet.Put(SfxBoolItem(FID_PAGEBREAKMODE, GetViewData()->IsPagebreakMode()));
}
break;
case FID_FUNCTION_BOX:
nMyId = ScFunctionChildWindow::GetChildWindowId();
rSet.Put(SfxBoolItem(FID_FUNCTION_BOX, pThisFrame->HasChildWindow(nMyId)));
break;
case FID_PROTECT_DOC:
{
if ( pDocShell && pDocShell->IsDocShared() )
{
rSet.DisableItem( nWhich );
}
else
{
rSet.Put( SfxBoolItem( nWhich, pDoc->IsDocProtected() ) );
}
}
break;
case FID_PROTECT_TABLE:
{
if ( pDocShell && pDocShell->IsDocShared() )
{
rSet.DisableItem( nWhich );
}
else
{
rSet.Put( SfxBoolItem( nWhich, pDoc->IsTabProtected( nTab ) ) );
}
}
break;
case SID_AUTO_OUTLINE:
{
if (pDoc->GetChangeTrack()!=NULL || GetViewData()->IsMultiMarked())
{
rSet.DisableItem( nWhich );
}
}
break;
case SID_OUTLINE_DELETEALL:
{
SCTAB nOlTab = GetViewData()->GetTabNo();
ScOutlineTable* pOlTable = pDoc->GetOutlineTable( nOlTab );
if (pOlTable == NULL)
rSet.DisableItem( nWhich );
}
break;
case SID_WINDOW_SPLIT:
rSet.Put(SfxBoolItem(nWhich,
pViewData->GetHSplitMode() == SC_SPLIT_NORMAL ||
pViewData->GetVSplitMode() == SC_SPLIT_NORMAL ));
break;
case SID_WINDOW_FIX:
rSet.Put(SfxBoolItem(nWhich,
pViewData->GetHSplitMode() == SC_SPLIT_FIX ||
pViewData->GetVSplitMode() == SC_SPLIT_FIX ));
break;
case FID_CHG_SHOW:
{
if ( pDoc->GetChangeTrack() == NULL || ( pDocShell && pDocShell->IsDocShared() ) )
rSet.DisableItem( nWhich );
}
break;
case FID_CHG_ACCEPT:
{
rSet.Put(SfxBoolItem(FID_CHG_ACCEPT,
pThisFrame->HasChildWindow(FID_CHG_ACCEPT)));
if(pDoc->GetChangeTrack()==NULL)
{
if ( !pThisFrame->HasChildWindow(FID_CHG_ACCEPT) )
{
rSet.DisableItem( nWhich);
}
}
if ( pDocShell && pDocShell->IsDocShared() )
{
rSet.DisableItem( nWhich );
}
}
break;
case SID_FORMATPAGE:
//! bei geschuetzten Tabellen ???
if ( pDocShell && ( pDocShell->IsReadOnly() || pDocShell->IsDocShared() ) )
rSet.DisableItem( nWhich );
break;
case SID_PRINTPREVIEW:
// #58924# Toggle-Slot braucht einen State
rSet.Put( SfxBoolItem( nWhich, sal_False ) );
break;
case SID_READONLY_MODE:
rSet.Put( SfxBoolItem( nWhich, GetViewData()->GetDocShell()->IsReadOnly() ) );
break;
case FID_TAB_DESELECTALL:
if ( nTabSelCount == 1 )
rSet.DisableItem( nWhich ); // enabled only if several sheets are selected
break;
} // switch ( nWitch )
nWhich = aIter.NextWhich();
} // while ( nWitch )
}
//------------------------------------------------------------------
void ScTabViewShell::ExecuteCellFormatDlg( SfxRequest& rReq, sal_uInt16 nTabPage )
{
//CHINA001 ScAttrDlg* pDlg = NULL;
SfxAbstractTabDialog * pDlg = NULL; //CHINA001
ScDocument* pDoc = GetViewData()->GetDocument();
SvxBoxItem aLineOuter( ATTR_BORDER );
SvxBoxInfoItem aLineInner( ATTR_BORDER_INNER );
SvxNumberInfoItem* pNumberInfoItem = NULL;
const ScPatternAttr* pOldAttrs = GetSelectionPattern();
SfxItemSet* pOldSet = new SfxItemSet(
pOldAttrs->GetItemSet() );
// Umrandungs-Items holen und in den Set packen:
GetSelectionFrame( aLineOuter, aLineInner );
pOldSet->Put( aLineOuter );
pOldSet->Put( aLineInner );
// NumberFormat Value aus Value und Language erzeugen und eintueten
pOldSet->Put( SfxUInt32Item( ATTR_VALUE_FORMAT,
pOldAttrs->GetNumberFormat( pDoc->GetFormatTable() ) ) );
MakeNumberInfoItem( pDoc, GetViewData(), &pNumberInfoItem );
pOldSet->MergeRange( SID_ATTR_NUMBERFORMAT_INFO, SID_ATTR_NUMBERFORMAT_INFO );
pOldSet->Put(*pNumberInfoItem );
bInFormatDialog = sal_True;
//CHINA001 pDlg = new ScAttrDlg( GetViewFrame(), GetDialogParent(), pOldSet );
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
pDlg = pFact->CreateScAttrDlg( GetViewFrame(), GetDialogParent(), pOldSet, RID_SCDLG_ATTR);
DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
if ( nTabPage != 0xffff )
pDlg->SetCurPageId( nTabPage );
short nResult = pDlg->Execute();
bInFormatDialog = sal_False;
if ( nResult == RET_OK )
{
const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
const SfxPoolItem* pItem=NULL;
if(pOutSet->GetItemState(SID_ATTR_NUMBERFORMAT_INFO,sal_True,&pItem)==SFX_ITEM_SET)
{
UpdateNumberFormatter( pDoc,(const SvxNumberInfoItem&)*pItem);
}
ApplyAttributes( pOutSet, pOldSet );
rReq.Done( *pOutSet );
}
delete pOldSet;
delete pNumberInfoItem;
delete pDlg;
}
//------------------------------------------------------------------
bool ScTabViewShell::IsRefInputMode() const
{
ScModule* pScMod = SC_MOD();
if ( pScMod )
{
if( pScMod->IsRefDialogOpen() )
return pScMod->IsFormulaMode();
if( pScMod->IsFormulaMode() )
{
ScInputHandler* pHdl = pScMod->GetInputHdl();
if ( pHdl )
{
String aString = pHdl->GetEditString();
if ( !pHdl->GetSelIsRef() && aString.Len() > 1 &&
( aString.GetChar(0) == '+' || aString.GetChar(0) == '-' ) )
{
const ScViewData* pViewData = GetViewData();
if ( pViewData )
{
ScDocument* pDoc = pViewData->GetDocument();
if ( pDoc )
{
const ScAddress aPos( pViewData->GetCurPos() );
ScCompiler aComp( pDoc, aPos );
aComp.SetGrammar(pDoc->GetGrammar());
aComp.SetCloseBrackets( false );
ScTokenArray* pArr = aComp.CompileString( aString );
if ( pArr && pArr->MayReferenceFollow() )
{
return true;
}
}
}
}
else
{
return true;
}
}
}
}
return false;
}
//------------------------------------------------------------------
void ScTabViewShell::ExecuteInputDirect()
{
if ( !IsRefInputMode() )
{
ScModule* pScMod = SC_MOD();
if ( pScMod )
{
pScMod->InputEnterHandler();
}
}
}
//------------------------------------------------------------------
void ScTabViewShell::UpdateInputHandler( sal_Bool bForce /* = sal_False */, sal_Bool bStopEditing /* = sal_True */ )
{
ScInputHandler* pHdl = pInputHandler ? pInputHandler : SC_MOD()->GetInputHdl();
if ( pHdl )
{
String aString;
const EditTextObject* pObject = NULL;
ScViewData* pViewData = GetViewData();
ScDocument* pDoc = pViewData->GetDocument();
CellType eType;
SCCOL nPosX = pViewData->GetCurX();
SCROW nPosY = pViewData->GetCurY();
SCTAB nTab = pViewData->GetTabNo();
SCTAB nStartTab = 0;
SCTAB nEndTab = 0;
SCCOL nStartCol = 0;
SCROW nStartRow = 0;
SCCOL nEndCol = 0;
SCROW nEndRow = 0;
pViewData->GetSimpleArea( nStartCol, nStartRow, nStartTab,
nEndCol, nEndRow, nEndTab );
PutInOrder( nStartCol, nEndCol );
PutInOrder( nStartRow, nEndRow );
PutInOrder( nStartTab, nEndTab );
sal_Bool bHideFormula = sal_False;
sal_Bool bHideAll = sal_False;
if (pDoc->IsTabProtected(nTab))
{
const ScProtectionAttr* pProt = (const ScProtectionAttr*)
pDoc->GetAttr( nPosX,nPosY,nTab,
ATTR_PROTECTION);
bHideFormula = pProt->GetHideFormula();
bHideAll = pProt->GetHideCell();
}
if (!bHideAll)
{
pDoc->GetCellType( nPosX, nPosY, nTab, eType );
if (eType == CELLTYPE_FORMULA)
{
if (!bHideFormula)
pDoc->GetFormula( nPosX, nPosY, nTab, aString );
}
else if (eType == CELLTYPE_EDIT)
{
ScBaseCell* pCell;
pDoc->GetCell( nPosX, nPosY, nTab, pCell );
((ScEditCell*)pCell)->GetData( pObject );
}
else
{
pDoc->GetInputString( nPosX, nPosY, nTab, aString );
if (eType == CELLTYPE_STRING)
{
// Bei Bedarf ein ' vorneweg, damit der String nicht ungewollt
// als Zahl interpretiert wird, und um dem Benutzer zu zeigen,
// dass es ein String ist (#35060#).
//! Auch bei Zahlformat "Text"? -> dann beim Editieren wegnehmen
SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
sal_uInt32 nNumFmt;
pDoc->GetNumberFormat( nPosX, nPosY, nTab, nNumFmt );
double fDummy;
if ( pFormatter->IsNumberFormat(aString, nNumFmt, fDummy) )
aString.Insert('\'',0);
}
}
}
ScInputHdlState aState( ScAddress( nPosX, nPosY, nTab ),
ScAddress( nStartCol, nStartRow, nTab ),
ScAddress( nEndCol, nEndRow, nTab ),
aString,
pObject );
// if using the view's local input handler, this view can always be set
// as current view inside NotifyChange.
ScTabViewShell* pSourceSh = pInputHandler ? this : NULL;
pHdl->NotifyChange( &aState, bForce, pSourceSh, bStopEditing );
}
SfxBindings& rBindings = GetViewFrame()->GetBindings();
rBindings.Invalidate( SID_STATUS_SUM ); // immer zusammen mit Eingabezeile
rBindings.Invalidate( SID_ATTR_SIZE );
rBindings.Invalidate( SID_TABLE_CELL );
}
void ScTabViewShell::UpdateInputHandlerCellAdjust( SvxCellHorJustify eJust )
{
if( ScInputHandler* pHdl = pInputHandler ? pInputHandler : SC_MOD()->GetInputHdl() )
pHdl->UpdateCellAdjust( eJust );
}
//------------------------------------------------------------------
void __EXPORT ScTabViewShell::ExecuteSave( SfxRequest& rReq )
{
// nur SID_SAVEDOC / SID_SAVEASDOC
// Eingabe auf jeden Fall abschliessen, auch wenn eine Formel bearbeitet wird
SC_MOD()->InputEnterHandler();
if ( GetViewData()->GetDocShell()->IsDocShared() )
{
GetViewData()->GetDocShell()->SetDocumentModified();
}
// ansonsten normal weiter
GetViewData()->GetDocShell()->ExecuteSlot( rReq );
}
void __EXPORT ScTabViewShell::GetSaveState( SfxItemSet& rSet )
{
SfxShell* pDocSh = GetViewData()->GetDocShell();
SfxWhichIter aIter(rSet);
sal_uInt16 nWhich = aIter.FirstWhich();
while( nWhich )
{
if ( nWhich != SID_SAVEDOC || !GetViewData()->GetDocShell()->IsDocShared() )
{
// get state from DocShell
pDocSh->GetSlotState( nWhich, NULL, &rSet );
}
nWhich = aIter.NextWhich();
}
}
//------------------------------------------------------------------
void ScTabViewShell::ExecDrawOpt( SfxRequest& rReq )
{
ScViewOptions aViewOptions = GetViewData()->GetOptions();
ScGridOptions aGridOptions = aViewOptions.GetGridOptions();
SfxBindings& rBindings = GetViewFrame()->GetBindings();
const SfxItemSet* pArgs = rReq.GetArgs();
const SfxPoolItem* pItem;
sal_uInt16 nSlotId = rReq.GetSlot();
switch (nSlotId)
{
case SID_GRID_VISIBLE:
if ( pArgs && pArgs->GetItemState(nSlotId,sal_True,&pItem) == SFX_ITEM_SET )
{
aGridOptions.SetGridVisible( ((const SfxBoolItem*)pItem)->GetValue() );
aViewOptions.SetGridOptions(aGridOptions);
rBindings.Invalidate(SID_GRID_VISIBLE);
}
break;
case SID_GRID_USE:
if ( pArgs && pArgs->GetItemState(nSlotId,sal_True,&pItem) == SFX_ITEM_SET )
{
aGridOptions.SetUseGridSnap( ((const SfxBoolItem*)pItem)->GetValue() );
aViewOptions.SetGridOptions(aGridOptions);
rBindings.Invalidate(SID_GRID_USE);
}
break;
case SID_HELPLINES_MOVE:
if ( pArgs && pArgs->GetItemState(nSlotId,sal_True,&pItem) == SFX_ITEM_SET )
{
aViewOptions.SetOption( VOPT_HELPLINES, ((const SfxBoolItem*)pItem)->GetValue() );
rBindings.Invalidate(SID_HELPLINES_MOVE);
}
break;
}
GetViewData()->SetOptions(aViewOptions);
}
void ScTabViewShell::GetDrawOptState( SfxItemSet& rSet )
{
SfxBoolItem aBool;
const ScViewOptions& rViewOptions = GetViewData()->GetOptions();
const ScGridOptions& rGridOptions = rViewOptions.GetGridOptions();
aBool.SetValue(rGridOptions.GetGridVisible());
aBool.SetWhich( SID_GRID_VISIBLE );
rSet.Put( aBool );
aBool.SetValue(rGridOptions.GetUseGridSnap());
aBool.SetWhich( SID_GRID_USE );
rSet.Put( aBool );
aBool.SetValue(rViewOptions.GetOption( VOPT_HELPLINES ));
aBool.SetWhich( SID_HELPLINES_MOVE );
rSet.Put( aBool );
}