diff options
author | Kurt Zenker <kz@openoffice.org> | 2008-03-05 15:38:36 +0000 |
---|---|---|
committer | Kurt Zenker <kz@openoffice.org> | 2008-03-05 15:38:36 +0000 |
commit | 6a5c70dba391c378c61d302db5960ad6f36c479b (patch) | |
tree | 265af064646642d4415594b14878b7c2c9b304be /fpicker/source/aqua | |
parent | a8ad3d383537d06cc419d0389967c5d4c48a90ef (diff) |
INTEGRATION: CWS aquafilepicker02_DEV300 (1.2.40); FILE MERGED
2008/02/15 14:22:07 pl 1.2.40.9: saved some merge problems
2008/02/14 17:28:45 fheckl 1.2.40.8: Further changes concerning Autoextension
2008/02/14 08:30:02 fheckl 1.2.40.7: small implementation changes
2008/02/12 07:55:17 fheckl 1.2.40.6: a little cleanup
2008/01/14 08:23:24 fheckl 1.2.40.5: Code cleanup and some implementation details
2008/01/02 18:51:11 fheckl 1.2.40.4: removing NSInteger
2008/01/02 18:25:59 fheckl 1.2.40.3: issue #80399 more Cocoa
2007/11/18 20:55:02 fheckl 1.2.40.2: making save panel work temporarily
2007/11/18 19:36:37 fheckl 1.2.40.1: initial support for Cocoa version
Diffstat (limited to 'fpicker/source/aqua')
-rw-r--r-- | fpicker/source/aqua/SalAquaPicker.cxx | 387 |
1 files changed, 125 insertions, 262 deletions
diff --git a/fpicker/source/aqua/SalAquaPicker.cxx b/fpicker/source/aqua/SalAquaPicker.cxx index 317fd063ce..e85d37ca58 100644 --- a/fpicker/source/aqua/SalAquaPicker.cxx +++ b/fpicker/source/aqua/SalAquaPicker.cxx @@ -4,9 +4,9 @@ * * $RCSfile: SalAquaPicker.cxx,v $ * - * $Revision: 1.2 $ + * $Revision: 1.3 $ * - * last change: $Author: ihi $ $Date: 2007-07-11 10:59:44 $ + * last change: $Author: kz $ $Date: 2008-03-05 16:38:36 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -73,6 +73,9 @@ #ifndef _CFSTRINGUTILITIES_HXX_ #include "CFStringUtilities.hxx" #endif +#include "NSString_OOoAdditions.hxx" + +#include "SalAquaFilePicker.hxx" #include <stdio.h> @@ -88,227 +91,148 @@ using namespace ::com::sun::star; using namespace ::com::sun::star::lang; using namespace ::com::sun::star::uno; -void navigationEventHandler(NavEventCallbackMessage callBackSelector, NavCBRecPtr callBackParms, void *callBackUserData) +// constructor +SalAquaPicker::SalAquaPicker() +: m_pDialog(NULL) +, m_pControlHelper(new ControlHelper()) { - NavReplyRecord reply; - NavUserAction userAction = 0; - SalAquaPicker *pSalAquaPicker = (SalAquaPicker *) callBackUserData; - - switch (callBackSelector) { - - // We are ignoring several callbackSelectors here... - case kNavCBEvent: - pSalAquaPicker->implHandleNavDialogEvent(callBackParms); - break; - case kNavCBCustomize: - OSL_TRACE("NavigationServices callBackSelector = kNavCBCustomize"); - pSalAquaPicker->implHandleNavDialogCustomize(callBackParms); - break; - case kNavCBStart: - OSL_TRACE("NavigationServices callBackSelector = kNavCBStart"); - -//leave the following in in case we should consider X11 support in the future -#ifndef QUARTZ - /* - * We need to bring the dialog to the front. However, to make - * the dialog usable, soffice.bin must be the application bundle's executable. - */ - if (callBackParms) { - WindowRef dialogWindow = callBackParms->window; - if (dialogWindow) { - ProcessSerialNumber psn; - OSStatus error = GetCurrentProcess(&psn); - if (error == noErr) { - (void)SetFrontProcess(&psn); - } - BringToFront(dialogWindow); - } - } -#endif - pSalAquaPicker->implHandleNavDialogStart(callBackParms); - break; - case kNavCBAdjustRect: - OSL_TRACE("NavigationServices callBackSelector = kNavCBAdjustRect"); - pSalAquaPicker->getControlHelper()->handleAdjustRect(callBackParms); - break; - case kNavCBNewLocation: - OSL_TRACE("NavigationServices callBackSelector = kNavCBNewLocation"); - break; - case kNavCBAccept: - OSL_TRACE("NavigationServices callBackSelector = kNavCBAccept"); - break; - case kNavCBCancel: - OSL_TRACE("NavigationServices callBackSelector = kNavCBCancel"); - break; - case kNavCBAdjustPreview: - OSL_TRACE("NavigationServices callBackSelector = kNavCBAdjustPreview"); - break; - case kNavCBPopupMenuSelect: - NavMenuItemSpec* menuItem = (NavMenuItemSpec*)callBackParms->eventData.eventDataParms.param; - pSalAquaPicker->implHandlePopupMenuSelect(menuItem); - break; - case kNavCBUserAction: - OSL_TRACE("NavigationServices callBackSelector = kNavCBUserAction"); - - if (NavDialogGetReply (callBackParms->context, &reply) == noErr ) - { - userAction = NavDialogGetUserAction (callBackParms->context); - - switch (userAction) { - case kNavUserActionSaveAs: - OSL_TRACE("NavigationServices userAction = knavUserActionSaveAs"); - break; - case kNavUserActionOpen: - OSL_TRACE("NavigationServices userAction = knavUserActionOpen"); - break; - case kNavUserActionCancel: - OSL_TRACE("NavigationServices userAction = knavUserActionCancel"); - break; - case kNavUserActionNewFolder: - OSL_TRACE("NavigationServices userAction = knavUserActionNewFolder"); - break; - default: - OSL_TRACE("NavigationServices userAction is UNKNOWN %d", userAction); - break; - } - - NavDisposeReply (&reply); - } - break; - case kNavCBTerminate: - OSL_TRACE("NavigationServices callBackSelector = kNavCBTerminate"); -//leave the following in in case we should consider X11 support in the future -#ifndef QUARTZ - { - /* - * This passage searches the process list to find the X11 application. - * When it is found, it is being made the front process. Otherwise - * OpenOffice.org app would stay on top and the X11 window might be hidden. - */ - OSStatus status; - ProcessSerialNumber psn = {0, kNoProcess};//to initialize the process list - while((status = GetNextProcess(&psn)) == noErr && (psn.lowLongOfPSN != kNoProcess)) { - CFStringRef processName; - CopyProcessName(&psn, &processName); - CFStringRef sX11 = CFSTR("X11"); - if (CFStringCompare(processName, sX11, NULL) == kCFCompareEqualTo) { - (void)SetFrontProcess(&psn); - CFRelease(processName); - CFRelease(sX11); - break; - } - CFRelease(processName); - CFRelease(sX11); - } - } -#endif - break; - case kNavCBSelectEntry: - OSL_TRACE("NavigationServices callBackSelector = kNavCBSelectEntry"); - pSalAquaPicker->implHandleNavDialogSelectEntry(callBackParms); - break; - case kNavCBOpenSelection: - OSL_TRACE("NavigationServices callBackSelector = kNavCBOpenSelection"); - //no need to do anythong here, sfx2 will call us - break; - default: - OSL_TRACE("NavigationServices callBackSelector = %d", (int)callBackSelector); - break; - } - - pSalAquaPicker->setLatestEvent(callBackSelector); + DBG_PRINT_ENTRY(CLASS_NAME, __func__); + DBG_PRINT_EXIT(CLASS_NAME, __func__); } -MacOSBoolean filterEventHandler (AEDesc *theItem, void *info, - void *callBackUD, - NavFilterModes filterMode ) +SalAquaPicker::~SalAquaPicker() { - SalAquaPicker *pPicker = (SalAquaPicker *) callBackUD; - return pPicker->implFilterHandler(theItem, info, callBackUD, filterMode); -} + DBG_PRINT_ENTRY(CLASS_NAME, __func__); + + ::vos::OGuard aGuard( Application::GetSolarMutex() ); -MacOSBoolean previewHandler (NavCBRecPtr callBackParms, - NavCallBackUserData callBackUD ) -{ - SalAquaPicker *pSalAquaPicker = (SalAquaPicker *) callBackUD; + NSAutoreleasePool *pool = [NSAutoreleasePool new]; - if (NULL != pSalAquaPicker) { - return pSalAquaPicker->implPreviewHandler(callBackParms); - } + if (NULL != m_pControlHelper) + delete m_pControlHelper; - return FALSE; + if (NULL != m_pDialog) + [m_pDialog release]; + + [pool release]; + + DBG_PRINT_EXIT(CLASS_NAME, __func__); } -OSStatus SalAquaPicker::run() +void SAL_CALL SalAquaPicker::implInitialize() { DBG_PRINT_ENTRY(CLASS_NAME, __func__); - if (m_pDialog == NULL) { - //this is the case e.g. for the folder picker at this stage - implInitialize(); - } + ::vos::OGuard aGuard( Application::GetSolarMutex() ); - OSStatus status = NavDialogRun (m_pDialog); - if (status != noErr) { - OSL_TRACE("NavigationServices returned an error while running the dialog"); + if (m_pDialog != nil) { + return; } - DBG_PRINT_EXIT(CLASS_NAME, __func__, status); + 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; - return status; -} + case NAVIGATIONSERVICES_SAVE: + OSL_TRACE("NAVIGATIONSERVICES_SAVE"); + m_pDialog = [NSSavePanel savePanel]; + [(NSSavePanel*)m_pDialog setCanSelectHiddenExtension:YES]; + [(NSSavePanel*)m_pDialog setExtensionHidden:NO]; + break; -OSStatus SalAquaPicker::runandwaitforresult() -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__); + case NAVIGATIONSERVICES_DIRECTORY: + OSL_TRACE("NAVIGATIONSERVICES_DIRECTORY"); + m_pDialog = [NSOpenPanel openPanel]; + [(NSOpenPanel*)m_pDialog setCanChooseDirectories:YES]; + [(NSOpenPanel*)m_pDialog setCanChooseFiles:NO]; + break; - OSStatus status = this->run(); - if (status != noErr) { - DBG_PRINT_EXIT(CLASS_NAME, __func__, status); - return status; + default: + OSL_TRACE("m_nDialogType is UNKNOWN: %d", m_nDialogType); + break; } - status = NavDialogGetReply (m_pDialog, &m_pReplyRecord); - if (status != noErr) { - OSL_TRACE("NavigationServices returned an error while getting the dialog reply"); + + 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__, status); - return status; + DBG_PRINT_EXIT(CLASS_NAME, __func__); } -// constructor -SalAquaPicker::SalAquaPicker() -: m_pDialog(NULL) -, m_pControlHelper(new ControlHelper()) -, m_aLatestEvent(kNavCBEvent) +int SalAquaPicker::run() { DBG_PRINT_ENTRY(CLASS_NAME, __func__); - // set the standard set of dialog options - OSStatus status = NavGetDefaultDialogCreationOptions(&m_pDialogOptions); - if (status != noErr) { - OSL_TRACE("NavigationServices returned an error while creating dialog options"); + ::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]; } - DBG_PRINT_EXIT(CLASS_NAME, __func__); + 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; + } + + + DBG_PRINT_EXIT(CLASS_NAME, __func__, retVal); + + [pool release]; + + return retVal; } -SalAquaPicker::~SalAquaPicker() +int SalAquaPicker::runandwaitforresult() { DBG_PRINT_ENTRY(CLASS_NAME, __func__); - if (NULL != m_pControlHelper) - delete m_pControlHelper; - if (NULL != m_pEventHandler) - DisposeNavEventUPP(m_pEventHandler); - if (NULL != m_pDialog) - NavDialogDispose (m_pDialog); - if (NULL != m_pFilterHandler) - DisposeNavObjectFilterUPP(m_pFilterHandler); - if (NULL != m_pPreviewHandler) - DisposeNavPreviewUPP(m_pPreviewHandler); + ::vos::OGuard aGuard( Application::GetSolarMutex() ); - DBG_PRINT_EXIT(CLASS_NAME, __func__); + int status = this->run(); + + DBG_PRINT_EXIT(CLASS_NAME, __func__, status); + return status; } void SAL_CALL SalAquaPicker::implsetDisplayDirectory( const rtl::OUString& aDirectory ) @@ -316,7 +240,16 @@ void SAL_CALL SalAquaPicker::implsetDisplayDirectory( const rtl::OUString& aDire { DBG_PRINT_ENTRY(CLASS_NAME, __func__, "directory", aDirectory); - m_sDisplayDirectory = aDirectory; + ::vos::OGuard aGuard( Application::GetSolarMutex() ); + + if (aDirectory != m_sDisplayDirectory) { + m_sDisplayDirectory = aDirectory; + + if (m_pDialog != nil) { + //NSLog(@"would change now to:%@", [NSString stringWithOUString:aDirectory]); + // [m_pDialog setDirectory:[NSString stringWithOUString:aDirectory]]; + } + } DBG_PRINT_EXIT(CLASS_NAME, __func__); } @@ -335,80 +268,10 @@ void SAL_CALL SalAquaPicker::implsetTitle( const rtl::OUString& aTitle ) throw( ::vos::OGuard aGuard( Application::GetSolarMutex() ); - m_pDialogOptions.windowTitle = CFStringCreateWithOUString ( aTitle ); - - DBG_PRINT_EXIT(CLASS_NAME, __func__); -} - -void SAL_CALL SalAquaPicker::implInitialize() -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__); - - m_pEventHandler = NewNavEventUPP( navigationEventHandler ); - - //does not work currently - unfortunately - //WindowRef parent = FrontWindow(); - WindowRef parent = NULL; - if (NULL == parent) { - m_pDialogOptions.modality = kWindowModalityAppModal; - } else if (m_nDialogType == NAVIGATIONSERVICES_SAVE) { - m_pDialogOptions.modality = kWindowModalityWindowModal; - m_pDialogOptions.parentWindow = parent; - } - - OSStatus status = noErr; - // Create the corresponding dialog - // pass the pointer to SalAquaPicker as an userData - switch (m_nDialogType) - { - case NAVIGATIONSERVICES_OPEN: - OSL_TRACE("NAVIGATIONSERVICES_OPEN"); - m_pFilterHandler = NewNavObjectFilterUPP(filterEventHandler); - m_pPreviewHandler = NewNavPreviewUPP(previewHandler); - status = NavCreateGetFileDialog (&m_pDialogOptions, NULL, m_pEventHandler, m_pPreviewHandler, m_pFilterHandler, (void *) this, &m_pDialog); - break; - - case NAVIGATIONSERVICES_SAVE: - OSL_TRACE("NAVIGATIONSERVICES_SAVE"); - status = NavCreatePutFileDialog (&m_pDialogOptions, kUnknownType, kUnknownType, m_pEventHandler, (void *) this, &m_pDialog); - break; - - case NAVIGATIONSERVICES_DIRECTORY: - OSL_TRACE("NAVIGATIONSERVICES_DIRECTORY"); - status = NavCreateChooseFolderDialog (&m_pDialogOptions, m_pEventHandler, NULL, (void *) this, &m_pDialog); - break; - - default: - OSL_TRACE("m_nDialogType is UNKNOWN: %d", m_nDialogType); - break; - } - - if (status != noErr) { - OSL_TRACE("An error occurred while creating the dialog!"); + if (m_pDialog != nil) { + [m_pDialog setTitle:[NSString stringWithOUString:aTitle]]; } DBG_PRINT_EXIT(CLASS_NAME, __func__); } -///// -void SAL_CALL SalAquaPicker::implHandleNavDialogCustomize(NavCBRecPtr callBackParms) { } - -void SAL_CALL SalAquaPicker::implHandleNavDialogStart(NavCBRecPtr callBackParms) { } - -void SAL_CALL SalAquaPicker::implHandleNavDialogEvent(NavCBRecPtr callBackParms) { } - -sal_Bool SAL_CALL SalAquaPicker::implFilterHandler(AEDesc *theItem, void *info, - void *callBackUD, - NavFilterModes filterMode) -{ - return sal_True; -} - -sal_Bool SAL_CALL SalAquaPicker::implPreviewHandler(NavCBRecPtr callBackParms) -{ - return sal_False; -} - -void SAL_CALL SalAquaPicker::implHandlePopupMenuSelect(NavMenuItemSpec* menuItem) { } - -void SAL_CALL SalAquaPicker::implHandleNavDialogSelectEntry(NavCBRecPtr callBackParms) { } |