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 :
21 : #include "TabControl.hxx"
22 :
23 : #include <sfx2/viewfrm.hxx>
24 : #include <svx/svdlayer.hxx>
25 : #include <svx/svdpagv.hxx>
26 : #include <sfx2/dispatch.hxx>
27 :
28 :
29 : #include "sdattr.hxx"
30 : #include "app.hxx"
31 : #include "app.hrc"
32 : #include "glob.hrc"
33 : #include "res_bmp.hrc"
34 : #include "DrawViewShell.hxx"
35 : #include "GraphicViewShell.hxx"
36 : #include "helpids.h"
37 : #include "View.hxx"
38 : #include "sdpage.hxx"
39 : #include "drawdoc.hxx"
40 : #include "Window.hxx"
41 : #include "unmodpg.hxx"
42 : #include "DrawDocShell.hxx"
43 : #include "sdresid.hxx"
44 :
45 :
46 : namespace sd {
47 :
48 : #define SWITCH_TIMEOUT 20
49 :
50 : // -----------------------------------------
51 : // - SdTabControl::SdPageObjsTransferable -
52 : // -----------------------------------------
53 :
54 0 : TabControl::TabControlTransferable::~TabControlTransferable()
55 : {
56 0 : }
57 :
58 : // -----------------------------------------------------------------------------
59 :
60 0 : void TabControl::TabControlTransferable::AddSupportedFormats()
61 : {
62 0 : AddFormat( SOT_FORMATSTR_ID_STARDRAW_TABBAR );
63 0 : }
64 :
65 : // -----------------------------------------------------------------------------
66 :
67 0 : sal_Bool TabControl::TabControlTransferable::GetData( const ::com::sun::star::datatransfer::DataFlavor& )
68 : {
69 0 : return sal_False;
70 : }
71 :
72 : // -----------------------------------------------------------------------------
73 :
74 0 : void TabControl::TabControlTransferable::DragFinished( sal_Int8 nDropAction )
75 : {
76 0 : mrParent.DragFinished( nDropAction );
77 0 : }
78 :
79 : /*************************************************************************
80 : |*
81 : |* Standard-Konstruktor
82 : |*
83 : \************************************************************************/
84 :
85 0 : TabControl::TabControl(DrawViewShell* pViewSh, Window* pParent) :
86 : TabBar( pParent, WinBits( WB_BORDER | WB_3DLOOK | WB_SCROLL | WB_SIZEABLE | WB_DRAG) ),
87 : DragSourceHelper( this ),
88 : DropTargetHelper( this ),
89 : pDrViewSh(pViewSh),
90 0 : bInternalMove(sal_False)
91 : {
92 0 : EnableEditMode();
93 0 : SetSizePixel(Size(0, 0));
94 0 : SetMaxPageWidth( 150 );
95 0 : SetHelpId( HID_SD_TABBAR_PAGES );
96 0 : }
97 :
98 : /*************************************************************************
99 : |*
100 : |* Destruktor
101 : |*
102 : \************************************************************************/
103 :
104 0 : TabControl::~TabControl()
105 : {
106 0 : }
107 :
108 0 : void TabControl::Select()
109 : {
110 0 : SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
111 : pDispatcher->Execute(SID_SWITCHPAGE, SFX_CALLMODE_ASYNCHRON |
112 0 : SFX_CALLMODE_RECORD);
113 0 : }
114 :
115 0 : void TabControl::MouseButtonDown(const MouseEvent& rMEvt)
116 : {
117 0 : if (rMEvt.IsLeft()
118 0 : && !rMEvt.IsMod1()
119 0 : && !rMEvt.IsMod2()
120 0 : && !rMEvt.IsShift())
121 : {
122 0 : Point aPos = PixelToLogic( rMEvt.GetPosPixel() );
123 0 : sal_uInt16 aPageId = GetPageId(aPos);
124 :
125 0 : if (aPageId == 0)
126 : {
127 0 : SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
128 :
129 : pDispatcher->Execute(SID_INSERTPAGE_QUICK,
130 0 : SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD);
131 : }
132 : }
133 :
134 : // A single left click with pressed control key on a tab page first
135 : // switches to that page before the usual handling (copying with drag
136 : // and drop) takes place.
137 0 : else if (rMEvt.IsLeft() && rMEvt.IsMod1() && !rMEvt.IsMod2() && !rMEvt.IsShift())
138 : {
139 0 : pDrViewSh->SwitchPage (GetPageId (rMEvt.GetPosPixel()) - 1);
140 : }
141 :
142 : // When only the right button is pressed then first process a
143 : // synthesized left button click to make the page the current one
144 : // whose tab has been clicked. When then the actual right button
145 : // click is processed the resulting context menu relates to the
146 : // now current page.
147 0 : if (rMEvt.IsRight() && ! rMEvt.IsLeft())
148 : {
149 : MouseEvent aSyntheticEvent (
150 0 : rMEvt.GetPosPixel(),
151 0 : rMEvt.GetClicks(),
152 0 : rMEvt.GetMode(),
153 : MOUSE_LEFT,
154 0 : rMEvt.GetModifier());
155 0 : TabBar::MouseButtonDown(aSyntheticEvent);
156 : }
157 :
158 0 : TabBar::MouseButtonDown(rMEvt);
159 0 : }
160 :
161 0 : void TabControl::DoubleClick()
162 : {
163 0 : if (GetCurPageId() != 0)
164 : {
165 0 : SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
166 : pDispatcher->Execute( SID_MODIFYPAGE,
167 0 : SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD );
168 : }
169 0 : }
170 :
171 : /*************************************************************************
172 : |*
173 : |* StartDrag-Request
174 : |*
175 : \************************************************************************/
176 :
177 0 : void TabControl::StartDrag( sal_Int8, const Point& )
178 : {
179 0 : bInternalMove = sal_True;
180 :
181 : // object is delete by reference mechanismn
182 0 : ( new TabControl::TabControlTransferable( *this ) )->StartDrag( this, DND_ACTION_COPYMOVE );
183 0 : }
184 :
185 : /*************************************************************************
186 : |*
187 : |* DragFinished
188 : |*
189 : \************************************************************************/
190 :
191 0 : void TabControl::DragFinished( sal_Int8 )
192 : {
193 0 : bInternalMove = sal_False;
194 0 : }
195 :
196 : /*************************************************************************
197 : |*
198 : |* AcceptDrop-Event
199 : |*
200 : \************************************************************************/
201 :
202 0 : sal_Int8 TabControl::AcceptDrop( const AcceptDropEvent& rEvt )
203 : {
204 0 : sal_Int8 nRet = DND_ACTION_NONE;
205 :
206 0 : if( rEvt.mbLeaving )
207 0 : EndSwitchPage();
208 :
209 0 : if( !pDrViewSh->GetDocSh()->IsReadOnly() )
210 : {
211 0 : SdDrawDocument* pDoc = pDrViewSh->GetDoc();
212 0 : Point aPos( rEvt.maPosPixel );
213 :
214 0 : if( bInternalMove )
215 : {
216 0 : if( rEvt.mbLeaving || ( pDrViewSh->GetEditMode() == EM_MASTERPAGE ) )
217 0 : HideDropPos();
218 : else
219 : {
220 0 : ShowDropPos( aPos );
221 0 : nRet = rEvt.mnAction;
222 : }
223 : }
224 : else
225 : {
226 0 : HideDropPos();
227 :
228 0 : sal_Int32 nPageId = GetPageId( aPos ) - 1;
229 :
230 0 : if( ( nPageId >= 0 ) && pDoc->GetPage( (sal_uInt16)nPageId ) )
231 : {
232 0 : nRet = pDrViewSh->AcceptDrop( rEvt, *this, NULL, (sal_uInt16)nPageId, SDRLAYER_NOTFOUND );
233 0 : SwitchPage( aPos );
234 : }
235 : }
236 : }
237 :
238 0 : return nRet;
239 : }
240 :
241 : /*************************************************************************
242 : |*
243 : |* ExecuteDrop-Event
244 : |*
245 : \************************************************************************/
246 :
247 0 : sal_Int8 TabControl::ExecuteDrop( const ExecuteDropEvent& rEvt )
248 : {
249 0 : SdDrawDocument* pDoc = pDrViewSh->GetDoc();
250 0 : Point aPos( rEvt.maPosPixel );
251 0 : sal_Int8 nRet = DND_ACTION_NONE;
252 :
253 0 : if( bInternalMove )
254 : {
255 0 : sal_uInt16 nPageId = ShowDropPos( aPos ) - 1;
256 :
257 0 : switch (rEvt.mnAction)
258 : {
259 : case DND_ACTION_MOVE:
260 0 : if( pDrViewSh->IsSwitchPageAllowed() && pDoc->MovePages( nPageId ) )
261 : {
262 0 : SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
263 0 : pDispatcher->Execute(SID_SWITCHPAGE, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
264 : }
265 0 : break;
266 :
267 : case DND_ACTION_COPY:
268 : {
269 : // Copying the selected page to the place that rEvt points
270 : // takes place in three steps:
271 : // 1. Create a copy of the selected page. This copy will
272 : // lie directly behind the selected page.
273 : // 2. Move the copy to the desired place.
274 : // 3. Select the copy.
275 0 : if (pDrViewSh->IsSwitchPageAllowed())
276 : {
277 : // 1. Create a copy.
278 0 : sal_uInt16 nPageNumOfCopy = pDoc->DuplicatePage (GetCurPageId() - 1);
279 : // 2. Move page. For this first switch to the copy:
280 : // MovePages operates on the currently selected page(s).
281 0 : pDrViewSh->SwitchPage (nPageNumOfCopy);
282 : // Adapt target page id when necessary, i.e. page copy
283 : // has been inserted in front of the target page.
284 0 : sal_uInt16 nPageNum = nPageId;
285 0 : if ((nPageNumOfCopy <= nPageNum) && (nPageNum != (sal_uInt16)-1))
286 0 : nPageNum += 1;
287 0 : if (pDoc->MovePages(nPageNum))
288 : {
289 : // 3. Switch to the copy that has been moved to its
290 : // final destination. Use an asynchron slot call to
291 : // be executed after the still pending ones.
292 0 : if (nPageNumOfCopy >= nPageNum || (nPageNum == (sal_uInt16)-1))
293 0 : nPageNum += 1;
294 0 : SetCurPageId (GetPageId(nPageNum));
295 0 : SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
296 : pDispatcher->Execute(SID_SWITCHPAGE,
297 0 : SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
298 : }
299 : }
300 :
301 0 : break;
302 : }
303 : }
304 :
305 0 : nRet = rEvt.mnAction;
306 : }
307 : else
308 : {
309 0 : sal_Int32 nPageId = GetPageId( aPos ) - 1;
310 :
311 0 : if( ( nPageId >= 0 ) && pDoc->GetPage( (sal_uInt16)nPageId ) )
312 : {
313 0 : nRet = pDrViewSh->ExecuteDrop( rEvt, *this, NULL, (sal_uInt16)nPageId, SDRLAYER_NOTFOUND );
314 : }
315 : }
316 :
317 0 : HideDropPos();
318 0 : EndSwitchPage();
319 :
320 0 : return nRet;
321 : }
322 :
323 0 : void TabControl::Command(const CommandEvent& rCEvt)
324 : {
325 0 : sal_uInt16 nCmd = rCEvt.GetCommand();
326 :
327 0 : if ( nCmd == COMMAND_CONTEXTMENU )
328 : {
329 0 : sal_Bool bGraphicShell = pDrViewSh->ISA(GraphicViewShell);
330 : sal_uInt16 nResId = bGraphicShell ? RID_GRAPHIC_PAGETAB_POPUP :
331 0 : RID_DRAW_PAGETAB_POPUP;
332 0 : SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
333 0 : pDispatcher->ExecutePopup( SdResId( nResId ) );
334 : }
335 0 : }
336 :
337 0 : long TabControl::StartRenaming()
338 : {
339 0 : sal_Bool bOK = sal_False;
340 :
341 0 : if (pDrViewSh->GetPageKind() == PK_STANDARD)
342 : {
343 0 : bOK = sal_True;
344 :
345 0 : ::sd::View* pView = pDrViewSh->GetView();
346 :
347 0 : if ( pView->IsTextEdit() )
348 0 : pView->SdrEndTextEdit();
349 : }
350 :
351 0 : return( bOK );
352 : }
353 :
354 0 : long TabControl::AllowRenaming()
355 : {
356 0 : sal_Bool bOK = sal_True;
357 :
358 0 : String aNewName( GetEditText() );
359 0 : String aCompareName( GetPageText( GetEditPageId() ) );
360 :
361 0 : if( aCompareName != aNewName )
362 : {
363 : // Seite umbenennen
364 0 : if( pDrViewSh->GetDocSh()->CheckPageName( this, aNewName ) )
365 : {
366 0 : SetEditText( aNewName );
367 0 : EndRenaming();
368 : }
369 : else
370 : {
371 0 : bOK = sal_False;
372 : }
373 : }
374 0 : return( bOK );
375 : }
376 :
377 0 : void TabControl::EndRenaming()
378 : {
379 0 : if( !IsEditModeCanceled() )
380 0 : pDrViewSh->RenameSlide( GetEditPageId(), GetEditText() );
381 0 : }
382 :
383 0 : void TabControl::ActivatePage()
384 : {
385 0 : if ( /*IsInSwitching && */ pDrViewSh->IsSwitchPageAllowed() )
386 : {
387 0 : SfxDispatcher* pDispatcher = pDrViewSh->GetViewFrame()->GetDispatcher();
388 : pDispatcher->Execute(SID_SWITCHPAGE,
389 0 : SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
390 : }
391 0 : }
392 :
393 0 : long TabControl::DeactivatePage()
394 : {
395 0 : return pDrViewSh->IsSwitchPageAllowed();
396 : }
397 :
398 :
399 :
400 :
401 0 : void TabControl::SendActivatePageEvent (void)
402 : {
403 : CallEventListeners (VCLEVENT_TABBAR_PAGEACTIVATED,
404 0 : reinterpret_cast<void*>(GetCurPageId()));
405 0 : }
406 :
407 :
408 :
409 :
410 0 : void TabControl::SendDeactivatePageEvent (void)
411 : {
412 : CallEventListeners (VCLEVENT_TABBAR_PAGEDEACTIVATED,
413 0 : reinterpret_cast<void*>(GetCurPageId()));
414 0 : }
415 :
416 : } // end of namespace sd
417 :
418 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|