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