blob: d3666ee3287feffe006c754834be01dcb039b487 [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 <boost/scoped_ptr.hpp>
#include "scitems.hxx"
#include <sfx2/request.hxx>
#include <sfx2/viewfrm.hxx>
#include <basic/sbstar.hxx>
#include <layout/layout.hxx>
#include <svl/languageoptions.hxx>
#include <svl/stritem.hxx>
#include <svl/whiter.hxx>
#include <vcl/msgbox.hxx>
#include <sfx2/objface.hxx>
#include <svx/svxdlg.hxx>
#include <editeng/colritem.hxx>
#include "tabvwsh.hxx"
#include "sc.hrc"
#include "docsh.hxx"
#include "document.hxx"
#include "shtabdlg.hxx"
#include "scresid.hxx"
//CHINA001 #include "instbdlg.hxx"
#include "globstr.hrc"
//CHINA001 #include "strindlg.hxx"
//CHINA001 #include "mvtabdlg.hxx"
#include "docfunc.hxx"
#include "eventuno.hxx"
#include "scabstdlg.hxx" //CHINA001
#include "tabbgcolor.hxx"
#include "tabbgcolordlg.hxx"
#include "sccommands.h"
using ::boost::scoped_ptr;
using namespace com::sun::star;
#define IS_AVAILABLE(WhichId,ppItem) \
(pReqArgs->GetItemState((WhichId), sal_True, ppItem ) == SFX_ITEM_SET)
//------------------------------------------------------------------
void ScTabViewShell::ExecuteTable( SfxRequest& rReq )
{
ScViewData* pViewData = GetViewData();
ScDocument* pDoc = pViewData->GetDocument();
SCTAB nCurrentTab = pViewData->GetTabNo();
SCTAB nTabCount = pDoc->GetTableCount();
sal_uInt16 nSlot = rReq.GetSlot();
const SfxItemSet* pReqArgs = rReq.GetArgs();
HideListBox(); // Autofilter-DropDown-Listbox
switch ( nSlot )
{
case FID_TABLE_VISIBLE:
{
String aName;
pDoc->GetName( nCurrentTab, aName );
sal_Bool bVisible=sal_True;
if( pReqArgs != NULL )
{
const SfxPoolItem* pItem;
if( IS_AVAILABLE( FID_TABLE_VISIBLE, &pItem ) )
bVisible = ((const SfxBoolItem*)pItem)->GetValue();
}
if( ! bVisible ) // ausblenden
{
ScMarkData& rMark = pViewData->GetMarkData();
SCTAB nTabSelCount = rMark.GetSelectCount();
sal_uInt16 nVis = 0;
for ( SCTAB i=0; i < nTabCount && nVis<2; i++ )
if (pDoc->IsVisible(i))
++nVis;
if ( nVis<2 || !pDoc->IsDocEditable() || nTabSelCount > 1 )
break;
SCTAB nHideTab;
if (pDoc->GetTable( aName, nHideTab ))
HideTable( nHideTab );
}
else // einblenden
{
ShowTable( aName );
}
}
break;
case FID_TABLE_HIDE:
{
ScMarkData& rMark = pViewData->GetMarkData();
SCTAB nTabSelCount = rMark.GetSelectCount();
sal_uInt16 nVis = 0;
for ( SCTAB i=0; i < nTabCount && nVis<2; i++ )
if (pDoc->IsVisible(i))
++nVis;
if ( nVis<2 || !pDoc->IsDocEditable() || nTabSelCount > 1 )
break;
String aName;
if( pReqArgs != NULL )
{
const SfxPoolItem* pItem;
if( IS_AVAILABLE( FID_TABLE_HIDE, &pItem ) )
aName = ((const SfxStringItem*)pItem)->GetValue();
}
if (!aName.Len())
{
pDoc->GetName( nCurrentTab, aName ); // aktuelle Tabelle
rReq.AppendItem( SfxStringItem( FID_TABLE_HIDE, aName ) );
}
SCTAB nHideTab;
if (pDoc->GetTable( aName, nHideTab ))
HideTable( nHideTab );
if( ! rReq.IsAPI() )
rReq.Done();
}
break;
case FID_TABLE_SHOW:
{
String aName;
if ( pReqArgs )
{
const SfxPoolItem* pItem;
if( IS_AVAILABLE( FID_TABLE_SHOW, &pItem ) )
{
aName = ((const SfxStringItem*)pItem)->GetValue();
ShowTable( aName );
if( ! rReq.IsAPI() )
rReq.Done();
}
}
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
String aTabName;
sal_Bool bFirst = sal_True;
for ( SCTAB i=0; i != nTabCount; i++ )
{
if (!pDoc->IsVisible(i))
{
pDoc->GetName( i, aTabName );
pDlg->Insert( aTabName, bFirst );
bFirst = sal_False;
}
}
if ( pDlg->Execute() == RET_OK )
{
sal_uInt16 nCount = pDlg->GetSelectEntryCount();
for (sal_uInt16 nPos=0; nPos<nCount; nPos++)
{
aName = pDlg->GetSelectEntry(nPos);
ShowTable( aName );
}
rReq.AppendItem( SfxStringItem( FID_TABLE_SHOW, aName ) );
rReq.Done();
}
delete pDlg;
}
}
break;
case FID_INS_TABLE:
case FID_INS_TABLE_EXT:
{
ScMarkData& rMark = pViewData->GetMarkData();
SCTAB nTabSelCount = rMark.GetSelectCount();
SCTAB nTabNr = nCurrentTab;
if ( !pDoc->IsDocEditable() )
break; // gesperrt
if ( pReqArgs != NULL ) // von Basic
{
sal_Bool bOk = sal_False;
const SfxPoolItem* pTabItem;
const SfxPoolItem* pNameItem;
String aName;
if ( IS_AVAILABLE( FN_PARAM_1, &pTabItem ) &&
IS_AVAILABLE( nSlot, &pNameItem ) )
{
// Tabellennr. von Basic: 1-basiert
aName = ((const SfxStringItem*)pNameItem)->GetValue();
nTabNr = ((const SfxUInt16Item*)pTabItem)->GetValue() - 1;
if ( nTabNr < nTabCount )
bOk = InsertTable( aName, nTabNr );
}
if (bOk)
rReq.Done( *pReqArgs );
//! sonst Fehler setzen
}
else // Dialog
{
//CHINA001 ScInsertTableDlg* pDlg = new ScInsertTableDlg(
//CHINA001 GetDialogParent(),
//CHINA001 *pViewData,nTabSelCount);
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
AbstractScInsertTableDlg* pDlg = pFact->CreateScInsertTableDlg( GetDialogParent(), *pViewData,
nTabSelCount, nSlot == FID_INS_TABLE_EXT,
RID_SCDLG_INSERT_TABLE);
DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
if ( RET_OK == pDlg->Execute() )
{
if (pDlg->GetTablesFromFile())
{
SCTAB nTabs[MAXTABCOUNT];
SCTAB nCount = 0;
sal_uInt16 n = 0;
const String* pStr = pDlg->GetFirstTable( &n );
while ( pStr )
{
nTabs[nCount++] = static_cast<SCTAB>(n);
pStr = pDlg->GetNextTable( &n );
}
sal_Bool bLink = pDlg->GetTablesAsLink();
if (nCount != 0)
{
if(pDlg->IsTableBefore())
{
ImportTables( pDlg->GetDocShellTables(), nCount, nTabs,
bLink,nTabNr );
}
else
{
SCTAB nTabAfter = nTabNr+1;
for(SCTAB j=nCurrentTab+1;j<nTabCount;j++)
{
if(!pDoc->IsScenario(j))
{
nTabAfter=j;
break;
}
}
ImportTables( pDlg->GetDocShellTables(), nCount, nTabs,
bLink,nTabAfter );
}
}
}
else
{
SCTAB nCount=pDlg->GetTableCount();
if(pDlg->IsTableBefore())
{
if(nCount==1 && pDlg->GetFirstTable()->Len()>0)
{
rReq.AppendItem( SfxStringItem( FID_INS_TABLE, *pDlg->GetFirstTable() ) );
rReq.AppendItem( SfxUInt16Item( FN_PARAM_1, static_cast<sal_uInt16>(nTabNr) + 1 ) ); // 1-based
rReq.Done();
InsertTable( *pDlg->GetFirstTable(), nTabNr );
}
else
InsertTables( NULL, nTabNr,nCount );
}
else
{
SCTAB nTabAfter = nTabNr+1;
SCTAB nSelHigh=0;
for(SCTAB i=0;i<nTabCount;i++)
{
if(rMark.GetTableSelect(i))
{
nSelHigh=i;
}
}
for(SCTAB j=nSelHigh+1;j<nTabCount;j++)
{
if(!pDoc->IsScenario(j))
{
nTabAfter=j;
break;
}
else // #101672#; increase nTabAfter, because it is possible that the scenario tables are the last
nTabAfter = j + 1;
}
if(nCount==1 && pDlg->GetFirstTable()->Len()>0)
{
rReq.AppendItem( SfxStringItem( FID_INS_TABLE, *pDlg->GetFirstTable() ) );
rReq.AppendItem( SfxUInt16Item( FN_PARAM_1, static_cast<sal_uInt16>(nTabAfter) + 1 ) ); // 1-based
rReq.Done();
InsertTable( *pDlg->GetFirstTable(), nTabAfter);
}
else
{
InsertTables( NULL, nTabAfter,nCount);
}
}
}
}
delete pDlg;
}
}
break;
case FID_TAB_APPEND:
case FID_TAB_RENAME:
case FID_TAB_MENU_RENAME:
{
// FID_TAB_MENU_RENAME - "umbenennen" im Menu
// FID_TAB_RENAME - "Name"-Property fuer Basic
// Execute ist gleich, aber im GetState wird MENU_RENAME evtl. disabled
if ( nSlot == FID_TAB_MENU_RENAME )
nSlot = FID_TAB_RENAME; // Execute ist gleich
SCTAB nTabNr = pViewData->GetTabNo();
ScMarkData& rMark = pViewData->GetMarkData();
SCTAB nTabSelCount = rMark.GetSelectCount();
if ( !pDoc->IsDocEditable() )
break; // alles gesperrt
if ( nSlot != FID_TAB_APPEND &&
( pDoc->IsTabProtected( nTabNr ) || nTabSelCount > 1 ) )
break; // kein Rename
#if 0
// ScSbxObject wird nicht mehr benutzt, stattdessen aus dem
// ScSbxTable::Notify die richtige Tabelle an der Basic-View eingestellt
if( rReq.IsAPI() )
{
SbxObject* pObj = GetScSbxObject();
ScSbxTable* pSbxTab = PTR_CAST( ScSbxTable, pObj );
DBG_ASSERT( pSbxTab, "pSbxTab???" );
if( pSbxTab )
nTabNr = pSbxTab->GetTableNr();
}
#endif
if( pReqArgs != NULL )
{
sal_Bool bDone = sal_False;
const SfxPoolItem* pItem;
String aName;
if( IS_AVAILABLE( FN_PARAM_1, &pItem ) )
nTabNr = ((const SfxUInt16Item*)pItem)->GetValue();
if( IS_AVAILABLE( nSlot, &pItem ) )
aName = ((const SfxStringItem*)pItem)->GetValue();
switch ( nSlot )
{
case FID_TAB_APPEND:
bDone = AppendTable( aName );
break;
case FID_TAB_RENAME:
bDone = RenameTable( aName, nTabNr );
break;
}
if( bDone )
{
rReq.Done( *pReqArgs );
}
}
else
{
sal_uInt16 nRet = RET_OK;
sal_Bool bDone = sal_False;
String aErrMsg ( ScGlobal::GetRscString( STR_INVALIDTABNAME ) );
String aName;
String aDlgTitle;
const sal_Char* pHelpId = 0;
switch ( nSlot )
{
case FID_TAB_APPEND:
aDlgTitle = String(ScResId(SCSTR_APDTABLE));
pDoc->CreateValidTabName( aName );
pHelpId = HID_SC_APPEND_NAME;
break;
case FID_TAB_RENAME:
aDlgTitle = String(ScResId(SCSTR_RENAMETAB));
pDoc->GetName( pViewData->GetTabNo(), aName );
pHelpId = HID_SC_RENAME_NAME;
break;
}
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
AbstractScStringInputDlg* pDlg = pFact->CreateScStringInputDlg( GetDialogParent(),
aDlgTitle,
String(ScResId(SCSTR_NAME)),
aName,
GetStaticInterface()->GetSlot(nSlot)->GetCommand(), pHelpId, RID_SCDLG_STRINPUT);
DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
while ( !bDone && nRet == RET_OK )
{
nRet = pDlg->Execute();
if ( nRet == RET_OK )
{
pDlg->GetInputString( aName );
switch ( nSlot )
{
case FID_TAB_APPEND:
bDone = AppendTable( aName );
break;
case FID_TAB_RENAME:
bDone = RenameTable( aName, nTabNr );
break;
}
if ( bDone )
{
rReq.AppendItem( SfxStringItem( nSlot, aName ) );
rReq.Done();
}
else
{
if( rReq.IsAPI() )
{
StarBASIC::Error( SbERR_SETPROP_FAILED ); // XXX Fehlerbehandlung???
}
else
{
nRet = ErrorBox( GetDialogParent(),
WinBits( WB_OK | WB_DEF_OK ),
aErrMsg
).Execute();
}
}
}
}
delete pDlg;
}
}
break;
case FID_TAB_MOVE:
{
if ( pDoc->GetChangeTrack() != NULL )
break; // bei aktiviertem ChangeTracking kein TabMove
sal_Bool bDoIt = sal_False;
sal_uInt16 nDoc = 0;
SCTAB nTab = pViewData->GetTabNo();
sal_Bool bCpy = sal_False;
String aDocName;
if( pReqArgs != NULL )
{
SCTAB nTableCount = pDoc->GetTableCount();
const SfxPoolItem* pItem;
if( IS_AVAILABLE( FID_TAB_MOVE, &pItem ) )
aDocName = ((const SfxStringItem*)pItem)->GetValue();
if( IS_AVAILABLE( FN_PARAM_1, &pItem ) )
{
// Tabelle ist 1-basiert
nTab = ((const SfxUInt16Item*)pItem)->GetValue() - 1;
if ( nTab >= nTableCount )
nTab = SC_TAB_APPEND;
}
if( IS_AVAILABLE( FN_PARAM_2, &pItem ) )
bCpy = ((const SfxBoolItem*)pItem)->GetValue();
if( aDocName.Len() )
{
SfxObjectShell* pSh = SfxObjectShell::GetFirst();
ScDocShell* pScSh = NULL;
sal_uInt16 i=0;
while ( pSh )
{
pScSh = PTR_CAST( ScDocShell, pSh );
if( pScSh )
{
pScSh->GetTitle();
if( pScSh->GetTitle() == aDocName )
{
nDoc = i;
ScDocument* pDestDoc = pScSh->GetDocument();
nTableCount = pDestDoc->GetTableCount();
bDoIt = pDestDoc->IsDocEditable();
break;
}
i++; // nur die ScDocShell's zaehlen
}
pSh = SfxObjectShell::GetNext( *pSh );
}
}
else // Kein Dokumentname -> neues Dokument
{
nDoc = SC_DOC_NEW;
bDoIt = sal_True;
}
if ( bDoIt && nTab >= nTableCount ) // ggf. anhaengen
nTab = SC_TAB_APPEND;
}
else
{
//CHINA001 ScMoveTableDlg* pDlg = new ScMoveTableDlg( GetDialogParent() );
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
AbstractScMoveTableDlg* pDlg = pFact->CreateScMoveTableDlg( GetDialogParent(), RID_SCDLG_MOVETAB );
DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
SCTAB nTableCount = pDoc->GetTableCount();
ScMarkData& rMark = GetViewData()->GetMarkData();
SCTAB nTabSelCount = rMark.GetSelectCount();
if(nTableCount==nTabSelCount)
{
pDlg->SetCopyTable();
pDlg->EnableCopyTable(sal_False);
}
if ( pDlg->Execute() == RET_OK )
{
nDoc = pDlg->GetSelectedDocument();
nTab = pDlg->GetSelectedTable();
bCpy = pDlg->GetCopyTable();
bDoIt = sal_True;
String aFoundDocName;
if ( nDoc != SC_DOC_NEW )
{
ScDocShell* pSh = ScDocShell::GetShellByNum( nDoc );
if (pSh)
{
aFoundDocName = pSh->GetTitle();
if ( !pSh->GetDocument()->IsDocEditable() )
{
ErrorMessage(STR_READONLYERR);
bDoIt = sal_False;
}
}
}
rReq.AppendItem( SfxStringItem( FID_TAB_MOVE, aFoundDocName ) );
// Tabelle ist 1-basiert, wenn nicht APPEND
SCTAB nBasicTab = ( nTab <= MAXTAB ) ? (nTab+1) : nTab;
rReq.AppendItem( SfxUInt16Item( FN_PARAM_1, static_cast<sal_uInt16>(nBasicTab) ) );
rReq.AppendItem( SfxBoolItem( FN_PARAM_2, bCpy ) );
}
delete pDlg;
}
if( bDoIt )
{
rReq.Done(); // aufzeichnen, solange das Dokument noch aktiv ist
MoveTable( nDoc, nTab, bCpy );
}
}
break;
case FID_DELETE_TABLE:
{
// Parameter war ueberfluessig, weil die Methode an der Table haengt
sal_Bool bDoIt = rReq.IsAPI();
if( !bDoIt )
{
// wenn's nicht von Basic kommt, nochmal nachfragen:
#if ENABLE_LAYOUT
// Using layout::QueryBox without client code modification is
// deprecated, rather add HIG-complient buttons with verbs.
#define QueryBox( parent, winbits, question ) layout::QueryBox (parent, question, ScGlobal::GetRscString (STR_UNDO_DELETE_TAB))
#endif /* ENABLE_LAYOUT */
bDoIt = ( RET_YES ==
QueryBox( GetDialogParent(),
WinBits( WB_YES_NO | WB_DEF_YES ),
ScGlobal::GetRscString(STR_QUERY_DELTAB)
).Execute() );
}
if( bDoIt )
{
SCTAB nNewTab = nCurrentTab;
SCTAB nFirstTab=0;
sal_Bool bTabFlag=sal_False;
ScMarkData& rMark = pViewData->GetMarkData();
SvShorts TheTabs;
for(SCTAB i=0;i<nTabCount;i++)
{
if(rMark.GetTableSelect(i) &&!pDoc->IsTabProtected(i))
{
TheTabs.push_back(i);
bTabFlag=sal_True;
if(nNewTab==i) nNewTab++;
}
if(!bTabFlag) nFirstTab=i;
}
if(nNewTab>=nTabCount) nNewTab=nFirstTab;
pViewData->SetTabNo(nNewTab);
DeleteTables(TheTabs);
TheTabs.clear();
rReq.Done();
}
}
break;
case FID_TAB_RTL:
{
ScDocShell* pDocSh = pViewData->GetDocShell();
ScDocFunc aFunc(*pDocSh);
sal_Bool bSet = !pDoc->IsLayoutRTL( nCurrentTab );
const ScMarkData& rMark = pViewData->GetMarkData();
if ( rMark.GetSelectCount() != 0 )
{
// handle several sheets
::svl::IUndoManager* pUndoManager = pDocSh->GetUndoManager();
String aUndo = ScGlobal::GetRscString( STR_UNDO_TAB_RTL );
pUndoManager->EnterListAction( aUndo, aUndo );
for (SCTAB nTab=0; nTab<nTabCount; nTab++)
if ( rMark.GetTableSelect(nTab) )
aFunc.SetLayoutRTL( nTab, bSet, sal_False );
pUndoManager->LeaveListAction();
}
else
aFunc.SetLayoutRTL( nCurrentTab, bSet, sal_False );
}
break;
case FID_TAB_SET_TAB_BG_COLOR:
case FID_TAB_MENU_SET_TAB_BG_COLOR:
{
if ( nSlot == FID_TAB_MENU_SET_TAB_BG_COLOR )
nSlot = FID_TAB_SET_TAB_BG_COLOR;
SCTAB nTabNr = pViewData->GetTabNo();
ScMarkData& rMark = pViewData->GetMarkData();
SCTAB nTabSelCount = rMark.GetSelectCount();
if ( !pDoc->IsDocEditable() )
break;
if ( pDoc->IsTabProtected( nTabNr ) ) // ||nTabSelCount > 1
break;
if( pReqArgs != NULL )
{
sal_Bool bDone = sal_False;
const SfxPoolItem* pItem;
Color aColor;
if( IS_AVAILABLE( FN_PARAM_1, &pItem ) )
nTabNr = ((const SfxUInt16Item*)pItem)->GetValue();
if( IS_AVAILABLE( nSlot, &pItem ) )
aColor = ((const SvxColorItem*)pItem)->GetValue();
if ( nTabSelCount > 1 )
{
scoped_ptr<ScUndoTabColorInfo::List>
pTabColorList(new ScUndoTabColorInfo::List);
for (SCTAB nTab=0; nTab<nTabCount; nTab++)
{
if ( rMark.GetTableSelect(nTab) && !pDoc->IsTabProtected(nTab) )
{
ScUndoTabColorInfo aTabColorInfo(nTab);
aTabColorInfo.maNewTabBgColor = aColor;
pTabColorList->push_back(aTabColorInfo);
}
}
bDone = SetTabBgColor( *pTabColorList );
}
else
{
bDone = SetTabBgColor( aColor, nCurrentTab ); //ScViewFunc.SetTabBgColor
}
if( bDone )
{
rReq.Done( *pReqArgs );
}
}
else
{
sal_uInt16 nRet = RET_OK; /// temp
sal_Bool bDone = sal_False; /// temp
Color aTabBgColor;
Color aNewTabBgColor;
aTabBgColor = pDoc->GetTabBgColor( nCurrentTab );
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "ScAbstractFactory create fail!");
AbstractScTabBgColorDlg* pDlg = pFact->CreateScTabBgColorDlg(
GetDialogParent(),
String(ScResId(SCSTR_SET_TAB_BG_COLOR)),
String(ScResId(SCSTR_NO_TAB_BG_COLOR)),
aTabBgColor,
CMD_FID_TAB_SET_TAB_BG_COLOR,
RID_SCDLG_TAB_BG_COLOR);
while ( !bDone && nRet == RET_OK )
{
nRet = pDlg->Execute();
if( nRet == RET_OK )
{
Color aSelectedColor;
pDlg->GetSelectedColor(aSelectedColor);
scoped_ptr<ScUndoTabColorInfo::List>
pTabColorList(new ScUndoTabColorInfo::List);
if ( nTabSelCount > 1 )
{
for (SCTAB nTab=0; nTab<nTabCount; nTab++)
{
if ( rMark.GetTableSelect(nTab) && !pDoc->IsTabProtected(nTab) )
{
ScUndoTabColorInfo aTabColorInfo(nTab);
aTabColorInfo.maNewTabBgColor = aSelectedColor;
pTabColorList->push_back(aTabColorInfo);
}
}
bDone = SetTabBgColor( *pTabColorList );
}
else
{
bDone = SetTabBgColor( aSelectedColor, nCurrentTab ); //ScViewFunc.SetTabBgColor
}
if ( bDone )
{
rReq.AppendItem( SvxColorItem( aTabBgColor, nSlot ) );
rReq.Done();
}
else
{
if( rReq.IsAPI() )
{
StarBASIC::Error( SbERR_SETPROP_FAILED );
}
}
}
}
delete( pDlg );
}
}
break;
case FID_TAB_EVENTS:
{
ScDocShell* pDocSh = pViewData->GetDocShell();
uno::Reference<container::XNameReplace> xEvents( new ScSheetEventsObj( pDocSh, nCurrentTab ) );
uno::Reference<frame::XFrame> xFrame = GetViewFrame()->GetFrame().GetFrameInterface();
SvxAbstractDialogFactory* pDlgFactory = SvxAbstractDialogFactory::Create();
if (pDlgFactory)
{
std::auto_ptr<VclAbstractDialog> pDialog( pDlgFactory->CreateSvxMacroAssignDlg(
GetDialogParent(), xFrame, false, xEvents, 0 ) );
if ( pDialog.get() && pDialog->Execute() == RET_OK )
{
// the dialog modifies the settings directly
}
}
}
break;
default:
DBG_ERROR("Unbekannte Message bei ViewShell");
break;
}
}
//------------------------------------------------------------------
void ScTabViewShell::GetStateTable( SfxItemSet& rSet )
{
ScViewData* pViewData = GetViewData();
ScDocument* pDoc = pViewData->GetDocument();
ScDocShell* pDocShell = pViewData->GetDocShell();
ScMarkData& rMark = GetViewData()->GetMarkData();
SCTAB nTab = pViewData->GetTabNo();
SCTAB nTabCount = pDoc->GetTableCount();
SCTAB nTabSelCount = rMark.GetSelectCount();
SfxWhichIter aIter(rSet);
sal_uInt16 nWhich = aIter.FirstWhich();
while ( nWhich )
{
switch ( nWhich )
{
case FID_TABLE_VISIBLE:
rSet.Put( SfxBoolItem( nWhich, pDoc->IsVisible(nTab) ));
break;
case FID_TABLE_HIDE:
{
sal_uInt16 nVis = 0;
for ( SCTAB i=0; i < nTabCount && nVis<2; i++ )
if (pDoc->IsVisible(i))
++nVis;
if ( nVis<2 || !pDoc->IsDocEditable() || nTabSelCount > 1 )
rSet.DisableItem( nWhich );
}
break;
case FID_TABLE_SHOW:
{
sal_Bool bHasHidden = sal_False;
for ( SCTAB i=0; i < nTabCount && !bHasHidden; i++ )
if (!pDoc->IsVisible(i))
bHasHidden = sal_True;
if ( !bHasHidden || pDoc->IsDocProtected() || nTabSelCount > 1 )
rSet.DisableItem( nWhich );
}
break;
case FID_DELETE_TABLE:
{
if ( pDoc->GetChangeTrack() )
rSet.DisableItem( nWhich );
else
{
sal_uInt16 nVis = 0;
for ( SCTAB i=0; i < nTabCount && nVis<2; i++ )
if (pDoc->IsVisible(i))
++nVis;
if ( pDoc->IsTabProtected(nTab)
|| !pDoc->IsDocEditable()
|| nVis < 2
|| nTabSelCount == nTabCount)
rSet.DisableItem( nWhich );
}
}
break;
case FID_INS_TABLE:
case FID_INS_TABLE_EXT:
case FID_TAB_APPEND:
if ( !pDoc->IsDocEditable() ||
nTabCount > MAXTAB ||
( nWhich == FID_INS_TABLE_EXT && pDocShell && pDocShell->IsDocShared() ) )
rSet.DisableItem( nWhich );
break;
case FID_TAB_MOVE:
if ( !pDoc->IsDocEditable()
|| pDoc->GetChangeTrack() != NULL
|| nTabCount > MAXTAB)
rSet.DisableItem( nWhich );
break;
// FID_TAB_MENU_RENAME - "umbenennen" im Menu
// FID_TAB_RENAME - "Name"-Property fuer Basic
case FID_TAB_MENU_RENAME:
if ( !pDoc->IsDocEditable() ||
pDoc->IsTabProtected(nTab) ||nTabSelCount > 1 ||
( pDocShell && pDocShell->IsDocShared() ) )
rSet.DisableItem( nWhich );
break;
case FID_TAB_RENAME:
{
String aTabName;
pDoc->GetName( nTab, aTabName );
rSet.Put( SfxStringItem( nWhich, aTabName ));
}
break;
case FID_TAB_RTL:
{
SvtLanguageOptions aLangOpt;
if ( !aLangOpt.IsCTLFontEnabled() )
rSet.DisableItem( nWhich );
else
rSet.Put( SfxBoolItem( nWhich, pDoc->IsLayoutRTL( nTab ) ) );
}
break;
case FID_TAB_MENU_SET_TAB_BG_COLOR:
{
if ( !pDoc->IsDocEditable()
|| ( pDocShell && pDocShell->IsDocShared() )
|| pDoc->IsTabProtected(nTab) )
rSet.DisableItem( nWhich );
}
break;
case FID_TAB_SET_TAB_BG_COLOR:
{
Color aColor;
aColor = pDoc->GetTabBgColor( nTab );
rSet.Put( SvxColorItem( aColor, nWhich ) );
}
break;
}
nWhich = aIter.NextWhich();
}
}