| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| //------------------------------------------------------------------------ |
| // includes |
| //------------------------------------------------------------------------ |
| |
| #include <com/sun/star/lang/DisposedException.hpp> |
| #include <com/sun/star/lang/XMultiServiceFactory.hpp> |
| #include <cppuhelper/interfacecontainer.h> |
| #include <osl/diagnose.h> |
| #include <com/sun/star/uno/Any.hxx> |
| #include <FPServiceInfo.hxx> |
| #include <vos/mutex.hxx> |
| #include <vcl/svapp.hxx> |
| #ifndef _SALAQUAPICKER_HXX_ |
| #include "SalAquaPicker.hxx" |
| #endif |
| #include <tools/urlobj.hxx> |
| #include <osl/file.hxx> |
| #include "CFStringUtilities.hxx" |
| #include "NSString_OOoAdditions.hxx" |
| |
| #ifndef _NSURL_OOOADDITIONS_HXX_ |
| #include "NSURL_OOoAdditions.hxx" |
| #endif |
| |
| #include "SalAquaFilePicker.hxx" |
| |
| #include <stdio.h> |
| |
| #pragma mark DEFINES |
| #define CLASS_NAME "SalAquaPicker" |
| #define kSetHideExtensionStateKey @"NSNavLastUserSetHideExtensionButtonState" |
| |
| //------------------------------------------------------------------------ |
| // namespace directives |
| //------------------------------------------------------------------------ |
| |
| using namespace ::rtl; |
| using namespace ::com::sun::star; |
| using namespace ::com::sun::star::lang; |
| using namespace ::com::sun::star::uno; |
| |
| // constructor |
| SalAquaPicker::SalAquaPicker() |
| : m_pDialog(NULL) |
| , m_pControlHelper(new ControlHelper()) |
| { |
| DBG_PRINT_ENTRY(CLASS_NAME, __func__); |
| DBG_PRINT_EXIT(CLASS_NAME, __func__); |
| } |
| |
| SalAquaPicker::~SalAquaPicker() |
| { |
| DBG_PRINT_ENTRY(CLASS_NAME, __func__); |
| |
| ::vos::OGuard aGuard( Application::GetSolarMutex() ); |
| |
| NSAutoreleasePool *pool = [NSAutoreleasePool new]; |
| |
| if (NULL != m_pControlHelper) |
| delete m_pControlHelper; |
| |
| if (NULL != m_pDialog) |
| [m_pDialog release]; |
| |
| [pool release]; |
| |
| DBG_PRINT_EXIT(CLASS_NAME, __func__); |
| } |
| |
| void SAL_CALL SalAquaPicker::implInitialize() |
| { |
| DBG_PRINT_ENTRY(CLASS_NAME, __func__); |
| |
| ::vos::OGuard aGuard( Application::GetSolarMutex() ); |
| |
| if (m_pDialog != nil) { |
| return; |
| } |
| |
| switch (m_nDialogType) |
| { |
| case NAVIGATIONSERVICES_OPEN: |
| OSL_TRACE("NAVIGATIONSERVICES_OPEN"); |
| m_pDialog = [NSOpenPanel openPanel]; |
| [(NSOpenPanel*)m_pDialog setCanChooseDirectories:NO]; |
| [(NSOpenPanel*)m_pDialog setCanChooseFiles:YES]; |
| break; |
| |
| case NAVIGATIONSERVICES_SAVE: { |
| OSL_TRACE("NAVIGATIONSERVICES_SAVE"); |
| m_pDialog = [NSSavePanel savePanel]; |
| [(NSSavePanel*)m_pDialog setCanSelectHiddenExtension:NO]; //changed for issue #102102 |
| /* I would have loved to use |
| * [(NSSavePanel*)m_pDialog setExtensionHidden:YES]; |
| * here but unfortunately this |
| * a) only works when the dialog is already displayed because it seems to act on the corresponding checkbox (that we don't show but that doesn't matter) |
| * b) Mac OS X saves this setting on an application-based level which means that the last state is always being restored again when the app runs for the next time |
| * |
| * So the only reliable way seems to be using the NSUserDefaults object because that is where that value is stored and |
| * to just overwrite it if it has the wrong value. |
| */ |
| NSUserDefaults *pDefaults = [NSUserDefaults standardUserDefaults]; |
| NSNumber *pExtn = [pDefaults objectForKey:kSetHideExtensionStateKey]; |
| if(pExtn == nil || [pExtn boolValue] == NO) { |
| OSL_TRACE("Hiding extension"); |
| [pDefaults setBool:YES forKey:kSetHideExtensionStateKey]; |
| } |
| } break; |
| |
| case NAVIGATIONSERVICES_DIRECTORY: |
| OSL_TRACE("NAVIGATIONSERVICES_DIRECTORY"); |
| m_pDialog = [NSOpenPanel openPanel]; |
| [(NSOpenPanel*)m_pDialog setCanChooseDirectories:YES]; |
| [(NSOpenPanel*)m_pDialog setCanChooseFiles:NO]; |
| break; |
| |
| default: |
| OSL_TRACE("m_nDialogType is UNKNOWN: %d", m_nDialogType); |
| break; |
| } |
| |
| if (m_pDialog == nil) { |
| OSL_TRACE("An error occurred while creating the dialog!"); |
| } |
| else { |
| [(NSOpenPanel*)m_pDialog setCanCreateDirectories:YES]; |
| //Retain the dialog instance or it will go away immediately |
| [m_pDialog retain]; |
| } |
| |
| DBG_PRINT_EXIT(CLASS_NAME, __func__); |
| } |
| |
| int SalAquaPicker::run() |
| { |
| DBG_PRINT_ENTRY(CLASS_NAME, __func__); |
| |
| ::vos::OGuard aGuard( Application::GetSolarMutex() ); |
| |
| NSAutoreleasePool *pool = [NSAutoreleasePool new]; |
| |
| if (m_pDialog == NULL) { |
| //this is the case e.g. for the folder picker at this stage |
| implInitialize(); |
| } |
| |
| NSView *userPane = m_pControlHelper->getUserPane(); |
| if (userPane != NULL) { |
| [m_pDialog setAccessoryView:userPane]; |
| } |
| |
| int retVal = 0; |
| |
| NSString *startDirectory; |
| if (m_sDisplayDirectory.getLength() > 0) { |
| NSString *temp = [NSString stringWithOUString:m_sDisplayDirectory]; |
| NSURL *url = [NSURL URLWithString:temp]; |
| startDirectory = [url path]; |
| |
| OSL_TRACE("start dir: %s", [startDirectory UTF8String]); |
| // NSLog(@"%@", startDirectory); |
| } |
| else { |
| startDirectory = NSHomeDirectory(); |
| } |
| |
| switch(m_nDialogType) { |
| case NAVIGATIONSERVICES_DIRECTORY: |
| case NAVIGATIONSERVICES_OPEN: |
| retVal = [(NSOpenPanel*)m_pDialog runModalForDirectory:startDirectory file:nil types:nil]; |
| break; |
| case NAVIGATIONSERVICES_SAVE: |
| retVal = [m_pDialog runModalForDirectory:startDirectory file:[NSString stringWithOUString:((SalAquaFilePicker*)this)->getSaveFileName()]/*[m_pDialog saveFilename]*/]; |
| break; |
| // [m_pDialog beginSheetForDirectory:startDirectory file:[m_pDialog saveFilename] modalForWindow:[NSApp keyWindow] modalDelegate:((SalAquaFilePicker*)this)->getDelegate() didEndSelector:@selector(savePanelDidEnd:returnCode:contextInfo:) contextInfo:nil]; |
| default: |
| break; |
| } |
| |
| if (retVal == NSFileHandlingPanelOKButton) { |
| NSString* pDir = [m_pDialog directory]; |
| if (pDir) { |
| implsetDisplayDirectory([[NSURL fileURLWithPath:pDir] OUStringForInfo:FULLPATH]); |
| } |
| } |
| |
| DBG_PRINT_EXIT(CLASS_NAME, __func__, retVal); |
| |
| [pool release]; |
| |
| return retVal; |
| } |
| |
| int SalAquaPicker::runandwaitforresult() |
| { |
| DBG_PRINT_ENTRY(CLASS_NAME, __func__); |
| |
| ::vos::OGuard aGuard( Application::GetSolarMutex() ); |
| |
| int status = this->run(); |
| |
| DBG_PRINT_EXIT(CLASS_NAME, __func__, status); |
| return status; |
| } |
| |
| void SAL_CALL SalAquaPicker::implsetDisplayDirectory( const rtl::OUString& aDirectory ) |
| throw( lang::IllegalArgumentException, uno::RuntimeException ) |
| { |
| DBG_PRINT_ENTRY(CLASS_NAME, __func__, "directory", aDirectory); |
| |
| ::vos::OGuard aGuard( Application::GetSolarMutex() ); |
| |
| if (aDirectory != m_sDisplayDirectory) { |
| m_sDisplayDirectory = aDirectory; |
| } |
| |
| DBG_PRINT_EXIT(CLASS_NAME, __func__); |
| } |
| |
| rtl::OUString SAL_CALL SalAquaPicker::implgetDisplayDirectory() throw( uno::RuntimeException ) |
| { |
| DBG_PRINT_ENTRY(CLASS_NAME, __func__); |
| DBG_PRINT_EXIT(CLASS_NAME, __func__, m_sDisplayDirectory); |
| |
| return m_sDisplayDirectory; |
| } |
| |
| void SAL_CALL SalAquaPicker::implsetTitle( const rtl::OUString& aTitle ) throw( uno::RuntimeException ) |
| { |
| DBG_PRINT_ENTRY(CLASS_NAME, __func__, "title", aTitle); |
| |
| ::vos::OGuard aGuard( Application::GetSolarMutex() ); |
| |
| if (m_pDialog != nil) { |
| [m_pDialog setTitle:[NSString stringWithOUString:aTitle]]; |
| } |
| |
| DBG_PRINT_EXIT(CLASS_NAME, __func__); |
| } |
| |