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