diff options
Diffstat (limited to 'fpicker/source/aqua/ControlHelper.cxx')
-rw-r--r-- | fpicker/source/aqua/ControlHelper.cxx | 1022 |
1 files changed, 0 insertions, 1022 deletions
diff --git a/fpicker/source/aqua/ControlHelper.cxx b/fpicker/source/aqua/ControlHelper.cxx deleted file mode 100644 index de224e3191..0000000000 --- a/fpicker/source/aqua/ControlHelper.cxx +++ /dev/null @@ -1,1022 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * 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. - * - ************************************************************************/ - -#include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp> -#include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp> -#include <com/sun/star/ui/dialogs/ControlActions.hpp> -#include <com/sun/star/ui/dialogs/TemplateDescription.hpp> -#include <osl/mutex.hxx> -#include <vcl/svapp.hxx> -#include "CFStringUtilities.hxx" -#include "resourceprovider.hxx" -#include "NSString_OOoAdditions.hxx" - -#include "ControlHelper.hxx" - -#pragma mark DEFINES -#define CLASS_NAME "ControlHelper" -#define POPUP_WIDTH_MIN 200 -#define POPUP_WIDTH_MAX 350 - -using namespace ::com::sun::star::ui::dialogs; -using namespace ::com::sun::star::ui::dialogs::TemplateDescription; -using namespace ::com::sun::star::ui::dialogs::ExtendedFilePickerElementIds; -using namespace ::com::sun::star::ui::dialogs::CommonFilePickerElementIds; -using namespace ::rtl; - -#pragma mark Constructor / Destructor -//------------------------------------------------------------------------------------ -// Constructor / Destructor -//------------------------------------------------------------------------------------ -ControlHelper::ControlHelper() -: m_pUserPane(NULL) -, m_pFilterControl(nil) -, m_bUserPaneNeeded( false ) -, m_bIsUserPaneLaidOut(false) -, m_bIsFilterControlNeeded(false) -, m_pFilterHelper(NULL) -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__); - - int i; - - for( i = 0; i < TOGGLE_LAST; i++ ) { - m_bToggleVisibility[i] = false; - } - - for( i = 0; i < LIST_LAST; i++ ) { - m_bListVisibility[i] = false; - } - - DBG_PRINT_EXIT(CLASS_NAME, __func__); -} - -ControlHelper::~ControlHelper() -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__); - - NSAutoreleasePool *pool = [NSAutoreleasePool new]; - - if (NULL != m_pUserPane) { - [m_pUserPane release]; - } - - for(std::list<NSControl *>::iterator control = m_aActiveControls.begin(); control != m_aActiveControls.end(); ++control) { - NSControl* pControl = (*control); - NSString* sLabelName = m_aMapListLabels[pControl]; - if (sLabelName != nil) { - [sLabelName release]; - } - if ([pControl class] == [NSPopUpButton class]) { - NSTextField* pField = m_aMapListLabelFields[(NSPopUpButton*)pControl]; - if (pField != nil) { - [pField release]; - } - } - [pControl release]; - } - - if (m_pFilterControl != NULL) { - [m_pFilterControl setTarget:nil]; - } - - [pool release]; - - DBG_PRINT_EXIT(CLASS_NAME, __func__); -} - -#pragma mark XInitialization delegate -//------------------------------------------------ -// XInitialization delegate -//------------------------------------------------ -void ControlHelper::initialize( sal_Int16 nTemplateId ) -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__, "templateId", nTemplateId); - - switch( nTemplateId ) - { - case FILESAVE_AUTOEXTENSION_PASSWORD: - m_bToggleVisibility[AUTOEXTENSION] = true; - m_bToggleVisibility[PASSWORD] = true; - break; - case FILESAVE_AUTOEXTENSION_PASSWORD_FILTEROPTIONS: - m_bToggleVisibility[AUTOEXTENSION] = true; - m_bToggleVisibility[PASSWORD] = true; - m_bToggleVisibility[FILTEROPTIONS] = true; - break; - case FILESAVE_AUTOEXTENSION_SELECTION: - m_bToggleVisibility[AUTOEXTENSION] = true; - m_bToggleVisibility[SELECTION] = true; - break; - case FILESAVE_AUTOEXTENSION_TEMPLATE: - m_bToggleVisibility[AUTOEXTENSION] = true; - m_bListVisibility[TEMPLATE] = true; - break; - case FILEOPEN_LINK_PREVIEW_IMAGE_TEMPLATE: - m_bToggleVisibility[LINK] = true; - m_bToggleVisibility[PREVIEW] = true; - m_bListVisibility[IMAGE_TEMPLATE] = true; - break; - case FILEOPEN_READONLY_VERSION: - m_bToggleVisibility[READONLY] = true; - m_bListVisibility[VERSION] = true; - break; - case FILEOPEN_LINK_PREVIEW: - m_bToggleVisibility[LINK] = true; - m_bToggleVisibility[PREVIEW] = true; - break; - case FILESAVE_AUTOEXTENSION: - m_bToggleVisibility[AUTOEXTENSION] = true; - break; - } - - createControls(); - - DBG_PRINT_EXIT(CLASS_NAME, __func__); -} - -#pragma mark XFilePickerControlAccess delegates -//------------------------------------------------------------------------------------ -// XFilePickerControlAccess functions -//------------------------------------------------------------------------------------ - -void ControlHelper::enableControl( const sal_Int16 nControlId, const sal_Bool bEnable ) const -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__, "controlId", nControlId, "enable", bEnable); - - SolarMutexGuard aGuard; - - if (nControlId == ExtendedFilePickerElementIds::CHECKBOX_PREVIEW) { - OSL_TRACE(" preview checkbox cannot be changed"); - DBG_PRINT_EXIT(CLASS_NAME, __func__); - return; - } - - NSControl* pControl = getControl(nControlId); - - if( pControl != nil ) { - if( bEnable ) { - OSL_TRACE( "enable" ); - } else { - OSL_TRACE( "disable" ); - } - [pControl setEnabled:bEnable]; - } else { - OSL_TRACE("enable unknown control %d", nControlId ); - } - - DBG_PRINT_EXIT(CLASS_NAME, __func__); -} - -OUString ControlHelper::getLabel( sal_Int16 nControlId ) -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__, "controlId", nControlId); - - SolarMutexGuard aGuard; - - NSControl* pControl = getControl( nControlId ); - - if( pControl == nil ) { - OSL_TRACE("Get label for unknown control %d", nControlId); - return OUString(); - } - - rtl::OUString retVal; - if ([pControl class] == [NSPopUpButton class]) { - NSString *temp = m_aMapListLabels[pControl]; - if (temp != nil) - retVal = [temp OUString]; - } - else { - NSString* sLabel = [[pControl cell] title]; - retVal = [sLabel OUString]; - } - - DBG_PRINT_EXIT(CLASS_NAME, __func__, retVal); - - return retVal; -} - -void ControlHelper::setLabel( sal_Int16 nControlId, const NSString* aLabel ) -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__, "controlId", nControlId, "label", aLabel); - - SolarMutexGuard aGuard; - - NSAutoreleasePool *pool = [NSAutoreleasePool new]; - - NSControl* pControl = getControl(nControlId); - - if (nil != pControl) { - if ([pControl class] == [NSPopUpButton class]) { - NSString *sOldName = m_aMapListLabels[pControl]; - if (sOldName != NULL && sOldName != aLabel) { - [sOldName release]; - } - - m_aMapListLabels[pControl] = [aLabel retain]; - } else if ([pControl class] == [NSButton class]) { - [[pControl cell] setTitle:aLabel]; - } - } else { - OSL_TRACE("Control not found to set label for"); - } - - layoutControls(); - - [pool release]; - - DBG_PRINT_EXIT(CLASS_NAME, __func__); -} - -void ControlHelper::setValue( sal_Int16 nControlId, sal_Int16 nControlAction, const uno::Any& rValue ) -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__, "controlId", nControlId, "controlAction", nControlAction); - - SolarMutexGuard aGuard; - - if (nControlId == ExtendedFilePickerElementIds::CHECKBOX_PREVIEW) { - OSL_TRACE(" value for preview is unchangeable"); - } - else { - NSControl* pControl = getControl( nControlId ); - - if( pControl == nil ) { - OSL_TRACE("enable unknown control %d", nControlId); - } else { - if( [pControl class] == [NSPopUpButton class] ) { - HandleSetListValue(pControl, nControlAction, rValue); - } else if( [pControl class] == [NSButton class] ) { - sal_Bool bChecked = false; - rValue >>= bChecked; - OSL_TRACE(" value is a bool: %d", bChecked); - [(NSButton*)pControl setState:(bChecked ? NSOnState : NSOffState)]; - } else - { - OSL_TRACE("Can't set value on button / list %d %d", - nControlId, nControlAction); - } - } - } - - DBG_PRINT_EXIT(CLASS_NAME, __func__); -} - -uno::Any ControlHelper::getValue( sal_Int16 nControlId, sal_Int16 nControlAction ) const -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__, "controlId", nControlId, "controlAction", nControlAction); - - SolarMutexGuard aGuard; - uno::Any aRetval; - - 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); - } - } - - DBG_PRINT_EXIT(CLASS_NAME, __func__); - - return aRetval; -} - -void ControlHelper::createUserPane() -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__); - - if (m_bUserPaneNeeded == false) { - OSL_TRACE("no user pane needed"); - DBG_PRINT_EXIT(CLASS_NAME, __func__); - return; - } - - if (nil != m_pUserPane) { - OSL_TRACE("user pane already exists"); - DBG_PRINT_EXIT(CLASS_NAME, __func__); - return; - } - - if (m_bIsFilterControlNeeded == true && m_pFilterControl == nil) { - createFilterControl(); - } - - NSRect minRect = NSMakeRect(0,0,300,33); - m_pUserPane = [[NSView alloc] initWithFrame:minRect]; - - int currentHeight = kAquaSpaceBoxFrameViewDiffTop + kAquaSpaceBoxFrameViewDiffBottom; - int currentWidth = 300; - - sal_Bool bPopupControlPresent = NO; - sal_Bool bButtonControlPresent = NO; - - int nCheckboxMaxWidth = 0; - int nPopupMaxWidth = 0; - int nPopupLabelMaxWidth = 0; - - for (::std::list<NSControl*>::iterator child = m_aActiveControls.begin(); child != m_aActiveControls.end(); child++) { - OSL_TRACE("currentHeight: %d", currentHeight); - - NSControl* pControl = *child; - - //let the control calculate its size - [pControl sizeToFit]; - - NSRect frame = [pControl frame]; - OSL_TRACE("frame for control %s is {%f, %f, %f, %f}", [[pControl description] UTF8String], frame.origin.x, frame.origin.y, frame.size.width, frame.size.height); - - int nControlHeight = frame.size.height; - int nControlWidth = frame.size.width; - - // Note: controls are grouped by kind, first all popup menus, then checkboxes - if ([pControl class] == [NSPopUpButton class]) { - if (bPopupControlPresent == YES) { - //this is not the first popup - currentHeight += kAquaSpaceBetweenPopupMenus; - } - else if (child != m_aActiveControls.begin()){ - currentHeight += kAquaSpaceBetweenControls; - } - - bPopupControlPresent = YES; - - // we have to add the label text width - NSString *label = m_aMapListLabels[pControl]; - - NSTextField *textField = createLabelWithString(label); - [textField sizeToFit]; - m_aMapListLabelFields[(NSPopUpButton*)pControl] = textField; - [m_pUserPane addSubview:textField]; - - NSRect tfRect = [textField frame]; - OSL_TRACE("frame for textfield %s is {%f, %f, %f, %f}", [[textField description] UTF8String], tfRect.origin.x, tfRect.origin.y, tfRect.size.width, tfRect.size.height); - - int tfWidth = tfRect.size.width; - - if (nPopupLabelMaxWidth < tfWidth) { - nPopupLabelMaxWidth = tfWidth; - } - - frame.origin.x += (kAquaSpaceBetweenControls - kAquaSpaceLabelFrameBoundsDiffH - kAquaSpacePopupMenuFrameBoundsDiffLeft) + tfWidth; - - if (nControlWidth < POPUP_WIDTH_MIN) { - nControlWidth = POPUP_WIDTH_MIN; - frame.size.width = nControlWidth; - [pControl setFrame:frame]; - } - - if (nControlWidth > POPUP_WIDTH_MAX) { - nControlWidth = POPUP_WIDTH_MAX; - frame.size.width = nControlWidth; - [pControl setFrame:frame]; - } - - //set the max size - if (nPopupMaxWidth < nControlWidth) { - nPopupMaxWidth = nControlWidth; - } - - nControlWidth += tfWidth + kAquaSpaceBetweenControls - kAquaSpaceLabelFrameBoundsDiffH - kAquaSpacePopupMenuFrameBoundsDiffLeft; - if (nControlHeight < kAquaPopupButtonDefaultHeight) { - //maybe the popup has no menu item yet, so set a default height - nControlHeight = kAquaPopupButtonDefaultHeight; - } - - nControlHeight -= kAquaSpacePopupMenuFrameBoundsDiffV; - } - else if ([pControl class] == [NSButton class]) { - if (child != m_aActiveControls.begin()){ - currentHeight += kAquaSpaceBetweenControls; - } - - if (nCheckboxMaxWidth < nControlWidth) { - nCheckboxMaxWidth = nControlWidth; - } - - bButtonControlPresent = YES; - nControlWidth -= 2 * kAquaSpaceSwitchButtonFrameBoundsDiff; - nControlHeight -= 2 * kAquaSpaceSwitchButtonFrameBoundsDiff; - } - - // if ((nControlWidth + 2 * kAquaSpaceInsideGroupH) > currentWidth) { - // currentWidth = nControlWidth + 2 * kAquaSpaceInsideGroupH; - // } - - currentHeight += nControlHeight; - - [m_pUserPane addSubview:pControl]; - } - - OSL_TRACE("height after adding all controls: %d", currentHeight); - - if (bPopupControlPresent && bButtonControlPresent) - { - //after a popup button (array) and before a different kind of control we need some extra space instead of the standard - currentHeight -= kAquaSpaceBetweenControls; - currentHeight += kAquaSpaceAfterPopupButtonsV; - OSL_TRACE("popup extra space added, currentHeight: %d", currentHeight); - } - - int nLongestPopupWidth = nPopupMaxWidth + nPopupLabelMaxWidth + kAquaSpaceBetweenControls - kAquaSpacePopupMenuFrameBoundsDiffLeft - kAquaSpaceLabelFrameBoundsDiffH; - - currentWidth = nLongestPopupWidth > nCheckboxMaxWidth ? nLongestPopupWidth : nCheckboxMaxWidth; - OSL_TRACE("longest control width: %d", currentWidth); - - currentWidth += 2* kAquaSpaceInsideGroupH; - - if (currentWidth < minRect.size.width) - currentWidth = minRect.size.width; - - if (currentHeight < minRect.size.height) - currentHeight = minRect.size.height; - - NSRect upRect = NSMakeRect(0, 0, currentWidth, currentHeight ); - OSL_TRACE("setting user pane rect to {%f, %f, %f, %f}",upRect.origin.x, upRect.origin.y, upRect.size.width, upRect.size.height); - - [m_pUserPane setFrame:upRect]; - - layoutControls(); - - DBG_PRINT_EXIT(CLASS_NAME, __func__); -} - -#pragma mark Private / Misc -//------------------------------------------------------------------------------------ -// Private / Misc -//------------------------------------------------------------------------------------ -void ControlHelper::createControls() -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__); - - CResourceProvider aResProvider; - for (int i = 0; i < LIST_LAST; i++) { - if (true == m_bListVisibility[i]) { - m_bUserPaneNeeded = true; - - int elementName = getControlElementName([NSPopUpButton class], i); - NSString* sLabel = aResProvider.getResString(elementName); - - m_pListControls[i] = [NSPopUpButton new]; - -#define MAP_LIST_( elem ) \ - case elem: \ - setLabel(ExtendedFilePickerElementIds::LISTBOX_##elem, sLabel); \ - break - - switch(i) { - MAP_LIST_(VERSION); - MAP_LIST_(TEMPLATE); - MAP_LIST_(IMAGE_TEMPLATE); - } - - m_aActiveControls.push_back(m_pListControls[i]); - } else { - m_pListControls[i] = nil; - } - } - - for (int i = 0/*#i102102*/; i < TOGGLE_LAST; i++) { - if (true == m_bToggleVisibility[i]) { - m_bUserPaneNeeded = true; - - int elementName = getControlElementName([NSButton class], i); - NSString* sLabel = aResProvider.getResString(elementName); - - NSButton *button = [NSButton new]; - [button setTitle:sLabel]; - - [button setButtonType:NSSwitchButton]; - - [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]); - } else { - m_pToggles[i] = nil; - } - } - - //preview is always on with Mac OS X - NSControl *pPreviewBox = m_pToggles[PREVIEW]; - if (pPreviewBox != nil) { - [pPreviewBox setEnabled:NO]; - [(NSButton*)pPreviewBox setState:NSOnState]; - } - - DBG_PRINT_EXIT(CLASS_NAME, __func__); -} - -#define TOGGLE_ELEMENT( elem ) \ -case elem: \ - nReturn = CHECKBOX_##elem; \ - DBG_PRINT_EXIT(CLASS_NAME, __func__, nReturn); \ - return nReturn -#define LIST_ELEMENT( elem ) \ -case elem: \ - nReturn = LISTBOX_##elem##_LABEL; \ - DBG_PRINT_EXIT(CLASS_NAME, __func__, nReturn); \ - return nReturn - -int ControlHelper::getControlElementName(const Class aClazz, const int nControlId) const -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__, "aClazz", [[aClazz description] UTF8String], "controlId", nControlId); - - int nReturn = -1; - if (aClazz == [NSButton class]) - { - switch (nControlId) { - TOGGLE_ELEMENT( AUTOEXTENSION ); - TOGGLE_ELEMENT( PASSWORD ); - TOGGLE_ELEMENT( FILTEROPTIONS ); - TOGGLE_ELEMENT( READONLY ); - TOGGLE_ELEMENT( LINK ); - TOGGLE_ELEMENT( PREVIEW ); - TOGGLE_ELEMENT( SELECTION ); - } - } - else if (aClazz == [NSPopUpButton class]) - { - switch (nControlId) { - LIST_ELEMENT( VERSION ); - LIST_ELEMENT( TEMPLATE ); - LIST_ELEMENT( IMAGE_TEMPLATE ); - } - } - - DBG_PRINT_EXIT(CLASS_NAME, __func__, nReturn); - - return nReturn; -} - -void ControlHelper::HandleSetListValue(const NSControl* pControl, const sal_Int16 nControlAction, const uno::Any& rValue) -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__, "controlAction", nControlAction); - - if ([pControl class] != [NSPopUpButton class]) { - OSL_TRACE("not a popup menu"); - DBG_PRINT_EXIT(CLASS_NAME, __func__); - return; - } - - NSPopUpButton *pButton = (NSPopUpButton*)pControl; - NSMenu *rMenu = [pButton menu]; - if (nil == rMenu) { - OSL_TRACE("button has no menu"); - DBG_PRINT_EXIT(CLASS_NAME, __func__); - return; - } - - switch (nControlAction) - { - case ControlActions::ADD_ITEM: - { - OSL_TRACE("ADD_ITEMS"); - OUString sItem; - rValue >>= sItem; - - NSString* sCFItem = [NSString stringWithOUString:sItem]; - OSL_TRACE("Adding menu item: %s", OUStringToOString(sItem, RTL_TEXTENCODING_UTF8).getStr()); - [pButton addItemWithTitle:sCFItem]; - } - break; - case ControlActions::ADD_ITEMS: - { - OSL_TRACE("ADD_ITEMS"); - uno::Sequence< OUString > aStringList; - rValue >>= aStringList; - sal_Int32 nItemCount = aStringList.getLength(); - for (sal_Int32 i = 0; i < nItemCount; ++i) - { - NSString* sCFItem = [NSString stringWithOUString:aStringList[i]]; - OSL_TRACE("Adding menu item: %s", OUStringToOString(aStringList[i], RTL_TEXTENCODING_UTF8).getStr()); - [pButton addItemWithTitle:sCFItem]; - } - } - break; - case ControlActions::DELETE_ITEM: - { - OSL_TRACE("DELETE_ITEM"); - sal_Int32 nPos = -1; - rValue >>= nPos; - OSL_TRACE("Deleting item at position %d", (nPos)); - [rMenu removeItemAtIndex:nPos]; - } - break; - case ControlActions::DELETE_ITEMS: - { - OSL_TRACE("DELETE_ITEMS"); - int nItems = [rMenu numberOfItems]; - if (nItems == 0) { - OSL_TRACE("no menu items to delete"); - DBG_PRINT_EXIT(CLASS_NAME, __func__); - return; - } - for(sal_Int32 i = 0; i < nItems; i++) { - [rMenu removeItemAtIndex:i]; - } - } - break; - case ControlActions::SET_SELECT_ITEM: - { - sal_Int32 nPos = -1; - rValue >>= nPos; - OSL_TRACE("Selecting item at position %d", nPos); - [pButton selectItemAtIndex:nPos]; - } - break; - default: - OSL_TRACE("undocumented/unimplemented ControlAction for a list"); - break; - } - - layoutControls(); - - DBG_PRINT_EXIT(CLASS_NAME, __func__); -} - - -uno::Any ControlHelper::HandleGetListValue(const NSControl* pControl, const sal_Int16 nControlAction) const -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__, "controlAction", nControlAction); - - uno::Any aAny; - - if ([pControl class] != [NSPopUpButton class]) { - OSL_TRACE("not a popup button"); - DBG_PRINT_EXIT(CLASS_NAME, __func__); - return aAny; - } - - NSPopUpButton *pButton = (NSPopUpButton*)pControl; - NSMenu *rMenu = [pButton menu]; - if (nil == rMenu) { - OSL_TRACE("button has no menu"); - DBG_PRINT_EXIT(CLASS_NAME, __func__); - return aAny; - } - - switch (nControlAction) - { - case ControlActions::GET_ITEMS: - { - OSL_TRACE("GET_ITEMS"); - uno::Sequence< OUString > aItemList; - - int nItems = [rMenu numberOfItems]; - if (nItems > 0) { - aItemList.realloc(nItems); - } - for (int i = 0; i < nItems; i++) { - NSString* sCFItem = [pButton itemTitleAtIndex:i]; - if (nil != sCFItem) { - aItemList[i] = [sCFItem OUString]; - OSL_TRACE("Return value[%d]: %s", (i - 1), OUStringToOString(aItemList[i - 1], RTL_TEXTENCODING_UTF8).getStr()); - } - } - - aAny <<= aItemList; - } - break; - case ControlActions::GET_SELECTED_ITEM: - { - OSL_TRACE("GET_SELECTED_ITEM"); - NSString* sCFItem = [pButton titleOfSelectedItem]; - if (nil != sCFItem) { - OUString sString = [sCFItem OUString]; - OSL_TRACE("Return value: %s", OUStringToOString(sString, RTL_TEXTENCODING_UTF8).getStr()); - aAny <<= sString; - } - } - break; - case ControlActions::GET_SELECTED_ITEM_INDEX: - { - OSL_TRACE("GET_SELECTED_ITEM_INDEX"); - sal_Int32 nActive = [pButton indexOfSelectedItem]; - OSL_TRACE("Return value: %d", nActive); - aAny <<= nActive; - } - break; - default: - OSL_TRACE("undocumented/unimplemented ControlAction for a list"); - break; - } - - DBG_PRINT_EXIT(CLASS_NAME, __func__); - - return aAny; -} - - -// cf. offapi/com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.idl -NSControl* ControlHelper::getControl( const sal_Int16 nControlId ) const -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__, "controlId", nControlId); - - NSControl* pWidget = nil; - -#define MAP_TOGGLE( elem ) \ -case ExtendedFilePickerElementIds::CHECKBOX_##elem: \ - pWidget = m_pToggles[elem]; \ - break - -#define MAP_BUTTON( elem ) \ -case ExtendedFilePickerElementIds::PUSHBUTTON_##elem: \ - pWidget = m_pButtons[elem]; \ - break - -#define MAP_LIST( elem ) \ -case ExtendedFilePickerElementIds::LISTBOX_##elem: \ - pWidget = m_pListControls[elem]; \ - break - -#define MAP_LIST_LABEL( elem ) \ -case ExtendedFilePickerElementIds::LISTBOX_##elem##_LABEL: \ - pWidget = m_pListControls[elem]; \ - break - - switch( nControlId ) - { - MAP_TOGGLE( AUTOEXTENSION ); - MAP_TOGGLE( PASSWORD ); - MAP_TOGGLE( FILTEROPTIONS ); - MAP_TOGGLE( READONLY ); - MAP_TOGGLE( LINK ); - MAP_TOGGLE( PREVIEW ); - MAP_TOGGLE( SELECTION ); - //MAP_BUTTON( PLAY ); - MAP_LIST( VERSION ); - MAP_LIST( TEMPLATE ); - MAP_LIST( IMAGE_TEMPLATE ); - MAP_LIST_LABEL( VERSION ); - MAP_LIST_LABEL( TEMPLATE ); - MAP_LIST_LABEL( IMAGE_TEMPLATE ); - default: - OSL_TRACE("Handle unknown control %d", nControlId); - break; - } -#undef MAP - - DBG_PRINT_EXIT(CLASS_NAME, __func__); - - return pWidget; -} - -void ControlHelper::layoutControls() -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__); - - SolarMutexGuard aGuard; - - if (nil == m_pUserPane) { - OSL_TRACE("no user pane to layout"); - DBG_PRINT_EXIT(CLASS_NAME, __func__); - return; - } - - if (m_bIsUserPaneLaidOut == true) { - OSL_TRACE("user pane already laid out"); - DBG_PRINT_EXIT(CLASS_NAME, __func__); - return; - } - - NSRect userPaneRect = [m_pUserPane frame]; - OSL_TRACE("userPane frame: {%f, %f, %f, %f}",userPaneRect.origin.x, userPaneRect.origin.y, userPaneRect.size.width, userPaneRect.size.height); - - int nUsableWidth = userPaneRect.size.width; - - //NOTE: NSView's coordinate system starts in the lower left hand corner but we start adding controls from the top, - // so we subtract from the vertical position as we make our way down the pane. - int currenttop = userPaneRect.size.height; - int nCheckboxMaxWidth = 0; - int nPopupMaxWidth = 0; - int nPopupLabelMaxWidth = 0; - - //first loop to determine max sizes - for (::std::list<NSControl*>::iterator child = m_aActiveControls.begin(); child != m_aActiveControls.end(); child++) { - NSControl* pControl = *child; - - NSRect controlRect = [pControl frame]; - int nControlWidth = controlRect.size.width; - - Class aSubType = [pControl class]; - if (aSubType == [NSPopUpButton class]) { - if (nPopupMaxWidth < nControlWidth) { - nPopupMaxWidth = nControlWidth; - } - NSTextField *label = m_aMapListLabelFields[(NSPopUpButton*)pControl]; - NSRect labelFrame = [label frame]; - int nLabelWidth = labelFrame.size.width; - if (nPopupLabelMaxWidth < nLabelWidth) { - nPopupLabelMaxWidth = nLabelWidth; - } - } else { - if (nCheckboxMaxWidth < nControlWidth) { - nCheckboxMaxWidth = nControlWidth; - } - } - } - - int nLongestPopupWidth = nPopupMaxWidth + nPopupLabelMaxWidth + kAquaSpaceBetweenControls - kAquaSpacePopupMenuFrameBoundsDiffLeft - kAquaSpaceLabelFrameBoundsDiffH; - OSL_TRACE("longest popup width: %d", nLongestPopupWidth); - - NSControl* previousControl = nil; - - int nDistBetweenControls = 0; - - for (::std::list<NSControl*>::iterator child = m_aActiveControls.begin(); child != m_aActiveControls.end(); child++) { - NSControl* pControl = *child; - - //get the control's bounds - NSRect controlRect = [pControl frame]; - int nControlHeight = controlRect.size.height; - int nControlWidth = controlRect.size.width; - - //subtract the height from the current vertical position, because the control's bounds origin rect will be its lower left hand corner - currenttop -= nControlHeight; - - Class aSubType = [pControl class]; - - //add space between the previous control and this control according to Apple's HIG - nDistBetweenControls = getVerticalDistance(previousControl, pControl); - OSL_TRACE("vertical distance: %d", nDistBetweenControls); - currenttop -= nDistBetweenControls; - - previousControl = pControl; - - if (aSubType == [NSPopUpButton class]) { - //move vertically up some pixels to space the controls between their real (visual) bounds - currenttop += kAquaSpacePopupMenuFrameBoundsDiffTop;//from top - - //get the corresponding popup label - NSTextField *label = m_aMapListLabelFields[(NSPopUpButton*)pControl]; - NSRect labelFrame = [label frame]; - int totalWidth = nPopupMaxWidth + labelFrame.size.width + kAquaSpaceBetweenControls - kAquaSpacePopupMenuFrameBoundsDiffLeft - kAquaSpaceLabelFrameBoundsDiffH; - OSL_TRACE("totalWidth: %d", totalWidth); - //let's center popups - int left = (nUsableWidth + nLongestPopupWidth) / 2 - totalWidth; - OSL_TRACE("left: %d", left); - labelFrame.origin.x = left; - labelFrame.origin.y = currenttop + kAquaSpaceLabelPopupDiffV; - OSL_TRACE("setting label at: {%f, %f, %f, %f}",labelFrame.origin.x, labelFrame.origin.y, labelFrame.size.width, labelFrame.size.height); - [label setFrame:labelFrame]; - - controlRect.origin.x = left + labelFrame.size.width + kAquaSpaceBetweenControls - kAquaSpaceLabelFrameBoundsDiffH - kAquaSpacePopupMenuFrameBoundsDiffLeft; - controlRect.origin.y = currenttop; - controlRect.size.width = nPopupMaxWidth; - OSL_TRACE("setting popup at: {%f, %f, %f, %f}",controlRect.origin.x, controlRect.origin.y, controlRect.size.width, controlRect.size.height); - [pControl setFrame:controlRect]; - - //add some space to place the vertical position right below the popup's visual bounds - currenttop += kAquaSpacePopupMenuFrameBoundsDiffBottom; - } else { - currenttop += kAquaSpaceSwitchButtonFrameBoundsDiff;//from top - - nControlWidth = nCheckboxMaxWidth; - int left = (nUsableWidth - nCheckboxMaxWidth) / 2; - controlRect.origin.x = left; - controlRect.origin.y = currenttop; - controlRect.size.width = nPopupMaxWidth; - [pControl setFrame:controlRect]; - OSL_TRACE("setting checkbox at: {%f, %f, %f, %f}",controlRect.origin.x, controlRect.origin.y, controlRect.size.width, controlRect.size.height); - - currenttop += kAquaSpaceSwitchButtonFrameBoundsDiff; - } - } - - m_bIsUserPaneLaidOut = true; - - DBG_PRINT_EXIT(CLASS_NAME, __func__); -} - -void ControlHelper::createFilterControl() { - DBG_PRINT_ENTRY(CLASS_NAME, __func__); - - CResourceProvider aResProvider; - NSString* sLabel = aResProvider.getResString(CommonFilePickerElementIds::LISTBOX_FILTER_LABEL); - - m_pFilterControl = [NSPopUpButton new]; - - [m_pFilterControl setAction:@selector(filterSelectedAtIndex:)]; - [m_pFilterControl setTarget:m_pDelegate]; - - NSMenu *menu = [m_pFilterControl menu]; - - for (NSStringList::iterator iter = m_pFilterHelper->getFilterNames()->begin(); iter != m_pFilterHelper->getFilterNames()->end(); iter++) { - NSString *filterName = *iter; - OSL_TRACE("adding filter name: %s", [filterName UTF8String]); - if ([filterName isEqualToString:@"-"]) { - [menu addItem:[NSMenuItem separatorItem]]; - } - else { - [m_pFilterControl addItemWithTitle:filterName]; - } - } - - // always add the filter as first item - m_aActiveControls.push_front(m_pFilterControl); - m_aMapListLabels[m_pFilterControl] = [sLabel retain]; - - DBG_PRINT_EXIT(CLASS_NAME, __func__); -} - -NSTextField* ControlHelper::createLabelWithString(const NSString* labelString) { - DBG_PRINT_ENTRY(CLASS_NAME, __func__, "label", labelString); - - NSTextField *textField = [NSTextField new]; - [textField setEditable:NO]; - [textField setSelectable:NO]; - [textField setDrawsBackground:NO]; - [textField setBordered:NO]; - [[textField cell] setTitle:labelString]; - - DBG_PRINT_EXIT(CLASS_NAME, __func__); - return textField; -} - -int ControlHelper::getVerticalDistance(const NSControl* first, const NSControl* second) -{ - if (first == nil) { - return kAquaSpaceBoxFrameViewDiffTop; - } - else if (second == nil) { - return kAquaSpaceBoxFrameViewDiffBottom; - } - else { - Class firstClass = [first class]; - Class secondClass = [second class]; - - if (firstClass == [NSPopUpButton class]) { - if (secondClass == [NSPopUpButton class]) { - return kAquaSpaceBetweenPopupMenus; - } - else { - return kAquaSpaceAfterPopupButtonsV; - } - } - - return kAquaSpaceBetweenControls; - } -} - -void ControlHelper::updateFilterUI() -{ - DBG_PRINT_ENTRY(CLASS_NAME, __func__); - - if (m_bIsFilterControlNeeded == false || m_pFilterHelper == NULL) { - OSL_TRACE("no filter control needed or no filter helper present"); - DBG_PRINT_EXIT(CLASS_NAME, __func__); - return; - } - - int index = m_pFilterHelper->getCurrentFilterIndex(); - - if (m_pFilterControl == nil) { - createFilterControl(); - } - - [m_pFilterControl selectItemAtIndex:index]; - - DBG_PRINT_EXIT(CLASS_NAME, __func__); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |