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