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 <com/sun/star/beans/XPropertySet.hpp>
21 : #include <com/sun/star/beans/PropertyValue.hpp>
22 : #include <com/sun/star/embed/EmbedStates.hpp>
23 : #include <com/sun/star/embed/XInsertObjectDialog.hpp>
24 : #include <com/sun/star/embed/MSOLEObjectSystemCreator.hpp>
25 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
26 : #include <com/sun/star/lang/XInitialization.hpp>
27 : #include <com/sun/star/task/InteractionHandler.hpp>
28 : #include <com/sun/star/ucb/CommandAbortedException.hpp>
29 : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
30 : #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
31 : #include <com/sun/star/ui/dialogs/FilePicker.hpp>
32 : #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
33 : #include <comphelper/processfactory.hxx>
34 :
35 : #include "insdlg.hxx"
36 : #include <plfilter.hxx>
37 : #include <dialmgr.hxx>
38 : #include <svtools/sores.hxx>
39 :
40 : #include <tools/urlobj.hxx>
41 : #include <tools/debug.hxx>
42 : #include <svl/urihelper.hxx>
43 : #include <vcl/button.hxx>
44 : #include <vcl/fixed.hxx>
45 : #include <vcl/group.hxx>
46 : #include <vcl/layout.hxx>
47 : #include <vcl/lstbox.hxx>
48 : #include <vcl/svapp.hxx>
49 : #include <comphelper/classids.hxx>
50 : #include <sfx2/frmdescr.hxx>
51 : #include <sfx2/viewsh.hxx>
52 : #include <sfx2/filedlghelper.hxx>
53 : #include <svl/ownlist.hxx>
54 : #include <comphelper/seqstream.hxx>
55 :
56 : #include "cuires.hrc"
57 :
58 : #include <osl/file.hxx>
59 :
60 : #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
61 : #include <com/sun/star/container/XNameAccess.hpp>
62 : #include <vcl/settings.hxx>
63 :
64 : using namespace ::com::sun::star;
65 : using namespace ::com::sun::star::lang;
66 : using namespace ::com::sun::star::uno;
67 : using namespace ::com::sun::star::container;
68 : using namespace ::com::sun::star::ui::dialogs;
69 :
70 :
71 0 : static OUString impl_getSvtResString( sal_uInt32 nId )
72 : {
73 0 : OUString aRet;
74 0 : ResMgr* pMgr = ResMgr::CreateResMgr( "svt", Application::GetSettings().GetUILanguageTag() );
75 0 : if( pMgr )
76 : {
77 0 : aRet = ResId( nId, *pMgr );
78 0 : delete pMgr;
79 : }
80 0 : return aRet;
81 : }
82 :
83 0 : bool InsertObjectDialog_Impl::IsCreateNew() const
84 : {
85 0 : return false;
86 : }
87 :
88 0 : uno::Reference< io::XInputStream > InsertObjectDialog_Impl::GetIconIfIconified( OUString* /*pGraphicMediaType*/ )
89 : {
90 0 : return uno::Reference< io::XInputStream >();
91 : }
92 :
93 0 : InsertObjectDialog_Impl::InsertObjectDialog_Impl(vcl::Window * pParent, const OUString& rID,
94 : const OUString& rUIXMLDescription,
95 : const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xStorage)
96 : : ModalDialog(pParent, rID, rUIXMLDescription)
97 : , m_xStorage( xStorage )
98 0 : , aCnt( m_xStorage )
99 : {
100 0 : }
101 :
102 :
103 :
104 0 : IMPL_LINK_NOARG(SvInsertOleDlg, DoubleClickHdl)
105 : {
106 0 : EndDialog( RET_OK );
107 0 : return 0;
108 : }
109 :
110 0 : IMPL_LINK_NOARG(SvInsertOleDlg, BrowseHdl)
111 : {
112 0 : Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
113 :
114 0 : Reference< XFilePicker3 > xFilePicker = FilePicker::createWithMode(xContext, TemplateDescription::FILEOPEN_SIMPLE);
115 :
116 : // add filter
117 : try
118 : {
119 0 : xFilePicker->appendFilter(
120 : OUString(),
121 : OUString( "*.*" )
122 0 : );
123 : }
124 0 : catch( const IllegalArgumentException& )
125 : {
126 : DBG_ASSERT( false, "caught IllegalArgumentException when registering filter\n" );
127 : }
128 :
129 0 : if( xFilePicker->execute() == ExecutableDialogResults::OK )
130 : {
131 0 : Sequence< OUString > aPathSeq( xFilePicker->getFiles() );
132 0 : INetURLObject aObj( aPathSeq[0] );
133 0 : m_pEdFilepath->SetText( aObj.PathToFileName() );
134 : }
135 :
136 0 : return 0;
137 : }
138 :
139 :
140 :
141 0 : IMPL_LINK_NOARG(SvInsertOleDlg, RadioHdl)
142 : {
143 0 : if ( m_pRbNewObject->IsChecked() )
144 : {
145 0 : m_pObjectTypeFrame->Show();
146 0 : m_pFileFrame->Hide();
147 : }
148 : else
149 : {
150 0 : m_pFileFrame->Show();
151 0 : m_pObjectTypeFrame->Hide();
152 : }
153 0 : return 0;
154 : }
155 :
156 :
157 :
158 0 : void SvInsertOleDlg::SelectDefault()
159 : {
160 0 : m_pLbObjecttype->SelectEntryPos(0);
161 0 : }
162 :
163 :
164 0 : SvInsertOleDlg::SvInsertOleDlg
165 : (
166 : vcl::Window* pParent,
167 : const Reference < embed::XStorage >& xStorage,
168 : const SvObjectServerList* pServers
169 : )
170 : : InsertObjectDialog_Impl( pParent, "InsertOLEObjectDialog", "cui/ui/insertoleobject.ui", xStorage ),
171 0 : m_pServers( pServers )
172 : {
173 0 : get(m_pRbNewObject, "createnew");
174 0 : get(m_pRbObjectFromfile, "createfromfile");
175 0 : get(m_pObjectTypeFrame, "objecttypeframe");
176 0 : get(m_pLbObjecttype, "types");
177 0 : get(m_pFileFrame, "fileframe");
178 0 : get(m_pEdFilepath, "urled");
179 0 : get(m_pBtnFilepath, "urlbtn");
180 0 : get(m_pCbFilelink, "linktofile");
181 0 : m_pLbObjecttype->SetDoubleClickHdl( LINK( this, SvInsertOleDlg, DoubleClickHdl ) );
182 0 : m_pBtnFilepath->SetClickHdl( LINK( this, SvInsertOleDlg, BrowseHdl ) );
183 0 : Link<> aLink( LINK( this, SvInsertOleDlg, RadioHdl ) );
184 0 : m_pRbNewObject->SetClickHdl( aLink );
185 0 : m_pRbObjectFromfile->SetClickHdl( aLink );
186 0 : m_pRbNewObject->Check( true );
187 0 : RadioHdl( NULL );
188 0 : }
189 :
190 0 : SvInsertOleDlg::~SvInsertOleDlg()
191 : {
192 0 : disposeOnce();
193 0 : }
194 :
195 0 : void SvInsertOleDlg::dispose()
196 : {
197 0 : m_pRbNewObject.clear();
198 0 : m_pRbObjectFromfile.clear();
199 0 : m_pObjectTypeFrame.clear();
200 0 : m_pLbObjecttype.clear();
201 0 : m_pFileFrame.clear();
202 0 : m_pEdFilepath.clear();
203 0 : m_pBtnFilepath.clear();
204 0 : m_pCbFilelink.clear();
205 0 : InsertObjectDialog_Impl::dispose();
206 0 : }
207 :
208 0 : short SvInsertOleDlg::Execute()
209 : {
210 0 : short nRet = RET_OK;
211 0 : SvObjectServerList aObjS;
212 0 : if ( !m_pServers )
213 : {
214 : // if no list was provided, take the complete one
215 0 : aObjS.FillInsertObjects();
216 0 : m_pServers = &aObjS;
217 : }
218 :
219 : // fill listbox and select default
220 0 : ListBox& rBox = GetObjectTypes();
221 0 : rBox.SetUpdateMode( false );
222 0 : for ( sal_uLong i = 0; i < m_pServers->Count(); i++ )
223 0 : rBox.InsertEntry( (*m_pServers)[i].GetHumanName() );
224 0 : rBox.SetUpdateMode( true );
225 0 : SelectDefault();
226 0 : OUString aName;
227 :
228 : DBG_ASSERT( m_xStorage.is(), "No storage!");
229 0 : if ( m_xStorage.is() && ( nRet = Dialog::Execute() ) == RET_OK )
230 : {
231 0 : OUString aFileName;
232 0 : bool bCreateNew = IsCreateNew();
233 0 : if ( bCreateNew )
234 : {
235 : // create and insert new embedded object
236 0 : OUString aServerName = rBox.GetSelectEntry();
237 0 : const SvObjectServer* pS = m_pServers->Get( aServerName );
238 0 : if ( pS )
239 : {
240 0 : if( pS->GetClassName() == SvGlobalName( SO3_OUT_CLASSID ) )
241 : {
242 : try
243 : {
244 : uno::Reference < embed::XInsertObjectDialog > xDialogCreator(
245 : embed::MSOLEObjectSystemCreator::create( ::comphelper::getProcessComponentContext() ),
246 0 : uno::UNO_QUERY );
247 :
248 0 : if ( xDialogCreator.is() )
249 : {
250 0 : aName = aCnt.CreateUniqueObjectName();
251 0 : embed::InsertedObjectInfo aNewInf = xDialogCreator->createInstanceByDialog(
252 : m_xStorage,
253 : aName,
254 0 : uno::Sequence < beans::PropertyValue >() );
255 :
256 : OSL_ENSURE( aNewInf.Object.is(), "The object must be created or an exception must be thrown!" );
257 0 : m_xObj = aNewInf.Object;
258 0 : for ( sal_Int32 nInd = 0; nInd < aNewInf.Options.getLength(); nInd++ )
259 0 : if ( aNewInf.Options[nInd].Name == "Icon" )
260 : {
261 0 : aNewInf.Options[nInd].Value >>= m_aIconMetaFile;
262 : }
263 0 : else if ( aNewInf.Options[nInd].Name == "IconFormat" )
264 : {
265 0 : datatransfer::DataFlavor aFlavor;
266 0 : if ( aNewInf.Options[nInd].Value >>= aFlavor )
267 0 : m_aIconMediaType = aFlavor.MimeType;
268 0 : }
269 :
270 0 : }
271 : }
272 0 : catch( ucb::CommandAbortedException& )
273 : {
274 : // the user has pressed cancel
275 : }
276 0 : catch( uno::Exception& )
277 : {
278 : // TODO: Error handling
279 : }
280 : }
281 : else
282 : {
283 : // create object with desired ClassId
284 0 : m_xObj = aCnt.CreateEmbeddedObject( pS->GetClassName().GetByteSequence(), aName );
285 : }
286 :
287 0 : if ( !m_xObj.is() )
288 : {
289 0 : if( !aFileName.isEmpty() ) // from OLE Dialog
290 : {
291 : // object couldn't be created from file
292 : // global Resource from svtools (former so3 resource)
293 0 : OUString aErr( impl_getSvtResString( STR_ERROR_OBJNOCREATE_FROM_FILE ) );
294 0 : aErr = aErr.replaceFirst( "%", aFileName );
295 0 : ScopedVclPtrInstance<MessageDialog>::Create(this, aErr)->Execute();
296 : }
297 : else
298 : {
299 : // object couldn't be created
300 : // global Resource from svtools (former so3 resource)
301 0 : OUString aErr( impl_getSvtResString( STR_ERROR_OBJNOCREATE ) );
302 0 : aErr = aErr.replaceFirst( "%", aServerName );
303 0 : ScopedVclPtrInstance<MessageDialog>::Create(this, aErr)->Execute();
304 : }
305 : }
306 0 : }
307 : }
308 : else
309 : {
310 0 : aFileName = GetFilePath();
311 0 : INetURLObject aURL;
312 0 : aURL.SetSmartProtocol( INetProtocol::File );
313 0 : aURL.SetSmartURL( aFileName );
314 0 : aFileName = aURL.GetMainURL( INetURLObject::NO_DECODE );
315 0 : bool bLink = IsLinked();
316 :
317 0 : if ( !aFileName.isEmpty() )
318 : {
319 : // create MediaDescriptor for file to create object from
320 0 : uno::Sequence < beans::PropertyValue > aMedium( 2 );
321 0 : aMedium[0].Name = "URL";
322 0 : aMedium[0].Value <<= OUString( aFileName );
323 :
324 0 : uno::Reference< uno::XComponentContext > xContext = ::comphelper::getProcessComponentContext();
325 : uno::Reference< task::XInteractionHandler2 > xInteraction(
326 0 : task::InteractionHandler::createWithParent(xContext, 0) );
327 :
328 0 : aMedium[1].Name = "InteractionHandler";
329 0 : aMedium[1].Value <<= xInteraction;
330 :
331 : // create object from media descriptor
332 0 : if ( bLink )
333 0 : m_xObj = aCnt.InsertEmbeddedLink( aMedium, aName );
334 : else
335 0 : m_xObj = aCnt.InsertEmbeddedObject( aMedium, aName );
336 : }
337 :
338 0 : if ( !m_xObj.is() )
339 : {
340 : // object couldn't be created from file
341 : // global Resource from svtools (former so3 resource)
342 0 : OUString aErr( impl_getSvtResString( STR_ERROR_OBJNOCREATE_FROM_FILE ) );
343 0 : aErr = aErr.replaceFirst( "%", aFileName );
344 0 : ScopedVclPtrInstance<MessageDialog>::Create(this, aErr)->Execute();
345 0 : }
346 0 : }
347 : }
348 :
349 0 : m_pServers = 0;
350 0 : return nRet;
351 : }
352 :
353 0 : uno::Reference< io::XInputStream > SvInsertOleDlg::GetIconIfIconified( OUString* pGraphicMediaType )
354 : {
355 0 : if ( m_aIconMetaFile.getLength() )
356 : {
357 0 : if ( pGraphicMediaType )
358 0 : *pGraphicMediaType = m_aIconMediaType;
359 :
360 0 : return uno::Reference< io::XInputStream >( new ::comphelper::SequenceInputStream( m_aIconMetaFile ) );
361 : }
362 :
363 0 : return uno::Reference< io::XInputStream >();
364 : }
365 :
366 0 : IMPL_LINK_NOARG(SvInsertPlugInDialog, BrowseHdl)
367 : {
368 0 : Sequence< OUString > aFilterNames, aFilterTypes;
369 0 : fillNetscapePluginFilters( aFilterNames, aFilterTypes );
370 :
371 0 : Reference< XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
372 0 : Reference< XFilePicker3 > xFilePicker = ui::dialogs::FilePicker::createWithMode( xContext, ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE );
373 :
374 : // add the filters
375 : try
376 : {
377 0 : const OUString* pNames = aFilterNames.getConstArray();
378 0 : const OUString* pTypes = aFilterTypes.getConstArray();
379 0 : for( int i = 0; i < aFilterNames.getLength(); i++ )
380 0 : xFilePicker->appendFilter( pNames[i], pTypes[i] );
381 : }
382 0 : catch( IllegalArgumentException& )
383 : {
384 : DBG_ASSERT( false, "caught IllegalArgumentException when registering filter\n" );
385 : }
386 :
387 0 : if( xFilePicker->execute() == ExecutableDialogResults::OK )
388 : {
389 0 : Sequence< OUString > aPathSeq( xFilePicker->getFiles() );
390 0 : INetURLObject aObj( aPathSeq[0] );
391 0 : m_pEdFileurl->SetText(aObj.PathToFileName());
392 : }
393 :
394 0 : return 0;
395 : }
396 :
397 :
398 :
399 0 : SvInsertPlugInDialog::SvInsertPlugInDialog(vcl::Window* pParent,
400 : const uno::Reference < embed::XStorage >& xStorage)
401 : : InsertObjectDialog_Impl(pParent, "InsertPluginDialog", "cui/ui/insertplugin.ui", xStorage)
402 0 : , m_pURL(0)
403 : {
404 0 : get(m_pEdFileurl, "urled");
405 0 : get(m_pBtnFileurl, "urlbtn");
406 0 : get(m_pEdPluginsOptions, "pluginoptions");
407 0 : m_pBtnFileurl->SetClickHdl(LINK(this, SvInsertPlugInDialog, BrowseHdl));
408 0 : }
409 :
410 0 : SvInsertPlugInDialog::~SvInsertPlugInDialog()
411 : {
412 0 : disposeOnce();
413 0 : }
414 :
415 0 : void SvInsertPlugInDialog::dispose()
416 : {
417 0 : delete m_pURL;
418 0 : m_pURL = NULL;
419 0 : m_pEdFileurl.clear();
420 0 : m_pBtnFileurl.clear();
421 0 : m_pEdPluginsOptions.clear();
422 0 : InsertObjectDialog_Impl::dispose();
423 0 : }
424 :
425 0 : static void Plugin_ImplFillCommandSequence( const OUString& aCommands, uno::Sequence< beans::PropertyValue >& aCommandSequence )
426 : {
427 : sal_Int32 nEaten;
428 0 : SvCommandList aLst;
429 0 : aLst.AppendCommands( aCommands, &nEaten );
430 :
431 0 : const size_t nCount = aLst.size();
432 0 : aCommandSequence.realloc( nCount );
433 0 : for( size_t nIndex = 0; nIndex < nCount; nIndex++ )
434 : {
435 0 : aCommandSequence[nIndex].Name = aLst[ nIndex ].GetCommand();
436 0 : aCommandSequence[nIndex].Handle = -1;
437 0 : aCommandSequence[nIndex].Value = makeAny( aLst[ nIndex ].GetArgument() );
438 0 : aCommandSequence[nIndex].State = beans::PropertyState_DIRECT_VALUE;
439 0 : }
440 0 : }
441 :
442 0 : short SvInsertPlugInDialog::Execute()
443 : {
444 0 : short nRet = RET_OK;
445 0 : m_aCommands.clear();
446 : DBG_ASSERT( m_xStorage.is(), "No storage!");
447 0 : if ( m_xStorage.is() && ( nRet = Dialog::Execute() ) == RET_OK )
448 : {
449 0 : if ( !m_pURL )
450 0 : m_pURL = new INetURLObject();
451 : else
452 0 : *m_pURL = INetURLObject();
453 :
454 0 : m_aCommands = GetPlugInOptions();
455 0 : OUString aURL = GetPlugInFile();
456 :
457 : // URL can be a valid and absolute URL or a system file name
458 0 : m_pURL->SetSmartProtocol( INetProtocol::File );
459 0 : if ( aURL.isEmpty() || m_pURL->SetSmartURL( aURL ) )
460 : {
461 : // create a plugin object
462 0 : OUString aName;
463 0 : SvGlobalName aClassId( SO3_PLUGIN_CLASSID );
464 0 : m_xObj = aCnt.CreateEmbeddedObject( aClassId.GetByteSequence(), aName );
465 : }
466 :
467 0 : if ( m_xObj.is() )
468 : {
469 : // set properties from dialog
470 0 : if ( m_xObj->getCurrentState() == embed::EmbedStates::LOADED )
471 0 : m_xObj->changeState( embed::EmbedStates::RUNNING );
472 :
473 0 : uno::Reference < beans::XPropertySet > xSet( m_xObj->getComponent(), uno::UNO_QUERY );
474 0 : if ( xSet.is() )
475 : {
476 0 : xSet->setPropertyValue( "PluginURL",
477 0 : makeAny( OUString( m_pURL->GetMainURL( INetURLObject::NO_DECODE ) ) ) );
478 0 : uno::Sequence< beans::PropertyValue > aCommandSequence;
479 0 : Plugin_ImplFillCommandSequence( m_aCommands, aCommandSequence );
480 0 : xSet->setPropertyValue( "PluginCommands", makeAny( aCommandSequence ) );
481 0 : }
482 : }
483 : else
484 : {
485 : // PlugIn couldn't be created
486 : // global Resource from svtools (former so3 resource)
487 0 : OUString aErr( impl_getSvtResString( STR_ERROR_OBJNOCREATE_PLUGIN ) );
488 0 : aErr = aErr.replaceFirst( "%", aURL );
489 0 : ScopedVclPtrInstance<MessageDialog>::Create(this, aErr)->Execute();
490 0 : }
491 : }
492 :
493 0 : return nRet;
494 : }
495 :
496 0 : SfxInsertFloatingFrameDialog::SfxInsertFloatingFrameDialog( vcl::Window *pParent,
497 : const com::sun::star::uno::Reference < com::sun::star::embed::XStorage >& xStorage )
498 : : InsertObjectDialog_Impl( pParent, "InsertFloatingFrameDialog", "cui/ui/insertfloatingframe.ui",
499 0 : xStorage )
500 : {
501 0 : Init();
502 0 : }
503 :
504 0 : SfxInsertFloatingFrameDialog::SfxInsertFloatingFrameDialog( vcl::Window *pParent,
505 : const uno::Reference < embed::XEmbeddedObject >& xObj )
506 : : InsertObjectDialog_Impl( pParent, "InsertFloatingFrameDialog", "cui/ui/insertfloatingframe.ui",
507 0 : uno::Reference < embed::XStorage >() )
508 : {
509 0 : m_xObj = xObj;
510 :
511 0 : Init();
512 0 : }
513 :
514 0 : SfxInsertFloatingFrameDialog::~SfxInsertFloatingFrameDialog()
515 : {
516 0 : disposeOnce();
517 0 : }
518 :
519 0 : void SfxInsertFloatingFrameDialog::dispose()
520 : {
521 0 : m_pEDName.clear();
522 0 : m_pEDURL.clear();
523 0 : m_pBTOpen.clear();
524 0 : m_pRBScrollingOn.clear();
525 0 : m_pRBScrollingOff.clear();
526 0 : m_pRBScrollingAuto.clear();
527 0 : m_pRBFrameBorderOn.clear();
528 0 : m_pRBFrameBorderOff.clear();
529 0 : m_pFTMarginWidth.clear();
530 0 : m_pNMMarginWidth.clear();
531 0 : m_pCBMarginWidthDefault.clear();
532 0 : m_pFTMarginHeight.clear();
533 0 : m_pNMMarginHeight.clear();
534 0 : m_pCBMarginHeightDefault.clear();
535 0 : InsertObjectDialog_Impl::dispose();
536 0 : }
537 :
538 0 : void SfxInsertFloatingFrameDialog::Init()
539 : {
540 0 : get(m_pEDName, "edname");
541 0 : get(m_pEDURL, "edurl");
542 0 : get(m_pBTOpen, "buttonbrowse");
543 0 : get(m_pRBScrollingOn, "scrollbaron");
544 0 : get(m_pRBScrollingOff, "scrollbaroff");
545 0 : get(m_pRBScrollingAuto, "scrollbarauto");
546 0 : get(m_pRBFrameBorderOn, "borderon");
547 0 : get(m_pRBFrameBorderOff, "borderoff");
548 0 : get(m_pFTMarginWidth, "widthlabel");
549 0 : get(m_pNMMarginWidth, "width");
550 0 : get(m_pCBMarginWidthDefault, "defaultwidth");
551 0 : get(m_pFTMarginHeight, "heightlabel");
552 0 : get(m_pNMMarginHeight, "height");
553 0 : get(m_pCBMarginHeightDefault, "defaultheight");
554 :
555 0 : Link<> aLink( LINK( this, SfxInsertFloatingFrameDialog, CheckHdl ) );
556 0 : m_pCBMarginWidthDefault->SetClickHdl( aLink );
557 0 : m_pCBMarginHeightDefault->SetClickHdl( aLink );
558 :
559 0 : m_pCBMarginWidthDefault->Check();
560 0 : m_pCBMarginHeightDefault->Check();
561 0 : m_pRBScrollingAuto->Check();
562 0 : m_pRBFrameBorderOn->Check();
563 :
564 0 : m_pBTOpen->SetClickHdl( LINK( this, SfxInsertFloatingFrameDialog, OpenHdl ) );
565 0 : }
566 :
567 0 : short SfxInsertFloatingFrameDialog::Execute()
568 : {
569 0 : short nRet = RET_OK;
570 0 : bool bOK = false;
571 0 : uno::Reference < beans::XPropertySet > xSet;
572 0 : if ( m_xObj.is() )
573 : {
574 : try
575 : {
576 0 : if ( m_xObj->getCurrentState() == embed::EmbedStates::LOADED )
577 0 : m_xObj->changeState( embed::EmbedStates::RUNNING );
578 0 : xSet = uno::Reference < beans::XPropertySet >( m_xObj->getComponent(), uno::UNO_QUERY );
579 0 : OUString aStr;
580 0 : uno::Any aAny = xSet->getPropertyValue( "FrameURL" );
581 0 : if ( aAny >>= aStr )
582 0 : m_pEDURL->SetText( aStr );
583 0 : aAny = xSet->getPropertyValue( "FrameName" );
584 0 : if ( aAny >>= aStr )
585 0 : m_pEDName->SetText( aStr );
586 :
587 0 : sal_Int32 nSize = SIZE_NOT_SET;
588 0 : aAny = xSet->getPropertyValue( "FrameMarginWidth" );
589 0 : aAny >>= nSize;
590 :
591 0 : if ( nSize == SIZE_NOT_SET )
592 : {
593 0 : m_pCBMarginWidthDefault->Check( true );
594 0 : m_pNMMarginWidth->SetText( OUString::number(DEFAULT_MARGIN_WIDTH) );
595 0 : m_pFTMarginWidth->Enable( false );
596 0 : m_pNMMarginWidth->Enable( false );
597 : }
598 : else
599 0 : m_pNMMarginWidth->SetText( OUString::number( nSize ) );
600 :
601 0 : aAny = xSet->getPropertyValue( "FrameMarginHeight" );
602 0 : aAny >>= nSize;
603 :
604 0 : if ( nSize == SIZE_NOT_SET )
605 : {
606 0 : m_pCBMarginHeightDefault->Check( true );
607 0 : m_pNMMarginHeight->SetText( OUString::number(DEFAULT_MARGIN_HEIGHT) );
608 0 : m_pFTMarginHeight->Enable( false );
609 0 : m_pNMMarginHeight->Enable( false );
610 : }
611 : else
612 0 : m_pNMMarginHeight->SetText( OUString::number( nSize ) );
613 :
614 0 : bool bScrollOn = false;
615 0 : bool bScrollOff = false;
616 0 : bool bScrollAuto = false;
617 :
618 0 : bool bSet = false;
619 0 : aAny = xSet->getPropertyValue( "FrameIsAutoScroll" );
620 0 : aAny >>= bSet;
621 0 : if ( !bSet )
622 : {
623 0 : aAny = xSet->getPropertyValue( "FrameIsScrollingMode" );
624 0 : aAny >>= bSet;
625 0 : bScrollOn = bSet;
626 0 : bScrollOff = !bSet;
627 : }
628 : else
629 0 : bScrollAuto = true;
630 :
631 0 : m_pRBScrollingOn->Check( bScrollOn );
632 0 : m_pRBScrollingOff->Check( bScrollOff );
633 0 : m_pRBScrollingAuto->Check( bScrollAuto );
634 :
635 0 : bSet = false;
636 0 : aAny = xSet->getPropertyValue( "FrameIsAutoBorder" );
637 0 : aAny >>= bSet;
638 0 : if ( !bSet )
639 : {
640 0 : aAny = xSet->getPropertyValue( "FrameIsBorder" );
641 0 : aAny >>= bSet;
642 0 : m_pRBFrameBorderOn->Check( bSet );
643 0 : m_pRBFrameBorderOff->Check( !bSet );
644 : }
645 :
646 0 : SetUpdateMode( true );
647 0 : bOK = true;
648 : }
649 0 : catch ( uno::Exception& )
650 : {
651 : OSL_FAIL( "No IFrame!" );
652 : }
653 : }
654 : else
655 : {
656 : DBG_ASSERT( m_xStorage.is(), "No storage!");
657 0 : bOK = m_xStorage.is();
658 : }
659 :
660 0 : if ( bOK && ( nRet = Dialog::Execute() ) == RET_OK )
661 : {
662 0 : OUString aURL;
663 0 : if ( !m_pEDURL->GetText().isEmpty() )
664 : {
665 : // URL can be a valid and absolute URL or a system file name
666 0 : INetURLObject aObj;
667 0 : aObj.SetSmartProtocol( INetProtocol::File );
668 0 : if ( aObj.SetSmartURL( m_pEDURL->GetText() ) )
669 0 : aURL = aObj.GetMainURL( INetURLObject::NO_DECODE );
670 : }
671 :
672 0 : if ( !m_xObj.is() && !aURL.isEmpty() )
673 : {
674 : // create the object
675 0 : OUString aName;
676 0 : SvGlobalName aClassId( SO3_IFRAME_CLASSID );
677 0 : m_xObj = aCnt.CreateEmbeddedObject( aClassId.GetByteSequence(), aName );
678 0 : if ( m_xObj->getCurrentState() == embed::EmbedStates::LOADED )
679 0 : m_xObj->changeState( embed::EmbedStates::RUNNING );
680 0 : xSet = uno::Reference < beans::XPropertySet >( m_xObj->getComponent(), uno::UNO_QUERY );
681 : }
682 :
683 0 : if ( m_xObj.is() )
684 : {
685 : try
686 : {
687 0 : bool bIPActive = m_xObj->getCurrentState() == embed::EmbedStates::INPLACE_ACTIVE;
688 0 : if ( bIPActive )
689 0 : m_xObj->changeState( embed::EmbedStates::RUNNING );
690 :
691 0 : OUString aName = m_pEDName->GetText();
692 0 : ScrollingMode eScroll = ScrollingNo;
693 0 : if ( m_pRBScrollingOn->IsChecked() )
694 0 : eScroll = ScrollingYes;
695 0 : if ( m_pRBScrollingOff->IsChecked() )
696 0 : eScroll = ScrollingNo;
697 0 : if ( m_pRBScrollingAuto->IsChecked() )
698 0 : eScroll = ScrollingAuto;
699 :
700 0 : bool bHasBorder = m_pRBFrameBorderOn->IsChecked();
701 :
702 : long lMarginWidth;
703 0 : if ( !m_pCBMarginWidthDefault->IsChecked() )
704 0 : lMarginWidth = (long) m_pNMMarginWidth->GetText().toInt32();
705 : else
706 0 : lMarginWidth = SIZE_NOT_SET;
707 :
708 : long lMarginHeight;
709 0 : if ( !m_pCBMarginHeightDefault->IsChecked() )
710 0 : lMarginHeight = (long) m_pNMMarginHeight->GetText().toInt32();
711 : else
712 0 : lMarginHeight = SIZE_NOT_SET;
713 :
714 0 : xSet->setPropertyValue( "FrameURL", makeAny( aURL ) );
715 0 : xSet->setPropertyValue( "FrameName", makeAny( aName ) );
716 :
717 0 : if ( eScroll == ScrollingAuto )
718 0 : xSet->setPropertyValue( "FrameIsAutoScroll", makeAny( true ) );
719 : else
720 0 : xSet->setPropertyValue( "FrameIsScrollingMode", makeAny( eScroll == ScrollingYes ) );
721 :
722 0 : xSet->setPropertyValue( "FrameIsBorder", makeAny( bHasBorder ) );
723 0 : xSet->setPropertyValue( "FrameMarginWidth", makeAny( sal_Int32( lMarginWidth ) ) );
724 0 : xSet->setPropertyValue( "FrameMarginHeight", makeAny( sal_Int32( lMarginHeight ) ) );
725 :
726 0 : if ( bIPActive )
727 0 : m_xObj->changeState( embed::EmbedStates::INPLACE_ACTIVE );
728 : }
729 0 : catch ( uno::Exception& )
730 : {
731 : OSL_FAIL( "No IFrame!" );
732 : }
733 0 : }
734 : }
735 :
736 0 : return nRet;
737 : }
738 :
739 :
740 :
741 0 : IMPL_LINK( SfxInsertFloatingFrameDialog, CheckHdl, CheckBox*, pCB )
742 : {
743 0 : if ( pCB == m_pCBMarginWidthDefault )
744 : {
745 0 : if ( pCB->IsChecked() )
746 0 : m_pNMMarginWidth->SetText( OUString::number(DEFAULT_MARGIN_WIDTH) );
747 0 : m_pFTMarginWidth->Enable( !pCB->IsChecked() );
748 0 : m_pNMMarginWidth->Enable( !pCB->IsChecked() );
749 : }
750 :
751 0 : if ( pCB == m_pCBMarginHeightDefault )
752 : {
753 0 : if ( pCB->IsChecked() )
754 0 : m_pNMMarginHeight->SetText( OUString::number(DEFAULT_MARGIN_HEIGHT) );
755 0 : m_pFTMarginHeight->Enable( !pCB->IsChecked() );
756 0 : m_pNMMarginHeight->Enable( !pCB->IsChecked() );
757 : }
758 :
759 0 : return 0L;
760 : }
761 :
762 :
763 :
764 0 : IMPL_LINK( SfxInsertFloatingFrameDialog, OpenHdl, PushButton*, )
765 : {
766 0 : vcl::Window* pOldParent = Application::GetDefDialogParent();
767 0 : Application::SetDefDialogParent( this );
768 :
769 : // create the file dialog
770 : sfx2::FileDialogHelper aFileDlg(
771 0 : ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, 0, OUString() );
772 :
773 : // set the title
774 0 : aFileDlg.SetTitle(CUI_RESSTR(RID_SVXSTR_SELECT_FILE_IFRAME));
775 :
776 : // show the dialog
777 0 : if ( aFileDlg.Execute() == ERRCODE_NONE )
778 0 : m_pEDURL->SetText(
779 0 : INetURLObject( aFileDlg.GetPath() ).GetMainURL( INetURLObject::DECODE_WITH_CHARSET ) );
780 :
781 0 : Application::SetDefDialogParent( pOldParent );
782 0 : return 0L;
783 0 : }
784 :
785 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|