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