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

Generated by: LCOV version 1.11