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 #ifdef SD_DLLIMPLEMENTATION 28 #undef SD_DLLIMPLEMENTATION 29 #endif 30 31 #include <svx/svxids.hrc> 32 #include <com/sun/star/presentation/AnimationEffect.hpp> 33 #include <com/sun/star/presentation/ClickAction.hpp> 34 #include <com/sun/star/presentation/AnimationSpeed.hpp> 35 #ifndef _COM_SUN_STAR_EMBED_VERBDESCR_HPP_ 36 #include <com/sun/star/embed/VerbDescriptor.hpp> 37 #endif 38 #include <com/sun/star/embed/EmbedStates.hpp> 39 #include <com/sun/star/uri/XUriReferenceFactory.hpp> 40 #include <com/sun/star/uri/XVndSunStarScriptUrl.hpp> 41 #include <comphelper/processfactory.hxx> 42 #include <com/sun/star/embed/VerbAttributes.hpp> 43 44 #include "sdattr.hxx" 45 #include <sfx2/sfxresid.hxx> 46 47 #include <vcl/waitobj.hxx> 48 #include <osl/file.hxx> 49 #include <sfx2/app.hxx> 50 #include <unotools/pathoptions.hxx> 51 #include <svx/svdpagv.hxx> 52 #include <unotools/localfilehelper.hxx> 53 #include <svl/aeitem.hxx> 54 #include <editeng/colritem.hxx> 55 #include <svx/svdoole2.hxx> 56 #include <sfx2/docfile.hxx> 57 #include <sot/storage.hxx> 58 #include <basic/sbmeth.hxx> 59 #include <basic/sbmod.hxx> 60 #include <basic/sbstar.hxx> 61 #include <svx/xtable.hxx> 62 #include <vcl/svapp.hxx> 63 #include <vcl/mnemonic.hxx> 64 #include <svl/urihelper.hxx> 65 #include <sfx2/filedlghelper.hxx> 66 #include <svx/drawitem.hxx> 67 #include "View.hxx" 68 #include "sdresid.hxx" 69 #include "tpaction.hxx" 70 #include "tpaction.hrc" 71 #include "strmname.h" 72 #include "ViewShell.hxx" 73 #include "drawdoc.hxx" 74 #include "DrawDocShell.hxx" 75 #include "strings.hrc" 76 #include "res_bmp.hrc" 77 #include "filedlg.hxx" 78 79 #include <algorithm> 80 81 using namespace ::com::sun::star; 82 using namespace com::sun::star::uno; 83 using namespace com::sun::star::lang; 84 85 #define DOCUMENT_TOKEN (sal_Unicode('#')) 86 87 /************************************************************************* 88 |* 89 |* Konstruktor des Tab-Dialogs: Fuegt die Seiten zum Dialog hinzu 90 |* 91 \************************************************************************/ 92 93 SdActionDlg::SdActionDlg ( 94 ::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView ) : 95 SfxSingleTabDialog ( pParent, *pAttr, TP_ANIMATION_ACTION ), 96 rOutAttrs ( *pAttr ) 97 { 98 // FreeResource(); 99 SfxTabPage* pNewPage = SdTPAction::Create( this, rOutAttrs ); 100 DBG_ASSERT( pNewPage, "Seite konnte nicht erzeugt werden"); 101 102 // Ehemals in PageCreated 103 ( (SdTPAction*) pNewPage )->SetView( pView ); 104 ( (SdTPAction*) pNewPage )->Construct(); 105 106 SetTabPage( pNewPage ); 107 108 String aStr( pNewPage->GetText() ); 109 if( aStr.Len() ) 110 SetText( aStr ); 111 } 112 113 114 /************************************************************************* 115 |* 116 |* Action-TabPage 117 |* 118 \************************************************************************/ 119 120 SdTPAction::SdTPAction( Window* pWindow, const SfxItemSet& rInAttrs ) : 121 SfxTabPage ( pWindow, SdResId( TP_ANIMATION ), rInAttrs ), 122 123 aFtAction ( this, SdResId( FT_ACTION ) ), 124 aLbAction ( this, SdResId( LB_ACTION ) ), 125 aFtTree ( this, SdResId( FT_TREE ) ), 126 aLbTree ( this, SdResId( LB_TREE ) ), 127 aLbTreeDocument ( this, SdResId( LB_TREE_DOCUMENT ) ), 128 aLbOLEAction ( this, SdResId( LB_OLE_ACTION ) ), 129 aFlSeparator ( this, SdResId( FL_SEPARATOR ) ), 130 aEdtSound ( this, SdResId( EDT_SOUND ) ), 131 aEdtBookmark ( this, SdResId( EDT_BOOKMARK ) ), 132 aEdtDocument ( this, SdResId( EDT_DOCUMENT ) ), 133 aEdtProgram ( this, SdResId( EDT_PROGRAM ) ), 134 aEdtMacro ( this, SdResId( EDT_MACRO ) ), 135 aBtnSearch ( this, SdResId( BTN_SEARCH ) ), 136 aBtnSeek ( this, SdResId( BTN_SEEK ) ), 137 138 rOutAttrs ( rInAttrs ), 139 mpView ( NULL ), 140 mpDoc ( NULL ), 141 bTreeUpdated ( sal_False ) 142 { 143 aEdtSound.SetAccessibleName(String(SdResId(STR_PATHNAME))); 144 aBtnSeek.SetAccessibleRelationMemberOf( &aFlSeparator ); 145 146 FreeResource(); 147 148 aBtnSearch.SetClickHdl( LINK( this, SdTPAction, ClickSearchHdl ) ); 149 aBtnSeek.SetClickHdl( LINK( this, SdTPAction, ClickSearchHdl ) ); 150 151 // diese Page braucht ExchangeSupport 152 SetExchangeSupport(); 153 154 aLbAction.SetSelectHdl( LINK( this, SdTPAction, ClickActionHdl ) ); 155 aLbTree.SetSelectHdl( LINK( this, SdTPAction, SelectTreeHdl ) ); 156 aEdtDocument.SetLoseFocusHdl( LINK( this, SdTPAction, CheckFileHdl ) ); 157 aEdtMacro.SetLoseFocusHdl( LINK( this, SdTPAction, CheckFileHdl ) ); 158 159 // Controls enablen 160 aFtAction.Show(); 161 aLbAction.Show(); 162 163 ClickActionHdl( this ); 164 } 165 166 // ----------------------------------------------------------------------- 167 168 SdTPAction::~SdTPAction() 169 { 170 delete pCurrentActions; 171 } 172 173 // ----------------------------------------------------------------------- 174 175 void SdTPAction::SetView( const ::sd::View* pSdView ) 176 { 177 mpView = pSdView; 178 179 // Holen der ColorTable und Fuellen der ListBox 180 ::sd::DrawDocShell* pDocSh = static_cast<const ::sd::View*>(mpView)->GetDocSh(); 181 if( pDocSh && pDocSh->GetViewShell() ) 182 { 183 mpDoc = pDocSh->GetDoc(); 184 SfxViewFrame* pFrame = pDocSh->GetViewShell()->GetViewFrame(); 185 aLbTree.SetViewFrame( pFrame ); 186 aLbTreeDocument.SetViewFrame( pFrame ); 187 188 SvxColorTableItem aItem( *(const SvxColorTableItem*)( pDocSh->GetItem( SID_COLOR_TABLE ) ) ); 189 pColTab = aItem.GetColorTable(); 190 DBG_ASSERT( pColTab, "Keine Farbtabelle vorhanden!" ); 191 } 192 else 193 { 194 DBG_ERROR("sd::SdTPAction::SetView(), no docshell or viewshell?"); 195 } 196 } 197 198 // ----------------------------------------------------------------------- 199 200 void SdTPAction::Construct() 201 { 202 // OLE-Actionlistbox auffuellen 203 SdrOle2Obj* pOleObj = NULL; 204 SdrGrafObj* pGrafObj = NULL; 205 sal_Bool bOLEAction = sal_False; 206 207 if ( mpView->AreObjectsMarked() ) 208 { 209 const SdrMarkList& rMarkList = mpView->GetMarkedObjectList(); 210 SdrObject* pObj; 211 212 if (rMarkList.GetMarkCount() == 1) 213 { 214 SdrMark* pMark = rMarkList.GetMark(0); 215 pObj = pMark->GetMarkedSdrObj(); 216 217 sal_uInt32 nInv = pObj->GetObjInventor(); 218 sal_uInt16 nSdrObjKind = pObj->GetObjIdentifier(); 219 220 if (nInv == SdrInventor && nSdrObjKind == OBJ_OLE2) 221 { 222 pOleObj = (SdrOle2Obj*) pObj; 223 } 224 else if (nInv == SdrInventor && nSdrObjKind == OBJ_GRAF) 225 { 226 pGrafObj = (SdrGrafObj*) pObj; 227 } 228 // // VCXControl ? 229 // else if( pObj->IsA( TYPE( VCSbxDrawObject ) ) ) 230 // { 231 // bDisableAll = sal_True; 232 // } 233 } 234 } 235 if( pGrafObj ) 236 { 237 bOLEAction = sal_True; 238 239 aVerbVector.push_back( 0 ); 240 aLbOLEAction.InsertEntry( MnemonicGenerator::EraseAllMnemonicChars( String( SdResId( STR_EDIT_OBJ ) ) ) ); 241 } 242 else if( pOleObj ) 243 { 244 uno::Reference < embed::XEmbeddedObject > xObj = pOleObj->GetObjRef(); 245 if ( xObj.is() ) 246 { 247 bOLEAction = sal_True; 248 uno::Sequence < embed::VerbDescriptor > aVerbs; 249 try 250 { 251 aVerbs = xObj->getSupportedVerbs(); 252 } 253 catch ( embed::NeedsRunningStateException& ) 254 { 255 xObj->changeState( embed::EmbedStates::RUNNING ); 256 aVerbs = xObj->getSupportedVerbs(); 257 } 258 259 for( sal_Int32 i=0; i<aVerbs.getLength(); i++ ) 260 { 261 embed::VerbDescriptor aVerb = aVerbs[i]; 262 if( aVerb.VerbAttributes & embed::VerbAttributes::MS_VERBATTR_ONCONTAINERMENU ) 263 { 264 String aTmp( aVerb.VerbName ); 265 aVerbVector.push_back( aVerb.VerbID ); 266 aLbOLEAction.InsertEntry( MnemonicGenerator::EraseAllMnemonicChars( aTmp ) ); 267 } 268 } 269 } 270 } 271 272 pCurrentActions = new List; 273 pCurrentActions->Insert((void*)(sal_uIntPtr)presentation::ClickAction_NONE, LIST_APPEND); 274 pCurrentActions->Insert((void*)(sal_uIntPtr)presentation::ClickAction_PREVPAGE, LIST_APPEND); 275 pCurrentActions->Insert((void*)(sal_uIntPtr)presentation::ClickAction_NEXTPAGE, LIST_APPEND); 276 pCurrentActions->Insert((void*)(sal_uIntPtr)presentation::ClickAction_FIRSTPAGE, LIST_APPEND); 277 pCurrentActions->Insert((void*)(sal_uIntPtr)presentation::ClickAction_LASTPAGE, LIST_APPEND); 278 pCurrentActions->Insert((void*)(sal_uIntPtr)presentation::ClickAction_BOOKMARK, LIST_APPEND); 279 pCurrentActions->Insert((void*)(sal_uIntPtr)presentation::ClickAction_DOCUMENT, LIST_APPEND); 280 pCurrentActions->Insert((void*)(sal_uIntPtr)presentation::ClickAction_SOUND, LIST_APPEND); 281 if( bOLEAction && aLbOLEAction.GetEntryCount() ) 282 pCurrentActions->Insert((void*)(sal_uIntPtr)presentation::ClickAction_VERB, LIST_APPEND ); 283 pCurrentActions->Insert((void*)(sal_uIntPtr)presentation::ClickAction_PROGRAM, LIST_APPEND); 284 pCurrentActions->Insert((void*)(sal_uIntPtr)presentation::ClickAction_MACRO, LIST_APPEND); 285 pCurrentActions->Insert((void*)(sal_uIntPtr)presentation::ClickAction_STOPPRESENTATION, LIST_APPEND); 286 287 // Action-Listbox fuellen 288 for (sal_uLong nAction = 0; nAction < pCurrentActions->Count(); nAction++) 289 { 290 sal_uInt16 nRId = GetClickActionSdResId((presentation::ClickAction)(sal_uLong)pCurrentActions->GetObject(nAction)); 291 aLbAction.InsertEntry( String( SdResId( nRId ) ) ); 292 } 293 294 } 295 296 // ----------------------------------------------------------------------- 297 298 sal_Bool SdTPAction::FillItemSet( SfxItemSet& rAttrs ) 299 { 300 sal_Bool bModified = sal_False; 301 presentation::ClickAction eCA = presentation::ClickAction_NONE; 302 303 if( aLbAction.GetSelectEntryCount() ) 304 eCA = GetActualClickAction(); 305 306 if( aLbAction.GetSavedValue() != aLbAction.GetSelectEntryPos() ) 307 { 308 rAttrs.Put( SfxAllEnumItem( ATTR_ACTION, (sal_uInt16)eCA ) ); 309 bModified = sal_True; 310 } 311 else 312 rAttrs.InvalidateItem( ATTR_ACTION ); 313 314 String aFileName = GetEditText( sal_True ); 315 if( aFileName.Len() == 0 ) 316 rAttrs.InvalidateItem( ATTR_ACTION_FILENAME ); 317 else 318 { 319 if( mpDoc && mpDoc->GetDocSh() && mpDoc->GetDocSh()->GetMedium() ) 320 { 321 String aBaseURL = mpDoc->GetDocSh()->GetMedium()->GetBaseURL(); 322 if( eCA == presentation::ClickAction_SOUND || 323 eCA == presentation::ClickAction_DOCUMENT || 324 eCA == presentation::ClickAction_PROGRAM ) 325 aFileName = ::URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), aFileName, URIHelper::GetMaybeFileHdl(), true, false, 326 INetURLObject::WAS_ENCODED, 327 INetURLObject::DECODE_UNAMBIGUOUS ); 328 329 rAttrs.Put( SfxStringItem( ATTR_ACTION_FILENAME, aFileName ) ); 330 bModified = sal_True; 331 } 332 else 333 { 334 DBG_ERROR("sd::SdTPAction::FillItemSet(), I need a medium!"); 335 } 336 } 337 338 return( bModified ); 339 } 340 341 //------------------------------------------------------------------------ 342 343 void SdTPAction::Reset( const SfxItemSet& rAttrs ) 344 { 345 presentation::ClickAction eCA = presentation::ClickAction_NONE; 346 String aFileName; 347 348 // aLbAction 349 if( rAttrs.GetItemState( ATTR_ACTION ) != SFX_ITEM_DONTCARE ) 350 { 351 eCA = (presentation::ClickAction) ( ( const SfxAllEnumItem& ) rAttrs. 352 Get( ATTR_ACTION ) ).GetValue(); 353 SetActualClickAction( eCA ); 354 } 355 else 356 aLbAction.SetNoSelection(); 357 358 // aEdtSound 359 if( rAttrs.GetItemState( ATTR_ACTION_FILENAME ) != SFX_ITEM_DONTCARE ) 360 { 361 aFileName = ( ( const SfxStringItem& ) rAttrs.Get( ATTR_ACTION_FILENAME ) ).GetValue(); 362 SetEditText( aFileName ); 363 } 364 365 switch( eCA ) 366 { 367 case presentation::ClickAction_BOOKMARK: 368 { 369 if( !aLbTree.SelectEntry( aFileName ) ) 370 aLbTree.SelectAll( sal_False ); 371 } 372 break; 373 374 case presentation::ClickAction_DOCUMENT: 375 { 376 if( aFileName.GetTokenCount( DOCUMENT_TOKEN ) == 2 ) 377 aLbTreeDocument.SelectEntry( aFileName.GetToken( 1, DOCUMENT_TOKEN ) ); 378 } 379 break; 380 381 default: 382 break; 383 } 384 ClickActionHdl( this ); 385 386 aLbAction.SaveValue(); 387 aEdtSound.SaveValue(); 388 } 389 390 // ----------------------------------------------------------------------- 391 392 void SdTPAction::ActivatePage( const SfxItemSet& ) 393 { 394 } 395 396 // ----------------------------------------------------------------------- 397 398 int SdTPAction::DeactivatePage( SfxItemSet* pPageSet ) 399 { 400 if( pPageSet ) 401 FillItemSet( *pPageSet ); 402 403 return( LEAVE_PAGE ); 404 } 405 406 // ----------------------------------------------------------------------- 407 408 SfxTabPage* SdTPAction::Create( Window* pWindow, 409 const SfxItemSet& rAttrs ) 410 { 411 return( new SdTPAction( pWindow, rAttrs ) ); 412 } 413 414 //------------------------------------------------------------------------ 415 416 void SdTPAction::UpdateTree() 417 { 418 if( !bTreeUpdated && mpDoc && mpDoc->GetDocSh() && mpDoc->GetDocSh()->GetMedium() ) 419 { 420 //aLbTree.Clear(); 421 aLbTree.Fill( mpDoc, sal_True, mpDoc->GetDocSh()->GetMedium()->GetName() ); 422 bTreeUpdated = sal_True; 423 } 424 } 425 426 //------------------------------------------------------------------------ 427 428 void SdTPAction::OpenFileDialog() 429 { 430 // Soundpreview nur fuer Interaktionen mit Sound 431 presentation::ClickAction eCA = GetActualClickAction(); 432 sal_Bool bSound = ( eCA == presentation::ClickAction_SOUND ); 433 sal_Bool bPage = ( eCA == presentation::ClickAction_BOOKMARK ); 434 sal_Bool bDocument = ( eCA == presentation::ClickAction_DOCUMENT || 435 eCA == presentation::ClickAction_PROGRAM ); 436 sal_Bool bMacro = ( eCA == presentation::ClickAction_MACRO ); 437 438 if( bPage ) 439 { 440 // Es wird in der TreeLB nach dem eingegebenen Objekt gesucht 441 aLbTree.SelectEntry( GetEditText() ); 442 } 443 else 444 { 445 String aFile( GetEditText() ); 446 447 if (bSound) 448 { 449 SdOpenSoundFileDialog aFileDialog; 450 451 if( !aFile.Len() ) 452 aFile = SvtPathOptions().GetGraphicPath(); 453 454 aFileDialog.SetPath( aFile ); 455 456 if( aFileDialog.Execute() == ERRCODE_NONE ) 457 { 458 aFile = aFileDialog.GetPath(); 459 SetEditText( aFile ); 460 } 461 } 462 else if (bMacro) 463 { 464 Window* pOldWin = Application::GetDefDialogParent(); 465 Application::SetDefDialogParent( this ); 466 467 // choose macro dialog 468 ::rtl::OUString aScriptURL = SfxApplication::ChooseScript(); 469 470 if ( aScriptURL.getLength() != 0 ) 471 { 472 SetEditText( aScriptURL ); 473 } 474 475 Application::SetDefDialogParent( pOldWin ); 476 } 477 else 478 { 479 sfx2::FileDialogHelper aFileDialog(WB_OPEN | WB_3DLOOK | WB_STDMODAL ); 480 481 if (bDocument && !aFile.Len()) 482 aFile = SvtPathOptions().GetWorkPath(); 483 484 aFileDialog.SetDisplayDirectory( aFile ); 485 486 // The following is a fix for #1008001# and a workarround for 487 // #i4306#: The addition of the implicitely existing "all files" 488 // filter makes the (Windows system) open file dialog follow 489 // links on the desktop to directories. 490 aFileDialog.AddFilter ( 491 String (SfxResId (STR_SFX_FILTERNAME_ALL)), 492 String (RTL_CONSTASCII_USTRINGPARAM("*.*"))); 493 494 495 if( aFileDialog.Execute() == ERRCODE_NONE ) 496 { 497 aFile = aFileDialog.GetPath(); 498 SetEditText( aFile ); 499 } 500 if( bDocument ) 501 CheckFileHdl( NULL ); 502 } 503 } 504 } 505 506 //------------------------------------------------------------------------ 507 508 IMPL_LINK( SdTPAction, ClickSearchHdl, void *, EMPTYARG ) 509 { 510 OpenFileDialog(); 511 512 return( 0L ); 513 } 514 515 //------------------------------------------------------------------------ 516 517 IMPL_LINK( SdTPAction, ClickActionHdl, void *, EMPTYARG ) 518 { 519 presentation::ClickAction eCA = GetActualClickAction(); 520 521 // hide controls we don't need 522 switch( eCA ) 523 { 524 case presentation::ClickAction_NONE: 525 case presentation::ClickAction_INVISIBLE: 526 case presentation::ClickAction_PREVPAGE: 527 case presentation::ClickAction_NEXTPAGE: 528 case presentation::ClickAction_FIRSTPAGE: 529 case presentation::ClickAction_LASTPAGE: 530 case presentation::ClickAction_STOPPRESENTATION: 531 default: 532 aFtTree.Hide(); 533 aLbTree.Hide(); 534 aLbTreeDocument.Hide(); 535 aLbOLEAction.Hide(); 536 537 aFlSeparator.Hide(); 538 aEdtSound.Hide(); 539 aEdtBookmark.Hide(); 540 aEdtDocument.Hide(); 541 aEdtProgram.Hide(); 542 aEdtMacro.Hide(); 543 aBtnSearch.Hide(); 544 aBtnSeek.Hide(); 545 break; 546 547 case presentation::ClickAction_SOUND: 548 case presentation::ClickAction_PROGRAM: 549 case presentation::ClickAction_MACRO: 550 aFtTree.Hide(); 551 aLbTree.Hide(); 552 aLbTreeDocument.Hide(); 553 aLbOLEAction.Hide(); 554 555 aEdtDocument.Hide(); 556 557 if( eCA == presentation::ClickAction_MACRO ) 558 { 559 aEdtSound.Hide(); 560 aEdtProgram.Hide(); 561 } 562 else if( eCA == presentation::ClickAction_PROGRAM ) 563 { 564 aEdtSound.Hide(); 565 aEdtMacro.Hide(); 566 } 567 else if( eCA == presentation::ClickAction_SOUND ) 568 { 569 aEdtProgram.Hide(); 570 aEdtMacro.Hide(); 571 } 572 573 aBtnSeek.Hide(); 574 break; 575 576 577 case presentation::ClickAction_DOCUMENT: 578 aLbTree.Hide(); 579 aLbOLEAction.Hide(); 580 581 aEdtSound.Hide(); 582 aEdtProgram.Hide(); 583 aEdtMacro.Hide(); 584 aEdtBookmark.Hide(); 585 aBtnSeek.Hide(); 586 break; 587 588 case presentation::ClickAction_BOOKMARK: 589 aLbTreeDocument.Hide(); 590 aLbOLEAction.Hide(); 591 aEdtSound.Hide(); 592 aEdtDocument.Hide(); 593 aEdtProgram.Hide(); 594 aEdtMacro.Hide(); 595 aBtnSearch.Hide(); 596 break; 597 598 case presentation::ClickAction_VERB: 599 aLbTree.Hide(); 600 aEdtDocument.Hide(); 601 aEdtProgram.Hide(); 602 aEdtBookmark.Hide(); 603 aEdtMacro.Hide(); 604 aBtnSearch.Hide(); 605 aFlSeparator.Hide(); 606 aEdtSound.Hide(); 607 aBtnSeek.Hide(); 608 break; 609 } 610 611 // show controls we do need 612 switch( eCA ) 613 { 614 case presentation::ClickAction_NONE: 615 case presentation::ClickAction_INVISIBLE: 616 case presentation::ClickAction_PREVPAGE: 617 case presentation::ClickAction_NEXTPAGE: 618 case presentation::ClickAction_FIRSTPAGE: 619 case presentation::ClickAction_LASTPAGE: 620 case presentation::ClickAction_STOPPRESENTATION: 621 // none 622 break; 623 624 case presentation::ClickAction_SOUND: 625 aFlSeparator.Show(); 626 aEdtSound.Show(); 627 aEdtSound.Enable(); 628 aBtnSearch.Show(); 629 aBtnSearch.Enable(); 630 aFlSeparator.SetText( String( SdResId( STR_EFFECTDLG_SOUND ) ) ); 631 break; 632 633 case presentation::ClickAction_PROGRAM: 634 case presentation::ClickAction_MACRO: 635 aFlSeparator.Show(); 636 aBtnSearch.Show(); 637 aBtnSearch.Enable(); 638 if( eCA == presentation::ClickAction_MACRO ) 639 { 640 aEdtMacro.Show(); 641 aFlSeparator.SetText( String( SdResId( STR_EFFECTDLG_MACRO ) ) ); 642 } 643 else 644 { 645 aEdtProgram.Show(); 646 aFlSeparator.SetText( String( SdResId( STR_EFFECTDLG_PROGRAM ) ) ); 647 } 648 break; 649 650 case presentation::ClickAction_DOCUMENT: 651 aFtTree.Show(); 652 aLbTreeDocument.Show(); 653 654 aFlSeparator.Show(); 655 aEdtDocument.Show(); 656 aBtnSearch.Show(); 657 aBtnSearch.Enable(); 658 659 aFtTree.SetText( String( SdResId( STR_EFFECTDLG_JUMP ) ) ); 660 aFlSeparator.SetText( String( SdResId( STR_EFFECTDLG_DOCUMENT ) ) ); 661 662 CheckFileHdl( NULL ); 663 break; 664 665 case presentation::ClickAction_VERB: 666 aFtTree.Show(); 667 aLbOLEAction.Show(); 668 669 aFtTree.SetText( String( SdResId( STR_EFFECTDLG_ACTION ) ) ); 670 break; 671 672 case presentation::ClickAction_BOOKMARK: 673 UpdateTree(); 674 675 aFtTree.Show(); 676 aLbTree.Show(); 677 678 aFlSeparator.Show(); 679 aEdtBookmark.Show(); 680 aBtnSeek.Show(); 681 682 aFtTree.SetText( String( SdResId( STR_EFFECTDLG_JUMP ) ) ); 683 aFlSeparator.SetText( String( SdResId( STR_EFFECTDLG_PAGE_OBJECT ) ) ); 684 break; 685 default: 686 break; 687 } 688 689 return( 0L ); 690 } 691 692 //------------------------------------------------------------------------ 693 694 IMPL_LINK( SdTPAction, SelectTreeHdl, void *, EMPTYARG ) 695 { 696 aEdtBookmark.SetText( aLbTree.GetSelectEntry() ); 697 return( 0L ); 698 } 699 700 //------------------------------------------------------------------------ 701 702 IMPL_LINK( SdTPAction, CheckFileHdl, void *, EMPTYARG ) 703 { 704 String aFile( GetEditText() ); 705 706 if( aFile != aLastFile ) 707 { 708 // Ueberpruefen, ob es eine gueltige Draw-Datei ist 709 SfxMedium aMedium( aFile, 710 STREAM_READ | STREAM_NOCREATE, 711 sal_True ); // Download 712 713 if( aMedium.IsStorage() ) 714 { 715 WaitObject aWait( GetParent()->GetParent() ); 716 717 // ist es eine Draw-Datei? 718 // mit READ oeffnen, sonst schreiben die Storages evtl. in die Datei! 719 uno::Reference < embed::XStorage > xStorage = aMedium.GetStorage(); 720 DBG_ASSERT( xStorage.is(), "Kein Storage!" ); 721 722 uno::Reference < container::XNameAccess > xAccess( xStorage, uno::UNO_QUERY ); 723 if( xAccess.is() && 724 ( xAccess->hasByName( pStarDrawXMLContent ) || 725 xAccess->hasByName( pStarDrawOldXMLContent ) ) ) 726 { 727 SdDrawDocument* pBookmarkDoc = mpDoc->OpenBookmarkDoc( aFile ); 728 if( pBookmarkDoc ) 729 { 730 aLastFile = aFile; 731 732 aLbTreeDocument.Clear(); 733 aLbTreeDocument.Fill( pBookmarkDoc, sal_True, aFile ); 734 mpDoc->CloseBookmarkDoc(); 735 aLbTreeDocument.Show(); 736 } 737 else 738 aLbTreeDocument.Hide(); 739 } 740 else 741 aLbTreeDocument.Hide(); 742 743 } 744 else 745 aLbTreeDocument.Hide(); 746 } 747 748 return( 0L ); 749 } 750 751 //------------------------------------------------------------------------ 752 753 presentation::ClickAction SdTPAction::GetActualClickAction() 754 { 755 presentation::ClickAction eCA = presentation::ClickAction_NONE; 756 sal_uInt16 nPos = aLbAction.GetSelectEntryPos(); 757 758 if (nPos != LISTBOX_ENTRY_NOTFOUND) 759 eCA = (presentation::ClickAction)(sal_uLong)pCurrentActions->GetObject((sal_uLong)nPos); 760 return( eCA ); 761 } 762 763 //------------------------------------------------------------------------ 764 765 void SdTPAction::SetActualClickAction( presentation::ClickAction eCA ) 766 { 767 sal_uInt16 nPos = (sal_uInt16)pCurrentActions->GetPos((void*)(sal_uLong)eCA); 768 DBG_ASSERT(nPos != 0xffff, "unbekannte Interaktion"); 769 aLbAction.SelectEntryPos(nPos); 770 } 771 772 //------------------------------------------------------------------------ 773 774 void SdTPAction::SetEditText( String const & rStr ) 775 { 776 presentation::ClickAction eCA = GetActualClickAction(); 777 String aText(rStr); 778 779 // possibly convert URI back to system path 780 switch( eCA ) 781 { 782 case presentation::ClickAction_DOCUMENT: 783 if( rStr.GetTokenCount( DOCUMENT_TOKEN ) == 2 ) 784 aText = rStr.GetToken( 0, DOCUMENT_TOKEN ); 785 786 // fallthrough inteded 787 case presentation::ClickAction_SOUND: 788 case presentation::ClickAction_PROGRAM: 789 { 790 INetURLObject aURL( aText ); 791 792 // try to convert to system path 793 String aTmpStr(aURL.getFSysPath(INetURLObject::FSYS_DETECT)); 794 795 if( aTmpStr.Len() ) 796 aText = aTmpStr; // was a system path 797 } 798 break; 799 default: 800 break; 801 } 802 803 // set the string to the corresponding control 804 switch( eCA ) 805 { 806 case presentation::ClickAction_SOUND: 807 aEdtSound.SetText(aText ); 808 break; 809 case presentation::ClickAction_VERB: 810 { 811 ::std::vector< long >::iterator aFound( ::std::find( aVerbVector.begin(), aVerbVector.end(), rStr.ToInt32() ) ); 812 if( aFound != aVerbVector.end() ) 813 aLbOLEAction.SelectEntryPos( static_cast< short >( aFound - aVerbVector.begin() ) ); 814 } 815 break; 816 case presentation::ClickAction_PROGRAM: 817 aEdtProgram.SetText( aText ); 818 break; 819 case presentation::ClickAction_MACRO: 820 { 821 aEdtMacro.SetText( aText ); 822 } 823 break; 824 case presentation::ClickAction_DOCUMENT: 825 aEdtDocument.SetText( aText ); 826 break; 827 case presentation::ClickAction_BOOKMARK: 828 aEdtBookmark.SetText( aText ); 829 break; 830 default: 831 break; 832 } 833 } 834 835 //------------------------------------------------------------------------ 836 837 String SdTPAction::GetEditText( sal_Bool bFullDocDestination ) 838 { 839 String aStr; 840 presentation::ClickAction eCA = GetActualClickAction(); 841 842 switch( eCA ) 843 { 844 case presentation::ClickAction_SOUND: 845 aStr = aEdtSound.GetText(); 846 break; 847 case presentation::ClickAction_VERB: 848 { 849 const sal_uInt16 nPos = aLbOLEAction.GetSelectEntryPos(); 850 if( nPos < aVerbVector.size() ) 851 aStr = UniString::CreateFromInt32( aVerbVector[ nPos ] ); 852 return aStr; 853 } 854 case presentation::ClickAction_DOCUMENT: 855 aStr = aEdtDocument.GetText(); 856 break; 857 858 case presentation::ClickAction_PROGRAM: 859 aStr = aEdtProgram.GetText(); 860 break; 861 862 case presentation::ClickAction_MACRO: 863 { 864 return aEdtMacro.GetText(); 865 } 866 867 case presentation::ClickAction_BOOKMARK: 868 return( aEdtBookmark.GetText() ); 869 870 default: 871 break; 872 } 873 874 // validate file URI 875 INetURLObject aURL( aStr ); 876 String aBaseURL; 877 if( mpDoc && mpDoc->GetDocSh() && mpDoc->GetDocSh()->GetMedium() ) 878 aBaseURL = mpDoc->GetDocSh()->GetMedium()->GetBaseURL(); 879 880 if( aStr.Len() && aURL.GetProtocol() == INET_PROT_NOT_VALID ) 881 aURL = INetURLObject( ::URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), aStr, URIHelper::GetMaybeFileHdl(), true, false ) ); 882 883 // get adjusted file name 884 aStr = aURL.GetMainURL( INetURLObject::NO_DECODE ); 885 886 if( bFullDocDestination && 887 eCA == presentation::ClickAction_DOCUMENT && 888 aLbTreeDocument.Control::IsVisible() && 889 aLbTreeDocument.GetSelectionCount() > 0 ) 890 { 891 String aTmpStr( aLbTreeDocument.GetSelectEntry() ); 892 if( aTmpStr.Len() ) 893 { 894 aStr.Append( DOCUMENT_TOKEN ); 895 aStr.Append( aTmpStr ); 896 } 897 } 898 899 return( aStr ); 900 } 901 902 //------------------------------------------------------------------------ 903 904 sal_uInt16 SdTPAction::GetClickActionSdResId( presentation::ClickAction eCA ) 905 { 906 switch( eCA ) 907 { 908 case presentation::ClickAction_NONE: return STR_CLICK_ACTION_NONE; 909 case presentation::ClickAction_PREVPAGE: return STR_CLICK_ACTION_PREVPAGE; 910 case presentation::ClickAction_NEXTPAGE: return STR_CLICK_ACTION_NEXTPAGE; 911 case presentation::ClickAction_FIRSTPAGE: return STR_CLICK_ACTION_FIRSTPAGE; 912 case presentation::ClickAction_LASTPAGE: return STR_CLICK_ACTION_LASTPAGE; 913 case presentation::ClickAction_BOOKMARK: return STR_CLICK_ACTION_BOOKMARK; 914 case presentation::ClickAction_DOCUMENT: return STR_CLICK_ACTION_DOCUMENT; 915 case presentation::ClickAction_PROGRAM: return STR_CLICK_ACTION_PROGRAM; 916 case presentation::ClickAction_MACRO: return STR_CLICK_ACTION_MACRO; 917 case presentation::ClickAction_SOUND: return STR_CLICK_ACTION_SOUND; 918 case presentation::ClickAction_VERB: return STR_CLICK_ACTION_VERB; 919 case presentation::ClickAction_STOPPRESENTATION: return STR_CLICK_ACTION_STOPPRESENTATION; 920 default: DBG_ERROR( "Keine StringResource fuer ClickAction vorhanden!" ); 921 } 922 return( 0 ); 923 } 924 925