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