summaryrefslogtreecommitdiff
path: root/fpicker/source/aqua/SalAquaFolderPicker.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'fpicker/source/aqua/SalAquaFolderPicker.cxx')
-rw-r--r--fpicker/source/aqua/SalAquaFolderPicker.cxx289
1 files changed, 289 insertions, 0 deletions
diff --git a/fpicker/source/aqua/SalAquaFolderPicker.cxx b/fpicker/source/aqua/SalAquaFolderPicker.cxx
new file mode 100644
index 000000000000..60857e47c6c3
--- /dev/null
+++ b/fpicker/source/aqua/SalAquaFolderPicker.cxx
@@ -0,0 +1,289 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+//------------------------------------------------------------------------
+// includes
+//------------------------------------------------------------------------
+
+#include <com/sun/star/lang/DisposedException.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
+#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
+#include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
+#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
+#include <cppuhelper/interfacecontainer.h>
+#include <osl/diagnose.h>
+#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
+#include <com/sun/star/uno/Any.hxx>
+#include <FPServiceInfo.hxx>
+#include <vos/mutex.hxx>
+#include <vcl/svapp.hxx>
+#include "SalAquaFolderPicker.hxx"
+
+#include <tools/urlobj.hxx>
+#include <iostream>
+
+#include "resourceprovider.hxx"
+
+#ifndef _SV_RC_H
+#include <tools/rc.hxx>
+#endif
+
+#include <osl/file.hxx>
+#include "CFStringUtilities.hxx"
+#include "NSString_OOoAdditions.hxx"
+#include "NSURL_OOoAdditions.hxx"
+
+#pragma mark DEFINES
+#define CLASS_NAME "SalAquaFolderPicker"
+
+//------------------------------------------------------------------------
+// namespace directives
+//------------------------------------------------------------------------
+
+using namespace ::rtl;
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::ui::dialogs;
+using namespace ::com::sun::star::lang;
+using namespace ::com::sun::star::uno;
+
+//------------------------------------------------------------------------
+// helper functions
+//------------------------------------------------------------------------
+
+namespace
+{
+ // controling event notifications
+ uno::Sequence<rtl::OUString> SAL_CALL FolderPicker_getSupportedServiceNames()
+ {
+ uno::Sequence<rtl::OUString> aRet(2);
+ aRet[0] = rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.SystemFolderPicker" );
+ aRet[1] = rtl::OUString::createFromAscii( "com.sun.star.ui.dialogs.AquaFolderPicker" );
+ return aRet;
+ }
+}
+
+//-----------------------------------------------------------------------------------------
+// constructor
+//-----------------------------------------------------------------------------------------
+SalAquaFolderPicker::SalAquaFolderPicker( const uno::Reference<lang::XMultiServiceFactory>& xServiceMgr ) :
+ m_xServiceMgr( xServiceMgr )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ m_nDialogType = NAVIGATIONSERVICES_DIRECTORY;
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+//-----------------------------------------------------------------------------------------
+// XExecutableDialog functions
+//-----------------------------------------------------------------------------------------
+
+void SAL_CALL SalAquaFolderPicker::setTitle( const rtl::OUString& aTitle ) throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__, "title", aTitle);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ implsetTitle(aTitle);
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+sal_Int16 SAL_CALL SalAquaFolderPicker::execute() throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ sal_Int16 retVal = 0;
+
+ int nResult = runandwaitforresult();
+
+ switch( nResult )
+ {
+ case NSOKButton:
+ OSL_TRACE("Dialog returned with OK");
+ retVal = ExecutableDialogResults::OK;
+ break;
+
+ case NSCancelButton:
+ OSL_TRACE("Dialog was cancelled!");
+ retVal = ExecutableDialogResults::CANCEL;
+ break;
+
+ default:
+ throw uno::RuntimeException(rtl::OUString::createFromAscii("The dialog returned with an unknown result!"), static_cast< XFolderPicker* >( this ));
+ break;
+ }
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+ return retVal;
+}
+
+//------------------------------------------------------------------------------------
+// XFolderPicker functions
+//------------------------------------------------------------------------------------
+
+void SAL_CALL SalAquaFolderPicker::setDisplayDirectory( const rtl::OUString& aDirectory )
+ throw( lang::IllegalArgumentException, uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__, "directory", aDirectory);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ implsetDisplayDirectory(aDirectory);
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+rtl::OUString SAL_CALL SalAquaFolderPicker::getDisplayDirectory() throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ OUString aDirectory = implgetDisplayDirectory();
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__, aDirectory);
+
+ return aDirectory;
+}
+
+rtl::OUString SAL_CALL SalAquaFolderPicker::getDirectory() throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ NSArray *files = nil;
+ if (m_nDialogType == NAVIGATIONSERVICES_DIRECTORY) {
+ files = [(NSOpenPanel*)m_pDialog URLs];
+ }
+
+ long nFiles = [files count];
+ OSL_TRACE("# of items: %d", nFiles);
+
+ if (nFiles < 1) {
+ throw uno::RuntimeException(rtl::OUString::createFromAscii("no directory selected"), static_cast< XFolderPicker* >( this ));
+ }
+
+ rtl::OUString aDirectory;
+
+ NSURL *url = [files objectAtIndex:0];
+ OSL_TRACE("handling %s", [[url description] UTF8String]);
+
+ aDirectory = [url OUStringForInfo:FULLPATH];
+
+ implsetDisplayDirectory(aDirectory);
+
+ OSL_TRACE("dir url: %s", OUStringToOString(aDirectory, RTL_TEXTENCODING_UTF8).getStr());
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+ return aDirectory;
+}
+
+void SAL_CALL SalAquaFolderPicker::setDescription( const rtl::OUString& rDescription )
+ throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__, "description", rDescription);
+
+ [m_pDialog setMessage:[NSString stringWithOUString:rDescription]];
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+// -------------------------------------------------
+// XServiceInfo
+// -------------------------------------------------
+
+rtl::OUString SAL_CALL SalAquaFolderPicker::getImplementationName()
+ throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ rtl::OUString retVal = rtl::OUString::createFromAscii( FOLDER_PICKER_IMPL_NAME );
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__, retVal);
+
+ return retVal;
+}
+
+sal_Bool SAL_CALL SalAquaFolderPicker::supportsService( const rtl::OUString& sServiceName )
+ throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__, "serviceName", sServiceName);
+
+ sal_Bool retVal = sal_False;
+ uno::Sequence <rtl::OUString> supportedServicesNames = FolderPicker_getSupportedServiceNames();
+
+ for( sal_Int32 n = supportedServicesNames.getLength(); n--; ) {
+ if( supportedServicesNames[n].compareTo( sServiceName ) == 0) {
+ retVal = sal_True;
+ break;
+ }
+ }
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__, retVal);
+ return retVal;
+}
+
+uno::Sequence<rtl::OUString> SAL_CALL SalAquaFolderPicker::getSupportedServiceNames()
+ throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+
+ return FolderPicker_getSupportedServiceNames();
+}
+
+//------------------------------------------------------------------------------------
+// XCancellable
+//------------------------------------------------------------------------------------
+
+void SAL_CALL SalAquaFolderPicker::cancel() throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+
+ ::vos::OGuard aGuard( Application::GetSolarMutex() );
+
+ [m_pDialog cancel:nil];
+
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}
+
+// -------------------------------------------------
+// XEventListener
+// -------------------------------------------------
+
+void SAL_CALL SalAquaFolderPicker::disposing( const lang::EventObject& )
+ throw( uno::RuntimeException )
+{
+ DBG_PRINT_ENTRY(CLASS_NAME, __func__);
+ DBG_PRINT_EXIT(CLASS_NAME, __func__);
+}