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