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 <tools/urlobj.hxx>
21 : #include <unotools/localfilehelper.hxx>
22 : #include <sfx2/imgmgr.hxx>
23 : #include <sfx2/fcontnr.hxx>
24 : #include <svl/eitem.hxx>
25 : #include <svl/stritem.hxx>
26 : #include <sfx2/docfilt.hxx>
27 : #include <sfx2/docfile.hxx>
28 : #include <svl/intitem.hxx>
29 : #include <sfx2/dispatch.hxx>
30 : #include <svx/svxids.hrc>
31 :
32 : #include <vcl/menu.hxx>
33 : #include <vcl/settings.hxx>
34 :
35 : #include <sfx2/viewfrm.hxx>
36 : #include <sfx2/dockwin.hxx>
37 : #include <sfx2/sfxresid.hxx>
38 :
39 : #include "pres.hxx"
40 : #include "navigatr.hxx"
41 : #include "navigatr.hrc"
42 : #include "pgjump.hxx"
43 : #include "app.hrc"
44 : #include "strings.hrc"
45 : #include "res_bmp.hrc"
46 : #include "drawdoc.hxx"
47 : #include "DrawDocShell.hxx"
48 : #include "sdresid.hxx"
49 : #include "ViewShell.hxx"
50 : #include "ViewShellBase.hxx"
51 : #include "DrawViewShell.hxx"
52 : #include "slideshow.hxx"
53 : #include "FrameView.hxx"
54 : #include "helpids.h"
55 :
56 : namespace {
57 : static const sal_uInt16 nShowNamedShapesFilter=1;
58 : static const sal_uInt16 nShowAllShapesFilter=2;
59 : }
60 :
61 : /**
62 : * SdNavigatorWin - FloatingWindow
63 : */
64 2 : SdNavigatorWin::SdNavigatorWin(
65 : vcl::Window* pParent,
66 : ::sd::NavigatorChildWindow* pChWinCtxt,
67 : const SdResId& rSdResId,
68 : SfxBindings* pInBindings,
69 : const UpdateRequestFunctor& rUpdateRequest)
70 : : vcl::Window( pParent, rSdResId )
71 : , maToolbox ( this, SdResId( 1 ) )
72 : , maTlbObjects( this, SdResId( TLB_OBJECTS ) )
73 : , maLbDocs ( this, SdResId( LB_DOCS ) )
74 : , mpChildWinContext( pChWinCtxt )
75 : , mbDocImported ( false )
76 : // On changes of the DragType: adjust SelectionMode of TLB!
77 : , meDragType ( NAVIGATOR_DRAGTYPE_EMBEDDED )
78 : , mpBindings ( pInBindings )
79 2 : , maImageList ( SdResId( IL_NAVIGATR ) )
80 : {
81 2 : maTlbObjects.SetViewFrame( mpBindings->GetDispatcher()->GetFrame() );
82 :
83 2 : FreeResource();
84 :
85 2 : maTlbObjects.SetAccessibleName(SD_RESSTR(STR_OBJECTS_TREE));
86 :
87 2 : mpNavigatorCtrlItem = new SdNavigatorControllerItem( SID_NAVIGATOR_STATE, this, mpBindings, rUpdateRequest);
88 2 : mpPageNameCtrlItem = new SdPageNameControllerItem( SID_NAVIGATOR_PAGENAME, this, mpBindings, rUpdateRequest);
89 :
90 2 : ApplyImageList(); // load images *before* calculating sizes to get something useful !!!
91 :
92 2 : Size aTbxSize( maToolbox.CalcWindowSizePixel() );
93 2 : maToolbox.SetOutputSizePixel( aTbxSize );
94 2 : maToolbox.SetSelectHdl( LINK( this, SdNavigatorWin, SelectToolboxHdl ) );
95 2 : maToolbox.SetClickHdl( LINK( this, SdNavigatorWin, ClickToolboxHdl ) );
96 2 : maToolbox.SetDropdownClickHdl( LINK(this, SdNavigatorWin, DropdownClickToolBoxHdl) );
97 2 : maToolbox.SetItemBits( TBI_DRAGTYPE, maToolbox.GetItemBits( TBI_DRAGTYPE ) | ToolBoxItemBits::DROPDOWNONLY );
98 :
99 : // Shape filter drop down menu.
100 : maToolbox.SetItemBits(
101 : TBI_SHAPE_FILTER,
102 2 : maToolbox.GetItemBits(TBI_SHAPE_FILTER) | ToolBoxItemBits::DROPDOWNONLY);
103 :
104 : // TreeListBox
105 : // set position below toolbox
106 2 : long nListboxYPos = maToolbox.GetPosPixel().Y() + maToolbox.GetSizePixel().Height() + 4;
107 2 : maTlbObjects.setPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y );
108 2 : maTlbObjects.SetDoubleClickHdl( LINK( this, SdNavigatorWin, ClickObjectHdl ) );
109 2 : maTlbObjects.SetSelectionMode( SINGLE_SELECTION );
110 : // set focus to listbox, otherwise it is in the toolbox which is only useful
111 : // for keyboard navigation
112 2 : maTlbObjects.GrabFocus();
113 2 : maTlbObjects.SetSdNavigatorWinFlag(true);
114 :
115 : // DragTypeListBox
116 2 : maLbDocs.SetSelectHdl( LINK( this, SdNavigatorWin, SelectDocumentHdl ) );
117 : // set position below treelistbox
118 2 : nListboxYPos = maTlbObjects.GetPosPixel().Y() + maTlbObjects.GetSizePixel().Height() + 4;
119 2 : maLbDocs.setPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y );
120 :
121 : // assure that tool box is at least as wide as the tree list box
122 : {
123 2 : const Size aTlbSize( maTlbObjects.GetOutputSizePixel() );
124 2 : if ( aTlbSize.Width() > aTbxSize.Width() )
125 : {
126 0 : maToolbox.setPosSizePixel( 0, 0, aTlbSize.Width(), 0, WINDOW_POSSIZE_WIDTH );
127 0 : aTbxSize = maToolbox.GetOutputSizePixel();
128 : }
129 : }
130 :
131 : // set min outputsize after all sizes are known
132 2 : const long nFullHeight = nListboxYPos + maLbDocs.GetSizePixel().Height() + 4;
133 2 : maSize = GetOutputSizePixel();
134 2 : if( maSize.Height() < nFullHeight )
135 : {
136 0 : maSize.Height() = nFullHeight;
137 0 : SetOutputSizePixel( maSize );
138 : }
139 2 : maMinSize = maSize;
140 2 : const long nMinWidth = 2*maToolbox.GetPosPixel().X() + aTbxSize.Width(); // never clip the toolbox
141 2 : if( nMinWidth > maMinSize.Width() )
142 0 : maMinSize.Width() = nMinWidth;
143 2 : maMinSize.Height() -= 40;
144 2 : SfxDockingWindow* pDockingParent = dynamic_cast<SfxDockingWindow*>(GetParent());
145 2 : if (pDockingParent != NULL)
146 2 : pDockingParent->SetMinOutputSizePixel( maMinSize );
147 :
148 : // InitTlb; is initiated over Slot
149 2 : if (rUpdateRequest)
150 2 : rUpdateRequest();
151 2 : }
152 :
153 6 : SdNavigatorWin::~SdNavigatorWin()
154 : {
155 2 : delete mpNavigatorCtrlItem;
156 2 : delete mpPageNameCtrlItem;
157 4 : }
158 :
159 : //when object is marked , fresh the corresponding entry tree .
160 0 : void SdNavigatorWin::FreshTree( const SdDrawDocument* pDoc )
161 : {
162 0 : SdDrawDocument* pNonConstDoc = (SdDrawDocument*) pDoc; // const as const can...
163 0 : sd::DrawDocShell* pDocShell = pNonConstDoc->GetDocSh();
164 0 : OUString aDocShName( pDocShell->GetName() );
165 0 : OUString aDocName = pDocShell->GetMedium()->GetName();
166 0 : maTlbObjects.SetSaveTreeItemStateFlag(true); //Added by yanjun for sym2_6385
167 0 : maTlbObjects.Clear();
168 0 : maTlbObjects.Fill( pDoc, false, aDocName ); // Nur normale Seiten
169 0 : maTlbObjects.SetSaveTreeItemStateFlag(false); //Added by yanjun for sym2_6385
170 0 : RefreshDocumentLB();
171 0 : maLbDocs.SelectEntry( aDocShName );
172 0 : }
173 :
174 0 : void SdNavigatorWin::FreshEntry( )
175 : {
176 0 : maTlbObjects.FreshCurEntry();
177 0 : }
178 :
179 8 : void SdNavigatorWin::InitTreeLB( const SdDrawDocument* pDoc )
180 : {
181 8 : SdDrawDocument* pNonConstDoc = (SdDrawDocument*) pDoc; // const as const can...
182 8 : ::sd::DrawDocShell* pDocShell = pNonConstDoc->GetDocSh();
183 8 : OUString aDocShName( pDocShell->GetName() );
184 8 : ::sd::ViewShell* pViewShell = pDocShell->GetViewShell();
185 :
186 : // Restore the 'ShowAllShapes' flag from the last time (in this session)
187 : // that the navigator was shown.
188 8 : if (pViewShell != NULL)
189 : {
190 8 : ::sd::FrameView* pFrameView = pViewShell->GetFrameView();
191 8 : if (pFrameView != NULL)
192 8 : maTlbObjects.SetShowAllShapes(pFrameView->IsNavigatorShowingAllShapes(), false);
193 : }
194 :
195 : // Disable the shape filter drop down menu when there is a running slide
196 : // show.
197 8 : if (pViewShell!=NULL && sd::SlideShow::IsRunning( pViewShell->GetViewShellBase() ))
198 0 : maToolbox.EnableItem(TBI_SHAPE_FILTER, false);
199 : else
200 8 : maToolbox.EnableItem(TBI_SHAPE_FILTER);
201 :
202 8 : if( !maTlbObjects.IsEqualToDoc( pDoc ) )
203 : {
204 2 : OUString aDocName = pDocShell->GetMedium()->GetName();
205 2 : maTlbObjects.Clear();
206 2 : maTlbObjects.Fill( pDoc, false, aDocName ); // only normal pages
207 :
208 2 : RefreshDocumentLB();
209 2 : maLbDocs.SelectEntry( aDocShName );
210 : }
211 : else
212 : {
213 6 : maLbDocs.SetNoSelection();
214 6 : maLbDocs.SelectEntry( aDocShName );
215 :
216 : // commented in order to fix 30246
217 : // if( maLbDocs.GetSelectEntryCount() == 0 )
218 : {
219 6 : RefreshDocumentLB();
220 6 : maLbDocs.SelectEntry( aDocShName );
221 : }
222 : }
223 :
224 8 : SfxViewFrame* pViewFrame = ( ( pViewShell && pViewShell->GetViewFrame() ) ? pViewShell->GetViewFrame() : SfxViewFrame::Current() );
225 8 : if( pViewFrame )
226 8 : pViewFrame->GetBindings().Invalidate(SID_NAVIGATOR_PAGENAME, true, true);
227 8 : }
228 :
229 : /**
230 : * DragType is set on dependance if a Drag is even possible. For example,
231 : * under certain circumstances, it is not allowed to drag graphics (#31038#).
232 : */
233 0 : NavigatorDragType SdNavigatorWin::GetNavigatorDragType()
234 : {
235 0 : NavigatorDragType eDT = meDragType;
236 0 : NavDocInfo* pInfo = GetDocInfo();
237 :
238 0 : if( ( eDT == NAVIGATOR_DRAGTYPE_LINK ) && ( ( pInfo && !pInfo->HasName() ) || !maTlbObjects.IsLinkableSelected() ) )
239 0 : eDT = NAVIGATOR_DRAGTYPE_NONE;
240 :
241 0 : return( eDT );
242 : }
243 :
244 : //Get SdDrawDocShell
245 0 : sd::DrawDocShell* SdNavigatorWin::GetDrawDocShell( const SdDrawDocument* pDoc )
246 : {
247 0 : if( !pDoc )
248 0 : return NULL; // const as const can...
249 0 : sd::DrawDocShell* pDocShell = pDoc->GetDocSh();
250 0 : return pDocShell;
251 : }
252 :
253 0 : IMPL_LINK_NOARG(SdNavigatorWin, SelectToolboxHdl)
254 : {
255 0 : sal_uInt16 nId = maToolbox.GetCurItemId();
256 0 : sal_uInt16 nSId = 0;
257 0 : PageJump ePage = PAGE_NONE;
258 :
259 0 : switch( nId )
260 : {
261 : case TBI_PEN:
262 : {
263 0 : if( nId == TBI_PEN )
264 : {
265 0 : nSId = SID_NAVIGATOR_PEN;
266 : }
267 :
268 0 : if( nSId > 0 )
269 : {
270 0 : SfxBoolItem aItem( nSId, true );
271 : mpBindings->GetDispatcher()->Execute(
272 0 : nSId, SfxCallMode::SLOT |SfxCallMode::RECORD, &aItem, 0L );
273 : }
274 : }
275 0 : break;
276 :
277 : case TBI_FIRST:
278 : case TBI_PREVIOUS:
279 : case TBI_NEXT:
280 : case TBI_LAST:
281 : {
282 0 : if( nId == TBI_FIRST )
283 0 : ePage = PAGE_FIRST;
284 0 : else if( nId == TBI_PREVIOUS )
285 0 : ePage = PAGE_PREVIOUS;
286 0 : else if( nId == TBI_NEXT )
287 0 : ePage = PAGE_NEXT;
288 0 : else if( nId == TBI_LAST )
289 0 : ePage = PAGE_LAST;
290 :
291 0 : if( ePage != PAGE_NONE )
292 : {
293 0 : SfxUInt16Item aItem( SID_NAVIGATOR_PAGE, (sal_uInt16)ePage );
294 : mpBindings->GetDispatcher()->Execute(
295 0 : SID_NAVIGATOR_PAGE, SfxCallMode::SLOT | SfxCallMode::RECORD, &aItem, 0L );
296 : }
297 : }
298 0 : break;
299 : }
300 0 : return 0;
301 : }
302 :
303 0 : IMPL_LINK_NOARG(SdNavigatorWin, ClickToolboxHdl)
304 : {
305 0 : return 0;
306 : }
307 :
308 0 : IMPL_LINK( SdNavigatorWin, DropdownClickToolBoxHdl, ToolBox*, pBox )
309 : {
310 0 : sal_uInt16 nId = maToolbox.GetCurItemId();
311 :
312 0 : switch( nId )
313 : {
314 : case TBI_DRAGTYPE:
315 : {
316 : // Popup menu is created depending if the document is saved or not
317 0 : PopupMenu *pMenu = new PopupMenu;
318 :
319 : static const char* aHIDs[] =
320 : {
321 : HID_SD_NAVIGATOR_MENU1,
322 : HID_SD_NAVIGATOR_MENU2,
323 : HID_SD_NAVIGATOR_MENU3,
324 : 0
325 : };
326 :
327 0 : for( sal_uInt16 nID = NAVIGATOR_DRAGTYPE_URL;
328 : nID < NAVIGATOR_DRAGTYPE_COUNT;
329 : nID++ )
330 : {
331 0 : sal_uInt16 nRId = GetDragTypeSdResId( (NavigatorDragType)nID );
332 0 : if( nRId > 0 )
333 : {
334 : DBG_ASSERT(aHIDs[nID-NAVIGATOR_DRAGTYPE_URL],"HelpId not added!");
335 0 : pMenu->InsertItem( nID, SD_RESSTR( nRId ) );
336 0 : pMenu->SetHelpId( nID, aHIDs[nID - NAVIGATOR_DRAGTYPE_URL] );
337 : }
338 :
339 : }
340 0 : NavDocInfo* pInfo = GetDocInfo();
341 :
342 0 : if( ( pInfo && !pInfo->HasName() ) || !maTlbObjects.IsLinkableSelected() )
343 : {
344 0 : pMenu->EnableItem( NAVIGATOR_DRAGTYPE_LINK, false );
345 0 : pMenu->EnableItem( NAVIGATOR_DRAGTYPE_URL, false );
346 0 : meDragType = NAVIGATOR_DRAGTYPE_EMBEDDED;
347 : }
348 :
349 0 : pMenu->CheckItem( (sal_uInt16)meDragType );
350 0 : pMenu->SetSelectHdl( LINK( this, SdNavigatorWin, MenuSelectHdl ) );
351 :
352 0 : pMenu->Execute( this, maToolbox.GetItemRect( nId ), POPUPMENU_EXECUTE_DOWN );
353 0 : pBox->EndSelection();
354 0 : delete pMenu;
355 : }
356 0 : break;
357 :
358 : case TBI_SHAPE_FILTER:
359 : {
360 0 : PopupMenu *pMenu = new PopupMenu;
361 :
362 : pMenu->InsertItem(
363 : nShowNamedShapesFilter,
364 0 : SD_RESSTR(STR_NAVIGATOR_SHOW_NAMED_SHAPES));
365 : pMenu->InsertItem(
366 : nShowAllShapesFilter,
367 0 : SD_RESSTR(STR_NAVIGATOR_SHOW_ALL_SHAPES));
368 :
369 0 : if (maTlbObjects.GetShowAllShapes())
370 0 : pMenu->CheckItem(nShowAllShapesFilter);
371 : else
372 0 : pMenu->CheckItem(nShowNamedShapesFilter);
373 0 : pMenu->SetSelectHdl( LINK( this, SdNavigatorWin, ShapeFilterCallback ) );
374 :
375 0 : pMenu->Execute( this, maToolbox.GetItemRect( nId ), POPUPMENU_EXECUTE_DOWN );
376 0 : pBox->EndSelection();
377 0 : delete pMenu;
378 : }
379 0 : break;
380 : }
381 0 : return 0;
382 : }
383 :
384 0 : IMPL_LINK_NOARG(SdNavigatorWin, ClickObjectHdl)
385 : {
386 0 : if( !mbDocImported || maLbDocs.GetSelectEntryPos() != 0 )
387 : {
388 0 : NavDocInfo* pInfo = GetDocInfo();
389 :
390 : // if it is the active window, we jump to the page
391 0 : if( pInfo && pInfo->IsActive() )
392 : {
393 0 : OUString aStr( maTlbObjects.GetSelectEntry() );
394 :
395 0 : if( !aStr.isEmpty() )
396 : {
397 0 : SfxStringItem aItem( SID_NAVIGATOR_OBJECT, aStr );
398 : mpBindings->GetDispatcher()->Execute(
399 0 : SID_NAVIGATOR_OBJECT, SfxCallMode::SLOT | SfxCallMode::RECORD, &aItem, 0L );
400 : //set sign variable
401 0 : maTlbObjects.MarkCurEntry(aStr);
402 :
403 : // moved here from SetGetFocusHdl. Reset the
404 : // focus only if something has been selected in the
405 : // document.
406 0 : SfxViewShell* pCurSh = SfxViewShell::Current();
407 :
408 0 : if ( pCurSh )
409 : {
410 0 : vcl::Window* pShellWnd = pCurSh->GetWindow();
411 0 : if ( pShellWnd )
412 0 : pShellWnd->GrabFocus();
413 0 : }
414 0 : }
415 : }
416 : }
417 0 : return( 0L );
418 : }
419 :
420 0 : IMPL_LINK_NOARG(SdNavigatorWin, SelectDocumentHdl)
421 : {
422 0 : OUString aStrLb = maLbDocs.GetSelectEntry();
423 0 : long nPos = maLbDocs.GetSelectEntryPos();
424 0 : bool bFound = false;
425 0 : ::sd::DrawDocShell* pDocShell = NULL;
426 0 : NavDocInfo* pInfo = GetDocInfo();
427 :
428 : // is it a dragged object?
429 0 : if( mbDocImported && nPos == 0 )
430 : {
431 : // construct document in TLB
432 0 : InsertFile( aStrLb );
433 : }
434 0 : else if (pInfo)
435 : {
436 0 : pDocShell = pInfo->mpDocShell;
437 :
438 0 : bFound = true;
439 : }
440 :
441 0 : if( bFound )
442 : {
443 0 : SdDrawDocument* pDoc = pDocShell->GetDoc();
444 0 : if( !maTlbObjects.IsEqualToDoc( pDoc ) )
445 : {
446 0 : SdDrawDocument* pNonConstDoc = (SdDrawDocument*) pDoc; // const as const can...
447 0 : ::sd::DrawDocShell* pNCDocShell = pNonConstDoc->GetDocSh();
448 0 : OUString aDocName = pNCDocShell->GetMedium()->GetName();
449 0 : maTlbObjects.Clear();
450 0 : maTlbObjects.Fill( pDoc, false, aDocName ); // only normal pages
451 : }
452 : }
453 :
454 : // check if link or url is possible
455 0 : if( ( pInfo && !pInfo->HasName() ) || !maTlbObjects.IsLinkableSelected() || ( meDragType != NAVIGATOR_DRAGTYPE_EMBEDDED ) )
456 : {
457 0 : meDragType = NAVIGATOR_DRAGTYPE_EMBEDDED;
458 0 : SetDragImage();
459 : }
460 :
461 0 : return( 0L );
462 : }
463 :
464 : /**
465 : * Set DrageType and set image accordingly to it.
466 : * If the handler is called with NULL, the default (URL) is set.
467 : */
468 0 : IMPL_LINK( SdNavigatorWin, MenuSelectHdl, Menu *, pMenu )
469 : {
470 : sal_uInt16 nMenuId;
471 0 : if( pMenu )
472 0 : nMenuId = pMenu->GetCurItemId();
473 : else
474 0 : nMenuId = NAVIGATOR_DRAGTYPE_URL;
475 :
476 0 : if( nMenuId != USHRT_MAX ) // Necessary ?
477 : {
478 0 : NavigatorDragType eDT = (NavigatorDragType) nMenuId;
479 0 : if( meDragType != eDT )
480 : {
481 0 : meDragType = eDT;
482 0 : SetDragImage();
483 :
484 0 : if( meDragType == NAVIGATOR_DRAGTYPE_URL )
485 : {
486 : // patch, prevents endless loop
487 0 : if( maTlbObjects.GetSelectionCount() > 1 )
488 0 : maTlbObjects.SelectAll( false );
489 :
490 0 : maTlbObjects.SetSelectionMode( SINGLE_SELECTION );
491 : }
492 : else
493 0 : maTlbObjects.SetSelectionMode( MULTIPLE_SELECTION );
494 : }
495 : }
496 0 : return( 0 );
497 : }
498 :
499 0 : IMPL_LINK( SdNavigatorWin, ShapeFilterCallback, Menu *, pMenu )
500 : {
501 0 : if (pMenu != NULL)
502 : {
503 0 : bool bShowAllShapes (maTlbObjects.GetShowAllShapes());
504 0 : sal_uInt16 nMenuId (pMenu->GetCurItemId());
505 0 : switch (nMenuId)
506 : {
507 : case nShowNamedShapesFilter:
508 0 : bShowAllShapes = false;
509 0 : break;
510 :
511 : case nShowAllShapesFilter:
512 0 : bShowAllShapes = true;
513 0 : break;
514 :
515 : default:
516 : OSL_FAIL(
517 : "SdNavigatorWin::ShapeFilterCallback called for unknown menu entry");
518 0 : break;
519 : }
520 :
521 0 : maTlbObjects.SetShowAllShapes(bShowAllShapes, true);
522 :
523 : // Remember the selection in the FrameView.
524 0 : NavDocInfo* pInfo = GetDocInfo();
525 0 : if (pInfo != NULL)
526 : {
527 0 : ::sd::DrawDocShell* pDocShell = pInfo->mpDocShell;
528 0 : if (pDocShell != NULL)
529 : {
530 0 : ::sd::ViewShell* pViewShell = pDocShell->GetViewShell();
531 0 : if (pViewShell != NULL)
532 : {
533 0 : ::sd::FrameView* pFrameView = pViewShell->GetFrameView();
534 0 : if (pFrameView != NULL)
535 : {
536 0 : pFrameView->SetIsNavigatorShowingAllShapes(bShowAllShapes);
537 : }
538 : }
539 : }
540 : }
541 : }
542 :
543 0 : return 0;
544 : }
545 :
546 5 : void SdNavigatorWin::Resize()
547 : {
548 5 : Size aWinSize( GetOutputSizePixel() );
549 5 : if( aWinSize.Height() >= maMinSize.Height() )
550 : //aWinSize.Width() >= maMinSize.Width() )
551 : {
552 5 : Size aDiffSize;
553 5 : aDiffSize.Width() = aWinSize.Width() - maSize.Width();
554 5 : aDiffSize.Height() = aWinSize.Height() - maSize.Height();
555 :
556 : // change size of Toolbox
557 5 : Size aObjSize( maToolbox.GetOutputSizePixel() );
558 5 : aObjSize.Width() += aDiffSize.Width();
559 5 : maToolbox.SetOutputSizePixel( aObjSize );
560 :
561 : // change size of TreeLB
562 5 : aObjSize = maTlbObjects.GetSizePixel();
563 5 : aObjSize.Width() += aDiffSize.Width();
564 15 : aObjSize.Height() = maLbDocs.GetPosPixel().Y() + aDiffSize.Height() -
565 10 : maTlbObjects.GetPosPixel().Y() - 4;
566 5 : maTlbObjects.SetSizePixel( aObjSize );
567 :
568 5 : Point aPt( 0, aDiffSize.Height() );
569 :
570 : // move other controls (DocumentLB)
571 5 : maLbDocs.Hide();
572 5 : aObjSize = maLbDocs.GetOutputSizePixel();
573 5 : aObjSize.Width() += aDiffSize.Width();
574 5 : maLbDocs.SetPosPixel( maLbDocs.GetPosPixel() + aPt );
575 5 : maLbDocs.SetOutputSizePixel( aObjSize );
576 5 : maLbDocs.Show();
577 :
578 5 : maSize = aWinSize;
579 : }
580 5 : Window::Resize();
581 5 : }
582 :
583 0 : bool SdNavigatorWin::InsertFile(const OUString& rFileName)
584 : {
585 0 : INetURLObject aURL( rFileName );
586 :
587 0 : if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
588 : {
589 0 : OUString aURLStr;
590 0 : ::utl::LocalFileHelper::ConvertPhysicalNameToURL( rFileName, aURLStr );
591 0 : aURL = INetURLObject( aURLStr );
592 : }
593 :
594 : // get adjusted FileName
595 0 : OUString aFileName( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
596 :
597 0 : if (aFileName.isEmpty())
598 : {
599 : // show actual document again
600 0 : maDropFileName = aFileName;
601 : }
602 : else
603 : {
604 : // show dragged-in document
605 0 : const SfxFilter* pFilter = NULL;
606 0 : ErrCode nErr = 0;
607 :
608 0 : if (aFileName != maDropFileName)
609 : {
610 0 : SfxMedium aMed(aFileName, (STREAM_READ | STREAM_SHARE_DENYNONE));
611 0 : SfxFilterMatcher aMatch( OUString("simpress") );
612 0 : aMed.UseInteractionHandler( true );
613 0 : nErr = aMatch.GuessFilter(aMed, &pFilter);
614 : }
615 :
616 0 : if ((pFilter && !nErr) || aFileName == maDropFileName)
617 : {
618 : // The medium may be opened with READ/WRITE. Therefore, we first
619 : // check if it contains a Storage.
620 : SfxMedium* pMedium = new SfxMedium( aFileName,
621 0 : STREAM_READ | STREAM_NOCREATE);
622 :
623 0 : if (pMedium->IsStorage())
624 : {
625 : // Now depending on mode:
626 : // maTlbObjects.SetSelectionMode(MULTIPLE_SELECTION);
627 : // handover of ownership of pMedium;
628 0 : SdDrawDocument* pDropDoc = maTlbObjects.GetBookmarkDoc(pMedium);
629 :
630 0 : if (pDropDoc)
631 : {
632 0 : maTlbObjects.Clear();
633 0 : maDropFileName = aFileName;
634 :
635 0 : if( !maTlbObjects.IsEqualToDoc( pDropDoc ) )
636 : {
637 : // only normal pages
638 0 : maTlbObjects.Fill(pDropDoc, false, maDropFileName);
639 0 : RefreshDocumentLB( &maDropFileName );
640 : }
641 : }
642 : }
643 : else
644 : {
645 0 : delete pMedium;
646 0 : return false;
647 : }
648 : }
649 : else
650 : {
651 0 : return false;
652 : }
653 : }
654 :
655 0 : return true;
656 : }
657 :
658 8 : void SdNavigatorWin::RefreshDocumentLB( const OUString* pDocName )
659 : {
660 8 : sal_Int32 nPos = 0;
661 :
662 8 : if( pDocName )
663 : {
664 0 : if( mbDocImported )
665 0 : maLbDocs.RemoveEntry( 0 );
666 :
667 0 : maLbDocs.InsertEntry( *pDocName, 0 );
668 0 : mbDocImported = true;
669 : }
670 : else
671 : {
672 8 : nPos = maLbDocs.GetSelectEntryPos();
673 8 : if( nPos == LISTBOX_ENTRY_NOTFOUND )
674 2 : nPos = 0;
675 :
676 8 : OUString aStr;
677 8 : if( mbDocImported )
678 0 : aStr = maLbDocs.GetEntry( 0 );
679 :
680 8 : maLbDocs.Clear();
681 :
682 : // delete list of DocInfos
683 8 : maDocList.clear();
684 :
685 8 : if( mbDocImported )
686 0 : maLbDocs.InsertEntry( aStr, 0 );
687 :
688 : ::sd::DrawDocShell* pCurrentDocShell =
689 8 : PTR_CAST(::sd::DrawDocShell, SfxObjectShell::Current() );
690 8 : SfxObjectShell* pSfxDocShell = SfxObjectShell::GetFirst(0, false);
691 24 : while( pSfxDocShell )
692 : {
693 8 : ::sd::DrawDocShell* pDocShell = PTR_CAST(::sd::DrawDocShell, pSfxDocShell );
694 8 : if( pDocShell && !pDocShell->IsInDestruction() && ( pDocShell->GetCreateMode() != SFX_CREATE_MODE_EMBEDDED ) )
695 : {
696 8 : NavDocInfo aInfo ;
697 8 : aInfo.mpDocShell = pDocShell;
698 :
699 8 : SfxMedium *pMedium = pDocShell->GetMedium();
700 8 : aStr = pMedium ? pMedium->GetName() : OUString();
701 8 : if( !aStr.isEmpty() )
702 0 : aInfo.SetName();
703 : else
704 8 : aInfo.SetName( false );
705 : // at the moment, we use the name of the shell again (i.e.
706 : // without path) since Koose thinks it is an error if the path
707 : // is shown in url notation!
708 8 : aStr = pDocShell->GetName();
709 :
710 8 : maLbDocs.InsertEntry( aStr, LISTBOX_APPEND );
711 :
712 8 : if( pDocShell == pCurrentDocShell )
713 8 : aInfo.SetActive();
714 : else
715 0 : aInfo.SetActive( false );
716 :
717 8 : maDocList.push_back( aInfo );
718 : }
719 8 : pSfxDocShell = SfxObjectShell::GetNext( *pSfxDocShell, 0, false );
720 8 : }
721 : }
722 8 : maLbDocs.SelectEntryPos( nPos );
723 8 : }
724 :
725 2 : sal_uInt16 SdNavigatorWin::GetDragTypeSdResId( NavigatorDragType eDT, bool bImage )
726 : {
727 2 : switch( eDT )
728 : {
729 : case NAVIGATOR_DRAGTYPE_NONE:
730 0 : return( bImage ? 0 : STR_NONE );
731 : case NAVIGATOR_DRAGTYPE_URL:
732 0 : return( bImage ? TBI_HYPERLINK : STR_DRAGTYPE_URL );
733 : case NAVIGATOR_DRAGTYPE_EMBEDDED:
734 2 : return( bImage ? TBI_EMBEDDED : STR_DRAGTYPE_EMBEDDED );
735 : case NAVIGATOR_DRAGTYPE_LINK:
736 0 : return( bImage ? TBI_LINK : STR_DRAGTYPE_LINK );
737 : default: OSL_FAIL( "No resource for DragType available!" );
738 : }
739 0 : return( 0 );
740 : }
741 :
742 6 : NavDocInfo* SdNavigatorWin::GetDocInfo()
743 : {
744 6 : sal_uInt32 nPos = maLbDocs.GetSelectEntryPos();
745 :
746 6 : if( mbDocImported )
747 : {
748 0 : if( nPos == 0 )
749 : {
750 0 : return( NULL );
751 : }
752 0 : nPos--;
753 : }
754 :
755 6 : return nPos < maDocList.size() ? &(maDocList[ nPos ]) : NULL;
756 : }
757 :
758 : /**
759 : * PreNotify
760 : */
761 32 : bool SdNavigatorWin::Notify(NotifyEvent& rNEvt)
762 : {
763 32 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
764 32 : bool nOK = false;
765 :
766 32 : if( pKEvt )
767 : {
768 0 : if( KEY_ESCAPE == pKEvt->GetKeyCode().GetCode() )
769 : {
770 0 : if( SdPageObjsTLB::IsInDrag() )
771 : {
772 : // during drag'n'drop we just stop the drag but do not close the navigator
773 0 : nOK = true;
774 : }
775 : else
776 : {
777 0 : ::sd::ViewShellBase* pBase = ::sd::ViewShellBase::GetViewShellBase( mpBindings->GetDispatcher()->GetFrame());
778 0 : if( pBase )
779 : {
780 0 : sd::SlideShow::Stop( *pBase );
781 : // Stopping the slide show may result in a synchronous
782 : // deletion of the navigator window. Calling the
783 : // parents Notify after this is unsafe. Therefore we
784 : // return now.
785 0 : return true;
786 : }
787 : }
788 : }
789 : }
790 :
791 32 : if( !nOK )
792 32 : nOK = Window::Notify( rNEvt );
793 :
794 32 : return( nOK );
795 : }
796 :
797 : /**
798 : * catch ESCAPE in order to end show
799 : */
800 0 : void SdNavigatorWin::KeyInput( const KeyEvent& rKEvt )
801 : {
802 0 : long nOK = sal_False;
803 :
804 0 : if (rKEvt.GetKeyCode().GetCode() == KEY_ESCAPE)
805 : {
806 0 : if( SdPageObjsTLB::IsInDrag() )
807 : {
808 : // during drag'n'drop we just stop the drag but do not close the navigator
809 0 : nOK = sal_True;
810 : }
811 : else
812 : {
813 0 : ::sd::ViewShellBase* pBase = ::sd::ViewShellBase::GetViewShellBase( mpBindings->GetDispatcher()->GetFrame());
814 0 : if(pBase)
815 : {
816 0 : ::sd::SlideShow::Stop( *pBase );
817 : }
818 : }
819 : }
820 :
821 0 : if (!nOK)
822 : {
823 0 : Window::KeyInput(rKEvt);
824 : }
825 0 : }
826 :
827 0 : void SdNavigatorWin::DataChanged( const DataChangedEvent& rDCEvt )
828 : {
829 0 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
830 0 : ApplyImageList();
831 :
832 0 : Window::DataChanged( rDCEvt );
833 0 : }
834 :
835 2 : void SdNavigatorWin::SetDragImage()
836 : {
837 2 : maToolbox.SetItemImage( TBI_DRAGTYPE, maToolbox.GetImageList().GetImage( GetDragTypeSdResId( meDragType, true ) ) );
838 2 : }
839 :
840 2 : void SdNavigatorWin::ApplyImageList()
841 : {
842 :
843 2 : maToolbox.SetImageList( maImageList );
844 2 : maToolbox.SetItemImage(TBI_SHAPE_FILTER, Image(BitmapEx(SdResId(BMP_GRAPHIC))));
845 :
846 2 : SetDragImage();
847 2 : }
848 :
849 : /**
850 : * ControllerItem for Navigator
851 : */
852 2 : SdNavigatorControllerItem::SdNavigatorControllerItem(
853 : sal_uInt16 _nId,
854 : SdNavigatorWin* pNavWin,
855 : SfxBindings* _pBindings,
856 : const SdNavigatorWin::UpdateRequestFunctor& rUpdateRequest)
857 : : SfxControllerItem( _nId, *_pBindings ),
858 : pNavigatorWin( pNavWin ),
859 2 : maUpdateRequest(rUpdateRequest)
860 : {
861 2 : }
862 :
863 2 : void SdNavigatorControllerItem::StateChanged( sal_uInt16 nSId,
864 : SfxItemState eState, const SfxPoolItem* pItem )
865 : {
866 2 : if( eState >= SfxItemState::DEFAULT && nSId == SID_NAVIGATOR_STATE )
867 : {
868 2 : const SfxUInt32Item* pStateItem = PTR_CAST( SfxUInt32Item, pItem );
869 : DBG_ASSERT( pStateItem, "SfxUInt16Item expected");
870 2 : sal_uInt32 nState = pStateItem->GetValue();
871 :
872 : // pen
873 2 : if( nState & NAVBTN_PEN_ENABLED &&
874 0 : !pNavigatorWin->maToolbox.IsItemEnabled( TBI_PEN ) )
875 0 : pNavigatorWin->maToolbox.EnableItem( TBI_PEN );
876 4 : if( nState & NAVBTN_PEN_DISABLED &&
877 2 : pNavigatorWin->maToolbox.IsItemEnabled( TBI_PEN ) )
878 2 : pNavigatorWin->maToolbox.EnableItem( TBI_PEN, false );
879 2 : if( nState & NAVBTN_PEN_CHECKED &&
880 0 : !pNavigatorWin->maToolbox.IsItemChecked( TBI_PEN ) )
881 0 : pNavigatorWin->maToolbox.CheckItem( TBI_PEN );
882 2 : if( nState & NAVBTN_PEN_UNCHECKED &&
883 0 : pNavigatorWin->maToolbox.IsItemChecked( TBI_PEN ) )
884 0 : pNavigatorWin->maToolbox.CheckItem( TBI_PEN, false );
885 :
886 : // only if doc in LB is the active
887 2 : NavDocInfo* pInfo = pNavigatorWin->GetDocInfo();
888 2 : if( pInfo && pInfo->IsActive() )
889 : {
890 : // First
891 2 : if( nState & NAVBTN_FIRST_ENABLED &&
892 0 : !pNavigatorWin->maToolbox.IsItemEnabled( TBI_FIRST ) )
893 0 : pNavigatorWin->maToolbox.EnableItem( TBI_FIRST );
894 4 : if( nState & NAVBTN_FIRST_DISABLED &&
895 2 : pNavigatorWin->maToolbox.IsItemEnabled( TBI_FIRST ) )
896 2 : pNavigatorWin->maToolbox.EnableItem( TBI_FIRST, false );
897 :
898 : // Prev
899 2 : if( nState & NAVBTN_PREV_ENABLED &&
900 0 : !pNavigatorWin->maToolbox.IsItemEnabled( TBI_PREVIOUS ) )
901 0 : pNavigatorWin->maToolbox.EnableItem( TBI_PREVIOUS );
902 4 : if( nState & NAVBTN_PREV_DISABLED &&
903 2 : pNavigatorWin->maToolbox.IsItemEnabled( TBI_PREVIOUS ) )
904 2 : pNavigatorWin->maToolbox.EnableItem( TBI_PREVIOUS, false );
905 :
906 : // Last
907 2 : if( nState & NAVBTN_LAST_ENABLED &&
908 0 : !pNavigatorWin->maToolbox.IsItemEnabled( TBI_LAST ) )
909 0 : pNavigatorWin->maToolbox.EnableItem( TBI_LAST );
910 4 : if( nState & NAVBTN_LAST_DISABLED &&
911 2 : pNavigatorWin->maToolbox.IsItemEnabled( TBI_LAST ) )
912 2 : pNavigatorWin->maToolbox.EnableItem( TBI_LAST, false );
913 :
914 : // Next
915 2 : if( nState & NAVBTN_NEXT_ENABLED &&
916 0 : !pNavigatorWin->maToolbox.IsItemEnabled( TBI_NEXT ) )
917 0 : pNavigatorWin->maToolbox.EnableItem( TBI_NEXT );
918 4 : if( nState & NAVBTN_NEXT_DISABLED &&
919 2 : pNavigatorWin->maToolbox.IsItemEnabled( TBI_NEXT ) )
920 2 : pNavigatorWin->maToolbox.EnableItem( TBI_NEXT, false );
921 :
922 2 : if( nState & NAVTLB_UPDATE )
923 : {
924 : // InitTlb; is initiated by Slot
925 2 : if (maUpdateRequest)
926 2 : maUpdateRequest();
927 : }
928 : }
929 : }
930 2 : }
931 :
932 : /**
933 : * ControllerItem for Navigator to show page in TreeLB
934 : */
935 2 : SdPageNameControllerItem::SdPageNameControllerItem(
936 : sal_uInt16 _nId,
937 : SdNavigatorWin* pNavWin,
938 : SfxBindings* _pBindings,
939 : const SdNavigatorWin::UpdateRequestFunctor& rUpdateRequest)
940 : : SfxControllerItem( _nId, *_pBindings ),
941 : pNavigatorWin( pNavWin ),
942 2 : maUpdateRequest(rUpdateRequest)
943 : {
944 2 : }
945 :
946 4 : void SdPageNameControllerItem::StateChanged( sal_uInt16 nSId,
947 : SfxItemState eState, const SfxPoolItem* pItem )
948 : {
949 4 : if( eState >= SfxItemState::DEFAULT && nSId == SID_NAVIGATOR_PAGENAME )
950 : {
951 : // only if doc in LB is the active
952 4 : NavDocInfo* pInfo = pNavigatorWin->GetDocInfo();
953 4 : if( pInfo && pInfo->IsActive() )
954 : {
955 4 : const SfxStringItem* pStateItem = PTR_CAST( SfxStringItem, pItem );
956 : DBG_ASSERT( pStateItem, "SfxStringItem expected");
957 4 : OUString aPageName = pStateItem->GetValue();
958 :
959 4 : if( !pNavigatorWin->maTlbObjects.HasSelectedChildren( aPageName ) )
960 : {
961 4 : if( pNavigatorWin->maTlbObjects.GetSelectionMode() == MULTIPLE_SELECTION )
962 : {
963 : // because otherwise it is always additional select
964 0 : pNavigatorWin->maTlbObjects.SelectAll( false );
965 : }
966 4 : pNavigatorWin->maTlbObjects.SelectEntry( aPageName );
967 4 : }
968 : }
969 : }
970 118 : }
971 :
972 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|