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_fpicker.hxx"
26
27 //------------------------------------------------------------------------
28 // includes
29 //------------------------------------------------------------------------
30
31 #include <tchar.h>
32 #include <com/sun/star/lang/DisposedException.hpp>
33 #include <cppuhelper/interfacecontainer.h>
34 #include <osl/diagnose.h>
35
36 #ifndef _FILEPICKER_HXX_
37 #include "filepicker.hxx"
38 #endif
39 #include "WinFileOpenImpl.hxx"
40
41 #include "FPServiceInfo.hxx"
42 #include "..\misc\WinImplHelper.hxx"
43 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
44 #include "filepickereventnotification.hxx"
45
46 #include <comphelper/sequenceasvector.hxx>
47
48 //------------------------------------------------------------------------
49 // namespace directives
50 //------------------------------------------------------------------------
51
52 using namespace com::sun::star;
53
54 using namespace ::com::sun::star::ui::dialogs;
55 using namespace ::com::sun::star::ui::dialogs::TemplateDescription;
56
57 //------------------------------------------------------------------------
58 // defines
59 //------------------------------------------------------------------------
60
61 #define FILE_PICKER_DLL_NAME TEXT("fps.dll")
62
63 //------------------------------------------------------------------------
64 // helper functions
65 //------------------------------------------------------------------------
66
67 namespace
68 {
69 // controlling event notifications
70 const bool STARTUP_SUSPENDED = true;
71 const bool STARTUP_ALIVE = false;
72
FilePicker_getSupportedServiceNames()73 uno::Sequence<rtl::OUString> SAL_CALL FilePicker_getSupportedServiceNames()
74 {
75 uno::Sequence<rtl::OUString> aRet(2);
76 aRet[0] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.FilePicker");
77 aRet[1] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.SystemFilePicker");
78 return aRet;
79 }
80 }
81
82 //-----------------------------------------------------------------------------------------
83 //
84 //-----------------------------------------------------------------------------------------
85
CFilePicker(const uno::Reference<lang::XMultiServiceFactory> & xServiceMgr)86 CFilePicker::CFilePicker( const uno::Reference<lang::XMultiServiceFactory>& xServiceMgr) :
87 cppu::WeakComponentImplHelper10<
88 XFilterManager,
89 XFilterGroupManager,
90 XFilePickerControlAccess,
91 XFilePickerNotifier,
92 XFilePreview,
93 XFilePicker2,
94 lang::XInitialization,
95 util::XCancellable,
96 lang::XEventListener,
97 lang::XServiceInfo>(m_rbHelperMtx),
98 m_xServiceMgr(xServiceMgr),
99 m_aAsyncEventNotifier(rBHelper)
100 {
101 HINSTANCE hInstance = GetModuleHandle(FILE_PICKER_DLL_NAME);
102 OSL_POSTCOND( hInstance, "The name of the service dll must have changed" );
103
104 // create a default FileOpen dialog without any additional ui elements
105 m_pImpl = std::auto_ptr< CWinFileOpenImpl >(
106 new CWinFileOpenImpl(
107 this,
108 true,
109 0,
110 0,
111 hInstance ) );
112 }
113
114 //------------------------------------------------------------------------------------
115 // XFPEventListenerManager
116 //------------------------------------------------------------------------------------
117
addFilePickerListener(const uno::Reference<XFilePickerListener> & xListener)118 void SAL_CALL CFilePicker::addFilePickerListener(const uno::Reference<XFilePickerListener>& xListener)
119 throw(uno::RuntimeException)
120 {
121 if ( rBHelper.bDisposed )
122 throw lang::DisposedException(
123 rtl::OUString::createFromAscii( "object is already disposed" ),
124 static_cast< XFilePicker2* >( this ) );
125
126 if ( !rBHelper.bInDispose && !rBHelper.bDisposed )
127 rBHelper.aLC.addInterface( getCppuType( &xListener ), xListener );
128 }
129
130 //-----------------------------------------------------------------------------------------
131 //
132 //-----------------------------------------------------------------------------------------
133
removeFilePickerListener(const uno::Reference<XFilePickerListener> & xListener)134 void SAL_CALL CFilePicker::removeFilePickerListener(const uno::Reference<XFilePickerListener>& xListener )
135 throw(uno::RuntimeException)
136 {
137 if ( rBHelper.bDisposed )
138 throw lang::DisposedException(
139 rtl::OUString::createFromAscii( "object is already disposed" ),
140 static_cast< XFilePicker2* >( this ) );
141
142 rBHelper.aLC.removeInterface( getCppuType( &xListener ), xListener );
143 }
144
145 // -------------------------------------------------
146 // XEventListener
147 // -------------------------------------------------
148
disposing(const lang::EventObject & aEvent)149 void SAL_CALL CFilePicker::disposing(const lang::EventObject& aEvent) throw(uno::RuntimeException)
150 {
151 uno::Reference<XFilePickerListener> xFilePickerListener(aEvent.Source, ::com::sun::star::uno::UNO_QUERY);
152
153 if (xFilePickerListener.is())
154 removeFilePickerListener(xFilePickerListener);
155 }
156
157 //-----------------------------------------------------------------------------------------
158 //
159 //-----------------------------------------------------------------------------------------
160
fileSelectionChanged(FilePickerEvent aEvent)161 void SAL_CALL CFilePicker::fileSelectionChanged(FilePickerEvent aEvent)
162 {
163 aEvent.Source = uno::Reference<uno::XInterface>(static_cast<XFilePickerNotifier*>(this));
164 m_aAsyncEventNotifier.notifyEvent(
165 new CFilePickerParamEventNotification(&XFilePickerListener::fileSelectionChanged,aEvent));
166 }
167
168 //-----------------------------------------------------------------------------------------
169 //
170 //-----------------------------------------------------------------------------------------
171
directoryChanged(FilePickerEvent aEvent)172 void SAL_CALL CFilePicker::directoryChanged(FilePickerEvent aEvent)
173 {
174 aEvent.Source = uno::Reference<uno::XInterface>(static_cast<XFilePickerNotifier*>(this));
175 m_aAsyncEventNotifier.notifyEvent(
176 new CFilePickerParamEventNotification(&XFilePickerListener::directoryChanged,aEvent));
177 }
178
179 //-----------------------------------------------------------------------------------------
180 //
181 //-----------------------------------------------------------------------------------------
182
controlStateChanged(FilePickerEvent aEvent)183 void SAL_CALL CFilePicker::controlStateChanged(FilePickerEvent aEvent)
184 {
185 aEvent.Source = uno::Reference<uno::XInterface>(static_cast<XFilePickerNotifier*>(this));
186 m_aAsyncEventNotifier.notifyEvent(
187 new CFilePickerParamEventNotification(&XFilePickerListener::controlStateChanged,aEvent));
188 }
189
190 //-----------------------------------------------------------------------------------------
191 //
192 //-----------------------------------------------------------------------------------------
193
dialogSizeChanged()194 void SAL_CALL CFilePicker::dialogSizeChanged()
195 {
196 m_aAsyncEventNotifier.notifyEvent(
197 new CFilePickerEventNotification(&XFilePickerListener::dialogSizeChanged));
198 }
199
200 //-----------------------------------------------------------------------------------------
201 // If there are more then one listener the return value of the last one wins
202 //-----------------------------------------------------------------------------------------
203
helpRequested(FilePickerEvent aEvent) const204 rtl::OUString SAL_CALL CFilePicker::helpRequested(FilePickerEvent aEvent) const
205 {
206 rtl::OUString aHelpText;
207
208 ::cppu::OInterfaceContainerHelper* pICHelper =
209 rBHelper.getContainer( getCppuType((uno::Reference<XFilePickerListener>*)0));
210
211 if (pICHelper)
212 {
213 ::cppu::OInterfaceIteratorHelper iter(*pICHelper);
214
215 while(iter.hasMoreElements())
216 {
217 try
218 {
219 /*
220 if there are multiple listeners responding
221 to this notification the next response
222 overwrittes the one before if it is not empty
223 */
224
225 rtl::OUString temp;
226
227 uno::Reference<XFilePickerListener> xFPListener(iter.next(), uno::UNO_QUERY);
228 if (xFPListener.is())
229 {
230 temp = xFPListener->helpRequested(aEvent);
231 if (temp.getLength())
232 aHelpText = temp;
233 }
234
235 }
236 catch(uno::RuntimeException&)
237 {
238 OSL_ENSURE( false, "RuntimeException during event dispatching" );
239 }
240 }
241 }
242
243 return aHelpText;
244 }
245
246 //-------------------------------------
247 //
248 //-------------------------------------
249
startupEventNotification(bool bStartupSuspended)250 bool CFilePicker::startupEventNotification(bool bStartupSuspended)
251 {
252 return m_aAsyncEventNotifier.startup(bStartupSuspended);
253 }
254
255 //-------------------------------------
256 //
257 //-------------------------------------
258
shutdownEventNotification()259 void CFilePicker::shutdownEventNotification()
260 {
261 m_aAsyncEventNotifier.shutdown();
262 }
263
264 //-------------------------------------
265 //
266 //-------------------------------------
267
suspendEventNotification()268 void CFilePicker::suspendEventNotification()
269 {
270 m_aAsyncEventNotifier.suspend();
271 }
272
273 //-------------------------------------
274 //
275 //-------------------------------------
276
resumeEventNotification()277 void CFilePicker::resumeEventNotification()
278 {
279 m_aAsyncEventNotifier.resume();
280 }
281
282 //------------------------------------------------------------------------------------
283 // XFilePicker functions
284 //------------------------------------------------------------------------------------
285
setMultiSelectionMode(sal_Bool bMode)286 void SAL_CALL CFilePicker::setMultiSelectionMode(sal_Bool bMode) throw(uno::RuntimeException)
287 {
288 OSL_ASSERT(0 != m_pImpl.get());
289 osl::MutexGuard aGuard(m_aMutex);
290 m_pImpl->setMultiSelectionMode(bMode);
291 }
292
293 //-----------------------------------------------------------------------------------------
294 //
295 //-----------------------------------------------------------------------------------------
296
setTitle(const rtl::OUString & aTitle)297 void SAL_CALL CFilePicker::setTitle(const rtl::OUString& aTitle) throw(uno::RuntimeException)
298 {
299 OSL_ASSERT(0 != m_pImpl.get());
300 osl::MutexGuard aGuard(m_aMutex);
301 m_pImpl->setTitle(aTitle);
302 }
303
304 //-----------------------------------------------------------------------------------------
305 //
306 //-----------------------------------------------------------------------------------------
307
appendFilter(const rtl::OUString & aTitle,const rtl::OUString & aFilter)308 void SAL_CALL CFilePicker::appendFilter(const rtl::OUString& aTitle, const rtl::OUString& aFilter)
309 throw(lang::IllegalArgumentException, uno::RuntimeException)
310 {
311 OSL_ASSERT(0 != m_pImpl.get());
312 osl::MutexGuard aGuard(m_aMutex);
313 m_pImpl->appendFilter(aTitle, aFilter);
314 }
315
316 //-----------------------------------------------------------------------------------------
317 //
318 //-----------------------------------------------------------------------------------------
319
setCurrentFilter(const rtl::OUString & aTitle)320 void SAL_CALL CFilePicker::setCurrentFilter(const rtl::OUString& aTitle)
321 throw(lang::IllegalArgumentException, uno::RuntimeException)
322 {
323 OSL_ASSERT(0 != m_pImpl.get());
324 osl::MutexGuard aGuard(m_aMutex);
325 m_pImpl->setCurrentFilter(aTitle);
326 }
327
328 //-----------------------------------------------------------------------------------------
329 //
330 //-----------------------------------------------------------------------------------------
331
getCurrentFilter()332 rtl::OUString SAL_CALL CFilePicker::getCurrentFilter() throw(uno::RuntimeException)
333 {
334 OSL_ASSERT(0 != m_pImpl.get());
335 osl::MutexGuard aGuard(m_aMutex);
336 return m_pImpl->getCurrentFilter();
337 }
338
339 //-----------------------------------------------------------------------------------------
340 //
341 //-----------------------------------------------------------------------------------------
342
appendFilterGroup(const rtl::OUString & sGroupTitle,const uno::Sequence<beans::StringPair> & aFilters)343 void SAL_CALL CFilePicker::appendFilterGroup(const rtl::OUString& sGroupTitle, const uno::Sequence<beans::StringPair>& aFilters)
344 throw (lang::IllegalArgumentException, uno::RuntimeException)
345 {
346 OSL_ASSERT(0 != m_pImpl.get());
347 osl::MutexGuard aGuard(m_aMutex);
348 m_pImpl->appendFilterGroup(sGroupTitle, aFilters);
349 }
350
351 //-----------------------------------------------------------------------------------------
352 //
353 //-----------------------------------------------------------------------------------------
354
setDefaultName(const rtl::OUString & aName)355 void SAL_CALL CFilePicker::setDefaultName(const rtl::OUString& aName)
356 throw(uno::RuntimeException)
357 {
358 OSL_ASSERT(0 != m_pImpl.get());
359 osl::MutexGuard aGuard(m_aMutex);
360 m_pImpl->setDefaultName(aName);
361 }
362
363 //-----------------------------------------------------------------------------------------
364 //
365 //-----------------------------------------------------------------------------------------
366
setDisplayDirectory(const rtl::OUString & aDirectory)367 void SAL_CALL CFilePicker::setDisplayDirectory(const rtl::OUString& aDirectory)
368 throw(lang::IllegalArgumentException, uno::RuntimeException)
369 {
370 OSL_ASSERT(0 != m_pImpl.get());
371 osl::MutexGuard aGuard(m_aMutex);
372 m_pImpl->setDisplayDirectory(aDirectory);
373 }
374
375 //-----------------------------------------------------------------------------------------
376 //
377 //-----------------------------------------------------------------------------------------
378
getDisplayDirectory()379 rtl::OUString SAL_CALL CFilePicker::getDisplayDirectory() throw(uno::RuntimeException)
380 {
381 OSL_ASSERT(0 != m_pImpl.get());
382 osl::MutexGuard aGuard(m_aMutex);
383 return m_pImpl->getDisplayDirectory();
384 }
385
386 //-----------------------------------------------------------------------------------------
387 //
388 //-----------------------------------------------------------------------------------------
389
getFiles()390 uno::Sequence<rtl::OUString> SAL_CALL CFilePicker::getFiles() throw(uno::RuntimeException)
391 {
392 OSL_ASSERT(0 != m_pImpl.get());
393 osl::MutexGuard aGuard(m_aMutex);
394 return m_pImpl->getFiles();
395 }
396
397 //-----------------------------------------------------------------------------------------
398 //
399 //-----------------------------------------------------------------------------------------
getSelectedFiles()400 uno::Sequence< ::rtl::OUString > SAL_CALL CFilePicker::getSelectedFiles() throw (uno::RuntimeException)
401 {
402 OSL_ASSERT(0 != m_pImpl.get());
403 osl::MutexGuard aGuard(m_aMutex);
404
405 const uno::Sequence< ::rtl::OUString > lSource = m_pImpl->getFiles();
406 const ::sal_Int32 c = lSource.getLength();
407 if (c < 2)
408 return lSource;
409
410 const ::rtl::OUString sPath = lSource[0];
411 ::comphelper::SequenceAsVector< ::rtl::OUString > lTarget;
412 ::sal_Int32 i = 1;
413 for (i=1; i<c; ++i)
414 {
415 const ::rtl::OUString sFile = lSource[i];
416 if (sFile.indexOf ('/') > 0)
417 {
418 // a) file contains own path !
419 lTarget.push_back(sFile);
420 }
421 else
422 {
423 // b) file is relative to given path
424 ::rtl::OUStringBuffer sFull(256);
425
426 sFull.append (sPath);
427 sFull.appendAscii("/" );
428 sFull.append (sFile);
429
430 lTarget.push_back(sFull.makeStringAndClear());
431 }
432 }
433
434 return lTarget.getAsConstList();
435 }
436
437 //-----------------------------------------------------------------------------------------
438 //
439 //-----------------------------------------------------------------------------------------
440
execute()441 sal_Int16 SAL_CALL CFilePicker::execute() throw(uno::RuntimeException)
442 {
443 OSL_ASSERT(0 != m_pImpl.get());
444
445 sal_Int16 ret;
446
447 if (startupEventNotification(STARTUP_SUSPENDED))
448 {
449 // we should not block in this call else
450 // in the case of an event the client can't
451 // call another function an we run into a
452 // deadlock !!!!!
453 ret = m_pImpl->execute( );
454
455 shutdownEventNotification();
456 }
457 else
458 {
459 OSL_ENSURE(sal_False, "Could not start event notifier thread!");
460
461 throw uno::RuntimeException(
462 rtl::OUString::createFromAscii("Error executing dialog"),
463 static_cast<XFilePicker2*>(this));
464 }
465
466 return ret;
467 }
468
469 //------------------------------------------------------------------------------------
470 // XFilePicker functions
471 //------------------------------------------------------------------------------------
472
setValue(sal_Int16 aControlId,sal_Int16 aControlAction,const uno::Any & aValue)473 void SAL_CALL CFilePicker::setValue(sal_Int16 aControlId, sal_Int16 aControlAction, const uno::Any& aValue)
474 throw(uno::RuntimeException)
475 {
476 OSL_ASSERT(0 != m_pImpl.get());
477
478 osl::MutexGuard aGuard(m_aMutex);
479 m_pImpl->setValue(aControlId, aControlAction, aValue);
480 }
481
482 //-----------------------------------------------------------------------------------------
483 //
484 //-----------------------------------------------------------------------------------------
485
getValue(sal_Int16 aControlId,sal_Int16 aControlAction)486 uno::Any SAL_CALL CFilePicker::getValue(sal_Int16 aControlId, sal_Int16 aControlAction)
487 throw(uno::RuntimeException)
488 {
489 OSL_ASSERT(0 != m_pImpl.get());
490
491 osl::MutexGuard aGuard(m_aMutex);
492 return m_pImpl->getValue(aControlId, aControlAction);
493 }
494
495 //-----------------------------------------------------------------------------------------
496 //
497 //-----------------------------------------------------------------------------------------
498
enableControl(sal_Int16 aControlId,sal_Bool bEnable)499 void SAL_CALL CFilePicker::enableControl(sal_Int16 aControlId, sal_Bool bEnable)
500 throw(uno::RuntimeException)
501 {
502 OSL_ASSERT( 0 != m_pImpl.get( ) );
503
504 osl::MutexGuard aGuard( m_aMutex );
505 m_pImpl->enableControl( aControlId, bEnable );
506 }
507
508 //-----------------------------------------------------------------------------------------
509 //
510 //-----------------------------------------------------------------------------------------
511
setLabel(sal_Int16 aControlId,const::rtl::OUString & aLabel)512 void SAL_CALL CFilePicker::setLabel(sal_Int16 aControlId, const ::rtl::OUString& aLabel)
513 throw (uno::RuntimeException)
514 {
515 OSL_ASSERT(0 != m_pImpl.get());
516
517 osl::MutexGuard aGuard(m_aMutex);
518 m_pImpl->setLabel(aControlId, aLabel);
519 }
520
521 //-----------------------------------------------------------------------------------------
522 //
523 //-----------------------------------------------------------------------------------------
524
getLabel(sal_Int16 aControlId)525 rtl::OUString SAL_CALL CFilePicker::getLabel(sal_Int16 aControlId)
526 throw (uno::RuntimeException)
527 {
528 OSL_ASSERT(0 != m_pImpl.get());
529
530 osl::MutexGuard aGuard(m_aMutex);
531 return m_pImpl->getLabel(aControlId);
532 }
533
534 //------------------------------------------------------------------------------------
535 //
536 //------------------------------------------------------------------------------------
537
getSupportedImageFormats()538 uno::Sequence<sal_Int16> SAL_CALL CFilePicker::getSupportedImageFormats() throw (uno::RuntimeException)
539 {
540 OSL_ASSERT(0 != m_pImpl.get());
541
542 osl::MutexGuard aGuard(m_aMutex);
543 return m_pImpl->getSupportedImageFormats();
544 }
545
546 //------------------------------------------------------------------------------------
547 //
548 //------------------------------------------------------------------------------------
549
getTargetColorDepth()550 sal_Int32 SAL_CALL CFilePicker::getTargetColorDepth() throw (uno::RuntimeException)
551 {
552 OSL_ASSERT(0 != m_pImpl.get());
553
554 osl::MutexGuard aGuard(m_aMutex);
555 return m_pImpl->getTargetColorDepth();
556 }
557
558 //------------------------------------------------------------------------------------
559 //
560 //------------------------------------------------------------------------------------
561
getAvailableWidth()562 sal_Int32 SAL_CALL CFilePicker::getAvailableWidth() throw (uno::RuntimeException)
563 {
564 OSL_ASSERT(0 != m_pImpl.get());
565
566 osl::MutexGuard aGuard(m_aMutex);
567 return m_pImpl->getAvailableWidth();
568 }
569
570 //------------------------------------------------------------------------------------
571 //
572 //------------------------------------------------------------------------------------
573
getAvailableHeight()574 sal_Int32 SAL_CALL CFilePicker::getAvailableHeight() throw (uno::RuntimeException)
575 {
576 OSL_ASSERT(0 != m_pImpl.get());
577
578 osl::MutexGuard aGuard(m_aMutex);
579 return m_pImpl->getAvailableHeight();
580 }
581
582 //------------------------------------------------------------------------------------
583 //
584 //------------------------------------------------------------------------------------
585
setImage(sal_Int16 aImageFormat,const uno::Any & aImage)586 void SAL_CALL CFilePicker::setImage(sal_Int16 aImageFormat, const uno::Any& aImage)
587 throw (lang::IllegalArgumentException, uno::RuntimeException)
588 {
589 OSL_ASSERT(0 != m_pImpl.get());
590
591 osl::MutexGuard aGuard(m_aMutex);
592 m_pImpl->setImage(aImageFormat, aImage);
593 }
594
595 //------------------------------------------------------------------------------------
596 //
597 //------------------------------------------------------------------------------------
598
setShowState(sal_Bool bShowState)599 sal_Bool SAL_CALL CFilePicker::setShowState(sal_Bool bShowState) throw (uno::RuntimeException)
600 {
601 OSL_ASSERT(0 != m_pImpl.get());
602
603 osl::MutexGuard aGuard(m_aMutex);
604 return m_pImpl->setShowState(bShowState);
605 }
606
607 //------------------------------------------------------------------------------------
608 //
609 //------------------------------------------------------------------------------------
610
getShowState()611 sal_Bool SAL_CALL CFilePicker::getShowState() throw (uno::RuntimeException)
612 {
613 OSL_ASSERT(0 != m_pImpl.get());
614
615 osl::MutexGuard aGuard(m_aMutex);
616 return m_pImpl->getShowState();
617 }
618
619 //------------------------------------------------------------------------------------
620 //
621 //------------------------------------------------------------------------------------
622
initialize(const uno::Sequence<uno::Any> & aArguments)623 void SAL_CALL CFilePicker::initialize(const uno::Sequence<uno::Any>& aArguments)
624 throw( uno::Exception, uno::RuntimeException)
625 {
626 // parameter checking
627 uno::Any aAny;
628 if ( 0 == aArguments.getLength( ) )
629 throw lang::IllegalArgumentException(
630 rtl::OUString::createFromAscii( "no arguments" ),
631 static_cast<XFilePicker2*>(this), 1);
632
633 aAny = aArguments[0];
634
635 if ( (aAny.getValueType() != ::getCppuType((sal_Int16*)0)) &&
636 (aAny.getValueType() != ::getCppuType((sal_Int8*)0)) )
637 throw lang::IllegalArgumentException(
638 rtl::OUString::createFromAscii("invalid argument type"),
639 static_cast<XFilePicker2*>(this), 1);
640
641 sal_Int16 templateId = -1;
642 aAny >>= templateId;
643
644 sal_Bool bFileOpenDialog = sal_True;
645 sal_uInt32 winResTemplateId = 0;
646 sal_Bool bIsWin2000 = IsWindows2000Platform();
647
648 switch ( templateId )
649 {
650 case FILEOPEN_SIMPLE:
651 bFileOpenDialog = sal_True;
652 break;
653
654 case FILESAVE_SIMPLE:
655 bFileOpenDialog = sal_False;
656 break;
657
658 case FILESAVE_AUTOEXTENSION_PASSWORD:
659 bFileOpenDialog = sal_False;
660 if ( bIsWin2000 )
661 winResTemplateId = TMPL2000_FILESAVE_AUTOEXT_PASSWORD_BOX_ID;
662 else
663 winResTemplateId = TMPL95_FILESAVE_AUTOEXT_PASSWORD_BOX_ID;
664 break;
665
666 case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
667 bFileOpenDialog = sal_False;
668 if ( bIsWin2000 )
669 winResTemplateId = TMPL2000_AUTOEXT_PASSWORD_FILTEROPTION_BOX;
670 else
671 winResTemplateId = TMPL95_AUTOEXT_PASSWORD_FILTEROPTION_BOX;
672 break;
673
674 case FILESAVE_AUTOEXTENSION_SELECTION:
675 bFileOpenDialog = sal_False;
676 if ( bIsWin2000 )
677 winResTemplateId = TMPL2000_AUTOEXT_SELECTION_BOX;
678 else
679 winResTemplateId = TMPL95_AUTOEXT_SELECTION_BOX;
680 break;
681
682 case FILESAVE_AUTOEXTENSION_TEMPLATE:
683 bFileOpenDialog = sal_False;
684 if ( bIsWin2000 )
685 winResTemplateId = TMPL2000_FILEOPEN_AUTOEXT_TEMPLATE_BOX_ID;
686 else
687 winResTemplateId = TMPL95_FILEOPEN_AUTOEXT_TEMPLATE_BOX_ID;
688 break;
689
690 case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE:
691 if ( bIsWin2000 )
692 winResTemplateId = TMPL2000_FILEOPEN_LINK_PREVIEW_BOX_ID;
693 else
694 winResTemplateId = TMPL95_FILEOPEN_LINK_PREVIEW_BOX_ID;
695 break;
696
697 case FILEOPEN_PLAY:
698 if ( bIsWin2000 )
699 winResTemplateId = TMPL2000_PLAY_PUSHBUTTON;
700 else
701 winResTemplateId = TMPL95_PLAY_PUSHBUTTON;
702 break;
703
704 case FILEOPEN_READONLY_VERSION:
705 if ( bIsWin2000 )
706 winResTemplateId = TMPL2000_FILEOPEN_READONLY_VERSION_BOX_ID;
707 else
708 winResTemplateId = TMPL95_FILEOPEN_READONLY_VERSION_BOX_ID;
709 break;
710
711 case FILEOPEN_LINK_PREVIEW:
712 if ( bIsWin2000 )
713 winResTemplateId = TMPL2000_FILEOPEN_LINK_PREVIEW_BOX_SIMPLE_ID;
714 else
715 winResTemplateId = TMPL95_FILEOPEN_LINK_PREVIEW_BOX_SIMPLE_ID;
716 break;
717
718 case FILESAVE_AUTOEXTENSION:
719 bFileOpenDialog = sal_False;
720 if ( bIsWin2000 )
721 winResTemplateId = TMPL2000_FILESAVE_AUTOEXT;
722 else
723 winResTemplateId = TMPL95_FILESAVE_AUTOEXT;
724 break;
725
726 default:
727 throw lang::IllegalArgumentException(
728 rtl::OUString::createFromAscii( "Unknown template" ),
729 static_cast< XFilePicker2* >( this ),
730 1 );
731 }
732
733 HINSTANCE hInstance = GetModuleHandle( FILE_PICKER_DLL_NAME );
734 OSL_POSTCOND( hInstance, "The name of the service dll must have changed" );
735
736 // create a new impl-class here based on the
737 // given string, if the given string is empty
738 // we do nothing
739 m_pImpl = std::auto_ptr< CWinFileOpenImpl >(
740 new CWinFileOpenImpl(
741 this,
742 bFileOpenDialog,
743 0,
744 winResTemplateId,
745 hInstance ) );
746 }
747
748 //------------------------------------------------------------------------------------
749 //
750 //------------------------------------------------------------------------------------
751
cancel()752 void SAL_CALL CFilePicker::cancel()
753 throw(uno::RuntimeException)
754 {
755 OSL_ASSERT(m_pImpl.get());
756
757 osl::MutexGuard aGuard(m_aMutex);
758 m_pImpl->cancel();
759 }
760
761 // -------------------------------------------------
762 // XServiceInfo
763 // -------------------------------------------------
764
getImplementationName()765 rtl::OUString SAL_CALL CFilePicker::getImplementationName()
766 throw(uno::RuntimeException)
767 {
768 return rtl::OUString::createFromAscii(FILE_PICKER_IMPL_NAME);
769 }
770
771 // -------------------------------------------------
772 // XServiceInfo
773 // -------------------------------------------------
774
supportsService(const rtl::OUString & ServiceName)775 sal_Bool SAL_CALL CFilePicker::supportsService(const rtl::OUString& ServiceName)
776 throw(uno::RuntimeException )
777 {
778 uno::Sequence <rtl::OUString> SupportedServicesNames = FilePicker_getSupportedServiceNames();
779
780 for (sal_Int32 n = SupportedServicesNames.getLength(); n--;)
781 if (SupportedServicesNames[n].compareTo(ServiceName) == 0)
782 return sal_True;
783
784 return sal_False;
785 }
786
787 // -------------------------------------------------
788 // XServiceInfo
789 // -------------------------------------------------
790
getSupportedServiceNames()791 uno::Sequence<rtl::OUString> SAL_CALL CFilePicker::getSupportedServiceNames()
792 throw(uno::RuntimeException)
793 {
794 return FilePicker_getSupportedServiceNames();
795 }
796