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

Generated by: LCOV version 1.10