xref: /aoo42x/main/sc/source/ui/view/tabvwshf.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_sc.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <boost/scoped_ptr.hpp>
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir #include "scitems.hxx"
34*cdf0e10cSrcweir #include <sfx2/request.hxx>
35*cdf0e10cSrcweir #include <sfx2/viewfrm.hxx>
36*cdf0e10cSrcweir #include <basic/sbstar.hxx>
37*cdf0e10cSrcweir #include <layout/layout.hxx>
38*cdf0e10cSrcweir #include <svl/languageoptions.hxx>
39*cdf0e10cSrcweir #include <svl/stritem.hxx>
40*cdf0e10cSrcweir #include <svl/whiter.hxx>
41*cdf0e10cSrcweir #include <vcl/msgbox.hxx>
42*cdf0e10cSrcweir #include <sfx2/objface.hxx>
43*cdf0e10cSrcweir #include <svx/svxdlg.hxx>
44*cdf0e10cSrcweir #include <editeng/colritem.hxx>
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir #include "tabvwsh.hxx"
47*cdf0e10cSrcweir #include "sc.hrc"
48*cdf0e10cSrcweir #include "docsh.hxx"
49*cdf0e10cSrcweir #include "document.hxx"
50*cdf0e10cSrcweir #include "shtabdlg.hxx"
51*cdf0e10cSrcweir #include "scresid.hxx"
52*cdf0e10cSrcweir //CHINA001 #include "instbdlg.hxx"
53*cdf0e10cSrcweir #include "globstr.hrc"
54*cdf0e10cSrcweir //CHINA001 #include "strindlg.hxx"
55*cdf0e10cSrcweir //CHINA001 #include "mvtabdlg.hxx"
56*cdf0e10cSrcweir #include "docfunc.hxx"
57*cdf0e10cSrcweir #include "eventuno.hxx"
58*cdf0e10cSrcweir 
59*cdf0e10cSrcweir #include "scabstdlg.hxx" //CHINA001
60*cdf0e10cSrcweir 
61*cdf0e10cSrcweir #include "tabbgcolor.hxx"
62*cdf0e10cSrcweir #include "tabbgcolordlg.hxx"
63*cdf0e10cSrcweir #include "sccommands.h"
64*cdf0e10cSrcweir 
65*cdf0e10cSrcweir using ::boost::scoped_ptr;
66*cdf0e10cSrcweir using namespace com::sun::star;
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir #define IS_AVAILABLE(WhichId,ppItem) \
69*cdf0e10cSrcweir     (pReqArgs->GetItemState((WhichId), sal_True, ppItem ) == SFX_ITEM_SET)
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir //------------------------------------------------------------------
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir void ScTabViewShell::ExecuteTable( SfxRequest& rReq )
74*cdf0e10cSrcweir {
75*cdf0e10cSrcweir 	ScViewData*	pViewData	= GetViewData();
76*cdf0e10cSrcweir 	ScDocument*	pDoc		= pViewData->GetDocument();
77*cdf0e10cSrcweir 
78*cdf0e10cSrcweir 	SCTAB		nCurrentTab	= pViewData->GetTabNo();
79*cdf0e10cSrcweir 	SCTAB		nTabCount	= pDoc->GetTableCount();
80*cdf0e10cSrcweir 	sal_uInt16		nSlot		= rReq.GetSlot();
81*cdf0e10cSrcweir 	const SfxItemSet* pReqArgs = rReq.GetArgs();
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir 	HideListBox();					// Autofilter-DropDown-Listbox
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir 	switch ( nSlot )
86*cdf0e10cSrcweir 	{
87*cdf0e10cSrcweir 		case FID_TABLE_VISIBLE:
88*cdf0e10cSrcweir 			{
89*cdf0e10cSrcweir 				String aName;
90*cdf0e10cSrcweir 				pDoc->GetName( nCurrentTab, aName );
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir 				sal_Bool bVisible=sal_True;
93*cdf0e10cSrcweir 				if( pReqArgs != NULL )
94*cdf0e10cSrcweir 				{
95*cdf0e10cSrcweir 					const SfxPoolItem* pItem;
96*cdf0e10cSrcweir 					if( IS_AVAILABLE( FID_TABLE_VISIBLE, &pItem ) )
97*cdf0e10cSrcweir 						bVisible = ((const SfxBoolItem*)pItem)->GetValue();
98*cdf0e10cSrcweir 				}
99*cdf0e10cSrcweir 
100*cdf0e10cSrcweir 				if( ! bVisible )			// ausblenden
101*cdf0e10cSrcweir 				{
102*cdf0e10cSrcweir 					ScMarkData& rMark = pViewData->GetMarkData();
103*cdf0e10cSrcweir 					SCTAB nTabSelCount = rMark.GetSelectCount();
104*cdf0e10cSrcweir 					sal_uInt16 nVis = 0;
105*cdf0e10cSrcweir 					for ( SCTAB i=0; i < nTabCount && nVis<2; i++ )
106*cdf0e10cSrcweir 						if (pDoc->IsVisible(i))
107*cdf0e10cSrcweir 							++nVis;
108*cdf0e10cSrcweir 					if ( nVis<2 || !pDoc->IsDocEditable() || nTabSelCount > 1 )
109*cdf0e10cSrcweir 						break;
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir 					SCTAB nHideTab;
112*cdf0e10cSrcweir 					if (pDoc->GetTable( aName, nHideTab ))
113*cdf0e10cSrcweir 						HideTable( nHideTab );
114*cdf0e10cSrcweir 				}
115*cdf0e10cSrcweir 				else						// einblenden
116*cdf0e10cSrcweir 				{
117*cdf0e10cSrcweir 					ShowTable( aName );
118*cdf0e10cSrcweir 				}
119*cdf0e10cSrcweir 			}
120*cdf0e10cSrcweir 			break;
121*cdf0e10cSrcweir 
122*cdf0e10cSrcweir 		case FID_TABLE_HIDE:
123*cdf0e10cSrcweir 			{
124*cdf0e10cSrcweir 				ScMarkData& rMark = pViewData->GetMarkData();
125*cdf0e10cSrcweir 				SCTAB nTabSelCount = rMark.GetSelectCount();
126*cdf0e10cSrcweir 				sal_uInt16 nVis = 0;
127*cdf0e10cSrcweir 				for ( SCTAB i=0; i < nTabCount && nVis<2; i++ )
128*cdf0e10cSrcweir 					if (pDoc->IsVisible(i))
129*cdf0e10cSrcweir 						++nVis;
130*cdf0e10cSrcweir 				if ( nVis<2 || !pDoc->IsDocEditable() || nTabSelCount > 1 )
131*cdf0e10cSrcweir 					break;
132*cdf0e10cSrcweir 
133*cdf0e10cSrcweir 
134*cdf0e10cSrcweir 				String aName;
135*cdf0e10cSrcweir 				if( pReqArgs != NULL )
136*cdf0e10cSrcweir 				{
137*cdf0e10cSrcweir 					const SfxPoolItem* pItem;
138*cdf0e10cSrcweir 					if( IS_AVAILABLE( FID_TABLE_HIDE, &pItem ) )
139*cdf0e10cSrcweir 						aName = ((const SfxStringItem*)pItem)->GetValue();
140*cdf0e10cSrcweir 				}
141*cdf0e10cSrcweir 
142*cdf0e10cSrcweir 				if (!aName.Len())
143*cdf0e10cSrcweir 				{
144*cdf0e10cSrcweir 					pDoc->GetName( nCurrentTab, aName );		// aktuelle Tabelle
145*cdf0e10cSrcweir 					rReq.AppendItem( SfxStringItem( FID_TABLE_HIDE, aName ) );
146*cdf0e10cSrcweir 				}
147*cdf0e10cSrcweir 
148*cdf0e10cSrcweir 				SCTAB nHideTab;
149*cdf0e10cSrcweir 				if (pDoc->GetTable( aName, nHideTab ))
150*cdf0e10cSrcweir 					HideTable( nHideTab );
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir 				if( ! rReq.IsAPI() )
153*cdf0e10cSrcweir 					rReq.Done();
154*cdf0e10cSrcweir 			}
155*cdf0e10cSrcweir 			break;
156*cdf0e10cSrcweir 
157*cdf0e10cSrcweir 		case FID_TABLE_SHOW:
158*cdf0e10cSrcweir 			{
159*cdf0e10cSrcweir 				String aName;
160*cdf0e10cSrcweir 				if ( pReqArgs )
161*cdf0e10cSrcweir 				{
162*cdf0e10cSrcweir 					const SfxPoolItem* pItem;
163*cdf0e10cSrcweir 					if( IS_AVAILABLE( FID_TABLE_SHOW, &pItem ) )
164*cdf0e10cSrcweir 					{
165*cdf0e10cSrcweir 						aName = ((const SfxStringItem*)pItem)->GetValue();
166*cdf0e10cSrcweir 
167*cdf0e10cSrcweir 						ShowTable( aName );
168*cdf0e10cSrcweir 
169*cdf0e10cSrcweir 						if( ! rReq.IsAPI() )
170*cdf0e10cSrcweir 							rReq.Done();
171*cdf0e10cSrcweir 					}
172*cdf0e10cSrcweir 				}
173*cdf0e10cSrcweir 				else
174*cdf0e10cSrcweir 				{
175*cdf0e10cSrcweir                     //CHINA001 ScShowTabDlg* pDlg = new ScShowTabDlg( GetDialogParent() );
176*cdf0e10cSrcweir 					ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
177*cdf0e10cSrcweir 					DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir 					AbstractScShowTabDlg* pDlg = pFact->CreateScShowTabDlg( GetDialogParent(), RID_SCDLG_SHOW_TAB);
180*cdf0e10cSrcweir 					DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
181*cdf0e10cSrcweir 
182*cdf0e10cSrcweir                     String aTabName;
183*cdf0e10cSrcweir                     sal_Bool bFirst = sal_True;
184*cdf0e10cSrcweir 					for ( SCTAB i=0; i != nTabCount; i++ )
185*cdf0e10cSrcweir 					{
186*cdf0e10cSrcweir 						if (!pDoc->IsVisible(i))
187*cdf0e10cSrcweir 						{
188*cdf0e10cSrcweir                             pDoc->GetName( i, aTabName );
189*cdf0e10cSrcweir                             pDlg->Insert( aTabName, bFirst );
190*cdf0e10cSrcweir                             bFirst = sal_False;
191*cdf0e10cSrcweir 						}
192*cdf0e10cSrcweir 					}
193*cdf0e10cSrcweir 
194*cdf0e10cSrcweir 					if ( pDlg->Execute() == RET_OK )
195*cdf0e10cSrcweir 					{
196*cdf0e10cSrcweir 						sal_uInt16 nCount = pDlg->GetSelectEntryCount();
197*cdf0e10cSrcweir 						for (sal_uInt16 nPos=0; nPos<nCount; nPos++)
198*cdf0e10cSrcweir 						{
199*cdf0e10cSrcweir 							aName = pDlg->GetSelectEntry(nPos);
200*cdf0e10cSrcweir 							ShowTable( aName );
201*cdf0e10cSrcweir 						}
202*cdf0e10cSrcweir 						rReq.AppendItem( SfxStringItem( FID_TABLE_SHOW, aName ) );
203*cdf0e10cSrcweir 						rReq.Done();
204*cdf0e10cSrcweir 					}
205*cdf0e10cSrcweir 					delete pDlg;
206*cdf0e10cSrcweir 				}
207*cdf0e10cSrcweir 			}
208*cdf0e10cSrcweir 			break;
209*cdf0e10cSrcweir 
210*cdf0e10cSrcweir 		case FID_INS_TABLE:
211*cdf0e10cSrcweir         case FID_INS_TABLE_EXT:
212*cdf0e10cSrcweir 			{
213*cdf0e10cSrcweir 				ScMarkData& rMark 	 = pViewData->GetMarkData();
214*cdf0e10cSrcweir 				SCTAB	nTabSelCount = rMark.GetSelectCount();
215*cdf0e10cSrcweir 				SCTAB	nTabNr		 = nCurrentTab;
216*cdf0e10cSrcweir 
217*cdf0e10cSrcweir 				if ( !pDoc->IsDocEditable() )
218*cdf0e10cSrcweir 					break;							// gesperrt
219*cdf0e10cSrcweir 
220*cdf0e10cSrcweir 				if ( pReqArgs != NULL )				// von Basic
221*cdf0e10cSrcweir 				{
222*cdf0e10cSrcweir 					sal_Bool bOk = sal_False;
223*cdf0e10cSrcweir 					const SfxPoolItem*	pTabItem;
224*cdf0e10cSrcweir 					const SfxPoolItem*	pNameItem;
225*cdf0e10cSrcweir 					String				aName;
226*cdf0e10cSrcweir 
227*cdf0e10cSrcweir 					if ( IS_AVAILABLE( FN_PARAM_1, &pTabItem ) &&
228*cdf0e10cSrcweir 						 IS_AVAILABLE( nSlot, &pNameItem ) )
229*cdf0e10cSrcweir 					{
230*cdf0e10cSrcweir 						//	Tabellennr. von Basic: 1-basiert
231*cdf0e10cSrcweir 
232*cdf0e10cSrcweir 						aName = ((const SfxStringItem*)pNameItem)->GetValue();
233*cdf0e10cSrcweir 						nTabNr = ((const SfxUInt16Item*)pTabItem)->GetValue() - 1;
234*cdf0e10cSrcweir 						if ( nTabNr < nTabCount )
235*cdf0e10cSrcweir 							bOk = InsertTable( aName, nTabNr );
236*cdf0e10cSrcweir 					}
237*cdf0e10cSrcweir 
238*cdf0e10cSrcweir 					if (bOk)
239*cdf0e10cSrcweir 						rReq.Done( *pReqArgs );
240*cdf0e10cSrcweir 					//!	sonst Fehler setzen
241*cdf0e10cSrcweir 				}
242*cdf0e10cSrcweir 				else								// Dialog
243*cdf0e10cSrcweir 				{
244*cdf0e10cSrcweir //CHINA001					ScInsertTableDlg* pDlg = new ScInsertTableDlg(
245*cdf0e10cSrcweir //CHINA001					GetDialogParent(),
246*cdf0e10cSrcweir //CHINA001					*pViewData,nTabSelCount);
247*cdf0e10cSrcweir 					ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
248*cdf0e10cSrcweir 					DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
249*cdf0e10cSrcweir 
250*cdf0e10cSrcweir 					AbstractScInsertTableDlg* pDlg = pFact->CreateScInsertTableDlg( GetDialogParent(), *pViewData,
251*cdf0e10cSrcweir                                                                                     nTabSelCount, nSlot == FID_INS_TABLE_EXT,
252*cdf0e10cSrcweir 																					RID_SCDLG_INSERT_TABLE);
253*cdf0e10cSrcweir 					DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
254*cdf0e10cSrcweir 					if ( RET_OK == pDlg->Execute() )
255*cdf0e10cSrcweir 					{
256*cdf0e10cSrcweir 						if (pDlg->GetTablesFromFile())
257*cdf0e10cSrcweir 						{
258*cdf0e10cSrcweir 							SCTAB nTabs[MAXTABCOUNT];
259*cdf0e10cSrcweir 							SCTAB nCount = 0;
260*cdf0e10cSrcweir 							sal_uInt16 n = 0;
261*cdf0e10cSrcweir 							const String* pStr = pDlg->GetFirstTable( &n );
262*cdf0e10cSrcweir 							while ( pStr )
263*cdf0e10cSrcweir 							{
264*cdf0e10cSrcweir 								nTabs[nCount++] = static_cast<SCTAB>(n);
265*cdf0e10cSrcweir 								pStr = pDlg->GetNextTable( &n );
266*cdf0e10cSrcweir 							}
267*cdf0e10cSrcweir 							sal_Bool bLink = pDlg->GetTablesAsLink();
268*cdf0e10cSrcweir 							if (nCount != 0)
269*cdf0e10cSrcweir 							{
270*cdf0e10cSrcweir 								if(pDlg->IsTableBefore())
271*cdf0e10cSrcweir 								{
272*cdf0e10cSrcweir 									ImportTables( pDlg->GetDocShellTables(), nCount, nTabs,
273*cdf0e10cSrcweir 												bLink,nTabNr );
274*cdf0e10cSrcweir 								}
275*cdf0e10cSrcweir 								else
276*cdf0e10cSrcweir 								{
277*cdf0e10cSrcweir 									SCTAB	nTabAfter	 = nTabNr+1;
278*cdf0e10cSrcweir 
279*cdf0e10cSrcweir 									for(SCTAB j=nCurrentTab+1;j<nTabCount;j++)
280*cdf0e10cSrcweir 									{
281*cdf0e10cSrcweir 										if(!pDoc->IsScenario(j))
282*cdf0e10cSrcweir 										{
283*cdf0e10cSrcweir 											nTabAfter=j;
284*cdf0e10cSrcweir 											break;
285*cdf0e10cSrcweir 										}
286*cdf0e10cSrcweir 									}
287*cdf0e10cSrcweir 
288*cdf0e10cSrcweir 									ImportTables( pDlg->GetDocShellTables(), nCount, nTabs,
289*cdf0e10cSrcweir 												bLink,nTabAfter );
290*cdf0e10cSrcweir 								}
291*cdf0e10cSrcweir 							}
292*cdf0e10cSrcweir 						}
293*cdf0e10cSrcweir 						else
294*cdf0e10cSrcweir 						{
295*cdf0e10cSrcweir 							SCTAB nCount=pDlg->GetTableCount();
296*cdf0e10cSrcweir 							if(pDlg->IsTableBefore())
297*cdf0e10cSrcweir 							{
298*cdf0e10cSrcweir 								if(nCount==1 && pDlg->GetFirstTable()->Len()>0)
299*cdf0e10cSrcweir 								{
300*cdf0e10cSrcweir 									rReq.AppendItem( SfxStringItem( FID_INS_TABLE, *pDlg->GetFirstTable() ) );
301*cdf0e10cSrcweir 									rReq.AppendItem( SfxUInt16Item( FN_PARAM_1, static_cast<sal_uInt16>(nTabNr) + 1 ) );		// 1-based
302*cdf0e10cSrcweir 									rReq.Done();
303*cdf0e10cSrcweir 
304*cdf0e10cSrcweir 									InsertTable( *pDlg->GetFirstTable(), nTabNr );
305*cdf0e10cSrcweir 								}
306*cdf0e10cSrcweir 								else
307*cdf0e10cSrcweir 									InsertTables( NULL, nTabNr,nCount );
308*cdf0e10cSrcweir 							}
309*cdf0e10cSrcweir 							else
310*cdf0e10cSrcweir 							{
311*cdf0e10cSrcweir 								SCTAB	nTabAfter	 = nTabNr+1;
312*cdf0e10cSrcweir 								SCTAB nSelHigh=0;
313*cdf0e10cSrcweir 
314*cdf0e10cSrcweir 								for(SCTAB i=0;i<nTabCount;i++)
315*cdf0e10cSrcweir 								{
316*cdf0e10cSrcweir 									if(rMark.GetTableSelect(i))
317*cdf0e10cSrcweir 									{
318*cdf0e10cSrcweir 										nSelHigh=i;
319*cdf0e10cSrcweir 									}
320*cdf0e10cSrcweir 								}
321*cdf0e10cSrcweir 
322*cdf0e10cSrcweir 								for(SCTAB j=nSelHigh+1;j<nTabCount;j++)
323*cdf0e10cSrcweir 								{
324*cdf0e10cSrcweir 									if(!pDoc->IsScenario(j))
325*cdf0e10cSrcweir 									{
326*cdf0e10cSrcweir 										nTabAfter=j;
327*cdf0e10cSrcweir 										break;
328*cdf0e10cSrcweir 									}
329*cdf0e10cSrcweir                                     else // #101672#; increase nTabAfter, because it is possible that the scenario tables are the last
330*cdf0e10cSrcweir                                         nTabAfter = j + 1;
331*cdf0e10cSrcweir 								}
332*cdf0e10cSrcweir 
333*cdf0e10cSrcweir 								if(nCount==1 && pDlg->GetFirstTable()->Len()>0)
334*cdf0e10cSrcweir 								{
335*cdf0e10cSrcweir 									rReq.AppendItem( SfxStringItem( FID_INS_TABLE, *pDlg->GetFirstTable() ) );
336*cdf0e10cSrcweir 									rReq.AppendItem( SfxUInt16Item( FN_PARAM_1, static_cast<sal_uInt16>(nTabAfter) + 1 ) );		// 1-based
337*cdf0e10cSrcweir 									rReq.Done();
338*cdf0e10cSrcweir 
339*cdf0e10cSrcweir 									InsertTable( *pDlg->GetFirstTable(), nTabAfter);
340*cdf0e10cSrcweir 								}
341*cdf0e10cSrcweir 								else
342*cdf0e10cSrcweir 								{
343*cdf0e10cSrcweir 									InsertTables( NULL, nTabAfter,nCount);
344*cdf0e10cSrcweir 								}
345*cdf0e10cSrcweir 							}
346*cdf0e10cSrcweir 						}
347*cdf0e10cSrcweir 					}
348*cdf0e10cSrcweir 
349*cdf0e10cSrcweir 					delete pDlg;
350*cdf0e10cSrcweir 				}
351*cdf0e10cSrcweir 			}
352*cdf0e10cSrcweir 			break;
353*cdf0e10cSrcweir 
354*cdf0e10cSrcweir 		case FID_TAB_APPEND:
355*cdf0e10cSrcweir 		case FID_TAB_RENAME:
356*cdf0e10cSrcweir 		case FID_TAB_MENU_RENAME:
357*cdf0e10cSrcweir 			{
358*cdf0e10cSrcweir 				//	FID_TAB_MENU_RENAME - "umbenennen" im Menu
359*cdf0e10cSrcweir 				//	FID_TAB_RENAME		- "Name"-Property fuer Basic
360*cdf0e10cSrcweir 				//	Execute ist gleich, aber im GetState wird MENU_RENAME evtl. disabled
361*cdf0e10cSrcweir 
362*cdf0e10cSrcweir 				if ( nSlot == FID_TAB_MENU_RENAME )
363*cdf0e10cSrcweir 					nSlot = FID_TAB_RENAME;				// Execute ist gleich
364*cdf0e10cSrcweir 
365*cdf0e10cSrcweir 				SCTAB nTabNr = pViewData->GetTabNo();
366*cdf0e10cSrcweir 				ScMarkData& rMark = pViewData->GetMarkData();
367*cdf0e10cSrcweir 				SCTAB nTabSelCount = rMark.GetSelectCount();
368*cdf0e10cSrcweir 
369*cdf0e10cSrcweir 				if ( !pDoc->IsDocEditable() )
370*cdf0e10cSrcweir 					break; // alles gesperrt
371*cdf0e10cSrcweir 
372*cdf0e10cSrcweir 				if ( nSlot != FID_TAB_APPEND &&
373*cdf0e10cSrcweir 						( pDoc->IsTabProtected( nTabNr ) || nTabSelCount > 1 ) )
374*cdf0e10cSrcweir 					break; // kein Rename
375*cdf0e10cSrcweir 
376*cdf0e10cSrcweir #if 0
377*cdf0e10cSrcweir 				//	ScSbxObject wird nicht mehr benutzt, stattdessen aus dem
378*cdf0e10cSrcweir 				//	ScSbxTable::Notify die richtige Tabelle an der Basic-View eingestellt
379*cdf0e10cSrcweir 				if( rReq.IsAPI() )
380*cdf0e10cSrcweir 				{
381*cdf0e10cSrcweir 					SbxObject* pObj = GetScSbxObject();
382*cdf0e10cSrcweir 					ScSbxTable* pSbxTab = PTR_CAST( ScSbxTable, pObj );
383*cdf0e10cSrcweir 					DBG_ASSERT( pSbxTab, "pSbxTab???" );
384*cdf0e10cSrcweir 
385*cdf0e10cSrcweir 					if( pSbxTab )
386*cdf0e10cSrcweir 						nTabNr = pSbxTab->GetTableNr();
387*cdf0e10cSrcweir 				}
388*cdf0e10cSrcweir #endif
389*cdf0e10cSrcweir 
390*cdf0e10cSrcweir 				if( pReqArgs != NULL )
391*cdf0e10cSrcweir 				{
392*cdf0e10cSrcweir 					sal_Bool		bDone	= sal_False;
393*cdf0e10cSrcweir 					const SfxPoolItem* pItem;
394*cdf0e10cSrcweir 					String		aName;
395*cdf0e10cSrcweir 
396*cdf0e10cSrcweir 					if( IS_AVAILABLE( FN_PARAM_1, &pItem ) )
397*cdf0e10cSrcweir 						nTabNr = ((const SfxUInt16Item*)pItem)->GetValue();
398*cdf0e10cSrcweir 
399*cdf0e10cSrcweir 					if( IS_AVAILABLE( nSlot, &pItem ) )
400*cdf0e10cSrcweir 						aName = ((const SfxStringItem*)pItem)->GetValue();
401*cdf0e10cSrcweir 
402*cdf0e10cSrcweir 					switch ( nSlot )
403*cdf0e10cSrcweir 					{
404*cdf0e10cSrcweir 						case FID_TAB_APPEND:
405*cdf0e10cSrcweir 							bDone = AppendTable( aName );
406*cdf0e10cSrcweir 							break;
407*cdf0e10cSrcweir 						case FID_TAB_RENAME:
408*cdf0e10cSrcweir 							bDone = RenameTable( aName, nTabNr );
409*cdf0e10cSrcweir 							break;
410*cdf0e10cSrcweir 					}
411*cdf0e10cSrcweir 
412*cdf0e10cSrcweir 					if( bDone )
413*cdf0e10cSrcweir 					{
414*cdf0e10cSrcweir 						rReq.Done( *pReqArgs );
415*cdf0e10cSrcweir 					}
416*cdf0e10cSrcweir 				}
417*cdf0e10cSrcweir 				else
418*cdf0e10cSrcweir 				{
419*cdf0e10cSrcweir 					sal_uInt16		nRet	= RET_OK;
420*cdf0e10cSrcweir 					sal_Bool		bDone	= sal_False;
421*cdf0e10cSrcweir 					String		aErrMsg ( ScGlobal::GetRscString( STR_INVALIDTABNAME ) );
422*cdf0e10cSrcweir 					String		aName;
423*cdf0e10cSrcweir 					String		aDlgTitle;
424*cdf0e10cSrcweir                     const sal_Char* pHelpId = 0;
425*cdf0e10cSrcweir 
426*cdf0e10cSrcweir 					switch ( nSlot )
427*cdf0e10cSrcweir 					{
428*cdf0e10cSrcweir 						case FID_TAB_APPEND:
429*cdf0e10cSrcweir 							aDlgTitle = String(ScResId(SCSTR_APDTABLE));
430*cdf0e10cSrcweir 							pDoc->CreateValidTabName( aName );
431*cdf0e10cSrcweir                             pHelpId = HID_SC_APPEND_NAME;
432*cdf0e10cSrcweir 							break;
433*cdf0e10cSrcweir 
434*cdf0e10cSrcweir 						case FID_TAB_RENAME:
435*cdf0e10cSrcweir 							aDlgTitle = String(ScResId(SCSTR_RENAMETAB));
436*cdf0e10cSrcweir 							pDoc->GetName( pViewData->GetTabNo(), aName );
437*cdf0e10cSrcweir                             pHelpId = HID_SC_RENAME_NAME;
438*cdf0e10cSrcweir 							break;
439*cdf0e10cSrcweir 					}
440*cdf0e10cSrcweir 
441*cdf0e10cSrcweir 					ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
442*cdf0e10cSrcweir 					DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
443*cdf0e10cSrcweir 
444*cdf0e10cSrcweir 					AbstractScStringInputDlg* pDlg = pFact->CreateScStringInputDlg( GetDialogParent(),
445*cdf0e10cSrcweir 																					aDlgTitle,
446*cdf0e10cSrcweir 																					String(ScResId(SCSTR_NAME)),
447*cdf0e10cSrcweir 																					aName,
448*cdf0e10cSrcweir 																					GetStaticInterface()->GetSlot(nSlot)->GetCommand(), pHelpId, RID_SCDLG_STRINPUT);
449*cdf0e10cSrcweir 					DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
450*cdf0e10cSrcweir 
451*cdf0e10cSrcweir 					while ( !bDone && nRet == RET_OK )
452*cdf0e10cSrcweir 					{
453*cdf0e10cSrcweir 						nRet = pDlg->Execute();
454*cdf0e10cSrcweir 
455*cdf0e10cSrcweir 						if ( nRet == RET_OK )
456*cdf0e10cSrcweir 						{
457*cdf0e10cSrcweir 							pDlg->GetInputString( aName );
458*cdf0e10cSrcweir 
459*cdf0e10cSrcweir 
460*cdf0e10cSrcweir 							switch ( nSlot )
461*cdf0e10cSrcweir 							{
462*cdf0e10cSrcweir 								case FID_TAB_APPEND:
463*cdf0e10cSrcweir 									bDone = AppendTable( aName );
464*cdf0e10cSrcweir 									break;
465*cdf0e10cSrcweir 								case FID_TAB_RENAME:
466*cdf0e10cSrcweir 									bDone = RenameTable( aName, nTabNr );
467*cdf0e10cSrcweir 									break;
468*cdf0e10cSrcweir 							}
469*cdf0e10cSrcweir 
470*cdf0e10cSrcweir 							if ( bDone )
471*cdf0e10cSrcweir 							{
472*cdf0e10cSrcweir 								rReq.AppendItem( SfxStringItem( nSlot, aName ) );
473*cdf0e10cSrcweir 								rReq.Done();
474*cdf0e10cSrcweir 							}
475*cdf0e10cSrcweir 							else
476*cdf0e10cSrcweir 							{
477*cdf0e10cSrcweir 								if( rReq.IsAPI() )
478*cdf0e10cSrcweir 								{
479*cdf0e10cSrcweir 									StarBASIC::Error( SbERR_SETPROP_FAILED ); // XXX Fehlerbehandlung???
480*cdf0e10cSrcweir 								}
481*cdf0e10cSrcweir 								else
482*cdf0e10cSrcweir 								{
483*cdf0e10cSrcweir 									nRet = ErrorBox( GetDialogParent(),
484*cdf0e10cSrcweir 													 WinBits( WB_OK | WB_DEF_OK ),
485*cdf0e10cSrcweir 													 aErrMsg
486*cdf0e10cSrcweir 												   ).Execute();
487*cdf0e10cSrcweir 								}
488*cdf0e10cSrcweir 							}
489*cdf0e10cSrcweir 						}
490*cdf0e10cSrcweir 					}
491*cdf0e10cSrcweir 					delete pDlg;
492*cdf0e10cSrcweir 				}
493*cdf0e10cSrcweir 			}
494*cdf0e10cSrcweir 			break;
495*cdf0e10cSrcweir 
496*cdf0e10cSrcweir 		case FID_TAB_MOVE:
497*cdf0e10cSrcweir 			{
498*cdf0e10cSrcweir 				if ( pDoc->GetChangeTrack() != NULL )
499*cdf0e10cSrcweir 					break;		// bei aktiviertem ChangeTracking kein TabMove
500*cdf0e10cSrcweir 
501*cdf0e10cSrcweir 				sal_Bool   bDoIt = sal_False;
502*cdf0e10cSrcweir 				sal_uInt16 nDoc = 0;
503*cdf0e10cSrcweir 				SCTAB nTab = pViewData->GetTabNo();
504*cdf0e10cSrcweir 				sal_Bool   bCpy = sal_False;
505*cdf0e10cSrcweir 				String aDocName;
506*cdf0e10cSrcweir 
507*cdf0e10cSrcweir 				if( pReqArgs != NULL )
508*cdf0e10cSrcweir 				{
509*cdf0e10cSrcweir 					SCTAB nTableCount = pDoc->GetTableCount();
510*cdf0e10cSrcweir 					const SfxPoolItem* pItem;
511*cdf0e10cSrcweir 
512*cdf0e10cSrcweir 					if( IS_AVAILABLE( FID_TAB_MOVE, &pItem ) )
513*cdf0e10cSrcweir 						aDocName = ((const SfxStringItem*)pItem)->GetValue();
514*cdf0e10cSrcweir 					if( IS_AVAILABLE( FN_PARAM_1, &pItem ) )
515*cdf0e10cSrcweir 					{
516*cdf0e10cSrcweir 						//	Tabelle ist 1-basiert
517*cdf0e10cSrcweir 						nTab = ((const SfxUInt16Item*)pItem)->GetValue() - 1;
518*cdf0e10cSrcweir 						if ( nTab >= nTableCount )
519*cdf0e10cSrcweir 							nTab = SC_TAB_APPEND;
520*cdf0e10cSrcweir 					}
521*cdf0e10cSrcweir 					if( IS_AVAILABLE( FN_PARAM_2, &pItem ) )
522*cdf0e10cSrcweir 						bCpy = ((const SfxBoolItem*)pItem)->GetValue();
523*cdf0e10cSrcweir 
524*cdf0e10cSrcweir 					if( aDocName.Len() )
525*cdf0e10cSrcweir 					{
526*cdf0e10cSrcweir 						SfxObjectShell* pSh		= SfxObjectShell::GetFirst();
527*cdf0e10cSrcweir 						ScDocShell*		pScSh	= NULL;
528*cdf0e10cSrcweir 						sal_uInt16			i=0;
529*cdf0e10cSrcweir 
530*cdf0e10cSrcweir 						while ( pSh )
531*cdf0e10cSrcweir 						{
532*cdf0e10cSrcweir 							pScSh = PTR_CAST( ScDocShell, pSh );
533*cdf0e10cSrcweir 
534*cdf0e10cSrcweir 							if( pScSh )
535*cdf0e10cSrcweir 							{
536*cdf0e10cSrcweir 								pScSh->GetTitle();
537*cdf0e10cSrcweir 
538*cdf0e10cSrcweir 								if( pScSh->GetTitle() == aDocName )
539*cdf0e10cSrcweir 								{
540*cdf0e10cSrcweir 									nDoc = i;
541*cdf0e10cSrcweir 									ScDocument* pDestDoc = pScSh->GetDocument();
542*cdf0e10cSrcweir 									nTableCount = pDestDoc->GetTableCount();
543*cdf0e10cSrcweir 									bDoIt = pDestDoc->IsDocEditable();
544*cdf0e10cSrcweir 									break;
545*cdf0e10cSrcweir 								}
546*cdf0e10cSrcweir 
547*cdf0e10cSrcweir 								i++;		// nur die ScDocShell's zaehlen
548*cdf0e10cSrcweir 							}
549*cdf0e10cSrcweir 							pSh = SfxObjectShell::GetNext( *pSh );
550*cdf0e10cSrcweir 						}
551*cdf0e10cSrcweir 					}
552*cdf0e10cSrcweir 					else // Kein Dokumentname -> neues Dokument
553*cdf0e10cSrcweir 					{
554*cdf0e10cSrcweir 						nDoc = SC_DOC_NEW;
555*cdf0e10cSrcweir 						bDoIt = sal_True;
556*cdf0e10cSrcweir 					}
557*cdf0e10cSrcweir 
558*cdf0e10cSrcweir 					if ( bDoIt && nTab >= nTableCount )		// ggf. anhaengen
559*cdf0e10cSrcweir 						nTab = SC_TAB_APPEND;
560*cdf0e10cSrcweir 				}
561*cdf0e10cSrcweir 				else
562*cdf0e10cSrcweir 				{
563*cdf0e10cSrcweir 					//CHINA001 ScMoveTableDlg* pDlg = new ScMoveTableDlg( GetDialogParent() );
564*cdf0e10cSrcweir 					ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
565*cdf0e10cSrcweir 					DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
566*cdf0e10cSrcweir 
567*cdf0e10cSrcweir 					AbstractScMoveTableDlg* pDlg = pFact->CreateScMoveTableDlg( GetDialogParent(), RID_SCDLG_MOVETAB );
568*cdf0e10cSrcweir 					DBG_ASSERT(pDlg, "Dialog create fail!");//CHINA001
569*cdf0e10cSrcweir 
570*cdf0e10cSrcweir 					SCTAB nTableCount = pDoc->GetTableCount();
571*cdf0e10cSrcweir 					ScMarkData& rMark		= GetViewData()->GetMarkData();
572*cdf0e10cSrcweir 					SCTAB		nTabSelCount = rMark.GetSelectCount();
573*cdf0e10cSrcweir 
574*cdf0e10cSrcweir 
575*cdf0e10cSrcweir 					if(nTableCount==nTabSelCount)
576*cdf0e10cSrcweir 					{
577*cdf0e10cSrcweir 						pDlg->SetCopyTable();
578*cdf0e10cSrcweir 						pDlg->EnableCopyTable(sal_False);
579*cdf0e10cSrcweir 					}
580*cdf0e10cSrcweir 					if ( pDlg->Execute() == RET_OK )
581*cdf0e10cSrcweir 					{
582*cdf0e10cSrcweir 						nDoc = pDlg->GetSelectedDocument();
583*cdf0e10cSrcweir 						nTab = pDlg->GetSelectedTable();
584*cdf0e10cSrcweir 						bCpy = pDlg->GetCopyTable();
585*cdf0e10cSrcweir 						bDoIt = sal_True;
586*cdf0e10cSrcweir 
587*cdf0e10cSrcweir 						String aFoundDocName;
588*cdf0e10cSrcweir 						if ( nDoc != SC_DOC_NEW )
589*cdf0e10cSrcweir 						{
590*cdf0e10cSrcweir 							ScDocShell* pSh = ScDocShell::GetShellByNum( nDoc );
591*cdf0e10cSrcweir 							if (pSh)
592*cdf0e10cSrcweir 							{
593*cdf0e10cSrcweir 								aFoundDocName = pSh->GetTitle();
594*cdf0e10cSrcweir 								if ( !pSh->GetDocument()->IsDocEditable() )
595*cdf0e10cSrcweir 								{
596*cdf0e10cSrcweir 									ErrorMessage(STR_READONLYERR);
597*cdf0e10cSrcweir 									bDoIt = sal_False;
598*cdf0e10cSrcweir 								}
599*cdf0e10cSrcweir 							}
600*cdf0e10cSrcweir 						}
601*cdf0e10cSrcweir 						rReq.AppendItem( SfxStringItem( FID_TAB_MOVE, aFoundDocName ) );
602*cdf0e10cSrcweir 						//	Tabelle ist 1-basiert, wenn nicht APPEND
603*cdf0e10cSrcweir 						SCTAB nBasicTab = ( nTab <= MAXTAB ) ? (nTab+1) : nTab;
604*cdf0e10cSrcweir 						rReq.AppendItem( SfxUInt16Item( FN_PARAM_1, static_cast<sal_uInt16>(nBasicTab) ) );
605*cdf0e10cSrcweir 						rReq.AppendItem( SfxBoolItem( FN_PARAM_2, bCpy ) );
606*cdf0e10cSrcweir 					}
607*cdf0e10cSrcweir 					delete pDlg;
608*cdf0e10cSrcweir 				}
609*cdf0e10cSrcweir 
610*cdf0e10cSrcweir 				if( bDoIt )
611*cdf0e10cSrcweir 				{
612*cdf0e10cSrcweir 					rReq.Done();		// aufzeichnen, solange das Dokument noch aktiv ist
613*cdf0e10cSrcweir 
614*cdf0e10cSrcweir 					MoveTable( nDoc, nTab, bCpy );
615*cdf0e10cSrcweir 				}
616*cdf0e10cSrcweir 			}
617*cdf0e10cSrcweir 			break;
618*cdf0e10cSrcweir 
619*cdf0e10cSrcweir 		case FID_DELETE_TABLE:
620*cdf0e10cSrcweir 			{
621*cdf0e10cSrcweir 				//	Parameter war ueberfluessig, weil die Methode an der Table haengt
622*cdf0e10cSrcweir 
623*cdf0e10cSrcweir 				sal_Bool bDoIt = rReq.IsAPI();
624*cdf0e10cSrcweir 				if( !bDoIt )
625*cdf0e10cSrcweir 				{
626*cdf0e10cSrcweir 					//	wenn's nicht von Basic kommt, nochmal nachfragen:
627*cdf0e10cSrcweir 
628*cdf0e10cSrcweir #if ENABLE_LAYOUT
629*cdf0e10cSrcweir // Using layout::QueryBox without client code modification is
630*cdf0e10cSrcweir // deprecated, rather add HIG-complient buttons with verbs.
631*cdf0e10cSrcweir #define QueryBox( parent, winbits, question ) layout::QueryBox (parent, question, ScGlobal::GetRscString (STR_UNDO_DELETE_TAB))
632*cdf0e10cSrcweir #endif /* ENABLE_LAYOUT */
633*cdf0e10cSrcweir 
634*cdf0e10cSrcweir                         bDoIt = ( RET_YES ==
635*cdf0e10cSrcweir                                   QueryBox( GetDialogParent(),
636*cdf0e10cSrcweir                                             WinBits( WB_YES_NO | WB_DEF_YES ),
637*cdf0e10cSrcweir                                             ScGlobal::GetRscString(STR_QUERY_DELTAB)
638*cdf0e10cSrcweir                                       ).Execute() );
639*cdf0e10cSrcweir 				}
640*cdf0e10cSrcweir 				if( bDoIt )
641*cdf0e10cSrcweir 				{
642*cdf0e10cSrcweir 					SCTAB nNewTab	= nCurrentTab;
643*cdf0e10cSrcweir 					SCTAB nFirstTab=0;
644*cdf0e10cSrcweir 					sal_Bool   bTabFlag=sal_False;
645*cdf0e10cSrcweir 					ScMarkData& rMark = pViewData->GetMarkData();
646*cdf0e10cSrcweir 					SvShorts TheTabs;
647*cdf0e10cSrcweir 					for(SCTAB i=0;i<nTabCount;i++)
648*cdf0e10cSrcweir 					{
649*cdf0e10cSrcweir 						if(rMark.GetTableSelect(i) &&!pDoc->IsTabProtected(i))
650*cdf0e10cSrcweir 						{
651*cdf0e10cSrcweir 							TheTabs.push_back(i);
652*cdf0e10cSrcweir 							bTabFlag=sal_True;
653*cdf0e10cSrcweir 							if(nNewTab==i) nNewTab++;
654*cdf0e10cSrcweir 						}
655*cdf0e10cSrcweir 						if(!bTabFlag) nFirstTab=i;
656*cdf0e10cSrcweir 					}
657*cdf0e10cSrcweir 					if(nNewTab>=nTabCount) nNewTab=nFirstTab;
658*cdf0e10cSrcweir 
659*cdf0e10cSrcweir 					pViewData->SetTabNo(nNewTab);
660*cdf0e10cSrcweir 					DeleteTables(TheTabs);
661*cdf0e10cSrcweir 					TheTabs.clear();
662*cdf0e10cSrcweir 					rReq.Done();
663*cdf0e10cSrcweir 				}
664*cdf0e10cSrcweir 			}
665*cdf0e10cSrcweir 			break;
666*cdf0e10cSrcweir 
667*cdf0e10cSrcweir 		case FID_TAB_RTL:
668*cdf0e10cSrcweir 			{
669*cdf0e10cSrcweir 				ScDocShell* pDocSh = pViewData->GetDocShell();
670*cdf0e10cSrcweir 				ScDocFunc aFunc(*pDocSh);
671*cdf0e10cSrcweir 				sal_Bool bSet = !pDoc->IsLayoutRTL( nCurrentTab );
672*cdf0e10cSrcweir 
673*cdf0e10cSrcweir 				const ScMarkData& rMark = pViewData->GetMarkData();
674*cdf0e10cSrcweir 				if ( rMark.GetSelectCount() != 0 )
675*cdf0e10cSrcweir 				{
676*cdf0e10cSrcweir 					//	handle several sheets
677*cdf0e10cSrcweir 
678*cdf0e10cSrcweir 					::svl::IUndoManager* pUndoManager = pDocSh->GetUndoManager();
679*cdf0e10cSrcweir 					String aUndo = ScGlobal::GetRscString( STR_UNDO_TAB_RTL );
680*cdf0e10cSrcweir 					pUndoManager->EnterListAction( aUndo, aUndo );
681*cdf0e10cSrcweir 
682*cdf0e10cSrcweir 					for (SCTAB nTab=0; nTab<nTabCount; nTab++)
683*cdf0e10cSrcweir 						if ( rMark.GetTableSelect(nTab) )
684*cdf0e10cSrcweir 							aFunc.SetLayoutRTL( nTab, bSet, sal_False );
685*cdf0e10cSrcweir 
686*cdf0e10cSrcweir 					pUndoManager->LeaveListAction();
687*cdf0e10cSrcweir 				}
688*cdf0e10cSrcweir 				else
689*cdf0e10cSrcweir 					aFunc.SetLayoutRTL( nCurrentTab, bSet, sal_False );
690*cdf0e10cSrcweir 			}
691*cdf0e10cSrcweir 			break;
692*cdf0e10cSrcweir 
693*cdf0e10cSrcweir         case FID_TAB_SET_TAB_BG_COLOR:
694*cdf0e10cSrcweir         case FID_TAB_MENU_SET_TAB_BG_COLOR:
695*cdf0e10cSrcweir             {
696*cdf0e10cSrcweir                 if ( nSlot == FID_TAB_MENU_SET_TAB_BG_COLOR )
697*cdf0e10cSrcweir                     nSlot = FID_TAB_SET_TAB_BG_COLOR;
698*cdf0e10cSrcweir                 SCTAB nTabNr = pViewData->GetTabNo();
699*cdf0e10cSrcweir                 ScMarkData& rMark = pViewData->GetMarkData();
700*cdf0e10cSrcweir                 SCTAB nTabSelCount = rMark.GetSelectCount();
701*cdf0e10cSrcweir                 if ( !pDoc->IsDocEditable() )
702*cdf0e10cSrcweir                     break;
703*cdf0e10cSrcweir 
704*cdf0e10cSrcweir                 if ( pDoc->IsTabProtected( nTabNr ) ) // ||nTabSelCount > 1
705*cdf0e10cSrcweir                     break;
706*cdf0e10cSrcweir 
707*cdf0e10cSrcweir                 if( pReqArgs != NULL )
708*cdf0e10cSrcweir                 {
709*cdf0e10cSrcweir                     sal_Bool                bDone = sal_False;
710*cdf0e10cSrcweir                     const SfxPoolItem*  pItem;
711*cdf0e10cSrcweir                     Color               aColor;
712*cdf0e10cSrcweir                     if( IS_AVAILABLE( FN_PARAM_1, &pItem ) )
713*cdf0e10cSrcweir                         nTabNr = ((const SfxUInt16Item*)pItem)->GetValue();
714*cdf0e10cSrcweir 
715*cdf0e10cSrcweir                     if( IS_AVAILABLE( nSlot, &pItem ) )
716*cdf0e10cSrcweir                         aColor = ((const SvxColorItem*)pItem)->GetValue();
717*cdf0e10cSrcweir 
718*cdf0e10cSrcweir                     if ( nTabSelCount > 1 )
719*cdf0e10cSrcweir                     {
720*cdf0e10cSrcweir                         scoped_ptr<ScUndoTabColorInfo::List>
721*cdf0e10cSrcweir                             pTabColorList(new ScUndoTabColorInfo::List);
722*cdf0e10cSrcweir                         for (SCTAB nTab=0; nTab<nTabCount; nTab++)
723*cdf0e10cSrcweir                         {
724*cdf0e10cSrcweir                             if ( rMark.GetTableSelect(nTab) && !pDoc->IsTabProtected(nTab) )
725*cdf0e10cSrcweir                             {
726*cdf0e10cSrcweir                                 ScUndoTabColorInfo aTabColorInfo(nTab);
727*cdf0e10cSrcweir                                 aTabColorInfo.maNewTabBgColor = aColor;
728*cdf0e10cSrcweir                                 pTabColorList->push_back(aTabColorInfo);
729*cdf0e10cSrcweir                             }
730*cdf0e10cSrcweir                         }
731*cdf0e10cSrcweir                         bDone = SetTabBgColor( *pTabColorList );
732*cdf0e10cSrcweir                     }
733*cdf0e10cSrcweir                     else
734*cdf0e10cSrcweir                     {
735*cdf0e10cSrcweir                         bDone = SetTabBgColor( aColor, nCurrentTab ); //ScViewFunc.SetTabBgColor
736*cdf0e10cSrcweir                     }
737*cdf0e10cSrcweir                     if( bDone )
738*cdf0e10cSrcweir                     {
739*cdf0e10cSrcweir                         rReq.Done( *pReqArgs );
740*cdf0e10cSrcweir                     }
741*cdf0e10cSrcweir                 }
742*cdf0e10cSrcweir                 else
743*cdf0e10cSrcweir                 {
744*cdf0e10cSrcweir                     sal_uInt16      nRet    = RET_OK; /// temp
745*cdf0e10cSrcweir                     sal_Bool        bDone   = sal_False; /// temp
746*cdf0e10cSrcweir                     Color       aTabBgColor;
747*cdf0e10cSrcweir                     Color       aNewTabBgColor;
748*cdf0e10cSrcweir 
749*cdf0e10cSrcweir                     aTabBgColor = pDoc->GetTabBgColor( nCurrentTab );
750*cdf0e10cSrcweir                     ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
751*cdf0e10cSrcweir                     DBG_ASSERT(pFact, "ScAbstractFactory create fail!");
752*cdf0e10cSrcweir                     AbstractScTabBgColorDlg* pDlg = pFact->CreateScTabBgColorDlg(
753*cdf0e10cSrcweir                                                                 GetDialogParent(),
754*cdf0e10cSrcweir                                                                 String(ScResId(SCSTR_SET_TAB_BG_COLOR)),
755*cdf0e10cSrcweir                                                                 String(ScResId(SCSTR_NO_TAB_BG_COLOR)),
756*cdf0e10cSrcweir                                                                 aTabBgColor,
757*cdf0e10cSrcweir                                                                 CMD_FID_TAB_SET_TAB_BG_COLOR,
758*cdf0e10cSrcweir                                                                 RID_SCDLG_TAB_BG_COLOR);
759*cdf0e10cSrcweir                     while ( !bDone && nRet == RET_OK )
760*cdf0e10cSrcweir                     {
761*cdf0e10cSrcweir                         nRet = pDlg->Execute();
762*cdf0e10cSrcweir                         if( nRet == RET_OK )
763*cdf0e10cSrcweir                         {
764*cdf0e10cSrcweir                             Color aSelectedColor;
765*cdf0e10cSrcweir                             pDlg->GetSelectedColor(aSelectedColor);
766*cdf0e10cSrcweir                             scoped_ptr<ScUndoTabColorInfo::List>
767*cdf0e10cSrcweir                                 pTabColorList(new ScUndoTabColorInfo::List);
768*cdf0e10cSrcweir                             if ( nTabSelCount > 1 )
769*cdf0e10cSrcweir                             {
770*cdf0e10cSrcweir                                 for  (SCTAB nTab=0; nTab<nTabCount; nTab++)
771*cdf0e10cSrcweir                                 {
772*cdf0e10cSrcweir                                     if ( rMark.GetTableSelect(nTab) && !pDoc->IsTabProtected(nTab) )
773*cdf0e10cSrcweir                                     {
774*cdf0e10cSrcweir                                         ScUndoTabColorInfo aTabColorInfo(nTab);
775*cdf0e10cSrcweir                                         aTabColorInfo.maNewTabBgColor = aSelectedColor;
776*cdf0e10cSrcweir                                         pTabColorList->push_back(aTabColorInfo);
777*cdf0e10cSrcweir                                     }
778*cdf0e10cSrcweir                                 }
779*cdf0e10cSrcweir                                 bDone = SetTabBgColor( *pTabColorList );
780*cdf0e10cSrcweir                             }
781*cdf0e10cSrcweir                             else
782*cdf0e10cSrcweir                             {
783*cdf0e10cSrcweir                                 bDone = SetTabBgColor( aSelectedColor, nCurrentTab ); //ScViewFunc.SetTabBgColor
784*cdf0e10cSrcweir                             }
785*cdf0e10cSrcweir                             if ( bDone )
786*cdf0e10cSrcweir                             {
787*cdf0e10cSrcweir                                 rReq.AppendItem( SvxColorItem( aTabBgColor, nSlot ) );
788*cdf0e10cSrcweir                                 rReq.Done();
789*cdf0e10cSrcweir                             }
790*cdf0e10cSrcweir                             else
791*cdf0e10cSrcweir                             {
792*cdf0e10cSrcweir                                 if( rReq.IsAPI() )
793*cdf0e10cSrcweir                                 {
794*cdf0e10cSrcweir                                     StarBASIC::Error( SbERR_SETPROP_FAILED );
795*cdf0e10cSrcweir                                 }
796*cdf0e10cSrcweir                             }
797*cdf0e10cSrcweir                         }
798*cdf0e10cSrcweir                     }
799*cdf0e10cSrcweir                     delete( pDlg );
800*cdf0e10cSrcweir                 }
801*cdf0e10cSrcweir             }
802*cdf0e10cSrcweir             break;
803*cdf0e10cSrcweir 
804*cdf0e10cSrcweir         case FID_TAB_EVENTS:
805*cdf0e10cSrcweir             {
806*cdf0e10cSrcweir                 ScDocShell* pDocSh = pViewData->GetDocShell();
807*cdf0e10cSrcweir                 uno::Reference<container::XNameReplace> xEvents( new ScSheetEventsObj( pDocSh, nCurrentTab ) );
808*cdf0e10cSrcweir                 uno::Reference<frame::XFrame> xFrame = GetViewFrame()->GetFrame().GetFrameInterface();
809*cdf0e10cSrcweir                 SvxAbstractDialogFactory* pDlgFactory = SvxAbstractDialogFactory::Create();
810*cdf0e10cSrcweir                 if (pDlgFactory)
811*cdf0e10cSrcweir                 {
812*cdf0e10cSrcweir                     std::auto_ptr<VclAbstractDialog> pDialog( pDlgFactory->CreateSvxMacroAssignDlg(
813*cdf0e10cSrcweir                         GetDialogParent(), xFrame, false, xEvents, 0 ) );
814*cdf0e10cSrcweir                     if ( pDialog.get() && pDialog->Execute() == RET_OK )
815*cdf0e10cSrcweir                     {
816*cdf0e10cSrcweir                         // the dialog modifies the settings directly
817*cdf0e10cSrcweir                     }
818*cdf0e10cSrcweir                 }
819*cdf0e10cSrcweir             }
820*cdf0e10cSrcweir             break;
821*cdf0e10cSrcweir 
822*cdf0e10cSrcweir 		default:
823*cdf0e10cSrcweir 			DBG_ERROR("Unbekannte Message bei ViewShell");
824*cdf0e10cSrcweir 			break;
825*cdf0e10cSrcweir 	}
826*cdf0e10cSrcweir }
827*cdf0e10cSrcweir 
828*cdf0e10cSrcweir //------------------------------------------------------------------
829*cdf0e10cSrcweir 
830*cdf0e10cSrcweir void ScTabViewShell::GetStateTable( SfxItemSet& rSet )
831*cdf0e10cSrcweir {
832*cdf0e10cSrcweir 	ScViewData* pViewData	= GetViewData();
833*cdf0e10cSrcweir 	ScDocument* pDoc		= pViewData->GetDocument();
834*cdf0e10cSrcweir     ScDocShell* pDocShell   = pViewData->GetDocShell();
835*cdf0e10cSrcweir 	ScMarkData& rMark		= GetViewData()->GetMarkData();
836*cdf0e10cSrcweir 	SCTAB		nTab		= pViewData->GetTabNo();
837*cdf0e10cSrcweir 
838*cdf0e10cSrcweir 	SCTAB nTabCount = pDoc->GetTableCount();
839*cdf0e10cSrcweir 	SCTAB nTabSelCount = rMark.GetSelectCount();
840*cdf0e10cSrcweir 
841*cdf0e10cSrcweir 	SfxWhichIter	aIter(rSet);
842*cdf0e10cSrcweir 	sal_uInt16			nWhich = aIter.FirstWhich();
843*cdf0e10cSrcweir 
844*cdf0e10cSrcweir 	while ( nWhich )
845*cdf0e10cSrcweir 	{
846*cdf0e10cSrcweir 		switch ( nWhich )
847*cdf0e10cSrcweir 		{
848*cdf0e10cSrcweir 
849*cdf0e10cSrcweir 			case FID_TABLE_VISIBLE:
850*cdf0e10cSrcweir 				rSet.Put( SfxBoolItem( nWhich, pDoc->IsVisible(nTab) ));
851*cdf0e10cSrcweir 				break;
852*cdf0e10cSrcweir 
853*cdf0e10cSrcweir 			case FID_TABLE_HIDE:
854*cdf0e10cSrcweir 				{
855*cdf0e10cSrcweir 					sal_uInt16 nVis = 0;
856*cdf0e10cSrcweir 					for ( SCTAB i=0; i < nTabCount && nVis<2; i++ )
857*cdf0e10cSrcweir 						if (pDoc->IsVisible(i))
858*cdf0e10cSrcweir 							++nVis;
859*cdf0e10cSrcweir 
860*cdf0e10cSrcweir 					if ( nVis<2 || !pDoc->IsDocEditable() || nTabSelCount > 1 )
861*cdf0e10cSrcweir 						rSet.DisableItem( nWhich );
862*cdf0e10cSrcweir 				}
863*cdf0e10cSrcweir 				break;
864*cdf0e10cSrcweir 
865*cdf0e10cSrcweir 			case FID_TABLE_SHOW:
866*cdf0e10cSrcweir 				{
867*cdf0e10cSrcweir 					sal_Bool bHasHidden = sal_False;
868*cdf0e10cSrcweir 					for ( SCTAB i=0; i < nTabCount && !bHasHidden; i++ )
869*cdf0e10cSrcweir 						if (!pDoc->IsVisible(i))
870*cdf0e10cSrcweir 							bHasHidden = sal_True;
871*cdf0e10cSrcweir 					if ( !bHasHidden || pDoc->IsDocProtected() || nTabSelCount > 1 )
872*cdf0e10cSrcweir 						rSet.DisableItem( nWhich );
873*cdf0e10cSrcweir 				}
874*cdf0e10cSrcweir 				break;
875*cdf0e10cSrcweir 
876*cdf0e10cSrcweir 			case FID_DELETE_TABLE:
877*cdf0e10cSrcweir 				{
878*cdf0e10cSrcweir 					if ( pDoc->GetChangeTrack() )
879*cdf0e10cSrcweir 						rSet.DisableItem( nWhich );
880*cdf0e10cSrcweir 					else
881*cdf0e10cSrcweir 					{
882*cdf0e10cSrcweir 						sal_uInt16 nVis = 0;
883*cdf0e10cSrcweir 						for ( SCTAB i=0; i < nTabCount && nVis<2; i++ )
884*cdf0e10cSrcweir 							if (pDoc->IsVisible(i))
885*cdf0e10cSrcweir 								++nVis;
886*cdf0e10cSrcweir 						if (   pDoc->IsTabProtected(nTab)
887*cdf0e10cSrcweir 							|| !pDoc->IsDocEditable()
888*cdf0e10cSrcweir 							|| nVis < 2
889*cdf0e10cSrcweir 							|| nTabSelCount == nTabCount)
890*cdf0e10cSrcweir 						rSet.DisableItem( nWhich );
891*cdf0e10cSrcweir 					}
892*cdf0e10cSrcweir 				}
893*cdf0e10cSrcweir 				break;
894*cdf0e10cSrcweir 
895*cdf0e10cSrcweir 			case FID_INS_TABLE:
896*cdf0e10cSrcweir             case FID_INS_TABLE_EXT:
897*cdf0e10cSrcweir 			case FID_TAB_APPEND:
898*cdf0e10cSrcweir                 if ( !pDoc->IsDocEditable() ||
899*cdf0e10cSrcweir                      nTabCount > MAXTAB ||
900*cdf0e10cSrcweir                      ( nWhich == FID_INS_TABLE_EXT && pDocShell && pDocShell->IsDocShared() ) )
901*cdf0e10cSrcweir 					rSet.DisableItem( nWhich );
902*cdf0e10cSrcweir 				break;
903*cdf0e10cSrcweir 
904*cdf0e10cSrcweir 			case FID_TAB_MOVE:
905*cdf0e10cSrcweir 				if (   !pDoc->IsDocEditable()
906*cdf0e10cSrcweir 					|| pDoc->GetChangeTrack() != NULL
907*cdf0e10cSrcweir 					|| nTabCount > MAXTAB)
908*cdf0e10cSrcweir 					rSet.DisableItem( nWhich );
909*cdf0e10cSrcweir 				break;
910*cdf0e10cSrcweir 
911*cdf0e10cSrcweir 			//	FID_TAB_MENU_RENAME - "umbenennen" im Menu
912*cdf0e10cSrcweir 			//	FID_TAB_RENAME		- "Name"-Property fuer Basic
913*cdf0e10cSrcweir 
914*cdf0e10cSrcweir 			case FID_TAB_MENU_RENAME:
915*cdf0e10cSrcweir 				if ( !pDoc->IsDocEditable() ||
916*cdf0e10cSrcweir 					 pDoc->IsTabProtected(nTab) ||nTabSelCount > 1 ||
917*cdf0e10cSrcweir                      ( pDocShell && pDocShell->IsDocShared() ) )
918*cdf0e10cSrcweir 					rSet.DisableItem( nWhich );
919*cdf0e10cSrcweir 				break;
920*cdf0e10cSrcweir 
921*cdf0e10cSrcweir 			case FID_TAB_RENAME:
922*cdf0e10cSrcweir 				{
923*cdf0e10cSrcweir 					String aTabName;
924*cdf0e10cSrcweir 					pDoc->GetName( nTab, aTabName );
925*cdf0e10cSrcweir 
926*cdf0e10cSrcweir 					rSet.Put( SfxStringItem( nWhich, aTabName ));
927*cdf0e10cSrcweir 
928*cdf0e10cSrcweir 				}
929*cdf0e10cSrcweir 				break;
930*cdf0e10cSrcweir 
931*cdf0e10cSrcweir 			case FID_TAB_RTL:
932*cdf0e10cSrcweir 				{
933*cdf0e10cSrcweir 					SvtLanguageOptions aLangOpt;
934*cdf0e10cSrcweir 					if ( !aLangOpt.IsCTLFontEnabled() )
935*cdf0e10cSrcweir 						rSet.DisableItem( nWhich );
936*cdf0e10cSrcweir 					else
937*cdf0e10cSrcweir 						rSet.Put( SfxBoolItem( nWhich, pDoc->IsLayoutRTL( nTab ) ) );
938*cdf0e10cSrcweir 				}
939*cdf0e10cSrcweir 				break;
940*cdf0e10cSrcweir 
941*cdf0e10cSrcweir             case FID_TAB_MENU_SET_TAB_BG_COLOR:
942*cdf0e10cSrcweir                 {
943*cdf0e10cSrcweir                     if ( !pDoc->IsDocEditable()
944*cdf0e10cSrcweir                         || ( pDocShell && pDocShell->IsDocShared() )
945*cdf0e10cSrcweir                         || pDoc->IsTabProtected(nTab) )
946*cdf0e10cSrcweir                         rSet.DisableItem( nWhich );
947*cdf0e10cSrcweir                 }
948*cdf0e10cSrcweir                 break;
949*cdf0e10cSrcweir 
950*cdf0e10cSrcweir             case FID_TAB_SET_TAB_BG_COLOR:
951*cdf0e10cSrcweir                 {
952*cdf0e10cSrcweir                     Color aColor;
953*cdf0e10cSrcweir                     aColor = pDoc->GetTabBgColor( nTab );
954*cdf0e10cSrcweir                     rSet.Put( SvxColorItem( aColor, nWhich ) );
955*cdf0e10cSrcweir                 }
956*cdf0e10cSrcweir                 break;
957*cdf0e10cSrcweir 		}
958*cdf0e10cSrcweir 		nWhich = aIter.NextWhich();
959*cdf0e10cSrcweir 	}
960*cdf0e10cSrcweir }
961*cdf0e10cSrcweir 
962*cdf0e10cSrcweir 
963*cdf0e10cSrcweir 
964*cdf0e10cSrcweir 
965