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