summaryrefslogtreecommitdiff
path: root/fpicker/source/win32/filepicker/FilePicker.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'fpicker/source/win32/filepicker/FilePicker.cxx')
-rw-r--r--fpicker/source/win32/filepicker/FilePicker.cxx799
1 files changed, 799 insertions, 0 deletions
diff --git a/fpicker/source/win32/filepicker/FilePicker.cxx b/fpicker/source/win32/filepicker/FilePicker.cxx
new file mode 100644
index 000000000000..a3191ce77580
--- /dev/null
+++ b/fpicker/source/win32/filepicker/FilePicker.cxx
@@ -0,0 +1,799 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_fpicker.hxx"
+
+//------------------------------------------------------------------------
+// includes
+//------------------------------------------------------------------------
+
+#include <tchar.h>
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <cppuhelper/interfacecontainer.h>
+#include <osl/diagnose.h>
+
+#ifndef _FILEPICKER_HXX_
+#include "filepicker.hxx"
+#endif
+#include "WinFileOpenImpl.hxx"
+
+#include "FPServiceInfo.hxx"
+#include "..\misc\WinImplHelper.hxx"
+#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
+#include "filepickereventnotification.hxx"
+
+#include <comphelper/sequenceasvector.hxx>
+
+//------------------------------------------------------------------------
+// namespace directives
+//------------------------------------------------------------------------
+
+using namespace com::sun::star;
+
+using namespace ::com::sun::star::ui::dialogs;
+using namespace ::com::sun::star::ui::dialogs::TemplateDescription;
+
+//------------------------------------------------------------------------
+// defines
+//------------------------------------------------------------------------
+
+#define FILE_PICKER_DLL_NAME TEXT("fps.dll")
+
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+namespace
+{
+ // controling event notifications
+ const bool STARTUP_SUSPENDED = true;
+ const bool STARTUP_ALIVE = false;
+
+ uno::Sequence<rtl::OUString> SAL_CALL FilePicker_getSupportedServiceNames()
+ {
+ uno::Sequence<rtl::OUString> aRet(2);
+ aRet[0] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.FilePicker");
+ aRet[1] = rtl::OUString::createFromAscii("com.sun.star.ui.dialogs.SystemFilePicker");
+ return aRet;
+ }
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+CFilePicker::CFilePicker( const uno::Reference<lang::XMultiServiceFactory>& xServiceMgr) :
+ cppu::WeakComponentImplHelper10<
+ XFilterManager,
+ XFilterGroupManager,
+ XFilePickerControlAccess,
+ XFilePickerNotifier,
+ XFilePreview,
+ XFilePicker2,
+ lang::XInitialization,
+ util::XCancellable,
+ lang::XEventListener,
+ lang::XServiceInfo>(m_rbHelperMtx),
+ m_xServiceMgr(xServiceMgr),
+ m_aAsyncEventNotifier(rBHelper)
+{
+ HINSTANCE hInstance = GetModuleHandle(FILE_PICKER_DLL_NAME);
+ OSL_POSTCOND( hInstance, "The name of the service dll must have changed" );
+
+ // create a default FileOpen dialog without any additional ui elements
+ m_pImpl = std::auto_ptr< CWinFileOpenImpl >(
+ new CWinFileOpenImpl(
+ this,
+ true,
+ 0,
+ 0,
+ hInstance ) );
+}
+
+//------------------------------------------------------------------------------------
+// XFPEventListenerManager
+//------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::addFilePickerListener(const uno::Reference<XFilePickerListener>& xListener)
+ throw(uno::RuntimeException)
+{
+ if ( rBHelper.bDisposed )
+ throw lang::DisposedException(
+ rtl::OUString::createFromAscii( "object is already disposed" ),
+ static_cast< XFilePicker2* >( this ) );
+
+ if ( !rBHelper.bInDispose && !rBHelper.bDisposed )
+ rBHelper.aLC.addInterface( getCppuType( &xListener ), xListener );
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::removeFilePickerListener(const uno::Reference<XFilePickerListener>& xListener )
+ throw(uno::RuntimeException)
+{
+ if ( rBHelper.bDisposed )
+ throw lang::DisposedException(
+ rtl::OUString::createFromAscii( "object is already disposed" ),
+ static_cast< XFilePicker2* >( this ) );
+
+ rBHelper.aLC.removeInterface( getCppuType( &xListener ), xListener );
+}
+
+// -------------------------------------------------
+// XEventListener
+// -------------------------------------------------
+
+void SAL_CALL CFilePicker::disposing(const lang::EventObject& aEvent) throw(uno::RuntimeException)
+{
+ uno::Reference<XFilePickerListener> xFilePickerListener(aEvent.Source, ::com::sun::star::uno::UNO_QUERY);
+
+ if (xFilePickerListener.is())
+ removeFilePickerListener(xFilePickerListener);
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::fileSelectionChanged(FilePickerEvent aEvent)
+{
+ aEvent.Source = uno::Reference<uno::XInterface>(static_cast<XFilePickerNotifier*>(this));
+ m_aAsyncEventNotifier.notifyEvent(
+ new CFilePickerParamEventNotification(&XFilePickerListener::fileSelectionChanged,aEvent));
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::directoryChanged(FilePickerEvent aEvent)
+{
+ aEvent.Source = uno::Reference<uno::XInterface>(static_cast<XFilePickerNotifier*>(this));
+ m_aAsyncEventNotifier.notifyEvent(
+ new CFilePickerParamEventNotification(&XFilePickerListener::directoryChanged,aEvent));
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::controlStateChanged(FilePickerEvent aEvent)
+{
+ aEvent.Source = uno::Reference<uno::XInterface>(static_cast<XFilePickerNotifier*>(this));
+ m_aAsyncEventNotifier.notifyEvent(
+ new CFilePickerParamEventNotification(&XFilePickerListener::controlStateChanged,aEvent));
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::dialogSizeChanged()
+{
+ m_aAsyncEventNotifier.notifyEvent(
+ new CFilePickerEventNotification(&XFilePickerListener::dialogSizeChanged));
+}
+
+//-----------------------------------------------------------------------------------------
+// If there are more then one listener the return value of the last one wins
+//-----------------------------------------------------------------------------------------
+
+rtl::OUString SAL_CALL CFilePicker::helpRequested(FilePickerEvent aEvent) const
+{
+ rtl::OUString aHelpText;
+
+ ::cppu::OInterfaceContainerHelper* pICHelper =
+ rBHelper.getContainer( getCppuType((uno::Reference<XFilePickerListener>*)0));
+
+ if (pICHelper)
+ {
+ ::cppu::OInterfaceIteratorHelper iter(*pICHelper);
+
+ while(iter.hasMoreElements())
+ {
+ try
+ {
+ /*
+ if there are multiple listeners responding
+ to this notification the next response
+ overwrittes the one before if it is not empty
+ */
+
+ rtl::OUString temp;
+
+ uno::Reference<XFilePickerListener> xFPListener(iter.next(), uno::UNO_QUERY);
+ if (xFPListener.is())
+ {
+ temp = xFPListener->helpRequested(aEvent);
+ if (temp.getLength())
+ aHelpText = temp;
+ }
+
+ }
+ catch(uno::RuntimeException&)
+ {
+ OSL_ENSURE( false, "RuntimeException during event dispatching" );
+ }
+ }
+ }
+
+ return aHelpText;
+}
+
+//-------------------------------------
+//
+//-------------------------------------
+
+bool CFilePicker::startupEventNotification(bool bStartupSuspended)
+{
+ return m_aAsyncEventNotifier.startup(bStartupSuspended);
+}
+
+//-------------------------------------
+//
+//-------------------------------------
+
+void CFilePicker::shutdownEventNotification()
+{
+ m_aAsyncEventNotifier.shutdown();
+}
+
+//-------------------------------------
+//
+//-------------------------------------
+
+void CFilePicker::suspendEventNotification()
+{
+ m_aAsyncEventNotifier.suspend();
+}
+
+//-------------------------------------
+//
+//-------------------------------------
+
+void CFilePicker::resumeEventNotification()
+{
+ m_aAsyncEventNotifier.resume();
+}
+
+//------------------------------------------------------------------------------------
+// XFilePicker functions
+//------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::setMultiSelectionMode(sal_Bool bMode) throw(uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+ osl::MutexGuard aGuard(m_aMutex);
+ m_pImpl->setMultiSelectionMode(bMode);
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::setTitle(const rtl::OUString& aTitle) throw(uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+ osl::MutexGuard aGuard(m_aMutex);
+ m_pImpl->setTitle(aTitle);
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::appendFilter(const rtl::OUString& aTitle, const rtl::OUString& aFilter)
+ throw(lang::IllegalArgumentException, uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+ osl::MutexGuard aGuard(m_aMutex);
+ m_pImpl->appendFilter(aTitle, aFilter);
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::setCurrentFilter(const rtl::OUString& aTitle)
+ throw(lang::IllegalArgumentException, uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+ osl::MutexGuard aGuard(m_aMutex);
+ m_pImpl->setCurrentFilter(aTitle);
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+rtl::OUString SAL_CALL CFilePicker::getCurrentFilter() throw(uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+ osl::MutexGuard aGuard(m_aMutex);
+ return m_pImpl->getCurrentFilter();
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::appendFilterGroup(const rtl::OUString& sGroupTitle, const uno::Sequence<beans::StringPair>& aFilters)
+ throw (lang::IllegalArgumentException, uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+ osl::MutexGuard aGuard(m_aMutex);
+ m_pImpl->appendFilterGroup(sGroupTitle, aFilters);
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::setDefaultName(const rtl::OUString& aName)
+ throw(uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+ osl::MutexGuard aGuard(m_aMutex);
+ m_pImpl->setDefaultName(aName);
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::setDisplayDirectory(const rtl::OUString& aDirectory)
+ throw(lang::IllegalArgumentException, uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+ osl::MutexGuard aGuard(m_aMutex);
+ m_pImpl->setDisplayDirectory(aDirectory);
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+rtl::OUString SAL_CALL CFilePicker::getDisplayDirectory() throw(uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+ osl::MutexGuard aGuard(m_aMutex);
+ return m_pImpl->getDisplayDirectory();
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+uno::Sequence<rtl::OUString> SAL_CALL CFilePicker::getFiles() throw(uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+ osl::MutexGuard aGuard(m_aMutex);
+ return m_pImpl->getFiles();
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+uno::Sequence< ::rtl::OUString > SAL_CALL CFilePicker::getSelectedFiles() throw (uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+ osl::MutexGuard aGuard(m_aMutex);
+
+ const uno::Sequence< ::rtl::OUString > lSource = m_pImpl->getFiles();
+ const ::sal_Int32 c = lSource.getLength();
+ if (c < 2)
+ return lSource;
+
+ const ::rtl::OUString sPath = lSource[0];
+ ::comphelper::SequenceAsVector< ::rtl::OUString > lTarget;
+ ::sal_Int32 i = 1;
+ for (i=1; i<c; ++i)
+ {
+ const ::rtl::OUString sFile = lSource[i];
+ if (sFile.indexOf ('/') > 0)
+ {
+ // a) file contains own path !
+ lTarget.push_back(sFile);
+ }
+ else
+ {
+ // b) file is relative to given path
+ ::rtl::OUStringBuffer sFull(256);
+
+ sFull.append (sPath);
+ sFull.appendAscii("/" );
+ sFull.append (sFile);
+
+ lTarget.push_back(sFull.makeStringAndClear());
+ }
+ }
+
+ return lTarget.getAsConstList();
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+sal_Int16 SAL_CALL CFilePicker::execute() throw(uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+
+ sal_Int16 ret;
+
+ if (startupEventNotification(STARTUP_SUSPENDED))
+ {
+ // we should not block in this call else
+ // in the case of an event the client can't
+ // call another function an we run into a
+ // deadlock !!!!!
+ ret = m_pImpl->execute( );
+
+ shutdownEventNotification();
+ }
+ else
+ {
+ OSL_ENSURE(sal_False, "Could not start event notifier thread!");
+
+ throw uno::RuntimeException(
+ rtl::OUString::createFromAscii("Error executing dialog"),
+ static_cast<XFilePicker2*>(this));
+ }
+
+ return ret;
+}
+
+//------------------------------------------------------------------------------------
+// XFilePicker functions
+//------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::setValue(sal_Int16 aControlId, sal_Int16 aControlAction, const uno::Any& aValue)
+ throw(uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+
+ osl::MutexGuard aGuard(m_aMutex);
+ m_pImpl->setValue(aControlId, aControlAction, aValue);
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+uno::Any SAL_CALL CFilePicker::getValue(sal_Int16 aControlId, sal_Int16 aControlAction)
+ throw(uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+
+ osl::MutexGuard aGuard(m_aMutex);
+ return m_pImpl->getValue(aControlId, aControlAction);
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::enableControl(sal_Int16 aControlId, sal_Bool bEnable)
+throw(uno::RuntimeException)
+{
+ OSL_ASSERT( 0 != m_pImpl.get( ) );
+
+ osl::MutexGuard aGuard( m_aMutex );
+ m_pImpl->enableControl( aControlId, bEnable );
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::setLabel(sal_Int16 aControlId, const ::rtl::OUString& aLabel)
+ throw (uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+
+ osl::MutexGuard aGuard(m_aMutex);
+ m_pImpl->setLabel(aControlId, aLabel);
+}
+
+//-----------------------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------------------
+
+rtl::OUString SAL_CALL CFilePicker::getLabel(sal_Int16 aControlId)
+ throw (uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+
+ osl::MutexGuard aGuard(m_aMutex);
+ return m_pImpl->getLabel(aControlId);
+}
+
+//------------------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------------
+
+uno::Sequence<sal_Int16> SAL_CALL CFilePicker::getSupportedImageFormats() throw (uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+
+ osl::MutexGuard aGuard(m_aMutex);
+ return m_pImpl->getSupportedImageFormats();
+}
+
+//------------------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------------
+
+sal_Int32 SAL_CALL CFilePicker::getTargetColorDepth() throw (uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+
+ osl::MutexGuard aGuard(m_aMutex);
+ return m_pImpl->getTargetColorDepth();
+}
+
+//------------------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------------
+
+sal_Int32 SAL_CALL CFilePicker::getAvailableWidth() throw (uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+
+ osl::MutexGuard aGuard(m_aMutex);
+ return m_pImpl->getAvailableWidth();
+}
+
+//------------------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------------
+
+sal_Int32 SAL_CALL CFilePicker::getAvailableHeight() throw (uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+
+ osl::MutexGuard aGuard(m_aMutex);
+ return m_pImpl->getAvailableHeight();
+}
+
+//------------------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::setImage(sal_Int16 aImageFormat, const uno::Any& aImage)
+ throw (lang::IllegalArgumentException, uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+
+ osl::MutexGuard aGuard(m_aMutex);
+ m_pImpl->setImage(aImageFormat, aImage);
+}
+
+//------------------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL CFilePicker::setShowState(sal_Bool bShowState) throw (uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+
+ osl::MutexGuard aGuard(m_aMutex);
+ return m_pImpl->setShowState(bShowState);
+}
+
+//------------------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------------
+
+sal_Bool SAL_CALL CFilePicker::getShowState() throw (uno::RuntimeException)
+{
+ OSL_ASSERT(0 != m_pImpl.get());
+
+ osl::MutexGuard aGuard(m_aMutex);
+ return m_pImpl->getShowState();
+}
+
+//------------------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::initialize(const uno::Sequence<uno::Any>& aArguments)
+ throw( uno::Exception, uno::RuntimeException)
+{
+ // parameter checking
+ uno::Any aAny;
+ if ( 0 == aArguments.getLength( ) )
+ throw lang::IllegalArgumentException(
+ rtl::OUString::createFromAscii( "no arguments" ),
+ static_cast<XFilePicker2*>(this), 1);
+
+ aAny = aArguments[0];
+
+ if ( (aAny.getValueType() != ::getCppuType((sal_Int16*)0)) &&
+ (aAny.getValueType() != ::getCppuType((sal_Int8*)0)) )
+ throw lang::IllegalArgumentException(
+ rtl::OUString::createFromAscii("invalid argument type"),
+ static_cast<XFilePicker2*>(this), 1);
+
+ sal_Int16 templateId = -1;
+ aAny >>= templateId;
+
+ sal_Bool bFileOpenDialog = sal_True;
+ sal_uInt32 winResTemplateId = 0;
+ sal_Bool bIsWin2000 = IsWindows2000Platform();
+
+ switch ( templateId )
+ {
+ case FILEOPEN_SIMPLE:
+ bFileOpenDialog = sal_True;
+ break;
+
+ case FILESAVE_SIMPLE:
+ bFileOpenDialog = sal_False;
+ break;
+
+ case FILESAVE_AUTOEXTENSION_PASSWORD:
+ bFileOpenDialog = sal_False;
+ if ( bIsWin2000 )
+ winResTemplateId = TMPL2000_FILESAVE_AUTOEXT_PASSWORD_BOX_ID;
+ else
+ winResTemplateId = TMPL95_FILESAVE_AUTOEXT_PASSWORD_BOX_ID;
+ break;
+
+ case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS:
+ bFileOpenDialog = sal_False;
+ if ( bIsWin2000 )
+ winResTemplateId = TMPL2000_AUTOEXT_PASSWORD_FILTEROPTION_BOX;
+ else
+ winResTemplateId = TMPL95_AUTOEXT_PASSWORD_FILTEROPTION_BOX;
+ break;
+
+ case FILESAVE_AUTOEXTENSION_SELECTION:
+ bFileOpenDialog = sal_False;
+ if ( bIsWin2000 )
+ winResTemplateId = TMPL2000_AUTOEXT_SELECTION_BOX;
+ else
+ winResTemplateId = TMPL95_AUTOEXT_SELECTION_BOX;
+ break;
+
+ case FILESAVE_AUTOEXTENSION_TEMPLATE:
+ bFileOpenDialog = sal_False;
+ if ( bIsWin2000 )
+ winResTemplateId = TMPL2000_FILEOPEN_AUTOEXT_TEMPLATE_BOX_ID;
+ else
+ winResTemplateId = TMPL95_FILEOPEN_AUTOEXT_TEMPLATE_BOX_ID;
+ break;
+
+ case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE:
+ if ( bIsWin2000 )
+ winResTemplateId = TMPL2000_FILEOPEN_LINK_PREVIEW_BOX_ID;
+ else
+ winResTemplateId = TMPL95_FILEOPEN_LINK_PREVIEW_BOX_ID;
+ break;
+
+ case FILEOPEN_PLAY:
+ if ( bIsWin2000 )
+ winResTemplateId = TMPL2000_PLAY_PUSHBUTTON;
+ else
+ winResTemplateId = TMPL95_PLAY_PUSHBUTTON;
+ break;
+
+ case FILEOPEN_READONLY_VERSION:
+ if ( bIsWin2000 )
+ winResTemplateId = TMPL2000_FILEOPEN_READONLY_VERSION_BOX_ID;
+ else
+ winResTemplateId = TMPL95_FILEOPEN_READONLY_VERSION_BOX_ID;
+ break;
+
+ case FILEOPEN_LINK_PREVIEW:
+ if ( bIsWin2000 )
+ winResTemplateId = TMPL2000_FILEOPEN_LINK_PREVIEW_BOX_SIMPLE_ID;
+ else
+ winResTemplateId = TMPL95_FILEOPEN_LINK_PREVIEW_BOX_SIMPLE_ID;
+ break;
+
+ case FILESAVE_AUTOEXTENSION:
+ bFileOpenDialog = sal_False;
+ if ( bIsWin2000 )
+ winResTemplateId = TMPL2000_FILESAVE_AUTOEXT;
+ else
+ winResTemplateId = TMPL95_FILESAVE_AUTOEXT;
+ break;
+
+ default:
+ throw lang::IllegalArgumentException(
+ rtl::OUString::createFromAscii( "Unknown template" ),
+ static_cast< XFilePicker2* >( this ),
+ 1 );
+ }
+
+ HINSTANCE hInstance = GetModuleHandle( FILE_PICKER_DLL_NAME );
+ OSL_POSTCOND( hInstance, "The name of the service dll must have changed" );
+
+ // create a new impl-class here based on the
+ // given string, if the given string is empty
+ // we do nothing
+ m_pImpl = std::auto_ptr< CWinFileOpenImpl >(
+ new CWinFileOpenImpl(
+ this,
+ bFileOpenDialog,
+ 0,
+ winResTemplateId,
+ hInstance ) );
+}
+
+//------------------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------------
+
+void SAL_CALL CFilePicker::cancel()
+ throw(uno::RuntimeException)
+{
+ OSL_ASSERT(m_pImpl.get());
+
+ osl::MutexGuard aGuard(m_aMutex);
+ m_pImpl->cancel();
+}
+
+// -------------------------------------------------
+// XServiceInfo
+// -------------------------------------------------
+
+rtl::OUString SAL_CALL CFilePicker::getImplementationName()
+ throw(uno::RuntimeException)
+{
+ return rtl::OUString::createFromAscii(FILE_PICKER_IMPL_NAME);
+}
+
+// -------------------------------------------------
+// XServiceInfo
+// -------------------------------------------------
+
+sal_Bool SAL_CALL CFilePicker::supportsService(const rtl::OUString& ServiceName)
+ throw(uno::RuntimeException )
+{
+ uno::Sequence <rtl::OUString> SupportedServicesNames = FilePicker_getSupportedServiceNames();
+
+ for (sal_Int32 n = SupportedServicesNames.getLength(); n--;)
+ if (SupportedServicesNames[n].compareTo(ServiceName) == 0)
+ return sal_True;
+
+ return sal_False;
+}
+
+// -------------------------------------------------
+// XServiceInfo
+// -------------------------------------------------
+
+uno::Sequence<rtl::OUString> SAL_CALL CFilePicker::getSupportedServiceNames()
+ throw(uno::RuntimeException)
+{
+ return FilePicker_getSupportedServiceNames();
+}