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