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