LCOV - code coverage report
Current view: top level - libreoffice/sc/source/ui/view - tabcont.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1 297 0.3 %
Date: 2012-12-27 Functions: 2 23 8.7 %
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             : #include <sfx2/viewfrm.hxx>
      21             : #include <sfx2/dispatch.hxx>
      22             : #include <sfx2/docfile.hxx>
      23             : #include <tools/urlobj.hxx>
      24             : #include <vcl/svapp.hxx>
      25             : #include "tabcont.hxx"
      26             : #include "tabvwsh.hxx"
      27             : #include "docsh.hxx"
      28             : #include "scmod.hxx"
      29             : #include "scresid.hxx"
      30             : #include "sc.hrc"
      31             : #include "globstr.hrc"
      32             : #include "transobj.hxx"
      33             : #include "clipparam.hxx"
      34             : #include "dragdata.hxx"
      35             : #include "markdata.hxx"
      36             : 
      37             : // STATIC DATA -----------------------------------------------------------
      38             : 
      39             : //==================================================================
      40             : 
      41           0 : ScTabControl::ScTabControl( Window* pParent, ScViewData* pData ) :
      42             :     TabBar( pParent,
      43             :             WinBits(WB_BORDER | WB_3DLOOK | WB_SCROLL | WB_RANGESELECT |
      44             :                     WB_MULTISELECT | WB_DRAG | WB_SIZEABLE) ),
      45             :             DropTargetHelper( this ),
      46             :             DragSourceHelper( this ),
      47             :             pViewData( pData ),
      48             :             nMouseClickPageId( TabBar::PAGE_NOT_FOUND ),
      49             :             nSelPageIdByMouse( TabBar::PAGE_NOT_FOUND ),
      50           0 :             bErrorShown( false )
      51             : {
      52           0 :     ScDocument* pDoc = pViewData->GetDocument();
      53             : 
      54           0 :     rtl::OUString aString;
      55           0 :     Color aTabBgColor;
      56           0 :     SCTAB nCount = pDoc->GetTableCount();
      57           0 :     for (SCTAB i=0; i<nCount; i++)
      58             :     {
      59           0 :         if (pDoc->IsVisible(i))
      60             :         {
      61           0 :             if (pDoc->GetName(i,aString))
      62             :             {
      63           0 :                 if ( pDoc->IsScenario(i) )
      64           0 :                     InsertPage( static_cast<sal_uInt16>(i)+1, aString, TPB_SPECIAL );
      65             :                 else
      66           0 :                     InsertPage( static_cast<sal_uInt16>(i)+1, aString );
      67           0 :                 if ( !pDoc->IsDefaultTabBgColor(i) )
      68             :                 {
      69           0 :                     aTabBgColor = pDoc->GetTabBgColor(i);
      70           0 :                     SetTabBgColor( static_cast<sal_uInt16>(i)+1, aTabBgColor );
      71             :                 }
      72             :             }
      73             :         }
      74             :     }
      75             : 
      76           0 :     SetCurPageId( static_cast<sal_uInt16>(pViewData->GetTabNo()) + 1 );
      77             : 
      78           0 :     SetSizePixel( Size(SC_TABBAR_DEFWIDTH, 0) );
      79             : 
      80           0 :     SetSplitHdl( LINK( pViewData->GetView(), ScTabView, TabBarResize ) );
      81             : 
      82           0 :     EnableEditMode();
      83           0 :     UpdateInputContext();
      84           0 : }
      85             : 
      86           0 : ScTabControl::~ScTabControl()
      87             : {
      88           0 : }
      89             : 
      90           0 : sal_uInt16 ScTabControl::GetMaxId() const
      91             : {
      92           0 :     sal_uInt16 nVisCnt = GetPageCount();
      93           0 :     if (nVisCnt)
      94           0 :         return GetPageId(nVisCnt-1);
      95             : 
      96           0 :     return 0;
      97             : }
      98             : 
      99           0 : SCTAB ScTabControl::GetPrivatDropPos(const Point& rPos )
     100             : {
     101           0 :     sal_uInt16 nPos = ShowDropPos(rPos);
     102             : 
     103           0 :     SCTAB nRealPos = static_cast<SCTAB>(nPos);
     104             : 
     105           0 :     if(nPos !=0 )
     106             :     {
     107           0 :         ScDocument* pDoc = pViewData->GetDocument();
     108             : 
     109           0 :         SCTAB nCount = pDoc->GetTableCount();
     110             : 
     111           0 :         sal_uInt16 nViewPos=0;
     112           0 :         nRealPos = nCount;
     113           0 :         for (SCTAB i=0; i<nCount; i++)
     114             :         {
     115           0 :             if (pDoc->IsVisible(i))
     116             :             {
     117           0 :                 nViewPos++;
     118           0 :                 if(nViewPos==nPos)
     119             :                 {
     120             :                     SCTAB j;
     121           0 :                     for (j=i+1; j<nCount; j++)
     122             :                     {
     123           0 :                         if (pDoc->IsVisible(j))
     124             :                         {
     125           0 :                             break;
     126             :                         }
     127             :                     }
     128           0 :                     nRealPos =j;
     129           0 :                     break;
     130             :                 }
     131             :             }
     132             :         }
     133             :     }
     134           0 :     return nRealPos ;
     135             : }
     136             : 
     137           0 : void ScTabControl::MouseButtonDown( const MouseEvent& rMEvt )
     138             : {
     139           0 :     ScModule* pScMod = SC_MOD();
     140           0 :     if ( !pScMod->IsModalMode() && !pScMod->IsFormulaMode() && !IsInEditMode() )
     141             :     {
     142             :         //  View aktivieren
     143           0 :         pViewData->GetViewShell()->SetActive();         // Appear und SetViewFrame
     144           0 :         pViewData->GetView()->ActiveGrabFocus();
     145             :     }
     146             : 
     147             :     /*  Click into free area -> insert new sheet (like in Draw).
     148             :         Needing clean left click without modifiers (may be context menu).
     149             :         Remember clicks to all pages, to be able to move mouse pointer later. */
     150           0 :     if( rMEvt.IsLeft() && (rMEvt.GetModifier() == 0) )
     151           0 :         nMouseClickPageId = GetPageId( rMEvt.GetPosPixel(), true );
     152             :     else
     153           0 :         nMouseClickPageId = TabBar::PAGE_NOT_FOUND;
     154             : 
     155           0 :     TabBar::MouseButtonDown( rMEvt );
     156           0 : }
     157             : 
     158           0 : void ScTabControl::MouseButtonUp( const MouseEvent& rMEvt )
     159             : {
     160           0 :     Point aPos = PixelToLogic( rMEvt.GetPosPixel() );
     161             : 
     162             :     // mouse button down and up on same page?
     163           0 :     if( nMouseClickPageId != GetPageId( aPos, true ) )
     164           0 :         nMouseClickPageId = TabBar::PAGE_NOT_FOUND;
     165             : 
     166           0 :     if (nMouseClickPageId == TabBar::INSERT_TAB_POS)
     167             :     {
     168             :         // Insert a new sheet at the right end, with default name.
     169           0 :         ScDocument* pDoc = pViewData->GetDocument();
     170           0 :         ScModule* pScMod = SC_MOD();
     171           0 :         if (!pDoc->IsDocEditable() || pScMod->IsTableLocked())
     172             :             return;
     173           0 :         rtl::OUString aName;
     174           0 :         pDoc->CreateValidTabName(aName);
     175           0 :         SCTAB nTabCount = pDoc->GetTableCount();
     176           0 :         pViewData->GetViewShell()->InsertTable(aName, nTabCount);
     177           0 :         return;
     178             :     }
     179             : 
     180           0 :     if ( rMEvt.GetClicks() == 2 && rMEvt.IsLeft() && nMouseClickPageId != 0 && nMouseClickPageId != TAB_PAGE_NOTFOUND )
     181             :     {
     182           0 :         SfxDispatcher* pDispatcher = pViewData->GetViewShell()->GetViewFrame()->GetDispatcher();
     183           0 :         pDispatcher->Execute( FID_TAB_MENU_RENAME, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD );
     184             :         return;
     185             :     }
     186             : 
     187           0 :     if( nMouseClickPageId == 0 )
     188             :     {
     189             :         // Click in the area next to the existing tabs:
     190             :         // #i70320# if several sheets are selected, deselect all ecxept the current sheet,
     191             :         // otherwise add new sheet
     192           0 :         sal_uInt16 nSlot = ( GetSelectPageCount() > 1 ) ? FID_TAB_DESELECTALL : FID_INS_TABLE;
     193           0 :         SfxDispatcher* pDispatcher = pViewData->GetViewShell()->GetViewFrame()->GetDispatcher();
     194           0 :         pDispatcher->Execute( nSlot, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD );
     195             :         // forget page ID, to be really sure that the dialog is not called twice
     196           0 :         nMouseClickPageId = TabBar::PAGE_NOT_FOUND;
     197             :     }
     198             : 
     199           0 :     TabBar::MouseButtonUp( rMEvt );
     200             : }
     201             : 
     202           0 : void ScTabControl::Select()
     203             : {
     204             :     /*  Remember last clicked page ID. */
     205           0 :     nSelPageIdByMouse = nMouseClickPageId;
     206             :     /*  Reset nMouseClickPageId, so that next Select() call may invalidate
     207             :         nSelPageIdByMouse (i.e. if called from keyboard). */
     208           0 :     nMouseClickPageId = TabBar::PAGE_NOT_FOUND;
     209             : 
     210           0 :     ScModule* pScMod = SC_MOD();
     211           0 :     ScDocument* pDoc = pViewData->GetDocument();
     212           0 :     ScMarkData& rMark = pViewData->GetMarkData();
     213           0 :     SCTAB nCount = pDoc->GetTableCount();
     214             :     SCTAB i;
     215             : 
     216           0 :     if ( pScMod->IsTableLocked() )      // darf jetzt nicht umgeschaltet werden ?
     217             :     {
     218             :         //  den alten Zustand des TabControls wiederherstellen:
     219             : 
     220           0 :         for (i=0; i<nCount; i++)
     221           0 :             SelectPage( static_cast<sal_uInt16>(i)+1, rMark.GetTableSelect(i) );
     222           0 :         SetCurPageId( static_cast<sal_uInt16>(pViewData->GetTabNo()) + 1 );
     223             : 
     224           0 :         return;
     225             :     }
     226             : 
     227           0 :     sal_uInt16 nCurId = GetCurPageId();
     228           0 :     if (!nCurId) return;            // kann vorkommen, wenn bei Excel-Import alles versteckt ist
     229           0 :     sal_uInt16 nPage = nCurId - 1;
     230             : 
     231             :     // OLE-inplace deaktivieren
     232           0 :     if ( nPage != static_cast<sal_uInt16>(pViewData->GetTabNo()) )
     233           0 :         pViewData->GetView()->DrawMarkListHasChanged();
     234             : 
     235             :     //  InputEnterHandler nur wenn nicht Referenzeingabe
     236             : 
     237           0 :     sal_Bool bRefMode = pScMod->IsFormulaMode();
     238           0 :     if (!bRefMode)
     239           0 :         pScMod->InputEnterHandler();
     240             : 
     241           0 :     for (i=0; i<nCount; i++)
     242           0 :         rMark.SelectTable( i, IsPageSelected(static_cast<sal_uInt16>(i)+1) );
     243             : 
     244           0 :     SfxDispatcher& rDisp = pViewData->GetDispatcher();
     245           0 :     if (rDisp.IsLocked())
     246           0 :         pViewData->GetView()->SetTabNo( static_cast<SCTAB>(nPage) );
     247             :     else
     248             :     {
     249             :         //  Tabelle fuer Basic ist 1-basiert
     250           0 :         SfxUInt16Item aItem( SID_CURRENTTAB, nPage + 1 );
     251             :         rDisp.Execute( SID_CURRENTTAB, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD,
     252           0 :                                 &aItem, (void*) NULL );
     253             :     }
     254             : 
     255           0 :     SfxBindings& rBind = pViewData->GetBindings();
     256           0 :     rBind.Invalidate( FID_FILL_TAB );
     257           0 :     rBind.Invalidate( FID_TAB_DESELECTALL );
     258             : 
     259           0 :     rBind.Invalidate( FID_INS_TABLE );
     260           0 :     rBind.Invalidate( FID_TAB_APPEND );
     261           0 :     rBind.Invalidate( FID_TAB_MOVE );
     262           0 :     rBind.Invalidate( FID_TAB_RENAME );
     263           0 :     rBind.Invalidate( FID_DELETE_TABLE );
     264           0 :     rBind.Invalidate( FID_TABLE_SHOW );
     265           0 :     rBind.Invalidate( FID_TABLE_HIDE );
     266           0 :     rBind.Invalidate( FID_TAB_SET_TAB_BG_COLOR );
     267             : 
     268             :         //  SetReference nur wenn der Konsolidieren-Dialog offen ist
     269             :         //  (fuer Referenzen ueber mehrere Tabellen)
     270             :         //  bei anderen gibt das nur unnoetiges Gezappel
     271             : 
     272           0 :     if ( bRefMode && pViewData->GetRefType() == SC_REFTYPE_REF )
     273           0 :         if ( pViewData->GetViewShell()->GetViewFrame()->HasChildWindow(SID_OPENDLG_CONSOLIDATE) )
     274             :         {
     275             :             ScRange aRange(
     276           0 :                     pViewData->GetRefStartX(), pViewData->GetRefStartY(), pViewData->GetRefStartZ(),
     277           0 :                     pViewData->GetRefEndX(), pViewData->GetRefEndY(), pViewData->GetRefEndZ() );
     278           0 :             pScMod->SetReference( aRange, pDoc, &rMark );
     279           0 :             pScMod->EndReference();                     // wegen Auto-Hide
     280             :         }
     281             : }
     282             : 
     283           0 : void ScTabControl::UpdateInputContext()
     284             : {
     285           0 :     ScDocument* pDoc = pViewData->GetDocument();
     286           0 :     WinBits nStyle = GetStyle();
     287           0 :     if (pDoc->GetDocumentShell()->IsReadOnly())
     288             :         // no insert sheet tab for readonly doc.
     289           0 :         SetStyle((nStyle & ~WB_INSERTTAB));
     290             :     else
     291           0 :         SetStyle((nStyle | WB_INSERTTAB));
     292           0 : }
     293             : 
     294           0 : void ScTabControl::UpdateStatus()
     295             : {
     296           0 :     ScDocument* pDoc = pViewData->GetDocument();
     297           0 :     ScMarkData& rMark = pViewData->GetMarkData();
     298           0 :     sal_Bool bActive = pViewData->IsActive();
     299             : 
     300           0 :     SCTAB nCount = pDoc->GetTableCount();
     301             :     SCTAB i;
     302           0 :     rtl::OUString aString;
     303           0 :     SCTAB nMaxCnt = Max( nCount, static_cast<SCTAB>(GetMaxId()) );
     304           0 :     Color aTabBgColor;
     305             : 
     306           0 :     sal_Bool bModified = false;                                     // Tabellen-Namen
     307           0 :     for (i=0; i<nMaxCnt && !bModified; i++)
     308             :     {
     309           0 :         if (pDoc->IsVisible(i))
     310             :         {
     311           0 :             pDoc->GetName(i,aString);
     312           0 :             aTabBgColor = pDoc->GetTabBgColor(i);
     313             :         }
     314             :         else
     315             :         {
     316           0 :             aString = rtl::OUString();
     317             :         }
     318             : 
     319           0 :         if ( !aString.equals(GetPageText(static_cast<sal_uInt16>(i)+1)) || (GetTabBgColor(static_cast<sal_uInt16>(i)+1) != aTabBgColor) )
     320           0 :             bModified = sal_True;
     321             :     }
     322             : 
     323           0 :     if (bModified)
     324             :     {
     325           0 :         Clear();
     326           0 :         for (i=0; i<nCount; i++)
     327             :         {
     328           0 :             if (pDoc->IsVisible(i))
     329             :             {
     330           0 :                 if (pDoc->GetName(i,aString))
     331             :                 {
     332           0 :                     if ( pDoc->IsScenario(i) )
     333           0 :                         InsertPage( static_cast<sal_uInt16>(i)+1, aString, TPB_SPECIAL );
     334             :                     else
     335           0 :                         InsertPage( static_cast<sal_uInt16>(i)+1, aString );
     336           0 :                     if ( !pDoc->IsDefaultTabBgColor(i) )
     337             :                     {
     338           0 :                         aTabBgColor = pDoc->GetTabBgColor(i);
     339           0 :                         SetTabBgColor( static_cast<sal_uInt16>(i)+1, aTabBgColor );
     340             :                     }
     341             :                 }
     342             :             }
     343             :         }
     344             :     }
     345           0 :     SetCurPageId( static_cast<sal_uInt16>(pViewData->GetTabNo()) + 1 );
     346             : 
     347           0 :     if (bActive)
     348             :     {
     349           0 :         bModified = false;                                          // Selektion
     350           0 :         for (i=0; i<nMaxCnt && !bModified; i++)
     351           0 :             if ( rMark.GetTableSelect(i) != (bool) IsPageSelected(static_cast<sal_uInt16>(i)+1) )
     352           0 :                 bModified = sal_True;
     353             : 
     354             :         // #i99576# the following loop is mis-optimized on unxsoli4 and the reason
     355             :         // why this file is in NOOPTFILES.
     356           0 :         if ( bModified )
     357           0 :             for (i=0; i<nCount; i++)
     358           0 :                 SelectPage( static_cast<sal_uInt16>(i)+1, rMark.GetTableSelect(i) );
     359             :     }
     360             :     else
     361             :     {
     362           0 :     }
     363           0 : }
     364             : 
     365           0 : void ScTabControl::SetSheetLayoutRTL( sal_Bool bSheetRTL )
     366             : {
     367           0 :     SetEffectiveRTL( bSheetRTL );
     368           0 :     nSelPageIdByMouse = TabBar::PAGE_NOT_FOUND;
     369           0 : }
     370             : 
     371             : 
     372           0 : void ScTabControl::Command( const CommandEvent& rCEvt )
     373             : {
     374           0 :     ScModule*       pScMod   = SC_MOD();
     375           0 :     ScTabViewShell* pViewSh  = pViewData->GetViewShell();
     376           0 :     sal_Bool            bDisable = pScMod->IsFormulaMode() || pScMod->IsModalMode();
     377             : 
     378             :     // ViewFrame erstmal aktivieren (Bug 19493):
     379           0 :     pViewSh->SetActive();
     380             : 
     381           0 :     sal_uInt16 nCmd = rCEvt.GetCommand();
     382           0 :     if ( nCmd == COMMAND_CONTEXTMENU )
     383             :     {
     384           0 :         if (!bDisable)
     385             :         {
     386             :             // #i18735# select the page that is under the mouse cursor
     387             :             // if multiple tables are selected and the one under the cursor
     388             :             // is not part of them then unselect them
     389           0 :             sal_uInt16 nId = GetPageId( rCEvt.GetMousePosPixel() );
     390           0 :             if (nId)
     391             :             {
     392           0 :                 sal_Bool bAlreadySelected = IsPageSelected( nId );
     393             :                 //make the clicked page the current one
     394           0 :                 SetCurPageId( nId );
     395             :                 //change the selection when the current one is not already
     396             :                 //selected or part of a multi selection
     397           0 :                 if(!bAlreadySelected)
     398             :                 {
     399           0 :                     sal_uInt16 nCount = GetMaxId();
     400             : 
     401           0 :                     for (sal_uInt16 i=1; i<=nCount; i++)
     402           0 :                         SelectPage( i, i==nId );
     403           0 :                     Select();
     404             :                 }
     405             :             }
     406             : 
     407             :             // #i52073# OLE inplace editing has to be stopped before showing the sheet tab context menu
     408           0 :             pViewSh->DeactivateOle();
     409             : 
     410             :             //  Popup-Menu:
     411             :             //  get Dispatcher from ViewData (ViewFrame) instead of Shell (Frame), so it can't be null
     412           0 :             pViewData->GetDispatcher().ExecutePopup( ScResId(RID_POPUP_TAB) );
     413             :         }
     414             :     }
     415           0 : }
     416             : 
     417           0 : void ScTabControl::StartDrag( sal_Int8 /* nAction */, const Point& rPosPixel )
     418             : {
     419           0 :     ScModule* pScMod = SC_MOD();
     420           0 :     sal_Bool bDisable = pScMod->IsFormulaMode() || pScMod->IsModalMode();
     421             : 
     422           0 :     if (!bDisable)
     423             :     {
     424           0 :         Region aRegion( Rectangle(0,0,0,0) );
     425           0 :         CommandEvent aCEvt( rPosPixel, COMMAND_STARTDRAG, sal_True );   // needed for StartDrag
     426           0 :         if (TabBar::StartDrag( aCEvt, aRegion ))
     427           0 :             DoDrag( aRegion );
     428             :     }
     429           0 : }
     430             : 
     431           0 : void ScTabControl::DoDrag( const Region& /* rRegion */ )
     432             : {
     433           0 :     ScDocShell* pDocSh = pViewData->GetDocShell();
     434           0 :     ScDocument* pDoc = pDocSh->GetDocument();
     435             : 
     436           0 :     SCTAB nTab = pViewData->GetTabNo();
     437           0 :     ScRange aTabRange( 0, 0, nTab, MAXCOL, MAXROW, nTab );
     438           0 :     ScMarkData aTabMark = pViewData->GetMarkData();
     439           0 :     aTabMark.ResetMark();   // doesn't change marked table information
     440           0 :     aTabMark.SetMarkArea( aTabRange );
     441             : 
     442           0 :     ScDocument* pClipDoc = new ScDocument( SCDOCMODE_CLIP );
     443           0 :     ScClipParam aClipParam(aTabRange, false);
     444           0 :     pDoc->CopyToClip(aClipParam, pClipDoc, &aTabMark, false);
     445             : 
     446           0 :     TransferableObjectDescriptor aObjDesc;
     447           0 :     pDocSh->FillTransferableObjectDescriptor( aObjDesc );
     448           0 :     aObjDesc.maDisplayName = pDocSh->GetMedium()->GetURLObject().GetURLNoPass();
     449             :     // maSize is set in ScTransferObj ctor
     450             : 
     451           0 :     ScTransferObj* pTransferObj = new ScTransferObj( pClipDoc, aObjDesc );
     452           0 :     com::sun::star::uno::Reference<com::sun::star::datatransfer::XTransferable> xTransferable( pTransferObj );
     453             : 
     454           0 :     pTransferObj->SetDragSourceFlags( SC_DROP_TABLE );
     455             : 
     456           0 :     pTransferObj->SetDragSource( pDocSh, aTabMark );
     457             : 
     458           0 :     Window* pWindow = pViewData->GetActiveWin();
     459           0 :     SC_MOD()->SetDragObject( pTransferObj, NULL );      // for internal D&D
     460           0 :     pTransferObj->StartDrag( pWindow, DND_ACTION_COPYMOVE | DND_ACTION_LINK );
     461           0 : }
     462             : 
     463           0 : static sal_uInt16 lcl_DocShellNr( ScDocument* pDoc )
     464             : {
     465           0 :     sal_uInt16 nShellCnt = 0;
     466           0 :     SfxObjectShell* pShell = SfxObjectShell::GetFirst();
     467           0 :     while ( pShell )
     468             :     {
     469           0 :         if ( pShell->Type() == TYPE(ScDocShell) )
     470             :         {
     471           0 :             if ( ((ScDocShell*)pShell)->GetDocument() == pDoc )
     472           0 :                 return nShellCnt;
     473             : 
     474           0 :             ++nShellCnt;
     475             :         }
     476           0 :         pShell = SfxObjectShell::GetNext( *pShell );
     477             :     }
     478             : 
     479             :     OSL_FAIL("Dokument nicht gefunden");
     480           0 :     return 0;
     481             : }
     482             : 
     483           0 : sal_Int8 ScTabControl::ExecuteDrop( const ExecuteDropEvent& rEvt )
     484             : {
     485           0 :     EndSwitchPage();
     486             : 
     487           0 :     ScDocument* pDoc = pViewData->GetDocument();
     488           0 :     const ScDragData& rData = SC_MOD()->GetDragData();
     489           0 :     if ( rData.pCellTransfer && ( rData.pCellTransfer->GetDragSourceFlags() & SC_DROP_TABLE ) &&
     490           0 :             rData.pCellTransfer->GetSourceDocument() == pDoc )
     491             :     {
     492             :         // moving of tables within the document
     493           0 :         SCTAB nPos = GetPrivatDropPos( rEvt.maPosPixel );
     494           0 :         HideDropPos();
     495             : 
     496           0 :         if ( nPos == rData.pCellTransfer->GetVisibleTab() && rEvt.mnAction == DND_ACTION_MOVE )
     497             :         {
     498             :             // #i83005# do nothing - don't move to the same position
     499             :             // (too easily triggered unintentionally, and might take a long time in large documents)
     500             :         }
     501             :         else
     502             :         {
     503           0 :             if ( !pDoc->GetChangeTrack() && pDoc->IsDocEditable() )
     504             :             {
     505             :                 //! use table selection from the tab control where dragging was started?
     506           0 :                 pViewData->GetView()->MoveTable( lcl_DocShellNr(pDoc), nPos, rEvt.mnAction != DND_ACTION_MOVE );
     507             : 
     508           0 :                 rData.pCellTransfer->SetDragWasInternal();          // don't delete
     509           0 :                 return sal_True;
     510             :             }
     511             :         }
     512             :     }
     513             : 
     514           0 :     return 0;
     515             : }
     516             : 
     517           0 : sal_Int8 ScTabControl::AcceptDrop( const AcceptDropEvent& rEvt )
     518             : {
     519           0 :     if ( rEvt.mbLeaving )
     520             :     {
     521           0 :         EndSwitchPage();
     522           0 :         HideDropPos();
     523           0 :         return rEvt.mnAction;
     524             :     }
     525             : 
     526           0 :     const ScDocument* pDoc = pViewData->GetDocument();
     527           0 :     const ScDragData& rData = SC_MOD()->GetDragData();
     528           0 :     if ( rData.pCellTransfer && ( rData.pCellTransfer->GetDragSourceFlags() & SC_DROP_TABLE ) &&
     529           0 :             rData.pCellTransfer->GetSourceDocument() == pDoc )
     530             :     {
     531             :         // moving of tables within the document
     532           0 :         if ( !pDoc->GetChangeTrack() && pDoc->IsDocEditable() )
     533             :         {
     534           0 :             ShowDropPos( rEvt.maPosPixel );
     535           0 :             return rEvt.mnAction;
     536             :         }
     537             :     }
     538             :     else                    // switch sheets for all formats
     539             :     {
     540           0 :         SwitchPage( rEvt.maPosPixel );      // switch sheet after timeout
     541           0 :         return 0;                           // nothing can be dropped here
     542             :     }
     543             : 
     544           0 :     return 0;
     545             : }
     546             : 
     547           0 : long ScTabControl::StartRenaming()
     548             : {
     549           0 :     if ( pViewData->GetDocument()->IsDocEditable() )
     550           0 :         return TABBAR_RENAMING_YES;
     551             :     else
     552           0 :         return TABBAR_RENAMING_NO;
     553             : }
     554             : 
     555           0 : long ScTabControl::AllowRenaming()
     556             : {
     557           0 :     ScTabViewShell* pViewSh = pViewData->GetViewShell();
     558             :     OSL_ENSURE( pViewSh, "pViewData->GetViewShell()" );
     559             : 
     560           0 :     long nRet = TABBAR_RENAMING_CANCEL;
     561           0 :     sal_uInt16 nId = GetEditPageId();
     562           0 :     if ( nId )
     563             :     {
     564           0 :         SCTAB nTab = nId - 1;
     565           0 :         String aNewName = GetEditText();
     566           0 :         sal_Bool bDone = pViewSh->RenameTable( aNewName, nTab );
     567           0 :         if ( bDone )
     568           0 :             nRet = TABBAR_RENAMING_YES;
     569           0 :         else if ( bErrorShown )
     570             :         {
     571             :             //  if the error message from this TabControl is currently visible,
     572             :             //  don't end edit mode now, to avoid problems when returning to
     573             :             //  the other call (showing the error) - this should not happen
     574             :             OSL_FAIL("ScTabControl::AllowRenaming: nested calls");
     575           0 :             nRet = TABBAR_RENAMING_NO;
     576             :         }
     577           0 :         else if ( Application::IsInModalMode() )
     578             :         {
     579             :             //  don't show error message above any modal dialog
     580             :             //  instead cancel renaming without error message
     581           0 :             nRet = TABBAR_RENAMING_CANCEL;
     582             :         }
     583             :         else
     584             :         {
     585           0 :             bErrorShown = sal_True;
     586           0 :             pViewSh->ErrorMessage( STR_INVALIDTABNAME );
     587           0 :             bErrorShown = false;
     588           0 :             nRet = TABBAR_RENAMING_NO;
     589           0 :         }
     590             :     }
     591           0 :     return nRet;
     592             : }
     593             : 
     594           0 : void ScTabControl::EndRenaming()
     595             : {
     596           0 :     if ( HasFocus() )
     597           0 :         pViewData->GetView()->ActiveGrabFocus();
     598           0 : }
     599             : 
     600           0 : void ScTabControl::Mirror()
     601             : {
     602           0 :     TabBar::Mirror();
     603           0 :     if( nSelPageIdByMouse != TabBar::PAGE_NOT_FOUND )
     604             :     {
     605           0 :         Rectangle aRect( GetPageRect( GetCurPageId() ) );
     606           0 :         if( !aRect.IsEmpty() )
     607           0 :             SetPointerPosPixel( aRect.Center() );
     608           0 :         nSelPageIdByMouse = TabBar::PAGE_NOT_FOUND;  // only once after a Select()
     609             :     }
     610          15 : }
     611             : 
     612             : 
     613             : 
     614             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10