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