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 <svx/svxids.hrc>
21 : #include <com/sun/star/presentation/AnimationEffect.hpp>
22 : #include <com/sun/star/presentation/ClickAction.hpp>
23 : #include <com/sun/star/presentation/AnimationSpeed.hpp>
24 : #include <com/sun/star/embed/VerbDescriptor.hpp>
25 : #include <com/sun/star/embed/EmbedStates.hpp>
26 : #include <com/sun/star/uri/XUriReferenceFactory.hpp>
27 : #include <com/sun/star/uri/XVndSunStarScriptUrl.hpp>
28 : #include <comphelper/processfactory.hxx>
29 : #include <comphelper/string.hxx>
30 : #include <com/sun/star/embed/VerbAttributes.hpp>
31 : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
32 :
33 : #include "sdattr.hxx"
34 : #include <sfx2/sfxresid.hxx>
35 :
36 : #include <vcl/waitobj.hxx>
37 : #include <osl/file.hxx>
38 : #include <sfx2/app.hxx>
39 : #include <unotools/pathoptions.hxx>
40 : #include <svx/svdpagv.hxx>
41 : #include <unotools/localfilehelper.hxx>
42 : #include <svl/aeitem.hxx>
43 : #include <editeng/colritem.hxx>
44 : #include <svx/svdoole2.hxx>
45 : #include <sfx2/docfile.hxx>
46 : #include <sot/storage.hxx>
47 : #include <basic/sbmeth.hxx>
48 : #include <basic/sbmod.hxx>
49 : #include <basic/sbstar.hxx>
50 : #include <svx/xtable.hxx>
51 : #include <vcl/svapp.hxx>
52 : #include <vcl/mnemonic.hxx>
53 : #include <svl/urihelper.hxx>
54 : #include <sfx2/filedlghelper.hxx>
55 : #include <svx/drawitem.hxx>
56 : #include "View.hxx"
57 : #include "sdresid.hxx"
58 : #include "tpaction.hxx"
59 : #include "strmname.h"
60 : #include "ViewShell.hxx"
61 : #include "drawdoc.hxx"
62 : #include "DrawDocShell.hxx"
63 : #include "strings.hrc"
64 : #include "res_bmp.hrc"
65 : #include "filedlg.hxx"
66 :
67 : #include <algorithm>
68 :
69 : using namespace ::com::sun::star;
70 : using namespace com::sun::star::uno;
71 : using namespace com::sun::star::lang;
72 :
73 : #define DOCUMENT_TOKEN '#'
74 :
75 : /**
76 : * Constructor of the Tab dialog: appends the pages to the dialog
77 : */
78 0 : SdActionDlg::SdActionDlg (
79 : vcl::Window* pParent, const SfxItemSet* pAttr, ::sd::View* pView )
80 : : SfxSingleTabDialog(pParent, *pAttr, "InteractionDialog",
81 : "modules/simpress/ui/interactiondialog.ui")
82 0 : , rOutAttrs(*pAttr)
83 : {
84 : // FreeResource();
85 0 : SfxTabPage* pNewPage = SdTPAction::Create(get_content_area(), rOutAttrs);
86 : assert(pNewPage); //Unable to create page
87 :
88 : // formerly in PageCreated
89 0 : ( (SdTPAction*) pNewPage )->SetView( pView );
90 0 : ( (SdTPAction*) pNewPage )->Construct();
91 :
92 0 : SetTabPage( pNewPage );
93 0 : }
94 :
95 : /**
96 : * Action-TabPage
97 : */
98 0 : SdTPAction::SdTPAction(vcl::Window* pWindow, const SfxItemSet& rInAttrs)
99 : : SfxTabPage(pWindow, "InteractionPage",
100 : "modules/simpress/ui/interactionpage.ui", &rInAttrs)
101 : , rOutAttrs(rInAttrs)
102 : , mpView(NULL)
103 : , mpDoc(NULL)
104 0 : , bTreeUpdated(false)
105 : {
106 0 : get(m_pLbAction, "listbox");
107 0 : get(m_pFtTree, "fttree");
108 0 : get(m_pLbTree, "tree");
109 0 : get(m_pLbTreeDocument, "treedoc");
110 0 : get(m_pLbOLEAction, "oleaction");
111 0 : get(m_pFrame, "frame");
112 0 : get(m_pEdtSound, "sound");
113 0 : get(m_pEdtBookmark, "bookmark");
114 0 : get(m_pEdtDocument, "document");
115 0 : get(m_pEdtProgram, "program");
116 0 : get(m_pEdtMacro, "macro");
117 0 : get(m_pBtnSearch, "browse");
118 0 : get(m_pBtnSeek, "find");
119 :
120 0 : m_pLbOLEAction->set_width_request(m_pLbOLEAction->approximate_char_width() * 52);
121 0 : m_pLbOLEAction->set_height_request(m_pLbOLEAction->GetTextHeight() * 12);
122 :
123 0 : m_pBtnSearch->SetClickHdl( LINK( this, SdTPAction, ClickSearchHdl ) );
124 0 : m_pBtnSeek->SetClickHdl( LINK( this, SdTPAction, ClickSearchHdl ) );
125 :
126 : // this page needs ExchangeSupport
127 0 : SetExchangeSupport();
128 :
129 0 : m_pLbAction->SetSelectHdl( LINK( this, SdTPAction, ClickActionHdl ) );
130 0 : m_pLbTree->SetSelectHdl( LINK( this, SdTPAction, SelectTreeHdl ) );
131 0 : m_pEdtDocument->SetLoseFocusHdl( LINK( this, SdTPAction, CheckFileHdl ) );
132 0 : m_pEdtMacro->SetLoseFocusHdl( LINK( this, SdTPAction, CheckFileHdl ) );
133 :
134 : //Lock to initial max size
135 0 : Size aSize(get_preferred_size());
136 0 : set_width_request(aSize.Width());
137 0 : set_height_request(aSize.Height());
138 :
139 0 : ClickActionHdl( this );
140 0 : }
141 :
142 0 : SdTPAction::~SdTPAction()
143 : {
144 0 : }
145 :
146 0 : void SdTPAction::SetView( const ::sd::View* pSdView )
147 : {
148 0 : mpView = pSdView;
149 :
150 : // get ColorTable and fill ListBox
151 0 : ::sd::DrawDocShell* pDocSh = static_cast<const ::sd::View*>(mpView)->GetDocSh();
152 0 : if( pDocSh && pDocSh->GetViewShell() )
153 : {
154 0 : mpDoc = pDocSh->GetDoc();
155 0 : SfxViewFrame* pFrame = pDocSh->GetViewShell()->GetViewFrame();
156 0 : m_pLbTree->SetViewFrame( pFrame );
157 0 : m_pLbTreeDocument->SetViewFrame( pFrame );
158 :
159 0 : SvxColorListItem aItem( *(const SvxColorListItem*)( pDocSh->GetItem( SID_COLOR_TABLE ) ) );
160 0 : pColList = aItem.GetColorList();
161 0 : DBG_ASSERT( pColList.is(), "No color table available!" );
162 : }
163 : else
164 : {
165 : OSL_FAIL("sd::SdTPAction::SetView(), no docshell or viewshell?");
166 : }
167 0 : }
168 :
169 0 : void SdTPAction::Construct()
170 : {
171 : // fill OLE-Actionlistbox
172 0 : SdrOle2Obj* pOleObj = NULL;
173 0 : SdrGrafObj* pGrafObj = NULL;
174 0 : bool bOLEAction = false;
175 :
176 0 : if ( mpView->AreObjectsMarked() )
177 : {
178 0 : const SdrMarkList& rMarkList = mpView->GetMarkedObjectList();
179 : SdrObject* pObj;
180 :
181 0 : if (rMarkList.GetMarkCount() == 1)
182 : {
183 0 : SdrMark* pMark = rMarkList.GetMark(0);
184 0 : pObj = pMark->GetMarkedSdrObj();
185 :
186 0 : sal_uInt32 nInv = pObj->GetObjInventor();
187 0 : sal_uInt16 nSdrObjKind = pObj->GetObjIdentifier();
188 :
189 0 : if (nInv == SdrInventor && nSdrObjKind == OBJ_OLE2)
190 : {
191 0 : pOleObj = (SdrOle2Obj*) pObj;
192 : }
193 0 : else if (nInv == SdrInventor && nSdrObjKind == OBJ_GRAF)
194 : {
195 0 : pGrafObj = (SdrGrafObj*) pObj;
196 : }
197 : }
198 : }
199 0 : if( pGrafObj )
200 : {
201 0 : bOLEAction = true;
202 :
203 0 : aVerbVector.push_back( 0 );
204 0 : m_pLbOLEAction->InsertEntry( MnemonicGenerator::EraseAllMnemonicChars( SD_RESSTR( STR_EDIT_OBJ ) ) );
205 : }
206 0 : else if( pOleObj )
207 : {
208 0 : uno::Reference < embed::XEmbeddedObject > xObj = pOleObj->GetObjRef();
209 0 : if ( xObj.is() )
210 : {
211 0 : bOLEAction = true;
212 0 : uno::Sequence < embed::VerbDescriptor > aVerbs;
213 : try
214 : {
215 0 : aVerbs = xObj->getSupportedVerbs();
216 : }
217 0 : catch ( embed::NeedsRunningStateException& )
218 : {
219 0 : xObj->changeState( embed::EmbedStates::RUNNING );
220 0 : aVerbs = xObj->getSupportedVerbs();
221 : }
222 :
223 0 : for( sal_Int32 i=0; i<aVerbs.getLength(); i++ )
224 : {
225 0 : embed::VerbDescriptor aVerb = aVerbs[i];
226 0 : if( aVerb.VerbAttributes & embed::VerbAttributes::MS_VERBATTR_ONCONTAINERMENU )
227 : {
228 0 : OUString aTmp( aVerb.VerbName );
229 0 : aVerbVector.push_back( aVerb.VerbID );
230 0 : m_pLbOLEAction->InsertEntry( MnemonicGenerator::EraseAllMnemonicChars( aTmp ) );
231 : }
232 0 : }
233 0 : }
234 : }
235 :
236 0 : maCurrentActions.push_back( presentation::ClickAction_NONE );
237 0 : maCurrentActions.push_back( presentation::ClickAction_PREVPAGE );
238 0 : maCurrentActions.push_back( presentation::ClickAction_NEXTPAGE );
239 0 : maCurrentActions.push_back( presentation::ClickAction_FIRSTPAGE );
240 0 : maCurrentActions.push_back( presentation::ClickAction_LASTPAGE );
241 0 : maCurrentActions.push_back( presentation::ClickAction_BOOKMARK );
242 0 : maCurrentActions.push_back( presentation::ClickAction_DOCUMENT );
243 0 : maCurrentActions.push_back( presentation::ClickAction_SOUND );
244 0 : if( bOLEAction && m_pLbOLEAction->GetEntryCount() )
245 0 : maCurrentActions.push_back( presentation::ClickAction_VERB );
246 0 : maCurrentActions.push_back( presentation::ClickAction_PROGRAM );
247 0 : maCurrentActions.push_back( presentation::ClickAction_MACRO );
248 0 : maCurrentActions.push_back( presentation::ClickAction_STOPPRESENTATION );
249 :
250 : // fill Action-Listbox
251 0 : for (size_t nAction = 0, n = maCurrentActions.size(); nAction < n; nAction++)
252 : {
253 0 : sal_uInt16 nRId = GetClickActionSdResId( maCurrentActions[ nAction ] );
254 0 : m_pLbAction->InsertEntry( SD_RESSTR( nRId ) );
255 : }
256 :
257 0 : }
258 :
259 0 : bool SdTPAction::FillItemSet( SfxItemSet* rAttrs )
260 : {
261 0 : bool bModified = false;
262 0 : presentation::ClickAction eCA = presentation::ClickAction_NONE;
263 :
264 0 : if( m_pLbAction->GetSelectEntryCount() )
265 0 : eCA = GetActualClickAction();
266 :
267 0 : if( m_pLbAction->IsValueChangedFromSaved() )
268 : {
269 0 : rAttrs->Put( SfxAllEnumItem( ATTR_ACTION, (sal_uInt16)eCA ) );
270 0 : bModified = true;
271 : }
272 : else
273 0 : rAttrs->InvalidateItem( ATTR_ACTION );
274 :
275 0 : OUString aFileName = GetEditText( true );
276 0 : if( aFileName.isEmpty() )
277 0 : rAttrs->InvalidateItem( ATTR_ACTION_FILENAME );
278 : else
279 : {
280 0 : if( mpDoc && mpDoc->GetDocSh() && mpDoc->GetDocSh()->GetMedium() )
281 : {
282 0 : OUString aBaseURL = mpDoc->GetDocSh()->GetMedium()->GetBaseURL();
283 0 : if( eCA == presentation::ClickAction_SOUND ||
284 0 : eCA == presentation::ClickAction_DOCUMENT ||
285 : eCA == presentation::ClickAction_PROGRAM )
286 0 : aFileName = ::URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), aFileName, URIHelper::GetMaybeFileHdl(), true, false,
287 : INetURLObject::WAS_ENCODED,
288 0 : INetURLObject::DECODE_UNAMBIGUOUS );
289 :
290 0 : rAttrs->Put( SfxStringItem( ATTR_ACTION_FILENAME, aFileName ) );
291 0 : bModified = true;
292 : }
293 : else
294 : {
295 : OSL_FAIL("sd::SdTPAction::FillItemSet(), I need a medium!");
296 : }
297 : }
298 :
299 0 : return( bModified );
300 : }
301 :
302 0 : void SdTPAction::Reset( const SfxItemSet* rAttrs )
303 : {
304 0 : presentation::ClickAction eCA = presentation::ClickAction_NONE;
305 0 : OUString aFileName;
306 :
307 : // m_pLbAction
308 0 : if( rAttrs->GetItemState( ATTR_ACTION ) != SfxItemState::DONTCARE )
309 : {
310 : eCA = (presentation::ClickAction) ( ( const SfxAllEnumItem& ) rAttrs->
311 0 : Get( ATTR_ACTION ) ).GetValue();
312 0 : SetActualClickAction( eCA );
313 : }
314 : else
315 0 : m_pLbAction->SetNoSelection();
316 :
317 : // m_pEdtSound
318 0 : if( rAttrs->GetItemState( ATTR_ACTION_FILENAME ) != SfxItemState::DONTCARE )
319 : {
320 0 : aFileName = ( ( const SfxStringItem& ) rAttrs->Get( ATTR_ACTION_FILENAME ) ).GetValue();
321 0 : SetEditText( aFileName );
322 : }
323 :
324 0 : switch( eCA )
325 : {
326 : case presentation::ClickAction_BOOKMARK:
327 : {
328 0 : if( !m_pLbTree->SelectEntry( aFileName ) )
329 0 : m_pLbTree->SelectAll( false );
330 : }
331 0 : break;
332 :
333 : case presentation::ClickAction_DOCUMENT:
334 : {
335 0 : if( comphelper::string::getTokenCount(aFileName, DOCUMENT_TOKEN) == 2 )
336 0 : m_pLbTreeDocument->SelectEntry( aFileName.getToken( 1, DOCUMENT_TOKEN ) );
337 : }
338 0 : break;
339 :
340 : default:
341 0 : break;
342 : }
343 0 : ClickActionHdl( this );
344 :
345 0 : m_pLbAction->SaveValue();
346 0 : m_pEdtSound->SaveValue();
347 0 : }
348 :
349 0 : void SdTPAction::ActivatePage( const SfxItemSet& )
350 : {
351 0 : }
352 :
353 0 : int SdTPAction::DeactivatePage( SfxItemSet* pPageSet )
354 : {
355 0 : if( pPageSet )
356 0 : FillItemSet( pPageSet );
357 :
358 0 : return( LEAVE_PAGE );
359 : }
360 :
361 0 : SfxTabPage* SdTPAction::Create( vcl::Window* pWindow,
362 : const SfxItemSet& rAttrs )
363 : {
364 0 : return( new SdTPAction( pWindow, rAttrs ) );
365 : }
366 :
367 0 : void SdTPAction::UpdateTree()
368 : {
369 0 : if( !bTreeUpdated && mpDoc && mpDoc->GetDocSh() && mpDoc->GetDocSh()->GetMedium() )
370 : {
371 : //m_pLbTree->Clear();
372 0 : m_pLbTree->Fill( mpDoc, true, mpDoc->GetDocSh()->GetMedium()->GetName() );
373 0 : bTreeUpdated = true;
374 : }
375 0 : }
376 :
377 0 : void SdTPAction::OpenFileDialog()
378 : {
379 : // Soundpreview only for interaction with sound
380 0 : presentation::ClickAction eCA = GetActualClickAction();
381 0 : bool bSound = ( eCA == presentation::ClickAction_SOUND );
382 0 : bool bPage = ( eCA == presentation::ClickAction_BOOKMARK );
383 0 : bool bDocument = ( eCA == presentation::ClickAction_DOCUMENT ||
384 0 : eCA == presentation::ClickAction_PROGRAM );
385 0 : bool bMacro = ( eCA == presentation::ClickAction_MACRO );
386 :
387 0 : if( bPage )
388 : {
389 : // search in the TreeLB for the specified object
390 0 : m_pLbTree->SelectEntry( GetEditText() );
391 : }
392 : else
393 : {
394 0 : OUString aFile( GetEditText() );
395 :
396 0 : if (bSound)
397 : {
398 0 : SdOpenSoundFileDialog aFileDialog;
399 :
400 0 : if( aFile.isEmpty() )
401 0 : aFile = SvtPathOptions().GetGraphicPath();
402 :
403 0 : aFileDialog.SetPath( aFile );
404 :
405 0 : if( aFileDialog.Execute() == ERRCODE_NONE )
406 : {
407 0 : aFile = aFileDialog.GetPath();
408 0 : SetEditText( aFile );
409 0 : }
410 : }
411 0 : else if (bMacro)
412 : {
413 0 : vcl::Window* pOldWin = Application::GetDefDialogParent();
414 0 : Application::SetDefDialogParent( this );
415 :
416 : // choose macro dialog
417 0 : OUString aScriptURL = SfxApplication::ChooseScript();
418 :
419 0 : if ( !aScriptURL.isEmpty() )
420 : {
421 0 : SetEditText( aScriptURL );
422 : }
423 :
424 0 : Application::SetDefDialogParent( pOldWin );
425 : }
426 : else
427 : {
428 : sfx2::FileDialogHelper aFileDialog(
429 0 : ui::dialogs::TemplateDescription::FILEOPEN_READONLY_VERSION, 0);
430 :
431 0 : if (bDocument && aFile.isEmpty())
432 0 : aFile = SvtPathOptions().GetWorkPath();
433 :
434 0 : aFileDialog.SetDisplayDirectory( aFile );
435 :
436 : // The following is a workaround for #i4306#:
437 : // The addition of the implicitly existing "all files"
438 : // filter makes the (Windows system) open file dialog follow
439 : // links on the desktop to directories.
440 : aFileDialog.AddFilter (
441 : SFX2_RESSTR(STR_SFX_FILTERNAME_ALL),
442 0 : OUString("*.*"));
443 :
444 0 : if( aFileDialog.Execute() == ERRCODE_NONE )
445 : {
446 0 : aFile = aFileDialog.GetPath();
447 0 : SetEditText( aFile );
448 : }
449 0 : if( bDocument )
450 0 : CheckFileHdl( NULL );
451 0 : }
452 : }
453 0 : }
454 :
455 0 : IMPL_LINK_NOARG(SdTPAction, ClickSearchHdl)
456 : {
457 0 : OpenFileDialog();
458 :
459 0 : return( 0L );
460 : }
461 :
462 0 : IMPL_LINK_NOARG(SdTPAction, ClickActionHdl)
463 : {
464 0 : presentation::ClickAction eCA = GetActualClickAction();
465 :
466 : // hide controls we don't need
467 0 : switch( eCA )
468 : {
469 : case presentation::ClickAction_NONE:
470 : case presentation::ClickAction_INVISIBLE:
471 : case presentation::ClickAction_PREVPAGE:
472 : case presentation::ClickAction_NEXTPAGE:
473 : case presentation::ClickAction_FIRSTPAGE:
474 : case presentation::ClickAction_LASTPAGE:
475 : case presentation::ClickAction_STOPPRESENTATION:
476 : default:
477 0 : m_pFtTree->Hide();
478 0 : m_pLbTree->Hide();
479 0 : m_pLbTreeDocument->Hide();
480 0 : m_pLbOLEAction->Hide();
481 :
482 0 : m_pFrame->Hide();
483 0 : m_pEdtSound->Hide();
484 0 : m_pEdtBookmark->Hide();
485 0 : m_pEdtDocument->Hide();
486 0 : m_pEdtProgram->Hide();
487 0 : m_pEdtMacro->Hide();
488 0 : m_pBtnSearch->Hide();
489 0 : m_pBtnSeek->Hide();
490 0 : break;
491 :
492 : case presentation::ClickAction_SOUND:
493 : case presentation::ClickAction_PROGRAM:
494 : case presentation::ClickAction_MACRO:
495 0 : m_pFtTree->Hide();
496 0 : m_pLbTree->Hide();
497 0 : m_pLbTreeDocument->Hide();
498 0 : m_pLbOLEAction->Hide();
499 :
500 0 : m_pEdtDocument->Hide();
501 :
502 0 : if( eCA == presentation::ClickAction_MACRO )
503 : {
504 0 : m_pEdtSound->Hide();
505 0 : m_pEdtProgram->Hide();
506 : }
507 0 : else if( eCA == presentation::ClickAction_PROGRAM )
508 : {
509 0 : m_pEdtSound->Hide();
510 0 : m_pEdtMacro->Hide();
511 : }
512 0 : else if( eCA == presentation::ClickAction_SOUND )
513 : {
514 0 : m_pEdtProgram->Hide();
515 0 : m_pEdtMacro->Hide();
516 : }
517 :
518 0 : m_pBtnSeek->Hide();
519 0 : break;
520 :
521 : case presentation::ClickAction_DOCUMENT:
522 0 : m_pLbTree->Hide();
523 0 : m_pLbOLEAction->Hide();
524 :
525 0 : m_pEdtSound->Hide();
526 0 : m_pEdtProgram->Hide();
527 0 : m_pEdtMacro->Hide();
528 0 : m_pEdtBookmark->Hide();
529 0 : m_pBtnSeek->Hide();
530 0 : break;
531 :
532 : case presentation::ClickAction_BOOKMARK:
533 0 : m_pLbTreeDocument->Hide();
534 0 : m_pLbOLEAction->Hide();
535 0 : m_pEdtSound->Hide();
536 0 : m_pEdtDocument->Hide();
537 0 : m_pEdtProgram->Hide();
538 0 : m_pEdtMacro->Hide();
539 0 : m_pBtnSearch->Hide();
540 0 : break;
541 :
542 : case presentation::ClickAction_VERB:
543 0 : m_pLbTree->Hide();
544 0 : m_pEdtDocument->Hide();
545 0 : m_pEdtProgram->Hide();
546 0 : m_pEdtBookmark->Hide();
547 0 : m_pEdtMacro->Hide();
548 0 : m_pBtnSearch->Hide();
549 0 : m_pFrame->Hide();
550 0 : m_pEdtSound->Hide();
551 0 : m_pBtnSeek->Hide();
552 0 : break;
553 : }
554 :
555 : // show controls we do need
556 0 : switch( eCA )
557 : {
558 : case presentation::ClickAction_NONE:
559 : case presentation::ClickAction_INVISIBLE:
560 : case presentation::ClickAction_PREVPAGE:
561 : case presentation::ClickAction_NEXTPAGE:
562 : case presentation::ClickAction_FIRSTPAGE:
563 : case presentation::ClickAction_LASTPAGE:
564 : case presentation::ClickAction_STOPPRESENTATION:
565 : // none
566 0 : break;
567 :
568 : case presentation::ClickAction_SOUND:
569 0 : m_pFrame->Show();
570 0 : m_pEdtSound->Show();
571 0 : m_pEdtSound->Enable();
572 0 : m_pBtnSearch->Show();
573 0 : m_pBtnSearch->Enable();
574 0 : m_pFrame->set_label( SD_RESSTR( STR_EFFECTDLG_SOUND ) );
575 0 : break;
576 :
577 : case presentation::ClickAction_PROGRAM:
578 : case presentation::ClickAction_MACRO:
579 0 : m_pFrame->Show();
580 0 : m_pBtnSearch->Show();
581 0 : m_pBtnSearch->Enable();
582 0 : if( eCA == presentation::ClickAction_MACRO )
583 : {
584 0 : m_pEdtMacro->Show();
585 0 : m_pFrame->set_label( SD_RESSTR( STR_EFFECTDLG_MACRO ) );
586 : }
587 : else
588 : {
589 0 : m_pEdtProgram->Show();
590 0 : m_pFrame->set_label( SD_RESSTR( STR_EFFECTDLG_PROGRAM ) );
591 : }
592 0 : break;
593 :
594 : case presentation::ClickAction_DOCUMENT:
595 0 : m_pFtTree->Show();
596 0 : m_pLbTreeDocument->Show();
597 :
598 0 : m_pFrame->Show();
599 0 : m_pEdtDocument->Show();
600 0 : m_pBtnSearch->Show();
601 0 : m_pBtnSearch->Enable();
602 :
603 0 : m_pFtTree->SetText( SD_RESSTR( STR_EFFECTDLG_JUMP ) );
604 0 : m_pFrame->set_label( SD_RESSTR( STR_EFFECTDLG_DOCUMENT ) );
605 :
606 0 : CheckFileHdl( NULL );
607 0 : break;
608 :
609 : case presentation::ClickAction_VERB:
610 0 : m_pFtTree->Show();
611 0 : m_pLbOLEAction->Show();
612 :
613 0 : m_pFtTree->SetText( SD_RESSTR( STR_EFFECTDLG_ACTION ) );
614 0 : break;
615 :
616 : case presentation::ClickAction_BOOKMARK:
617 0 : UpdateTree();
618 :
619 0 : m_pFtTree->Show();
620 0 : m_pLbTree->Show();
621 :
622 0 : m_pFrame->Show();
623 0 : m_pEdtBookmark->Show();
624 0 : m_pBtnSeek->Show();
625 :
626 0 : m_pFtTree->SetText( SD_RESSTR( STR_EFFECTDLG_JUMP ) );
627 0 : m_pFrame->set_label( SD_RESSTR( STR_EFFECTDLG_PAGE_OBJECT ) );
628 0 : break;
629 : default:
630 0 : break;
631 : }
632 :
633 0 : return( 0L );
634 : }
635 :
636 0 : IMPL_LINK_NOARG(SdTPAction, SelectTreeHdl)
637 : {
638 0 : m_pEdtBookmark->SetText( m_pLbTree->GetSelectEntry() );
639 0 : return( 0L );
640 : }
641 :
642 0 : IMPL_LINK_NOARG(SdTPAction, CheckFileHdl)
643 : {
644 0 : OUString aFile( GetEditText() );
645 :
646 0 : if( aFile != aLastFile )
647 : {
648 : // check if it is a valid draw file
649 : SfxMedium aMedium( aFile,
650 0 : STREAM_READ | STREAM_NOCREATE );
651 :
652 0 : if( aMedium.IsStorage() )
653 : {
654 0 : WaitObject aWait( GetParentDialog() );
655 :
656 : // is it a draw file?
657 : // open with READ, otherwise the Storages might write into the file!
658 0 : uno::Reference < embed::XStorage > xStorage = aMedium.GetStorage();
659 : DBG_ASSERT( xStorage.is(), "No storage!" );
660 :
661 0 : uno::Reference < container::XNameAccess > xAccess( xStorage, uno::UNO_QUERY );
662 0 : if( xAccess.is() &&
663 0 : ( xAccess->hasByName( pStarDrawXMLContent ) ||
664 0 : xAccess->hasByName( pStarDrawOldXMLContent ) ) )
665 : {
666 0 : SdDrawDocument* pBookmarkDoc = mpDoc->OpenBookmarkDoc( aFile );
667 0 : if( pBookmarkDoc )
668 : {
669 0 : aLastFile = aFile;
670 :
671 0 : m_pLbTreeDocument->Clear();
672 0 : m_pLbTreeDocument->Fill( pBookmarkDoc, true, aFile );
673 0 : mpDoc->CloseBookmarkDoc();
674 0 : m_pLbTreeDocument->Show();
675 : }
676 : else
677 0 : m_pLbTreeDocument->Hide();
678 : }
679 : else
680 0 : m_pLbTreeDocument->Hide();
681 :
682 : }
683 : else
684 0 : m_pLbTreeDocument->Hide();
685 : }
686 :
687 0 : return( 0L );
688 : }
689 :
690 0 : presentation::ClickAction SdTPAction::GetActualClickAction()
691 : {
692 0 : presentation::ClickAction eCA = presentation::ClickAction_NONE;
693 0 : sal_Int32 nPos = m_pLbAction->GetSelectEntryPos();
694 :
695 0 : if (nPos != LISTBOX_ENTRY_NOTFOUND && static_cast<size_t>(nPos) < maCurrentActions.size())
696 0 : eCA = maCurrentActions[ nPos ];
697 0 : return( eCA );
698 : }
699 :
700 0 : void SdTPAction::SetActualClickAction( presentation::ClickAction eCA )
701 : {
702 : std::vector<com::sun::star::presentation::ClickAction>::const_iterator pIter =
703 0 : std::find(maCurrentActions.begin(),maCurrentActions.end(),eCA);
704 :
705 0 : if ( pIter != maCurrentActions.end() )
706 0 : m_pLbAction->SelectEntryPos( pIter-maCurrentActions.begin() );
707 0 : }
708 :
709 0 : void SdTPAction::SetEditText( OUString const & rStr )
710 : {
711 0 : presentation::ClickAction eCA = GetActualClickAction();
712 0 : OUString aText(rStr);
713 :
714 : // possibly convert URI back to system path
715 0 : switch( eCA )
716 : {
717 : case presentation::ClickAction_DOCUMENT:
718 0 : if( comphelper::string::getTokenCount(rStr, DOCUMENT_TOKEN) == 2 )
719 0 : aText = rStr.getToken( 0, DOCUMENT_TOKEN );
720 :
721 : // fallthrough inteded
722 : case presentation::ClickAction_SOUND:
723 : case presentation::ClickAction_PROGRAM:
724 : {
725 0 : INetURLObject aURL( aText );
726 :
727 : // try to convert to system path
728 0 : OUString aTmpStr(aURL.getFSysPath(INetURLObject::FSYS_DETECT));
729 :
730 0 : if( !aTmpStr.isEmpty() )
731 0 : aText = aTmpStr; // was a system path
732 : }
733 0 : break;
734 : default:
735 0 : break;
736 : }
737 :
738 : // set the string to the corresponding control
739 0 : switch( eCA )
740 : {
741 : case presentation::ClickAction_SOUND:
742 0 : m_pEdtSound->SetText(aText );
743 0 : break;
744 : case presentation::ClickAction_VERB:
745 : {
746 0 : ::std::vector< long >::iterator aFound( ::std::find( aVerbVector.begin(), aVerbVector.end(), rStr.toInt32() ) );
747 0 : if( aFound != aVerbVector.end() )
748 0 : m_pLbOLEAction->SelectEntryPos( static_cast< short >( aFound - aVerbVector.begin() ) );
749 : }
750 0 : break;
751 : case presentation::ClickAction_PROGRAM:
752 0 : m_pEdtProgram->SetText( aText );
753 0 : break;
754 : case presentation::ClickAction_MACRO:
755 : {
756 0 : m_pEdtMacro->SetText( aText );
757 : }
758 0 : break;
759 : case presentation::ClickAction_DOCUMENT:
760 0 : m_pEdtDocument->SetText( aText );
761 0 : break;
762 : case presentation::ClickAction_BOOKMARK:
763 0 : m_pEdtBookmark->SetText( aText );
764 0 : break;
765 : default:
766 0 : break;
767 0 : }
768 0 : }
769 :
770 0 : OUString SdTPAction::GetEditText( bool bFullDocDestination )
771 : {
772 0 : OUString aStr;
773 0 : presentation::ClickAction eCA = GetActualClickAction();
774 :
775 0 : switch( eCA )
776 : {
777 : case presentation::ClickAction_SOUND:
778 0 : aStr = m_pEdtSound->GetText();
779 0 : break;
780 : case presentation::ClickAction_VERB:
781 : {
782 0 : const sal_Int32 nPos = m_pLbOLEAction->GetSelectEntryPos();
783 0 : if( static_cast<size_t>(nPos) < aVerbVector.size() )
784 0 : aStr = OUString::number( aVerbVector[ nPos ] );
785 0 : return aStr;
786 : }
787 : case presentation::ClickAction_DOCUMENT:
788 0 : aStr = m_pEdtDocument->GetText();
789 0 : break;
790 :
791 : case presentation::ClickAction_PROGRAM:
792 0 : aStr = m_pEdtProgram->GetText();
793 0 : break;
794 :
795 : case presentation::ClickAction_MACRO:
796 : {
797 0 : return m_pEdtMacro->GetText();
798 : }
799 :
800 : case presentation::ClickAction_BOOKMARK:
801 0 : return( m_pEdtBookmark->GetText() );
802 :
803 : default:
804 0 : break;
805 : }
806 :
807 : // validate file URI
808 0 : INetURLObject aURL( aStr );
809 0 : OUString aBaseURL;
810 0 : if( mpDoc && mpDoc->GetDocSh() && mpDoc->GetDocSh()->GetMedium() )
811 0 : aBaseURL = mpDoc->GetDocSh()->GetMedium()->GetBaseURL();
812 :
813 0 : if( !aStr.isEmpty() && aURL.GetProtocol() == INET_PROT_NOT_VALID )
814 0 : aURL = INetURLObject( ::URIHelper::SmartRel2Abs( INetURLObject(aBaseURL), aStr, URIHelper::GetMaybeFileHdl(), true, false ) );
815 :
816 : // get adjusted file name
817 0 : aStr = aURL.GetMainURL( INetURLObject::NO_DECODE );
818 :
819 0 : if( bFullDocDestination &&
820 0 : eCA == presentation::ClickAction_DOCUMENT &&
821 0 : m_pLbTreeDocument->Control::IsVisible() &&
822 0 : m_pLbTreeDocument->GetSelectionCount() > 0 )
823 : {
824 0 : OUString aTmpStr( m_pLbTreeDocument->GetSelectEntry() );
825 0 : if( !aTmpStr.isEmpty() )
826 : {
827 0 : aStr += OUString(DOCUMENT_TOKEN);
828 0 : aStr += aTmpStr;
829 0 : }
830 : }
831 :
832 0 : return( aStr );
833 : }
834 :
835 0 : sal_uInt16 SdTPAction::GetClickActionSdResId( presentation::ClickAction eCA )
836 : {
837 0 : switch( eCA )
838 : {
839 0 : case presentation::ClickAction_NONE: return STR_CLICK_ACTION_NONE;
840 0 : case presentation::ClickAction_PREVPAGE: return STR_CLICK_ACTION_PREVPAGE;
841 0 : case presentation::ClickAction_NEXTPAGE: return STR_CLICK_ACTION_NEXTPAGE;
842 0 : case presentation::ClickAction_FIRSTPAGE: return STR_CLICK_ACTION_FIRSTPAGE;
843 0 : case presentation::ClickAction_LASTPAGE: return STR_CLICK_ACTION_LASTPAGE;
844 0 : case presentation::ClickAction_BOOKMARK: return STR_CLICK_ACTION_BOOKMARK;
845 0 : case presentation::ClickAction_DOCUMENT: return STR_CLICK_ACTION_DOCUMENT;
846 0 : case presentation::ClickAction_PROGRAM: return STR_CLICK_ACTION_PROGRAM;
847 0 : case presentation::ClickAction_MACRO: return STR_CLICK_ACTION_MACRO;
848 0 : case presentation::ClickAction_SOUND: return STR_CLICK_ACTION_SOUND;
849 0 : case presentation::ClickAction_VERB: return STR_CLICK_ACTION_VERB;
850 0 : case presentation::ClickAction_STOPPRESENTATION: return STR_CLICK_ACTION_STOPPRESENTATION;
851 : default: OSL_FAIL( "No StringResource for ClickAction available!" );
852 : }
853 0 : return( 0 );
854 0 : }
855 :
856 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|