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