blob: 8d3eebe2080c1331a24adae8db6c1a8382d2641f [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 ---------------------------------------------------------------
#include "scitems.hxx"
#include <editeng/eeitem.hxx>
#include <sfx2/app.hxx>
//CHINA001 #include <svx/zoom.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/dispatch.hxx>
#include <sfx2/passwd.hxx>
#include <sfx2/request.hxx>
#include <svl/ptitem.hxx>
#include <svl/stritem.hxx>
#include <tools/urlobj.hxx>
#include <sfx2/objface.hxx>
#include <vcl/msgbox.hxx>
#include <vcl/vclenum.hxx>
#include "globstr.hrc"
#include "scmod.hxx"
#include "appoptio.hxx"
#include "tabvwsh.hxx"
#include "document.hxx"
#include "sc.hrc"
#include "inputwin.hxx"
#include "scresid.hxx"
#include "printfun.hxx"
#include "docsh.hxx"
#include "rangelst.hxx"
#include "prevwsh.hxx"
#include "rangeutl.hxx"
#include "reffact.hxx"
#include "uiitems.hxx"
#include "cell.hxx"
#include "inputhdl.hxx"
//CHINA001 #include "scendlg.hxx"
//CHINA001 #include "mtrindlg.hxx"
#include "autoform.hxx"
#include "autofmt.hxx"
#include "dwfunctr.hxx"
#include "shtabdlg.hxx"
#include "tabprotection.hxx"
#include "protectiondlg.hxx"
#include <svl/ilstitem.hxx>
#define _SVSTDARR_ULONGS
#include <svl/svstdarr.hxx>
#include <svx/zoomslideritem.hxx>
#include <svx/svxdlg.hxx> //CHINA001
#include <svx/dialogs.hrc> //CHINA001
#include "scabstdlg.hxx" //CHINA001
#include <memory>
using ::std::auto_ptr;
#define IS_EDITMODE() GetViewData()->HasEditView( GetViewData()->GetActivePart() )
#define IS_AVAILABLE(WhichId,ppItem) \
(pReqArgs->GetItemState((WhichId), sal_True, ppItem ) == SFX_ITEM_SET)
#define GET_STRING(nid) ((const SfxStringItem&)pReqArgs->Get(nid)).GetValue()
#define GET_UINT16(nid) ((const SfxUInt16Item&)pReqArgs->Get(nid)).GetValue()
#define GET_BOOL(nid) ((const SfxBoolItem&)pReqArgs->Get(nid)).GetValue()
#define RECALC_PAGE(pDocSh) ScPrintFunc( pDocSh, GetPrinter(), nCurTab ).UpdatePages()
//------------------------------------------------------------------
/** Try to parse the given range using Calc-style syntax first, then
Excel-style if that fails. */
sal_uInt16 lcl_ParseRange(ScRange& rScRange, const String& aAddress, ScDocument* pDoc, sal_uInt16 /* nSlot */)
{
sal_uInt16 nResult = rScRange.Parse(aAddress, pDoc);
if ( (nResult & SCA_VALID) )
return nResult;
return rScRange.Parse(aAddress, pDoc, ScAddress::Details(formula::FormulaGrammar::CONV_XL_A1, 0, 0));
}
/** Try to parse the given address using Calc-style syntax first, then
Excel-style if that fails. */
sal_uInt16 lcl_ParseAddress(ScAddress& rScAddress, const String& aAddress, ScDocument* pDoc, sal_uInt16 /* nSlot */)
{
sal_uInt16 nResult = rScAddress.Parse(aAddress, pDoc);
if ( (nResult & SCA_VALID) )
return nResult;
return rScAddress.Parse(aAddress, pDoc, ScAddress::Details(formula::FormulaGrammar::CONV_XL_A1, 0, 0));
}
void ScTabViewShell::Execute( SfxRequest& rReq )
{
SfxViewFrame* pThisFrame = GetViewFrame();
SfxBindings& rBindings = pThisFrame->GetBindings();
ScModule* pScMod = SC_MOD();
const SfxItemSet* pReqArgs = rReq.GetArgs();
sal_uInt16 nSlot = rReq.GetSlot();
if (nSlot != SID_CURRENTCELL) // der kommt beim MouseButtonUp
HideListBox(); // Autofilter-DropDown-Listbox
switch ( nSlot )
{
case FID_INSERT_FILE:
{
const SfxPoolItem* pItem;
if ( pReqArgs &&
pReqArgs->GetItemState(FID_INSERT_FILE,sal_True,&pItem) == SFX_ITEM_SET )
{
String aFileName = ((const SfxStringItem*)pItem)->GetValue();
// Einfuege-Position
Point aInsertPos;
if ( pReqArgs->GetItemState(FN_PARAM_1,sal_True,&pItem) == SFX_ITEM_SET )
aInsertPos = ((const SfxPointItem*)pItem)->GetValue();
else
aInsertPos = GetInsertPos();
// als Link?
sal_Bool bAsLink = sal_False;
if ( pReqArgs->GetItemState(FN_PARAM_2,sal_True,&pItem) == SFX_ITEM_SET )
bAsLink = ((const SfxBoolItem*)pItem)->GetValue();
// ausfuehren
PasteFile( aInsertPos, aFileName, bAsLink );
}
}
break;
case SID_OPENDLG_EDIT_PRINTAREA:
{
sal_uInt16 nId = ScPrintAreasDlgWrapper::GetChildWindowId();
SfxChildWindow* pWnd = pThisFrame->GetChildWindow( nId );
pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True );
}
break;
case SID_CHANGE_PRINTAREA:
{
if ( pReqArgs ) // OK aus Dialog
{
String aPrintStr;
String aRowStr;
String aColStr;
sal_Bool bEntire = sal_False;
const SfxPoolItem* pItem;
if ( pReqArgs->GetItemState( SID_CHANGE_PRINTAREA, sal_True, &pItem ) == SFX_ITEM_SET )
aPrintStr = static_cast<const SfxStringItem*>(pItem)->GetValue();
if ( pReqArgs->GetItemState( FN_PARAM_2, sal_True, &pItem ) == SFX_ITEM_SET )
aRowStr = static_cast<const SfxStringItem*>(pItem)->GetValue();
if ( pReqArgs->GetItemState( FN_PARAM_3, sal_True, &pItem ) == SFX_ITEM_SET )
aColStr = static_cast<const SfxStringItem*>(pItem)->GetValue();
if ( pReqArgs->GetItemState( FN_PARAM_4, sal_True, &pItem ) == SFX_ITEM_SET )
bEntire = static_cast<const SfxBoolItem*>(pItem)->GetValue();
SetPrintRanges( bEntire, &aPrintStr, &aColStr, &aRowStr, sal_False );
rReq.Done();
}
}
break;
case SID_ADD_PRINTAREA:
case SID_DEFINE_PRINTAREA: // Menue oder Basic
{
sal_Bool bAdd = ( nSlot == SID_ADD_PRINTAREA );
if ( pReqArgs )
{
String aPrintStr;
const SfxPoolItem* pItem;
if ( pReqArgs->GetItemState( SID_DEFINE_PRINTAREA, sal_True, &pItem ) == SFX_ITEM_SET )
aPrintStr = static_cast<const SfxStringItem*>(pItem)->GetValue();
SetPrintRanges( sal_False, &aPrintStr, NULL, NULL, bAdd );
}
else
{
SetPrintRanges( sal_False, NULL, NULL, NULL, bAdd ); // aus Selektion
rReq.Done();
}
}
break;
case SID_DELETE_PRINTAREA:
{
String aEmpty;
SetPrintRanges( sal_False, &aEmpty, NULL, NULL, sal_False ); // Druckbereich loeschen
rReq.Done();
}
break;
case FID_DEL_MANUALBREAKS:
RemoveManualBreaks();
rReq.Done();
break;
case FID_ADJUST_PRINTZOOM:
AdjustPrintZoom();
rReq.Done();
break;
case FID_RESET_PRINTZOOM:
SetPrintZoom( 100, 0 ); // 100%, nicht auf Seiten
rReq.Done();
break;
case SID_FORMATPAGE:
case SID_STATUS_PAGESTYLE:
case SID_HFEDIT:
GetViewData()->GetDocShell()->
ExecutePageStyle( *this, rReq, GetViewData()->GetTabNo() );
break;
case SID_JUMPTOMARK:
case SID_CURRENTCELL:
if ( pReqArgs )
{
String aAddress;
const SfxPoolItem* pItem;
if ( pReqArgs->GetItemState( nSlot, sal_True, &pItem ) == SFX_ITEM_SET )
aAddress = ((const SfxStringItem*)pItem)->GetValue();
else if ( nSlot == SID_JUMPTOMARK && pReqArgs->GetItemState(
SID_JUMPTOMARK, sal_True, &pItem ) == SFX_ITEM_SET )
aAddress = ((const SfxStringItem*)pItem)->GetValue();
// #i14927# SID_CURRENTCELL with a single cell must unmark if FN_PARAM_1
// isn't set (for recorded macros, because IsAPI is no longer available).
// ScGridWindow::MouseButtonUp no longer executes the slot for a single
// cell if there is a multi selection.
sal_Bool bUnmark = ( nSlot == SID_CURRENTCELL );
if ( pReqArgs->GetItemState( FN_PARAM_1, sal_True, &pItem ) == SFX_ITEM_SET )
bUnmark = ((const SfxBoolItem*)pItem)->GetValue();
if ( nSlot == SID_JUMPTOMARK )
{
// #106586# URL has to be decoded for escaped characters (%20)
aAddress = INetURLObject::decode( aAddress, INET_HEX_ESCAPE,
INetURLObject::DECODE_WITH_CHARSET,
RTL_TEXTENCODING_UTF8 );
}
sal_Bool bFound = sal_False;
ScViewData* pViewData = GetViewData();
ScDocument* pDoc = pViewData->GetDocument();
ScMarkData& rMark = pViewData->GetMarkData();
ScRange aScRange;
ScAddress aScAddress;
sal_uInt16 nResult = lcl_ParseRange(aScRange, aAddress, pDoc, nSlot);
SCTAB nTab = pViewData->GetTabNo();
sal_Bool bMark = sal_True;
// Is this a range ?
if( nResult & SCA_VALID )
{
if ( nResult & SCA_TAB_3D )
{
if( aScRange.aStart.Tab() != nTab )
SetTabNo( nTab = aScRange.aStart.Tab() );
}
else
{
aScRange.aStart.SetTab( nTab );
aScRange.aEnd.SetTab( nTab );
}
}
// Is this a cell ?
else if ( (nResult = lcl_ParseAddress(aScAddress, aAddress, pDoc, nSlot)) & SCA_VALID )
{
if ( nResult & SCA_TAB_3D )
{
if( aScAddress.Tab() != nTab )
SetTabNo( nTab = aScAddress.Tab() );
}
else
aScAddress.SetTab( nTab );
aScRange = ScRange( aScAddress, aScAddress );
// Zellen sollen nicht markiert werden
bMark = sal_False;
}
// Ist es benahmster Bereich (erst Namen dann DBBereiche) ?
else
{
ScRangeUtil aRangeUtil;
formula::FormulaGrammar::AddressConvention eConv = pDoc->GetAddressConvention();
if( aRangeUtil.MakeRangeFromName( aAddress, pDoc, nTab, aScRange, RUTL_NAMES, eConv ) ||
aRangeUtil.MakeRangeFromName( aAddress, pDoc, nTab, aScRange, RUTL_DBASE, eConv ) )
{
nResult |= SCA_VALID;
if( aScRange.aStart.Tab() != nTab )
SetTabNo( nTab = aScRange.aStart.Tab() );
}
}
if ( !(nResult & SCA_VALID) &&
ByteString(aAddress, RTL_TEXTENCODING_ASCII_US).IsNumericAscii() )
{
sal_Int32 nNumeric = aAddress.ToInt32();
if ( nNumeric > 0 && nNumeric <= MAXROW+1 )
{
// 1-basierte Zeilennummer
aScAddress.SetRow( (SCROW)(nNumeric - 1) );
aScAddress.SetCol( pViewData->GetCurX() );
aScAddress.SetTab( nTab );
aScRange = ScRange( aScAddress, aScAddress );
bMark = sal_False;
nResult = SCA_VALID;
}
}
if ( !ValidRow(aScRange.aStart.Row()) || !ValidRow(aScRange.aEnd.Row()) )
nResult = 0;
// wir haben was gefunden
if( nResult & SCA_VALID )
{
bFound = sal_True;
SCCOL nCol = aScRange.aStart.Col();
SCROW nRow = aScRange.aStart.Row();
sal_Bool bNothing = ( pViewData->GetCurX()==nCol && pViewData->GetCurY()==nRow );
// markieren
if( bMark )
{
if (rMark.IsMarked()) // ist derselbe Bereich schon markiert?
{
ScRange aOldMark;
rMark.GetMarkArea( aOldMark );
aOldMark.Justify();
ScRange aCurrent = aScRange;
aCurrent.Justify();
bNothing = ( aCurrent == aOldMark );
}
else
bNothing = sal_False;
if (!bNothing)
MarkRange( aScRange, sal_False ); // Cursor kommt hinterher...
}
else
{
// remove old selection, unless bUnmark argument is sal_False (from navigator)
if( bUnmark )
{
MoveCursorAbs( nCol, nRow,
SC_FOLLOW_NONE, sal_False, sal_False );
}
}
// und Cursor setzen
// zusammengefasste Zellen beruecksichtigen:
while ( pDoc->IsHorOverlapped( nCol, nRow, nTab ) ) //! ViewData !!!
--nCol;
while ( pDoc->IsVerOverlapped( nCol, nRow, nTab ) )
--nRow;
// Navigator-Aufrufe sind nicht API!!!
if( bNothing )
{
if (rReq.IsAPI())
rReq.Ignore(); // wenn Makro, dann gar nix
else
rReq.Done(); // sonst wenigstens aufzeichnen
}
else
{
pViewData->ResetOldCursor();
SetCursor( nCol, nRow );
AlignToCursor( nCol, nRow, SC_FOLLOW_JUMP );
rBindings.Invalidate( SID_CURRENTCELL );
rBindings.Update( nSlot );
if (!rReq.IsAPI())
rReq.Done();
}
rReq.SetReturnValue( SfxStringItem( SID_CURRENTCELL, aAddress ) );
}
if (!bFound) // kein gueltiger Bereich
{
// wenn es ein Tabellenname ist, umschalten (fuer Navigator/URL's)
SCTAB nNameTab;
if ( pDoc->GetTable( aAddress, nNameTab ) )
{
bFound = sal_True;
if ( nNameTab != nTab )
SetTabNo( nNameTab );
}
}
if ( !bFound && nSlot == SID_JUMPTOMARK )
{
// Grafik-Objekte probieren (nur bei URL's)
bFound = SelectObject( aAddress );
}
if (!bFound && !rReq.IsAPI())
ErrorMessage( STR_ERR_INVALID_AREA );
}
break;
case SID_CURRENTOBJECT:
if ( pReqArgs )
{
String aName = ((const SfxStringItem&)pReqArgs->Get(nSlot)).GetValue();
SelectObject( aName );
}
break;
case SID_CURRENTTAB:
if ( pReqArgs )
{
// Tabelle fuer Basic ist 1-basiert
SCTAB nTab = ((const SfxUInt16Item&)pReqArgs->Get(nSlot)).GetValue() - 1;
ScDocument* pDoc = GetViewData()->GetDocument();
if ( nTab < pDoc->GetTableCount() )
{
SetTabNo( nTab );
rBindings.Update( nSlot );
if( ! rReq.IsAPI() )
rReq.Done();
}
//! sonst Fehler ?
}
break;
case SID_CURRENTDOC:
if ( pReqArgs )
{
String aStrDocName( ((const SfxStringItem&)pReqArgs->
Get(nSlot)).GetValue() );
SfxViewFrame* pViewFrame = NULL;
ScDocShell* pDocSh = (ScDocShell*)SfxObjectShell::GetFirst();
sal_Bool bFound = sal_False;
// zu aktivierenden ViewFrame suchen
while ( pDocSh && !bFound )
{
if ( pDocSh->GetTitle() == aStrDocName )
{
pViewFrame = SfxViewFrame::GetFirst( pDocSh );
bFound = ( NULL != pViewFrame );
}
pDocSh = (ScDocShell*)SfxObjectShell::GetNext( *pDocSh );
}
if ( bFound )
pViewFrame->GetFrame().Appear();
rReq.Ignore();//XXX wird von SFX erledigt
}
case SID_ATTR_SIZE://XXX ???
break;
case SID_PRINTPREVIEW:
{
if ( !pThisFrame->GetFrame().IsInPlace() ) // nicht bei OLE
{
// print preview is now always in the same frame as the tab view
// -> always switch this frame back to normal view
// (ScPreviewShell ctor reads view data)
// #102785#; finish input
pScMod->InputEnterHandler();
pThisFrame->GetDispatcher()->Execute( SID_VIEWSHELL1, SFX_CALLMODE_ASYNCHRON );
}
// else Fehler (z.B. Ole)
}
break;
case SID_DETECTIVE_DEL_ALL:
DetectiveDelAll();
rReq.Done();
break;
// SID_TABLE_ACTIVATE und SID_MARKAREA werden von Basic aus an der versteckten
// View aufgerufen, um auf der sichtbaren View zu markieren/umzuschalten:
case SID_TABLE_ACTIVATE:
DBG_ERROR("old slot SID_TABLE_ACTIVATE");
break;
case SID_REPAINT:
PaintGrid();
PaintTop();
PaintLeft();
PaintExtras();
rReq.Done();
break;
case FID_NORMALVIEWMODE:
case FID_PAGEBREAKMODE:
{
sal_Bool bWantPageBreak = nSlot == FID_PAGEBREAKMODE;
// check whether there is an explicit argument, use it
const SfxPoolItem* pItem;
if ( pReqArgs && pReqArgs->GetItemState(nSlot, sal_True, &pItem) == SFX_ITEM_SET )
{
sal_Bool bItemValue = ((const SfxBoolItem*)pItem)->GetValue();
bWantPageBreak = (nSlot == FID_PAGEBREAKMODE) == bItemValue;
}
if( GetViewData()->IsPagebreakMode() != bWantPageBreak )
{
SetPagebreakMode( bWantPageBreak );
UpdatePageBreakData();
SetCurSubShell( GetCurObjectSelectionType(), sal_True );
PaintGrid();
PaintTop();
PaintLeft();
rBindings.Invalidate( nSlot );
rReq.AppendItem( SfxBoolItem( nSlot, sal_True ) );
rReq.Done();
}
}
break;
case FID_FUNCTION_BOX:
{
sal_uInt16 nChildId = ScFunctionChildWindow::GetChildWindowId();
if ( rReq.GetArgs() )
pThisFrame->SetChildWindow( nChildId, ((const SfxBoolItem&) (rReq.GetArgs()->Get(FID_FUNCTION_BOX))).GetValue());
else
{
pThisFrame->ToggleChildWindow( nChildId );
rReq.AppendItem( SfxBoolItem( FID_FUNCTION_BOX , pThisFrame->HasChildWindow( nChildId ) ) );
}
GetViewFrame()->GetBindings().Invalidate(FID_FUNCTION_BOX);
rReq.Done ();
}
break;
case FID_TOGGLESYNTAX:
{
sal_Bool bSet = !GetViewData()->IsSyntaxMode();
const SfxPoolItem* pItem;
if ( pReqArgs && pReqArgs->GetItemState(nSlot, sal_True, &pItem) == SFX_ITEM_SET )
bSet = ((const SfxBoolItem*)pItem)->GetValue();
GetViewData()->SetSyntaxMode( bSet );
PaintGrid();
rBindings.Invalidate( FID_TOGGLESYNTAX );
rReq.AppendItem( SfxBoolItem( nSlot, bSet ) );
rReq.Done();
}
break;
case FID_TOGGLEHEADERS:
{
sal_Bool bSet = !GetViewData()->IsHeaderMode();
const SfxPoolItem* pItem;
if ( pReqArgs && pReqArgs->GetItemState(nSlot, sal_True, &pItem) == SFX_ITEM_SET )
bSet = ((const SfxBoolItem*)pItem)->GetValue();
GetViewData()->SetHeaderMode( bSet );
RepeatResize();
rBindings.Invalidate( FID_TOGGLEHEADERS );
rReq.AppendItem( SfxBoolItem( nSlot, bSet ) );
rReq.Done();
}
break;
case FID_TOGGLEFORMULA:
{
ScViewData* pViewData = GetViewData();
const ScViewOptions& rOpts = pViewData->GetOptions();
sal_Bool bFormulaMode = !rOpts.GetOption( VOPT_FORMULAS );
const SfxPoolItem *pItem;
if( pReqArgs && pReqArgs->GetItemState(nSlot, sal_True, &pItem) == SFX_ITEM_SET )
bFormulaMode = ((const SfxBoolItem *)pItem)->GetValue();
ScViewOptions rSetOpts = ScViewOptions( rOpts );
rSetOpts.SetOption( VOPT_FORMULAS, bFormulaMode );
pViewData->SetOptions( rSetOpts );
pViewData->GetDocShell()->PostPaintGridAll();
rBindings.Invalidate( FID_TOGGLEFORMULA );
rReq.AppendItem( SfxBoolItem( nSlot, bFormulaMode ) );
rReq.Done();
}
break;
case FID_TOGGLEINPUTLINE:
{
sal_uInt16 nId = ScInputWindowWrapper::GetChildWindowId();
SfxChildWindow* pWnd = pThisFrame->GetChildWindow( nId );
sal_Bool bSet = ( pWnd == NULL );
const SfxPoolItem* pItem;
if ( pReqArgs && pReqArgs->GetItemState(nSlot, sal_True, &pItem) == SFX_ITEM_SET )
bSet = ((const SfxBoolItem*)pItem)->GetValue();
pThisFrame->SetChildWindow( nId, bSet );
rBindings.Invalidate( FID_TOGGLEINPUTLINE );
rReq.AppendItem( SfxBoolItem( nSlot, bSet ) );
rReq.Done();
}
break;
case SID_ATTR_ZOOM: // Statuszeile
case FID_SCALE:
{
sal_Bool bSyncZoom = SC_MOD()->GetAppOptions().GetSynchronizeZoom();
SvxZoomType eOldZoomType = GetZoomType();
SvxZoomType eNewZoomType = eOldZoomType;
const Fraction& rOldY = GetViewData()->GetZoomY(); // Y wird angezeigt
sal_uInt16 nOldZoom = (sal_uInt16)(( rOldY.GetNumerator() * 100 )
/ rOldY.GetDenominator());
sal_uInt16 nZoom = nOldZoom;
sal_Bool bCancel = sal_False;
if ( pReqArgs )
{
const SvxZoomItem& rZoomItem = (const SvxZoomItem&)
pReqArgs->Get(SID_ATTR_ZOOM);
eNewZoomType = rZoomItem.GetType();
nZoom = rZoomItem.GetValue();
}
else
{
SfxItemSet aSet ( GetPool(), SID_ATTR_ZOOM, SID_ATTR_ZOOM );
SvxZoomItem aZoomItem( eOldZoomType, nOldZoom, SID_ATTR_ZOOM );
//CHINA001 SvxZoomDialog* pDlg = NULL;
AbstractSvxZoomDialog* pDlg = NULL;
ScMarkData& rMark = GetViewData()->GetMarkData();
sal_uInt16 nBtnFlags = SVX_ZOOM_ENABLE_50
| SVX_ZOOM_ENABLE_75
| SVX_ZOOM_ENABLE_100
| SVX_ZOOM_ENABLE_150
| SVX_ZOOM_ENABLE_200
| SVX_ZOOM_ENABLE_WHOLEPAGE
| SVX_ZOOM_ENABLE_PAGEWIDTH;
if ( rMark.IsMarked() || rMark.IsMultiMarked() )
nBtnFlags = nBtnFlags | SVX_ZOOM_ENABLE_OPTIMAL;
aZoomItem.SetValueSet( nBtnFlags );
aSet.Put( aZoomItem );
//CHINA001 pDlg = new SvxZoomDialog( GetDialogParent(), aSet );
SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
if(pFact)
{
pDlg = pFact->CreateSvxZoomDialog(GetDialogParent(), aSet );
DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
}
pDlg->SetLimits( MINZOOM, MAXZOOM );
bCancel = ( RET_CANCEL == pDlg->Execute() );
if ( !bCancel )
{
const SvxZoomItem& rZoomItem = (const SvxZoomItem&)
pDlg->GetOutputItemSet()->
Get( SID_ATTR_ZOOM );
eNewZoomType = rZoomItem.GetType();
nZoom = rZoomItem.GetValue();
}
delete pDlg;
}
if ( !bCancel )
{
if ( eNewZoomType == SVX_ZOOM_PERCENT )
{
if ( nZoom < MINZOOM ) nZoom = MINZOOM;
if ( nZoom > MAXZOOM ) nZoom = MAXZOOM;
}
else
{
nZoom = CalcZoom( eNewZoomType, nOldZoom );
bCancel = nZoom == 0;
}
switch ( eNewZoomType )
{
case SVX_ZOOM_WHOLEPAGE:
case SVX_ZOOM_PAGEWIDTH:
SetZoomType( eNewZoomType, bSyncZoom );
break;
default:
SetZoomType( SVX_ZOOM_PERCENT, bSyncZoom );
}
}
if ( nZoom != nOldZoom && !bCancel )
{
if (!GetViewData()->IsPagebreakMode())
{
ScAppOptions aNewOpt = pScMod->GetAppOptions();
aNewOpt.SetZoom( nZoom );
aNewOpt.SetZoomType( GetZoomType() );
pScMod->SetAppOptions( aNewOpt );
}
Fraction aFract( nZoom, 100 );
SetZoom( aFract, aFract, bSyncZoom );
PaintGrid();
PaintTop();
PaintLeft();
rBindings.Invalidate( SID_ATTR_ZOOM );
rReq.AppendItem( SvxZoomItem( GetZoomType(), nZoom, nSlot ) );
rReq.Done();
}
}
break;
case SID_ATTR_ZOOMSLIDER:
{
const SfxPoolItem* pItem = NULL;
sal_Bool bSyncZoom = SC_MOD()->GetAppOptions().GetSynchronizeZoom();
if ( pReqArgs && pReqArgs->GetItemState(SID_ATTR_ZOOMSLIDER, sal_True, &pItem) == SFX_ITEM_SET )
{
const sal_uInt16 nCurrentZoom = ((const SvxZoomSliderItem *)pItem)->GetValue();
if( nCurrentZoom )
{
SetZoomType( SVX_ZOOM_PERCENT, bSyncZoom );
if (!GetViewData()->IsPagebreakMode())
{
ScAppOptions aNewOpt = pScMod->GetAppOptions();
aNewOpt.SetZoom( nCurrentZoom );
aNewOpt.SetZoomType( GetZoomType() );
pScMod->SetAppOptions( aNewOpt );
}
Fraction aFract( nCurrentZoom,100 );
SetZoom( aFract, aFract, bSyncZoom );
PaintGrid();
PaintTop();
PaintLeft();
rBindings.Invalidate( SID_ATTR_ZOOMSLIDER );
rReq.Done();
}
}
}
break;
//----------------------------------------------------------------
case FID_TAB_SELECTALL:
SelectAllTables();
rReq.Done();
break;
case FID_TAB_DESELECTALL:
DeselectAllTables();
rReq.Done();
break;
case SID_SELECT_TABLES:
{
ScViewData& rViewData = *GetViewData();
ScDocument& rDoc = *rViewData.GetDocument();
ScMarkData& rMark = rViewData.GetMarkData();
SCTAB nTabCount = rDoc.GetTableCount();
SCTAB nTab;
SvULongs aIndexList( 4, 4 );
SFX_REQUEST_ARG( rReq, pItem, SfxIntegerListItem, SID_SELECT_TABLES, sal_False );
if ( pItem )
pItem->GetList( aIndexList );
else
{
//CHINA001 ScShowTabDlg* pDlg = new ScShowTabDlg( GetDialogParent() );
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
AbstractScShowTabDlg* pDlg = pFact->CreateScShowTabDlg( GetDialogParent(), RID_SCDLG_SHOW_TAB);
DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
pDlg->SetDescription(
String( ScResId( STR_DLG_SELECTTABLES_TITLE ) ),
String( ScResId( STR_DLG_SELECTTABLES_LBNAME ) ),
GetStaticInterface()->GetSlot(SID_SELECT_TABLES)->GetCommand(), HID_SELECTTABLES );
// fill all table names with selection state
String aTabName;
for( nTab = 0; nTab < nTabCount; ++nTab )
{
rDoc.GetName( nTab, aTabName );
pDlg->Insert( aTabName, rMark.GetTableSelect( nTab ) );
}
if( pDlg->Execute() == RET_OK )
{
sal_uInt16 nSelCount = pDlg->GetSelectEntryCount();
sal_uInt16 nSelIx;
for( nSelIx = 0; nSelIx < nSelCount; ++nSelIx )
aIndexList.Insert( pDlg->GetSelectEntryPos( nSelIx ), nSelIx );
delete pDlg;
rReq.AppendItem( SfxIntegerListItem( SID_SELECT_TABLES, aIndexList ) );
}
else
rReq.Ignore();
}
if ( aIndexList.Count() )
{
sal_uInt16 nSelCount = aIndexList.Count();
sal_uInt16 nSelIx;
SCTAB nFirstVisTab = 0;
// special case: only hidden tables selected -> do nothing
sal_Bool bVisSelected = sal_False;
for( nSelIx = 0; !bVisSelected && (nSelIx < nSelCount); ++nSelIx )
bVisSelected = rDoc.IsVisible( nFirstVisTab = static_cast<SCTAB>(aIndexList[nSelIx]) );
if( !bVisSelected )
nSelCount = 0;
// select the tables
if( nSelCount )
{
for( nTab = 0; nTab < nTabCount; ++nTab )
rMark.SelectTable( nTab, sal_False );
for( nSelIx = 0; nSelIx < nSelCount; ++nSelIx )
rMark.SelectTable( static_cast<SCTAB>(aIndexList[nSelIx]), sal_True );
// activate another table, if current is deselected
if( !rMark.GetTableSelect( rViewData.GetTabNo() ) )
{
rMark.SelectTable( nFirstVisTab, sal_True );
SetTabNo( nFirstVisTab );
}
rViewData.GetDocShell()->PostPaintExtras();
SfxBindings& rBind = rViewData.GetBindings();
rBind.Invalidate( FID_FILL_TAB );
rBind.Invalidate( FID_TAB_DESELECTALL );
}
rReq.Done();
}
}
break;
case SID_OUTLINE_DELETEALL:
RemoveAllOutlines();
rReq.Done();
break;
case SID_AUTO_OUTLINE:
AutoOutline();
rReq.Done();
break;
case SID_WINDOW_SPLIT:
{
ScSplitMode eHSplit = GetViewData()->GetHSplitMode();
ScSplitMode eVSplit = GetViewData()->GetVSplitMode();
if ( eHSplit == SC_SPLIT_NORMAL || eVSplit == SC_SPLIT_NORMAL ) // aufheben
RemoveSplit();
else if ( eHSplit == SC_SPLIT_FIX || eVSplit == SC_SPLIT_FIX ) // normal
FreezeSplitters( sal_False );
else // erzeugen
SplitAtCursor();
rReq.Done();
InvalidateSplit();
}
break;
case SID_WINDOW_FIX:
{
ScSplitMode eHSplit = GetViewData()->GetHSplitMode();
ScSplitMode eVSplit = GetViewData()->GetVSplitMode();
if ( eHSplit == SC_SPLIT_FIX || eVSplit == SC_SPLIT_FIX ) // aufheben
RemoveSplit();
else
FreezeSplitters( sal_True ); // erzeugen oder fixieren
rReq.Done();
InvalidateSplit();
}
break;
// ----------------------------------------------------------------
case FID_CHG_SHOW:
{
sal_uInt16 nId = ScHighlightChgDlgWrapper::GetChildWindowId();
SfxChildWindow* pWnd = pThisFrame->GetChildWindow( nId );
pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True );
}
break;
case FID_CHG_ACCEPT:
{
pThisFrame->ToggleChildWindow(ScAcceptChgDlgWrapper::GetChildWindowId());
GetViewFrame()->GetBindings().Invalidate(FID_CHG_ACCEPT);
rReq.Done ();
/*
sal_uInt16 nId = ScAcceptChgDlgWrapper::GetChildWindowId();
SfxChildWindow* pWnd = pThisFrame->GetChildWindow( nId );
pScMod->SetRefDialog( nId, pWnd ? sal_False : sal_True );
*/
}
break;
case FID_CHG_COMMENT:
{
ScViewData* pData = GetViewData();
ScAddress aCursorPos( pData->GetCurX(), pData->GetCurY(), pData->GetTabNo() );
ScDocShell* pDocSh = pData->GetDocShell();
ScChangeAction* pAction = pDocSh->GetChangeAction( aCursorPos );
if ( pAction )
{
const SfxPoolItem* pItem;
if ( pReqArgs &&
pReqArgs->GetItemState( nSlot, sal_True, &pItem ) == SFX_ITEM_SET &&
pItem->ISA( SfxStringItem ) )
{
String aComment = ((const SfxStringItem*)pItem)->GetValue();
pDocSh->SetChangeComment( pAction, aComment );
rReq.Done();
}
else
{
pDocSh->ExecuteChangeCommentDialog( pAction, GetDialogParent() );
rReq.Done();
}
}
}
break;
case SID_CREATE_SW_DRAWVIEW:
// wird von den Forms gerufen, wenn die DrawView mit allem Zubehoer
// angelegt werden muss
if (!GetScDrawView())
{
GetViewData()->GetDocShell()->MakeDrawLayer();
rBindings.InvalidateAll(sal_False);
}
break;
case FID_PROTECT_DOC:
{
ScDocument* pDoc = GetViewData()->GetDocument();
SfxPasswordDialog* pDlg;
if( pReqArgs )
{
const SfxPoolItem* pItem;
if( IS_AVAILABLE( FID_PROTECT_DOC, &pItem ) &&
((const SfxBoolItem*)pItem)->GetValue() == pDoc->IsDocProtected() )
{
rReq.Ignore();
break;
}
}
ScDocProtection* pProtect = pDoc->GetDocProtection();
if (pProtect && pProtect->isProtected())
{
sal_Bool bCancel = sal_False;
String aPassword;
if (pProtect->isProtectedWithPass())
{
String aText( ScResId(SCSTR_PASSWORD) );
pDlg = new SfxPasswordDialog( GetDialogParent(), &aText );
pDlg->SetText( ScResId(SCSTR_UNPROTECTDOC) );
pDlg->SetMinLen( 0 );
pDlg->SetHelpId( GetStaticInterface()->GetSlot(FID_PROTECT_DOC)->GetCommand() );
pDlg->SetEditHelpId( HID_PASSWD_DOC );
if (pDlg->Execute() == RET_OK)
aPassword = pDlg->GetPassword();
else
bCancel = sal_True;
delete pDlg;
}
if (!bCancel)
{
Unprotect( TABLEID_DOC, aPassword );
rReq.AppendItem( SfxBoolItem( FID_PROTECT_DOC, sal_False ) );
rReq.Done();
}
}
else
{
String aText( ScResId(SCSTR_PASSWORDOPT) );
pDlg = new SfxPasswordDialog( GetDialogParent(), &aText );
pDlg->SetText( ScResId(SCSTR_PROTECTDOC) );
pDlg->SetMinLen( 0 );
pDlg->SetHelpId( GetStaticInterface()->GetSlot(FID_PROTECT_DOC)->GetCommand() );
pDlg->SetEditHelpId( HID_PASSWD_DOC );
pDlg->ShowExtras( SHOWEXTRAS_CONFIRM );
if (pDlg->Execute() == RET_OK)
{
String aPassword = pDlg->GetPassword();
Protect( TABLEID_DOC, aPassword );
rReq.AppendItem( SfxBoolItem( FID_PROTECT_DOC, sal_True ) );
rReq.Done();
}
delete pDlg;
}
rBindings.Invalidate( FID_PROTECT_DOC );
}
break;
case FID_PROTECT_TABLE:
{
ScDocument* pDoc = GetViewData()->GetDocument();
SCTAB nTab = GetViewData()->GetTabNo();
bool bOldProtection = pDoc->IsTabProtected(nTab);
#if ENABLE_SHEET_PROTECTION
if( pReqArgs )
{
const SfxPoolItem* pItem;
bool bNewProtection = !bOldProtection;
if( IS_AVAILABLE( FID_PROTECT_TABLE, &pItem ) )
bNewProtection = ((const SfxBoolItem*)pItem)->GetValue();
if( bNewProtection == bOldProtection )
{
rReq.Ignore();
break;
}
}
if (bOldProtection)
{
// Unprotect a protected sheet.
ScTableProtection* pProtect = pDoc->GetTabProtection(nTab);
if (pProtect && pProtect->isProtectedWithPass())
{
String aText( ScResId(SCSTR_PASSWORDOPT) );
auto_ptr<SfxPasswordDialog> pDlg(new SfxPasswordDialog(GetDialogParent(), &aText));
pDlg->SetText( ScResId(SCSTR_UNPROTECTTAB) );
pDlg->SetMinLen( 0 );
pDlg->SetHelpId( GetStaticInterface()->GetSlot(FID_PROTECT_TABLE)->GetCommand() );
pDlg->SetEditHelpId( HID_PASSWD_TABLE );
if (pDlg->Execute() == RET_OK)
{
String aPassword = pDlg->GetPassword();
Unprotect(nTab, aPassword);
}
}
else
// this sheet is not password-protected.
Unprotect(nTab, String());
if (!pReqArgs)
{
rReq.AppendItem( SfxBoolItem(FID_PROTECT_TABLE, false) );
rReq.Done();
}
}
else
{
// Protect a current sheet.
auto_ptr<ScTableProtectionDlg> pDlg(new ScTableProtectionDlg(GetDialogParent()));
ScTableProtection* pProtect = pDoc->GetTabProtection(nTab);
if (pProtect)
pDlg->SetDialogData(*pProtect);
if (pDlg->Execute() == RET_OK)
{
pScMod->InputEnterHandler();
ScTableProtection aNewProtect;
pDlg->WriteData(aNewProtect);
ProtectSheet(nTab, aNewProtect);
if (!pReqArgs)
{
rReq.AppendItem( SfxBoolItem(FID_PROTECT_TABLE, true) );
rReq.Done();
}
}
}
#else
auto_ptr<SfxPasswordDialog> pDlg;
String aPassword;
sal_Bool bCancel = sal_False;
bool bNewProtection = ! bOldProtection;
if( pReqArgs )
{
const SfxPoolItem* pItem;
if( IS_AVAILABLE( FID_PROTECT_TABLE, &pItem ) )
bNewProtection = ((const SfxBoolItem*)pItem)->GetValue();
if( bNewProtection == bOldProtection )
{
rReq.Ignore();
break;
}
}
if ( bOldProtection)
{
// Unprotect a protected sheet.
ScTableProtection* pProtect = pDoc->GetTabProtection(nTab);
if (pProtect && pProtect->isProtectedWithPass())
{
String aText( ScResId(SCSTR_PASSWORDOPT) );
pDlg.reset(new SfxPasswordDialog(GetDialogParent(), &aText));
pDlg->SetText( ScResId(SCSTR_UNPROTECTTAB) );
pDlg->SetMinLen( 0 );
pDlg->SetHelpId( GetStaticInterface()->GetSlot(FID_PROTECT_TABLE)->GetCommand() );
pDlg->SetEditHelpId( HID_PASSWD_TABLE );
if (pDlg->Execute() == RET_OK)
aPassword = pDlg->GetPassword();
else
bCancel = sal_True;
}
if (!pReqArgs)
{
rReq.AppendItem( SfxBoolItem(FID_PROTECT_TABLE, false) );
rReq.Done();
}
}
else
{
String aText( ScResId(SCSTR_PASSWORDOPT) );
pDlg.reset(new SfxPasswordDialog(GetDialogParent(), &aText));
pDlg->SetText( ScResId(SCSTR_PROTECTTAB) );
pDlg->SetMinLen( 0 );
pDlg->SetHelpId( GetStaticInterface()->GetSlot(FID_PROTECT_TABLE)->GetCommand() );
pDlg->SetEditHelpId( HID_PASSWD_TABLE );
pDlg->ShowExtras( SHOWEXTRAS_CONFIRM );
if (pDlg->Execute() == RET_OK)
aPassword = pDlg->GetPassword();
else
bCancel = sal_True;
}
if( !bCancel )
{
if ( bOldProtection )
Unprotect( nTab, aPassword );
else
{
pScMod->InputEnterHandler();
Protect( nTab, aPassword );
}
if( !pReqArgs )
{
rReq.AppendItem( SfxBoolItem( FID_PROTECT_TABLE, bNewProtection ) );
rReq.Done();
}
}
#endif
TabChanged();
UpdateInputHandler(true); // damit sofort wieder eingegeben werden kann
SelectionChanged();
}
break;
case SID_OPT_LOCALE_CHANGED :
{ // locale changed, SYSTEM number formats changed => repaint cell contents
PaintGrid();
rReq.Done();
}
break;
default:
DBG_ERROR("Unbekannter Slot bei ScTabViewShell::Execute");
break;
}
}