LCOV - code coverage report
Current view: top level - sc/source/ui/view - tabcont.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 78 321 24.3 %
Date: 2014-11-03 Functions: 10 26 38.5 %
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             : #include <gridwin.hxx>
      37             : 
      38             : // STATIC DATA -----------------------------------------------------------
      39             : 
      40         546 : ScTabControl::ScTabControl( vcl::Window* pParent, ScViewData* pData ) :
      41             :     TabBar( pParent,
      42             :             WinBits(WB_BORDER | WB_3DLOOK | WB_SCROLL | WB_RANGESELECT | WB_MULTISELECT | WB_DRAG ) ),
      43             :             DropTargetHelper( this ),
      44             :             DragSourceHelper( this ),
      45             :             pViewData( pData ),
      46             :             nMouseClickPageId( TabBar::PAGE_NOT_FOUND ),
      47             :             nSelPageIdByMouse( TabBar::PAGE_NOT_FOUND ),
      48         546 :             bErrorShown( false )
      49             : {
      50         546 :     ScDocument* pDoc = pViewData->GetDocument();
      51             : 
      52         546 :     OUString aString;
      53         546 :     Color aTabBgColor;
      54         546 :     SCTAB nCount = pDoc->GetTableCount();
      55        1328 :     for (SCTAB i=0; i<nCount; i++)
      56             :     {
      57         782 :         if (pDoc->IsVisible(i))
      58             :         {
      59         782 :             if (pDoc->GetName(i,aString))
      60             :             {
      61         782 :                 if ( pDoc->IsScenario(i) )
      62           0 :                     InsertPage( static_cast<sal_uInt16>(i)+1, aString, TPB_SPECIAL );
      63             :                 else
      64         782 :                     InsertPage( static_cast<sal_uInt16>(i)+1, aString );
      65         782 :                 if ( !pDoc->IsDefaultTabBgColor(i) )
      66             :                 {
      67           2 :                     aTabBgColor = pDoc->GetTabBgColor(i);
      68           2 :                     SetTabBgColor( static_cast<sal_uInt16>(i)+1, aTabBgColor );
      69             :                 }
      70             :             }
      71             :         }
      72             :     }
      73             : 
      74         546 :     SetCurPageId( static_cast<sal_uInt16>(pViewData->GetTabNo()) + 1 );
      75             : 
      76         546 :     SetSizePixel( Size(SC_TABBAR_DEFWIDTH, 0) );
      77             : 
      78         546 :     SetSplitHdl( LINK( pViewData->GetView(), ScTabView, TabBarResize ) );
      79             : 
      80         546 :     EnableEditMode();
      81         546 :     UpdateInputContext();
      82             : 
      83         546 :     SetScrollAlwaysEnabled(true);
      84             : 
      85         546 :     SetScrollAreaContextHdl( LINK( this, ScTabControl, ShowPageList ) );
      86         546 : }
      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, MenuItemBits::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        1092 : ScTabControl::~ScTabControl()
     118             : {
     119        1092 : }
     120             : 
     121        4938 : sal_uInt16 ScTabControl::GetMaxId() const
     122             : {
     123        4938 :     sal_uInt16 nVisCnt = GetPageCount();
     124        4938 :     if (nVisCnt)
     125        4938 :         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, SfxCallMode::SYNCHRON | SfxCallMode::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, SfxCallMode::SYNCHRON | SfxCallMode::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 :     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, SfxCallMode::SLOT | SfxCallMode::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        1860 : void ScTabControl::UpdateInputContext()
     315             : {
     316        1860 :     ScDocument* pDoc = pViewData->GetDocument();
     317        1860 :     WinBits nStyle = GetStyle();
     318        1860 :     if (pDoc->GetDocumentShell()->IsReadOnly())
     319             :         // no insert sheet tab for readonly doc.
     320           8 :         SetStyle((nStyle & ~WB_INSERTTAB));
     321             :     else
     322        1852 :         SetStyle((nStyle | WB_INSERTTAB));
     323        1860 : }
     324             : 
     325        4938 : void ScTabControl::UpdateStatus()
     326             : {
     327        4938 :     ScDocument* pDoc = pViewData->GetDocument();
     328        4938 :     ScMarkData& rMark = pViewData->GetMarkData();
     329        4938 :     bool bActive = pViewData->IsActive();
     330             : 
     331        4938 :     SCTAB nCount = pDoc->GetTableCount();
     332             :     SCTAB i;
     333        4938 :     OUString aString;
     334        4938 :     SCTAB nMaxCnt = std::max( nCount, static_cast<SCTAB>(GetMaxId()) );
     335        4938 :     Color aTabBgColor;
     336             : 
     337        4938 :     bool bModified = false;                                     // Tabellen-Namen
     338       11268 :     for (i=0; i<nMaxCnt && !bModified; i++)
     339             :     {
     340        6330 :         if (pDoc->IsVisible(i))
     341             :         {
     342        6322 :             pDoc->GetName(i,aString);
     343        6322 :             aTabBgColor = pDoc->GetTabBgColor(i);
     344             :         }
     345             :         else
     346             :         {
     347           8 :             aString = OUString();
     348             :         }
     349             : 
     350        6330 :         if ( !aString.equals(GetPageText(static_cast<sal_uInt16>(i)+1)) || (GetTabBgColor(static_cast<sal_uInt16>(i)+1) != aTabBgColor) )
     351         192 :             bModified = true;
     352             :     }
     353             : 
     354        4938 :     if (bModified)
     355             :     {
     356         192 :         Clear();
     357         606 :         for (i=0; i<nCount; i++)
     358             :         {
     359         414 :             if (pDoc->IsVisible(i))
     360             :             {
     361         412 :                 if (pDoc->GetName(i,aString))
     362             :                 {
     363         412 :                     if ( pDoc->IsScenario(i) )
     364           0 :                         InsertPage( static_cast<sal_uInt16>(i)+1, aString, TPB_SPECIAL );
     365             :                     else
     366         412 :                         InsertPage( static_cast<sal_uInt16>(i)+1, aString );
     367         412 :                     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        4938 :     SetCurPageId( static_cast<sal_uInt16>(pViewData->GetTabNo()) + 1 );
     377             : 
     378        4938 :     if (bActive)
     379             :     {
     380        4930 :         bModified = false;                                          // Selektion
     381       11176 :         for (i=0; i<nMaxCnt && !bModified; i++)
     382        6246 :             if ( rMark.GetTableSelect(i) != (bool) IsPageSelected(static_cast<sal_uInt16>(i)+1) )
     383         656 :                 bModified = true;
     384             : 
     385        4930 :         if ( bModified )
     386        1574 :             for (i=0; i<nCount; i++)
     387         918 :                 SelectPage( static_cast<sal_uInt16>(i)+1, rMark.GetTableSelect(i) );
     388             :     }
     389             :     else
     390             :     {
     391        4938 :     }
     392        4938 : }
     393             : 
     394        2304 : void ScTabControl::SetSheetLayoutRTL( bool bSheetRTL )
     395             : {
     396        2304 :     SetEffectiveRTL( bSheetRTL );
     397        2304 :     nSelPageIdByMouse = TabBar::PAGE_NOT_FOUND;
     398        2304 : }
     399             : 
     400           0 : void ScTabControl::SwitchToPageId(sal_uInt16 nId)
     401             : {
     402           0 :     if (nId)
     403             :     {
     404           0 :         bool bAlreadySelected = IsPageSelected( nId );
     405             :         //make the clicked page the current one
     406           0 :         SetCurPageId( nId );
     407             :         //change the selection when the current one is not already
     408             :         //selected or part of a multi selection
     409           0 :         if(!bAlreadySelected)
     410             :         {
     411           0 :             sal_uInt16 nCount = GetMaxId();
     412             : 
     413           0 :             for (sal_uInt16 i=1; i<=nCount; i++)
     414           0 :                 SelectPage( i, i==nId );
     415           0 :             Select();
     416             :         }
     417             :     }
     418           0 : }
     419             : 
     420           0 : void ScTabControl::Command( const CommandEvent& rCEvt )
     421             : {
     422           0 :     ScModule*       pScMod   = SC_MOD();
     423           0 :     ScTabViewShell* pViewSh  = pViewData->GetViewShell();
     424           0 :     bool            bDisable = pScMod->IsFormulaMode() || pScMod->IsModalMode();
     425             : 
     426             :     // ViewFrame erstmal aktivieren (Bug 19493):
     427           0 :     pViewSh->SetActive();
     428             : 
     429           0 :     sal_uInt16 nCmd = rCEvt.GetCommand();
     430           0 :     if ( nCmd == COMMAND_CONTEXTMENU )
     431             :     {
     432           0 :         if (!bDisable)
     433             :         {
     434             :             // #i18735# select the page that is under the mouse cursor
     435             :             // if multiple tables are selected and the one under the cursor
     436             :             // is not part of them then unselect them
     437           0 :             sal_uInt16 nId = GetPageId( rCEvt.GetMousePosPixel() );
     438           0 :             SwitchToPageId(nId);
     439             : 
     440             :             // #i52073# OLE inplace editing has to be stopped before showing the sheet tab context menu
     441           0 :             pViewSh->DeactivateOle();
     442             : 
     443             :             //  Popup-Menu:
     444             :             //  get Dispatcher from ViewData (ViewFrame) instead of Shell (Frame), so it can't be null
     445           0 :             pViewData->GetDispatcher().ExecutePopup( ScResId(RID_POPUP_TAB) );
     446             :         }
     447             :     }
     448           0 : }
     449             : 
     450           0 : void ScTabControl::StartDrag( sal_Int8 /* nAction */, const Point& rPosPixel )
     451             : {
     452           0 :     ScModule* pScMod = SC_MOD();
     453           0 :     bool bDisable = pScMod->IsFormulaMode() || pScMod->IsModalMode();
     454             : 
     455           0 :     if (!bDisable)
     456             :     {
     457           0 :         vcl::Region aRegion( Rectangle(0,0,0,0) );
     458           0 :         CommandEvent aCEvt( rPosPixel, COMMAND_STARTDRAG, true );   // needed for StartDrag
     459           0 :         if (TabBar::StartDrag( aCEvt, aRegion ))
     460           0 :             DoDrag( aRegion );
     461             :     }
     462           0 : }
     463             : 
     464           0 : void ScTabControl::DoDrag( const vcl::Region& /* rRegion */ )
     465             : {
     466           0 :     ScDocShell* pDocSh = pViewData->GetDocShell();
     467           0 :     ScDocument& rDoc = pDocSh->GetDocument();
     468             : 
     469           0 :     SCTAB nTab = pViewData->GetTabNo();
     470           0 :     ScRange aTabRange( 0, 0, nTab, MAXCOL, MAXROW, nTab );
     471           0 :     ScMarkData aTabMark = pViewData->GetMarkData();
     472           0 :     aTabMark.ResetMark();   // doesn't change marked table information
     473           0 :     aTabMark.SetMarkArea( aTabRange );
     474             : 
     475           0 :     ScDocument* pClipDoc = new ScDocument( SCDOCMODE_CLIP );
     476           0 :     ScClipParam aClipParam(aTabRange, false);
     477           0 :     rDoc.CopyToClip(aClipParam, pClipDoc, &aTabMark, false);
     478             : 
     479           0 :     TransferableObjectDescriptor aObjDesc;
     480           0 :     pDocSh->FillTransferableObjectDescriptor( aObjDesc );
     481           0 :     aObjDesc.maDisplayName = pDocSh->GetMedium()->GetURLObject().GetURLNoPass();
     482             :     // maSize is set in ScTransferObj ctor
     483             : 
     484           0 :     ScTransferObj* pTransferObj = new ScTransferObj( pClipDoc, aObjDesc );
     485           0 :     com::sun::star::uno::Reference<com::sun::star::datatransfer::XTransferable> xTransferable( pTransferObj );
     486             : 
     487           0 :     pTransferObj->SetDragSourceFlags( SC_DROP_TABLE );
     488             : 
     489           0 :     pTransferObj->SetDragSource( pDocSh, aTabMark );
     490             : 
     491           0 :     vcl::Window* pWindow = pViewData->GetActiveWin();
     492           0 :     SC_MOD()->SetDragObject( pTransferObj, NULL );      // for internal D&D
     493           0 :     pTransferObj->StartDrag( pWindow, DND_ACTION_COPYMOVE | DND_ACTION_LINK );
     494           0 : }
     495             : 
     496           0 : static sal_uInt16 lcl_DocShellNr( ScDocument* pDoc )
     497             : {
     498           0 :     sal_uInt16 nShellCnt = 0;
     499           0 :     SfxObjectShell* pShell = SfxObjectShell::GetFirst();
     500           0 :     while ( pShell )
     501             :     {
     502           0 :         if ( pShell->Type() == TYPE(ScDocShell) )
     503             :         {
     504           0 :             if ( &static_cast<ScDocShell*>(pShell)->GetDocument() == pDoc )
     505           0 :                 return nShellCnt;
     506             : 
     507           0 :             ++nShellCnt;
     508             :         }
     509           0 :         pShell = SfxObjectShell::GetNext( *pShell );
     510             :     }
     511             : 
     512             :     OSL_FAIL("Dokument nicht gefunden");
     513           0 :     return 0;
     514             : }
     515             : 
     516           0 : sal_Int8 ScTabControl::ExecuteDrop( const ExecuteDropEvent& rEvt )
     517             : {
     518           0 :     EndSwitchPage();
     519             : 
     520           0 :     ScDocument* pDoc = pViewData->GetDocument();
     521           0 :     const ScDragData& rData = SC_MOD()->GetDragData();
     522           0 :     if ( rData.pCellTransfer && ( rData.pCellTransfer->GetDragSourceFlags() & SC_DROP_TABLE ) &&
     523           0 :             rData.pCellTransfer->GetSourceDocument() == pDoc )
     524             :     {
     525             :         // moving of tables within the document
     526           0 :         SCTAB nPos = GetPrivatDropPos( rEvt.maPosPixel );
     527           0 :         HideDropPos();
     528             : 
     529           0 :         if ( nPos == rData.pCellTransfer->GetVisibleTab() && rEvt.mnAction == DND_ACTION_MOVE )
     530             :         {
     531             :             // #i83005# do nothing - don't move to the same position
     532             :             // (too easily triggered unintentionally, and might take a long time in large documents)
     533             :         }
     534             :         else
     535             :         {
     536           0 :             if ( !pDoc->GetChangeTrack() && pDoc->IsDocEditable() )
     537             :             {
     538             :                 //! use table selection from the tab control where dragging was started?
     539           0 :                 pViewData->GetView()->MoveTable( lcl_DocShellNr(pDoc), nPos, rEvt.mnAction != DND_ACTION_MOVE );
     540             : 
     541           0 :                 rData.pCellTransfer->SetDragWasInternal();          // don't delete
     542           0 :                 return sal_True;
     543             :             }
     544             :         }
     545             :     }
     546             : 
     547           0 :     return 0;
     548             : }
     549             : 
     550           0 : sal_Int8 ScTabControl::AcceptDrop( const AcceptDropEvent& rEvt )
     551             : {
     552           0 :     if ( rEvt.mbLeaving )
     553             :     {
     554           0 :         EndSwitchPage();
     555           0 :         HideDropPos();
     556           0 :         return rEvt.mnAction;
     557             :     }
     558             : 
     559           0 :     const ScDocument* pDoc = pViewData->GetDocument();
     560           0 :     const ScDragData& rData = SC_MOD()->GetDragData();
     561           0 :     if ( rData.pCellTransfer && ( rData.pCellTransfer->GetDragSourceFlags() & SC_DROP_TABLE ) &&
     562           0 :             rData.pCellTransfer->GetSourceDocument() == pDoc )
     563             :     {
     564             :         // moving of tables within the document
     565           0 :         if ( !pDoc->GetChangeTrack() && pDoc->IsDocEditable() )
     566             :         {
     567           0 :             ShowDropPos( rEvt.maPosPixel );
     568           0 :             return rEvt.mnAction;
     569             :         }
     570             :     }
     571             :     else                    // switch sheets for all formats
     572             :     {
     573           0 :         SwitchPage( rEvt.maPosPixel );      // switch sheet after timeout
     574           0 :         return 0;                           // nothing can be dropped here
     575             :     }
     576             : 
     577           0 :     return 0;
     578             : }
     579             : 
     580           0 : bool ScTabControl::StartRenaming()
     581             : {
     582           0 :     if ( pViewData->GetDocument()->IsDocEditable() )
     583           0 :         return true;
     584             :     else
     585           0 :         return false;
     586             : }
     587             : 
     588           0 : TabBarAllowRenamingReturnCode ScTabControl::AllowRenaming()
     589             : {
     590           0 :     ScTabViewShell* pViewSh = pViewData->GetViewShell();
     591             :     OSL_ENSURE( pViewSh, "pViewData->GetViewShell()" );
     592             : 
     593           0 :     TabBarAllowRenamingReturnCode nRet = TABBAR_RENAMING_CANCEL;
     594           0 :     sal_uInt16 nId = GetEditPageId();
     595           0 :     if ( nId )
     596             :     {
     597           0 :         SCTAB nTab = nId - 1;
     598           0 :         OUString aNewName = GetEditText();
     599           0 :         bool bDone = pViewSh->RenameTable( aNewName, nTab );
     600           0 :         if ( bDone )
     601           0 :             nRet = TABBAR_RENAMING_YES;
     602           0 :         else if ( bErrorShown )
     603             :         {
     604             :             //  if the error message from this TabControl is currently visible,
     605             :             //  don't end edit mode now, to avoid problems when returning to
     606             :             //  the other call (showing the error) - this should not happen
     607             :             OSL_FAIL("ScTabControl::AllowRenaming: nested calls");
     608           0 :             nRet = TABBAR_RENAMING_NO;
     609             :         }
     610           0 :         else if ( Application::IsInModalMode() )
     611             :         {
     612             :             //  don't show error message above any modal dialog
     613             :             //  instead cancel renaming without error message
     614           0 :             nRet = TABBAR_RENAMING_CANCEL;
     615             :         }
     616             :         else
     617             :         {
     618           0 :             bErrorShown = true;
     619           0 :             pViewSh->ErrorMessage( STR_INVALIDTABNAME );
     620           0 :             bErrorShown = false;
     621           0 :             nRet = TABBAR_RENAMING_NO;
     622           0 :         }
     623             :     }
     624           0 :     return nRet;
     625             : }
     626             : 
     627           0 : void ScTabControl::EndRenaming()
     628             : {
     629           0 :     if ( HasFocus() )
     630           0 :         pViewData->GetView()->ActiveGrabFocus();
     631           0 : }
     632             : 
     633           4 : void ScTabControl::Mirror()
     634             : {
     635           4 :     TabBar::Mirror();
     636           4 :     if( nSelPageIdByMouse != TabBar::PAGE_NOT_FOUND )
     637             :     {
     638           0 :         Rectangle aRect( GetPageRect( GetCurPageId() ) );
     639           0 :         if( !aRect.IsEmpty() )
     640           0 :             SetPointerPosPixel( aRect.Center() );
     641           0 :         nSelPageIdByMouse = TabBar::PAGE_NOT_FOUND;  // only once after a Select()
     642             :     }
     643         232 : }
     644             : 
     645             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10