LCOV - code coverage report
Current view: top level - libreoffice/sc/source/ui/view - tabvwshf.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1 457 0.2 %
Date: 2012-12-27 Functions: 2 4 50.0 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10