Index: source/aqua/ControlHelper.cxx =================================================================== --- source/aqua/ControlHelper.cxx (Revision 274595) +++ source/aqua/ControlHelper.cxx (Arbeitskopie) @@ -61,7 +61,6 @@ , m_bUserPaneNeeded( false ) , m_bIsUserPaneLaidOut(false) , m_bIsFilterControlNeeded(false) -, m_bAutoFilenameExtension(true) , m_pFilterHelper(NULL) { DBG_PRINT_ENTRY(CLASS_NAME, __func__); @@ -174,12 +173,7 @@ ::vos::OGuard aGuard( Application::GetSolarMutex() ); - if (nControlId == ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION) { - OSL_TRACE(" autoextension checkbox cannot be changed"); - DBG_PRINT_EXIT(CLASS_NAME, __func__); - return; - } - else if (nControlId == ExtendedFilePickerElementIds::CHECKBOX_PREVIEW) { + if (nControlId == ExtendedFilePickerElementIds::CHECKBOX_PREVIEW) { OSL_TRACE(" preview checkbox cannot be changed"); DBG_PRINT_EXIT(CLASS_NAME, __func__); return; @@ -268,12 +262,7 @@ ::vos::OGuard aGuard( Application::GetSolarMutex() ); - if (nControlId == ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION) { - /* see comment in the header file */ - //rValue >>= m_bAutoFilenameExtension; - OSL_TRACE(" value is a bool: %d", m_bAutoFilenameExtension); - } - else if (nControlId == ExtendedFilePickerElementIds::CHECKBOX_PREVIEW) { + if (nControlId == ExtendedFilePickerElementIds::CHECKBOX_PREVIEW) { OSL_TRACE(" value for preview is unchangeable"); } else { @@ -307,25 +296,19 @@ ::vos::OGuard aGuard( Application::GetSolarMutex() ); uno::Any aRetval; - if (nControlId == ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION) { - aRetval <<= m_bAutoFilenameExtension; - OSL_TRACE("value is a bool (autoextension): %d", m_bAutoFilenameExtension); - } - else { - NSControl* pControl = getControl( nControlId ); + NSControl* pControl = getControl( nControlId ); - if( pControl == nil ) { - OSL_TRACE("get value for unknown control %d", nControlId); - aRetval <<= sal_True; - } else { - if( [pControl class] == [NSPopUpButton class] ) { - aRetval = HandleGetListValue(pControl, nControlAction); - } else if( [pControl class] == [NSButton class] ) { - //NSLog(@"control: %@", [[pControl cell] title]); - sal_Bool bValue = [(NSButton*)pControl state] == NSOnState ? sal_True : sal_False; - aRetval <<= bValue; - OSL_TRACE("value is a bool (checkbox): %d", bValue); - } + if( pControl == nil ) { + OSL_TRACE("get value for unknown control %d", nControlId); + aRetval <<= sal_True; + } else { + if( [pControl class] == [NSPopUpButton class] ) { + aRetval = HandleGetListValue(pControl, nControlAction); + } else if( [pControl class] == [NSButton class] ) { + //NSLog(@"control: %@", [[pControl cell] title]); + sal_Bool bValue = [(NSButton*)pControl state] == NSOnState ? sal_True : sal_False; + aRetval <<= bValue; + OSL_TRACE("value is a bool (checkbox): %d", bValue); } } @@ -528,7 +511,7 @@ } } - for (int i = 1; i < TOGGLE_LAST; i++) { + for (int i = 0/*#i102102*/; i < TOGGLE_LAST; i++) { if (true == m_bToggleVisibility[i]) { m_bUserPaneNeeded = true; @@ -542,6 +525,11 @@ [button setState:NSOffState]; + if (i == AUTOEXTENSION) { + [button setTarget:m_pDelegate]; + [button setAction:@selector(autoextensionChanged:)]; + } + m_pToggles[i] = button; m_aActiveControls.push_back(m_pToggles[i]); @@ -790,6 +778,7 @@ switch( nControlId ) { + MAP_TOGGLE( AUTOEXTENSION ); MAP_TOGGLE( PASSWORD ); MAP_TOGGLE( FILTEROPTIONS ); MAP_TOGGLE( READONLY ); Index: source/aqua/SalAquaPicker.cxx =================================================================== --- source/aqua/SalAquaPicker.cxx (Revision 274631) +++ source/aqua/SalAquaPicker.cxx (Arbeitskopie) @@ -58,6 +58,7 @@ #pragma mark DEFINES #define CLASS_NAME "SalAquaPicker" +#define kSetHideExtensionStateKey @"NSNavLastUserSetHideExtensionButtonState" //------------------------------------------------------------------------ // namespace directives @@ -118,8 +119,22 @@ case NAVIGATIONSERVICES_SAVE: OSL_TRACE("NAVIGATIONSERVICES_SAVE"); m_pDialog = [NSSavePanel savePanel]; - [(NSSavePanel*)m_pDialog setCanSelectHiddenExtension:YES]; - [(NSSavePanel*)m_pDialog setExtensionHidden:NO]; + [(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: Index: source/aqua/AquaFilePickerDelegate.hxx =================================================================== --- source/aqua/AquaFilePickerDelegate.hxx (Revision 274595) +++ source/aqua/AquaFilePickerDelegate.hxx (Arbeitskopie) @@ -49,11 +49,11 @@ - (void)setFilterHelper:(FilterHelper*)filterHelper; - (MacOSBOOL)panel:(id)sender shouldShowFilename:(NSString *)filename; - - (void)panelSelectionDidChange:(id)sender; - (void)panel:(id)sender directoryDidChange:(NSString *)path; - (void)filterSelectedAtIndex:(id)sender; +- (void)autoextensionChanged:(id)sender; @end Index: source/aqua/ControlHelper.hxx =================================================================== --- source/aqua/ControlHelper.hxx (Revision 274595) +++ source/aqua/ControlHelper.hxx (Arbeitskopie) @@ -127,7 +127,7 @@ } inline bool isAutoExtensionEnabled() { - return m_bAutoFilenameExtension; + return ([((NSButton*) m_pToggles[AUTOEXTENSION]) state] == NSOnState); } private: @@ -168,16 +168,6 @@ /** indicates if a filter control is needed */ bool m_bIsFilterControlNeeded; - /* - * With issue #78852 the GUI option to set automatic filename extension was removed but - * so far the setting is still in effect and so the value for has to be saved and possibly be restored - * also. - * But with issue #FILLME users were starting to get confused on Windows so we decided to have - * autoextension always on and have it selectable for the user again. - */ - /** indicates if a filename extension is to automatically be appended to a user entered file name */ - bool m_bAutoFilenameExtension; - /** a list with all actively used controls */ ::std::list m_aActiveControls; Index: source/aqua/SalAquaFilePicker.cxx =================================================================== --- source/aqua/SalAquaFilePicker.cxx (Revision 274601) +++ source/aqua/SalAquaFilePicker.cxx (Arbeitskopie) @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -449,12 +448,7 @@ m_pControlHelper->setValue(nControlId, nControlAction, rValue); if (nControlId == ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION && m_nDialogType == NAVIGATIONSERVICES_SAVE) { - sal_Bool bAutoExtensionOn = sal_False; - rValue >>= bAutoExtensionOn; - if (bAutoExtensionOn == sal_True) { - [m_pDialog setExtensionHidden:bAutoExtensionOn]; - updateSaveFileNameExtension(); - } + updateSaveFileNameExtension(); } DBG_PRINT_EXIT(CLASS_NAME, __func__); @@ -771,22 +765,31 @@ return; } - if (m_pControlHelper->isAutoExtensionEnabled() == false) - return; + // we need to set this here again because initial setting does + //[m_pDialog setExtensionHidden:YES]; ::vos::OGuard aGuard( Application::GetSolarMutex() ); - ensureFilterHelper(); - - OUStringList aStringList = m_pFilterHelper->getCurrentFilterSuffixList(); - if( aStringList.empty()) // #i9328# - return; - - rtl::OUString suffix = (*(aStringList.begin())).copy(1); - NSString *requiredFileType = [NSString stringWithOUString:suffix]; + if (m_pControlHelper->isAutoExtensionEnabled() == false) { + OSL_TRACE("allowing other file types"); + [m_pDialog setAllowedFileTypes:nil]; + [m_pDialog setAllowsOtherFileTypes:YES]; + } else { + ensureFilterHelper(); - [m_pDialog setRequiredFileType:requiredFileType]; + OUStringList aStringList = m_pFilterHelper->getCurrentFilterSuffixList(); + if( aStringList.empty()) // #i9328# + return; + rtl::OUString suffix = (*(aStringList.begin())).copy(1); + NSString *requiredFileType = [NSString stringWithOUString:suffix]; + + [m_pDialog setRequiredFileType:requiredFileType]; + + OSL_TRACE("disallowing other file types"); + [m_pDialog setAllowsOtherFileTypes:NO]; + } + DBG_PRINT_EXIT(CLASS_NAME, __func__); } Index: source/aqua/AquaFilePickerDelegate.mm =================================================================== --- source/aqua/AquaFilePickerDelegate.mm (Revision 274595) +++ source/aqua/AquaFilePickerDelegate.mm (Arbeitskopie) @@ -27,6 +27,8 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ +#include +#include #ifndef _SALAQUAFILEPICKER_HXX_ #include "SalAquaFilePicker.hxx" @@ -106,5 +108,19 @@ filePicker->filterControlChanged(); } +- (void)autoextensionChanged:(id)sender +{ + if (sender == nil) { + return; + } + + if ([sender class] != [NSButton class]) { + return; + } + uno::Any aValue; + aValue <<= ([((NSButton*)sender) state] == NSOnState); + + filePicker->setValue(::com::sun::star::ui::dialogs::ExtendedFilePickerElementIds::CHECKBOX_AUTOEXTENSION, 0, aValue); +} -@end \ No newline at end of file +@end