1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_fpicker.hxx"
26 
27 #include "OfficeControlAccess.hxx"
28 #include <com/sun/star/ui/dialogs/ExtendedFilePickerElementIds.hpp>
29 #include <com/sun/star/ui/dialogs/CommonFilePickerElementIds.hpp>
30 #include <com/sun/star/ui/dialogs/ControlActions.hpp>
31 #include <vcl/lstbox.hxx>
32 #include <com/sun/star/uno/Sequence.hxx>
33 #include <tools/urlobj.hxx>
34 
35 #include <algorithm>
36 #include <functional>
37 
38 //.........................................................................
39 namespace svt
40 {
41 //.........................................................................
42 
43 	// helper -------------------------------------------------------------
44 
45 	using namespace ::com::sun::star::uno;
46 	using namespace ::com::sun::star::lang;
47 	using namespace ::com::sun::star::ui::dialogs;
48 
49 	using namespace ExtendedFilePickerElementIds;
50 	using namespace CommonFilePickerElementIds;
51 	using namespace InternalFilePickerElementIds;
52 
53 	// --------------------------------------------------------------------
54 	namespace
55 	{
56 		// ----------------------------------------------------------------
57 		#define PROPERTY_FLAG_TEXT					0x00000001
58 		#define PROPERTY_FLAG_ENDBALED				0x00000002
59 		#define PROPERTY_FLAG_VISIBLE				0x00000004
60 		#define PROPERTY_FLAG_HELPURL				0x00000008
61 		#define PROPERTY_FLAG_LISTITEMS				0x00000010
62 		#define PROPERTY_FLAG_SELECTEDITEM			0x00000020
63 		#define PROPERTY_FLAG_SELECTEDITEMINDEX		0x00000040
64 		#define PROPERTY_FLAG_CHECKED				0x00000080
65 
66 		// ----------------------------------------------------------------
67 		// ................................................................
68 		struct ControlDescription
69 		{
70 			const sal_Char*	pControlName;
71 			sal_Int16		nControlId;
72 			sal_Int32		nPropertyFlags;
73 		};
74 
75 		// ................................................................
76 		typedef const ControlDescription* ControlDescIterator;
77 		typedef ::std::pair< ControlDescIterator, ControlDescIterator >	ControlDescRange;
78 
79 		// ......................................................................
80 		#define PROPERTY_FLAGS_COMMON		( PROPERTY_FLAG_ENDBALED | PROPERTY_FLAG_VISIBLE | PROPERTY_FLAG_HELPURL )
81 		#define PROPERTY_FLAGS_LISTBOX		( PROPERTY_FLAG_LISTITEMS | PROPERTY_FLAG_SELECTEDITEM | PROPERTY_FLAG_SELECTEDITEMINDEX )
82 		#define PROPERTY_FLAGS_CHECKBOX		( PROPERTY_FLAG_CHECKED | PROPERTY_FLAG_TEXT )
83 
84 		// Note: this array MUST be sorted by name!
85 		static const ControlDescription aDescriptions[] =  {
86 			{ "AutoExtensionBox",		CHECKBOX_AUTOEXTENSION,			PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_CHECKBOX		},
87 			{ "CancelButton",			PUSHBUTTON_CANCEL,				PROPERTY_FLAGS_COMMON | PROPERTY_FLAG_TEXT			},
88 			{ "CurrentFolderText",		FIXEDTEXT_CURRENTFOLDER,		PROPERTY_FLAGS_COMMON | PROPERTY_FLAG_TEXT			},
89 			{ "DefaultLocationButton",	TOOLBOXBUTOON_DEFAULT_LOCATION,	PROPERTY_FLAGS_COMMON								},
90 			{ "FileURLEdit",			EDIT_FILEURL,					PROPERTY_FLAGS_COMMON | PROPERTY_FLAG_TEXT			},
91 			{ "FileURLEditLabel",		EDIT_FILEURL_LABEL,				PROPERTY_FLAGS_COMMON | PROPERTY_FLAG_TEXT			},
92 			{ "FileView",				CONTROL_FILEVIEW,				PROPERTY_FLAGS_COMMON								},
93 			{ "FilterList",				LISTBOX_FILTER,					PROPERTY_FLAGS_COMMON								},
94 			{ "FilterListLabel",		LISTBOX_FILTER_LABEL,			PROPERTY_FLAGS_COMMON | PROPERTY_FLAG_TEXT			},
95 			{ "FilterOptionsBox",		CHECKBOX_FILTEROPTIONS,			PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_CHECKBOX		},
96 			{ "HelpButton",				PUSHBUTTON_HELP,				PROPERTY_FLAGS_COMMON | PROPERTY_FLAG_TEXT			},
97 			{ "ImageTemplateList",		LISTBOX_IMAGE_TEMPLATE,			PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_LISTBOX		},
98 			{ "ImageTemplateListLabel",	LISTBOX_IMAGE_TEMPLATE_LABEL,	PROPERTY_FLAGS_COMMON | PROPERTY_FLAG_TEXT			},
99 			{ "LevelUpButton",			TOOLBOXBUTOON_LEVEL_UP,			PROPERTY_FLAGS_COMMON								},
100 			{ "LinkBox",				CHECKBOX_LINK,					PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_CHECKBOX		},
101 			{ "NewFolderButton",		TOOLBOXBUTOON_NEW_FOLDER,		PROPERTY_FLAGS_COMMON								},
102 			{ "OkButton",				PUSHBUTTON_OK ,					PROPERTY_FLAGS_COMMON | PROPERTY_FLAG_TEXT			},
103 			{ "PasswordBox",			CHECKBOX_PASSWORD,				PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_CHECKBOX		},
104 			{ "PlayButton",				PUSHBUTTON_PLAY,				PROPERTY_FLAGS_COMMON | PROPERTY_FLAG_TEXT			},
105 			{ "PreviewBox",				CHECKBOX_PREVIEW,				PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_CHECKBOX		},
106 			{ "ReadOnlyBox",			CHECKBOX_READONLY,				PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_CHECKBOX		},
107 			{ "SelectionBox",			CHECKBOX_SELECTION,				PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_CHECKBOX		},
108 			{ "TemplateList",			LISTBOX_TEMPLATE,				PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_LISTBOX		},
109 			{ "TemplateListLabel",		LISTBOX_TEMPLATE_LABEL,			PROPERTY_FLAGS_COMMON | PROPERTY_FLAG_TEXT			},
110 			{ "VersionList",			LISTBOX_VERSION,				PROPERTY_FLAGS_COMMON | PROPERTY_FLAGS_LISTBOX		},
111 			{ "VersionListLabel",		LISTBOX_VERSION_LABEL,			PROPERTY_FLAGS_COMMON | PROPERTY_FLAG_TEXT			}
112 		};
113 
114 		// ................................................................
115 		static const sal_Int32 s_nControlCount = sizeof( aDescriptions ) / sizeof( aDescriptions[0] );
116 
117 		static ControlDescIterator s_pControls = aDescriptions;
118 		static ControlDescIterator s_pControlsEnd = aDescriptions + s_nControlCount;
119 
120 		// ................................................................
121 		struct ControlDescriptionLookup
122 		{
operator ()svt::__anon304dad440111::ControlDescriptionLookup123 			bool operator()( const ::rtl::OUString& _rLookup, const ControlDescription& _rDesc )
124 			{
125 				return _rLookup.compareToAscii( _rDesc.pControlName ) < 0;
126 			}
operator ()svt::__anon304dad440111::ControlDescriptionLookup127 			bool operator()( const ControlDescription& _rDesc, const ::rtl::OUString& _rLookup )
128 			{
129 				return _rLookup.compareToAscii( _rDesc.pControlName ) > 0;
130 			}
131 		};
132 
133 		// ................................................................
134 		struct ExtractControlName : public ::std::unary_function< ControlDescription, ::rtl::OUString >
135 		{
operator ()svt::__anon304dad440111::ExtractControlName136 			::rtl::OUString operator()( const ControlDescription& _rDesc )
137 			{
138 				return ::rtl::OUString::createFromAscii( _rDesc.pControlName );
139 			}
140 		};
141 
142 		// ----------------------------------------------------------------
143 		// ................................................................
144 		struct ControlProperty
145 		{
146 			const sal_Char* pPropertyName;
147 			sal_Int16		nPropertyId;
148 		};
149 
150 		typedef const ControlProperty* ControlPropertyIterator;
151 
152 		// ................................................................
153 		static const ControlProperty aProperties[] =  {
154 			{ "Text",				PROPERTY_FLAG_TEXT				},
155 			{ "Enabled",			PROPERTY_FLAG_ENDBALED			},
156 			{ "Visible",			PROPERTY_FLAG_VISIBLE			},
157 			{ "HelpURL",			PROPERTY_FLAG_HELPURL			},
158 			{ "ListItems",			PROPERTY_FLAG_LISTITEMS			},
159 			{ "SelectedItem",		PROPERTY_FLAG_SELECTEDITEM		},
160 			{ "SelectedItemIndex",	PROPERTY_FLAG_SELECTEDITEMINDEX	},
161 			{ "Checked",			PROPERTY_FLAG_CHECKED			}
162 		};
163 
164 		// ................................................................
165 		static const int s_nPropertyCount = sizeof( aProperties ) / sizeof( aProperties[0] );
166 
167 		static ControlPropertyIterator s_pProperties = aProperties;
168 		static ControlPropertyIterator s_pPropertiesEnd = aProperties + s_nPropertyCount;
169 
170 		// ................................................................
171 		struct ControlPropertyLookup
172 		{
173 			::rtl::OUString	m_sLookup;
ControlPropertyLookupsvt::__anon304dad440111::ControlPropertyLookup174 			ControlPropertyLookup( const ::rtl::OUString& _rLookup ) : m_sLookup( _rLookup ) { }
175 
operator ()svt::__anon304dad440111::ControlPropertyLookup176 			sal_Bool operator()( const ControlProperty& _rProp )
177 			{
178 				return m_sLookup.equalsAscii( _rProp.pPropertyName );
179 			}
180 		};
181 
182 		//-----------------------------------------------------------------
lcl_throwIllegalArgumentException()183 		void lcl_throwIllegalArgumentException( ) SAL_THROW( (IllegalArgumentException) )
184 		{
185 			throw IllegalArgumentException();
186 			// TODO: error message in the exception
187 		}
188 	}
189 
190 	//---------------------------------------------------------------------
OControlAccess(IFilePickerController * _pController,SvtFileView * _pFileView)191 	OControlAccess::OControlAccess( IFilePickerController* _pController, SvtFileView* _pFileView )
192 		:m_pFilePickerController( _pController )
193 		,m_pFileView( _pFileView )
194 	{
195 		DBG_ASSERT( m_pFilePickerController, "OControlAccess::OControlAccess: invalid control locator!" );
196 	}
197 
198 	//---------------------------------------------------------------------
setHelpURL(Window * _pControl,const::rtl::OUString & sHelpURL,sal_Bool _bFileView)199 	void OControlAccess::setHelpURL( Window* _pControl, const ::rtl::OUString& sHelpURL, sal_Bool _bFileView )
200 	{
201         rtl::OUString sHelpID( sHelpURL );
202         INetURLObject aHID( sHelpURL );
203         if ( aHID.GetProtocol() == INET_PROT_HID )
204       	    sHelpID = aHID.GetURLPath();
205 
206         // URLs should always be UTF8 encoded and escaped
207 	    rtl::OString sID( rtl::OUStringToOString( sHelpID, RTL_TEXTENCODING_UTF8 ) );
208 		if ( _bFileView )
209 			// the file view "overloaded" the SetHelpId
210 			static_cast< SvtFileView* >( _pControl )->SetHelpId( sID );
211 		else
212 			_pControl->SetHelpId( sID );
213 	}
214 
215 	//---------------------------------------------------------------------
getHelpURL(Window * _pControl,sal_Bool _bFileView)216 	::rtl::OUString	OControlAccess::getHelpURL( Window* _pControl, sal_Bool _bFileView )
217 	{
218 	    rtl::OString aHelpId = _pControl->GetHelpId();
219 		if ( _bFileView )
220 			// the file view "overloaded" the SetHelpId
221 			aHelpId = static_cast< SvtFileView* >( _pControl )->GetHelpId( );
222 
223         ::rtl::OUString sHelpURL;
224         ::rtl::OUString aTmp( rtl::OStringToOUString( aHelpId, RTL_TEXTENCODING_UTF8 ) );
225         INetURLObject aHID( aTmp );
226         if ( aHID.GetProtocol() == INET_PROT_NOT_VALID )
227             sHelpURL = rtl::OUString::createFromAscii( INET_HID_SCHEME );
228 		sHelpURL += aTmp;
229 		return sHelpURL;
230 	}
231 
232 	// --------------------------------------------------------------------------
getControlProperty(const::rtl::OUString & _rControlName,const::rtl::OUString & _rControlProperty)233 	Any	OControlAccess::getControlProperty( const ::rtl::OUString& _rControlName, const ::rtl::OUString& _rControlProperty )
234 	{
235 		// look up the control
236 		sal_Int16 nControlId = -1;
237 		sal_Int32 nPropertyMask = 0;
238 		Control* pControl = implGetControl( _rControlName, &nControlId, &nPropertyMask );
239 			// will throw an IllegalArgumentException if the name is not valid
240 
241 		// look up the property
242 		ControlPropertyIterator aPropDesc = ::std::find_if( s_pProperties, s_pPropertiesEnd, ControlPropertyLookup( _rControlProperty ) );
243 		if ( aPropDesc == s_pPropertiesEnd )
244 			// it's a completely unknown property
245 			lcl_throwIllegalArgumentException();
246 
247 		if ( 0 == ( nPropertyMask & aPropDesc->nPropertyId ) )
248 			// it's a property which is known, but not allowed for this control
249 			lcl_throwIllegalArgumentException();
250 
251 		return implGetControlProperty( pControl, aPropDesc->nPropertyId );
252 	}
253 
254 	//---------------------------------------------------------------------
implGetControl(const::rtl::OUString & _rControlName,sal_Int16 * _pId,sal_Int32 * _pPropertyMask) const255 	Control* OControlAccess::implGetControl( const ::rtl::OUString& _rControlName, sal_Int16* _pId, sal_Int32* _pPropertyMask ) const SAL_THROW( (IllegalArgumentException) )
256 	{
257 		Control* pControl = NULL;
258 
259 		// translate the name into an id
260 		ControlDescRange aFoundRange = ::std::equal_range( s_pControls, s_pControlsEnd, _rControlName, ControlDescriptionLookup() );
261 		if ( aFoundRange.first != aFoundRange.second )
262 		{
263 			// get the VCL control determined by this id
264 			pControl = m_pFilePickerController->getControl( aFoundRange.first->nControlId );
265 		}
266 
267 		// if not found 'til here, the name is invalid, or we do not have the control in the current mode
268 		if ( !pControl )
269 			lcl_throwIllegalArgumentException();
270 
271 		// out parameters and outta here
272 		if ( _pId )
273 			*_pId = aFoundRange.first->nControlId;
274 		if ( _pPropertyMask )
275 			*_pPropertyMask = aFoundRange.first->nPropertyFlags;
276 
277 		return pControl;
278 	}
279 
280 	//---------------------------------------------------------------------
setControlProperty(const::rtl::OUString & _rControlName,const::rtl::OUString & _rControlProperty,const::com::sun::star::uno::Any & _rValue)281 	void OControlAccess::setControlProperty( const ::rtl::OUString& _rControlName, const ::rtl::OUString& _rControlProperty, const ::com::sun::star::uno::Any& _rValue )
282 	{
283 		// look up the control
284         sal_Int16 nControlId = -1;
285 		Control* pControl = implGetControl( _rControlName, &nControlId );
286 			// will throw an IllegalArgumentException if the name is not valid
287 
288 		// look up the property
289 		ControlPropertyIterator aPropDesc = ::std::find_if( s_pProperties, s_pPropertiesEnd, ControlPropertyLookup( _rControlProperty ) );
290 		if ( aPropDesc == s_pPropertiesEnd )
291 			lcl_throwIllegalArgumentException();
292 
293 		// set the property
294 		implSetControlProperty( nControlId, pControl, aPropDesc->nPropertyId, _rValue, sal_False );
295 	}
296 
297 	// --------------------------------------------------------------------------
getSupportedControls()298 	Sequence< ::rtl::OUString > OControlAccess::getSupportedControls(  )
299 	{
300 		Sequence< ::rtl::OUString > aControls( s_nControlCount );
301 		::rtl::OUString* pControls = aControls.getArray();
302 
303 		// collect the names of all _actually_existent_ controls
304 		for ( ControlDescIterator aControl = s_pControls; aControl != s_pControlsEnd; ++aControl )
305 		{
306 			if ( m_pFilePickerController->getControl( aControl->nControlId ) )
307 				*pControls++ = ::rtl::OUString::createFromAscii( aControl->pControlName );
308 		}
309 
310 		aControls.realloc( pControls - aControls.getArray() );
311 		return aControls;
312 	}
313 
314 	// --------------------------------------------------------------------------
getSupportedControlProperties(const::rtl::OUString & _rControlName)315 	Sequence< ::rtl::OUString > OControlAccess::getSupportedControlProperties( const ::rtl::OUString& _rControlName )
316 	{
317 		sal_Int16 nControlId = -1;
318 		sal_Int32 nPropertyMask = 0;
319 		implGetControl( _rControlName, &nControlId, &nPropertyMask );
320 			// will throw an IllegalArgumentException if the name is not valid
321 
322 		// fill in the property names
323 		Sequence< ::rtl::OUString > aProps( s_nPropertyCount );
324 		::rtl::OUString* pProperty = aProps.getArray();
325 
326 		for ( ControlPropertyIterator aProp = s_pProperties; aProp != s_pPropertiesEnd; ++aProp )
327 			if ( 0 != ( nPropertyMask & aProp->nPropertyId ) )
328 				*pProperty++ = ::rtl::OUString::createFromAscii( aProp->pPropertyName );
329 
330 		aProps.realloc( pProperty - aProps.getArray() );
331 		return aProps;
332 	}
333 
334 	// --------------------------------------------------------------------------
isControlSupported(const::rtl::OUString & _rControlName)335 	sal_Bool OControlAccess::isControlSupported( const ::rtl::OUString& _rControlName )
336 	{
337 		return ::std::binary_search( s_pControls, s_pControlsEnd, _rControlName, ControlDescriptionLookup() );
338 	}
339 
340 	// --------------------------------------------------------------------------
isControlPropertySupported(const::rtl::OUString & _rControlName,const::rtl::OUString & _rControlProperty)341 	sal_Bool OControlAccess::isControlPropertySupported( const ::rtl::OUString& _rControlName, const ::rtl::OUString& _rControlProperty )
342 	{
343 		// look up the control
344 		sal_Int16 nControlId = -1;
345 		sal_Int32 nPropertyMask = 0;
346 		implGetControl( _rControlName, &nControlId, &nPropertyMask );
347 			// will throw an IllegalArgumentException if the name is not valid
348 
349 		// look up the property
350 		ControlPropertyIterator aPropDesc = ::std::find_if( s_pProperties, s_pPropertiesEnd, ControlPropertyLookup( _rControlProperty ) );
351 		if ( aPropDesc == s_pPropertiesEnd )
352 			// it's a property which is completely unknown
353 			return sal_False;
354 
355 		return 0 != ( aPropDesc->nPropertyId & nPropertyMask );
356 	}
357 
358 	//-----------------------------------------------------------------------------
setValue(sal_Int16 _nControlId,sal_Int16 _nControlAction,const Any & _rValue)359 	void OControlAccess::setValue( sal_Int16 _nControlId, sal_Int16 _nControlAction, const Any& _rValue )
360 	{
361 		Control* pControl = m_pFilePickerController->getControl( _nControlId );
362 		DBG_ASSERT( pControl, "OControlAccess::SetValue: don't have this control in the current mode!" );
363 		if ( pControl )
364 		{
365 			sal_Int16 nPropertyId = -1;
366 			if ( ControlActions::SET_HELP_URL == _nControlAction )
367 			{
368 				nPropertyId = PROPERTY_FLAG_HELPURL;
369 			}
370 			else
371 			{
372 				switch ( _nControlId )
373 				{
374 					case CHECKBOX_AUTOEXTENSION:
375 					case CHECKBOX_PASSWORD:
376 					case CHECKBOX_FILTEROPTIONS:
377 					case CHECKBOX_READONLY:
378 					case CHECKBOX_LINK:
379 					case CHECKBOX_PREVIEW:
380 					case CHECKBOX_SELECTION:
381 						nPropertyId = PROPERTY_FLAG_CHECKED;
382 						break;
383 
384 					case LISTBOX_FILTER:
385 						DBG_ERRORFILE( "Use the XFilterManager to access the filter listbox" );
386 						break;
387 
388 					case LISTBOX_VERSION:
389 					case LISTBOX_TEMPLATE:
390 					case LISTBOX_IMAGE_TEMPLATE:
391 						if ( ControlActions::SET_SELECT_ITEM == _nControlAction )
392 						{
393 							nPropertyId = PROPERTY_FLAG_SELECTEDITEMINDEX;
394 						}
395 						else
396 						{
397 							DBG_ASSERT( WINDOW_LISTBOX == pControl->GetType(), "OControlAccess::SetValue: implGetControl returned nonsense!" );
398 							implDoListboxAction( static_cast< ListBox* >( pControl ), _nControlAction, _rValue );
399 						}
400 						break;
401 				}
402 			}
403 
404 			if ( -1 != nPropertyId )
405 				implSetControlProperty( _nControlId, pControl, nPropertyId, _rValue );
406 		}
407 	}
408 
409 	//-----------------------------------------------------------------------------
getValue(sal_Int16 _nControlId,sal_Int16 _nControlAction) const410 	Any OControlAccess::getValue( sal_Int16 _nControlId, sal_Int16 _nControlAction ) const
411 	{
412 		Any aRet;
413 
414 		Control* pControl = m_pFilePickerController->getControl( _nControlId, sal_False );
415 		DBG_ASSERT( pControl, "OControlAccess::GetValue: don't have this control in the current mode!" );
416 		if ( pControl )
417 		{
418 			sal_Int16 nPropertyId = -1;
419 			if ( ControlActions::SET_HELP_URL == _nControlAction )
420 			{
421 				nPropertyId = PROPERTY_FLAG_HELPURL;
422 			}
423 			else
424 			{
425 				switch ( _nControlId )
426 				{
427 					case CHECKBOX_AUTOEXTENSION:
428 					case CHECKBOX_PASSWORD:
429 					case CHECKBOX_FILTEROPTIONS:
430 					case CHECKBOX_READONLY:
431 					case CHECKBOX_LINK:
432 					case CHECKBOX_PREVIEW:
433 					case CHECKBOX_SELECTION:
434 						nPropertyId = PROPERTY_FLAG_CHECKED;
435 						break;
436 
437 					case LISTBOX_FILTER:
438 						if ( ControlActions::GET_SELECTED_ITEM == _nControlAction )
439 						{
440 							aRet <<= ::rtl::OUString( m_pFilePickerController->getCurFilter() );;
441 						}
442 						else
443 						{
444 							DBG_ERRORFILE( "Use the XFilterManager to access the filter listbox" );
445                         }
446 						break;
447 
448 					case LISTBOX_VERSION:
449 					case LISTBOX_TEMPLATE:
450 					case LISTBOX_IMAGE_TEMPLATE:
451 						switch ( _nControlAction )
452 						{
453 							case ControlActions::GET_SELECTED_ITEM:
454 								nPropertyId = PROPERTY_FLAG_SELECTEDITEM;
455 								break;
456 							case ControlActions::GET_SELECTED_ITEM_INDEX:
457 								nPropertyId = PROPERTY_FLAG_SELECTEDITEMINDEX;
458 								break;
459 							case ControlActions::GET_ITEMS:
460 								nPropertyId = PROPERTY_FLAG_LISTITEMS;
461 								break;
462 							default:
463 								DBG_ERRORFILE( "OControlAccess::GetValue: invalid control action for the listbox!" );
464 								break;
465 						}
466 						break;
467 				}
468 			}
469 
470 			if ( -1 != nPropertyId )
471 				aRet = implGetControlProperty( pControl, nPropertyId );
472 		}
473 
474 		return aRet;
475 	}
476 
477 	//-----------------------------------------------------------------------------
setLabel(sal_Int16 nId,const::rtl::OUString & rLabel)478 	void OControlAccess::setLabel( sal_Int16 nId, const ::rtl::OUString &rLabel )
479 	{
480 		Control* pControl = m_pFilePickerController->getControl( nId, sal_True );
481 		DBG_ASSERT( pControl, "OControlAccess::GetValue: don't have this control in the current mode!" );
482 		if ( pControl )
483 			pControl->SetText( rLabel );
484 	}
485 
486 	//-----------------------------------------------------------------------------
getLabel(sal_Int16 nId) const487 	::rtl::OUString OControlAccess::getLabel( sal_Int16 nId ) const
488 	{
489 		::rtl::OUString sLabel;
490 
491 		Control* pControl = m_pFilePickerController->getControl( nId, sal_True );
492 		DBG_ASSERT( pControl, "OControlAccess::GetValue: don't have this control in the current mode!" );
493 		if ( pControl )
494 			sLabel = pControl->GetText();
495 
496 		return sLabel;
497 	}
498 
499 	//-----------------------------------------------------------------------------
enableControl(sal_Int16 _nId,sal_Bool _bEnable)500 	void OControlAccess::enableControl( sal_Int16 _nId, sal_Bool _bEnable )
501 	{
502         m_pFilePickerController->enableControl( _nId, _bEnable );
503 	}
504 
505 	// -----------------------------------------------------------------------
implDoListboxAction(ListBox * _pListbox,sal_Int16 _nControlAction,const Any & _rValue)506 	void OControlAccess::implDoListboxAction( ListBox* _pListbox, sal_Int16 _nControlAction, const Any& _rValue )
507 	{
508 		switch ( _nControlAction )
509 		{
510 			case ControlActions::ADD_ITEM:
511 			{
512 				::rtl::OUString aEntry;
513 				_rValue >>= aEntry;
514 				if ( aEntry.getLength() )
515 					_pListbox->InsertEntry( aEntry );
516 			}
517 			break;
518 
519 			case ControlActions::ADD_ITEMS:
520 			{
521 				Sequence < ::rtl::OUString > aTemplateList;
522 				_rValue >>= aTemplateList;
523 
524 				if ( aTemplateList.getLength() )
525 				{
526 					for ( long i=0; i < aTemplateList.getLength(); i++ )
527 						_pListbox->InsertEntry( aTemplateList[i] );
528 				}
529 			}
530 			break;
531 
532 			case ControlActions::DELETE_ITEM:
533 			{
534 				sal_Int32 nPos = 0;
535 				if ( _rValue >>= nPos )
536 					_pListbox->RemoveEntry( (sal_uInt16) nPos );
537 			}
538 			break;
539 
540 			case ControlActions::DELETE_ITEMS:
541 				_pListbox->Clear();
542 				break;
543 
544 			default:
545 				DBG_ERRORFILE( "Wrong ControlAction for implDoListboxAction()" );
546 		}
547 	}
548 
549 	//-----------------------------------------------------------------------------
implSetControlProperty(sal_Int16 _nControlId,Control * _pControl,sal_Int16 _nProperty,const Any & _rValue,sal_Bool _bIgnoreIllegalArgument)550 	void OControlAccess::implSetControlProperty( sal_Int16 _nControlId, Control* _pControl, sal_Int16 _nProperty, const Any& _rValue, sal_Bool _bIgnoreIllegalArgument )
551 	{
552         if ( !_pControl )
553             _pControl = m_pFilePickerController->getControl( _nControlId );
554 		DBG_ASSERT( _pControl, "OControlAccess::implSetControlProperty: invalid argument, this will crash!" );
555         if ( !_pControl )
556             return;
557 
558         DBG_ASSERT( _pControl == m_pFilePickerController->getControl( _nControlId ),
559             "OControlAccess::implSetControlProperty: inconsistent parameters!" );
560 
561 		switch ( _nProperty )
562 		{
563 			case PROPERTY_FLAG_TEXT:
564 			{
565 				::rtl::OUString sText;
566 				if ( _rValue >>= sText )
567 				{
568 					_pControl->SetText( sText );
569 				}
570 				else if ( !_bIgnoreIllegalArgument )
571 				{
572 					lcl_throwIllegalArgumentException();
573 				}
574 			}
575 			break;
576 
577 			case PROPERTY_FLAG_ENDBALED:
578 			{
579 				sal_Bool bEnabled = sal_False;
580 				if ( _rValue >>= bEnabled )
581 				{
582                     m_pFilePickerController->enableControl( _nControlId, bEnabled );
583 				}
584 				else if ( !_bIgnoreIllegalArgument )
585 				{
586 					lcl_throwIllegalArgumentException();
587 				}
588 			}
589 			break;
590 
591 			case PROPERTY_FLAG_VISIBLE:
592 			{
593 				sal_Bool bVisible = sal_False;
594 				if ( _rValue >>= bVisible )
595 				{
596 					_pControl->Show( bVisible );
597 				}
598 				else if ( !_bIgnoreIllegalArgument )
599 				{
600 					lcl_throwIllegalArgumentException();
601 				}
602 			}
603 			break;
604 
605 			case PROPERTY_FLAG_HELPURL:
606 			{
607 				::rtl::OUString sHelpURL;
608 				if ( _rValue >>= sHelpURL )
609 				{
610 					setHelpURL( _pControl, sHelpURL, m_pFileView == _pControl );
611 				}
612 				else if ( !_bIgnoreIllegalArgument )
613 				{
614 					lcl_throwIllegalArgumentException();
615 				}
616 			}
617 			break;
618 
619 			case PROPERTY_FLAG_LISTITEMS:
620 			{
621 				DBG_ASSERT( WINDOW_LISTBOX == _pControl->GetType(),
622 					"OControlAccess::implSetControlProperty: invalid control/property combination!" );
623 
624 				Sequence< ::rtl::OUString > aItems;
625 				if ( _rValue >>= aItems )
626 				{
627 					// remove all previous items
628 					static_cast< ListBox* >( _pControl )->Clear();
629 
630 					// add the new ones
631 					const ::rtl::OUString* pItems		= aItems.getConstArray();
632 					const ::rtl::OUString* pItemsEnd	= aItems.getConstArray() + aItems.getLength();
633 					for	(	const ::rtl::OUString* pItem = pItems;
634 							pItem != pItemsEnd;
635 							++pItem
636 						)
637 					{
638 						static_cast< ListBox* >( _pControl )->InsertEntry( *pItem );
639 					}
640 
641 				}
642 				else if ( !_bIgnoreIllegalArgument )
643 				{
644 					lcl_throwIllegalArgumentException();
645 				}
646 			}
647 			break;
648 
649 			case PROPERTY_FLAG_SELECTEDITEM:
650 			{
651 				DBG_ASSERT( WINDOW_LISTBOX == _pControl->GetType(),
652 					"OControlAccess::implSetControlProperty: invalid control/property combination!" );
653 
654 				::rtl::OUString sSelected;
655 				if ( _rValue >>= sSelected )
656 				{
657 					static_cast< ListBox* >( _pControl )->SelectEntry( sSelected );
658 				}
659 				else if ( !_bIgnoreIllegalArgument )
660 				{
661 					lcl_throwIllegalArgumentException();
662 				}
663 			}
664 			break;
665 
666 			case PROPERTY_FLAG_SELECTEDITEMINDEX:
667 			{
668 				DBG_ASSERT( WINDOW_LISTBOX == _pControl->GetType(),
669 					"OControlAccess::implSetControlProperty: invalid control/property combination!" );
670 
671 				sal_Int32 nPos = 0;
672 				if ( _rValue >>= nPos )
673 				{
674 					static_cast< ListBox* >( _pControl )->SelectEntryPos( (sal_uInt16) nPos );
675 				}
676 				else if ( !_bIgnoreIllegalArgument )
677 				{
678 					lcl_throwIllegalArgumentException();
679 				}
680 			}
681 			break;
682 
683 			case PROPERTY_FLAG_CHECKED:
684 			{
685 				DBG_ASSERT( WINDOW_CHECKBOX == _pControl->GetType(),
686 					"OControlAccess::implSetControlProperty: invalid control/property combination!" );
687 
688 				sal_Bool bChecked = sal_False;
689 				if ( _rValue >>= bChecked )
690 				{
691 					static_cast< CheckBox* >( _pControl )->Check( bChecked );
692 				}
693 				else if ( !_bIgnoreIllegalArgument )
694 				{
695 					lcl_throwIllegalArgumentException();
696 				}
697 			}
698 			break;
699 
700 			default:
701 				DBG_ERROR( "OControlAccess::implSetControlProperty: invalid property id!" );
702 		}
703 	}
704 
705 	//-----------------------------------------------------------------------------
implGetControlProperty(Control * _pControl,sal_Int16 _nProperty) const706 	Any	OControlAccess::implGetControlProperty( Control* _pControl, sal_Int16 _nProperty ) const
707 	{
708 		DBG_ASSERT( _pControl, "OControlAccess::implGetControlProperty: invalid argument, this will crash!" );
709 
710 		Any aReturn;
711 		switch ( _nProperty )
712 		{
713 			case PROPERTY_FLAG_TEXT:
714 				aReturn <<= ::rtl::OUString( _pControl->GetText() );
715 				break;
716 
717 			case PROPERTY_FLAG_ENDBALED:
718 				aReturn <<= (sal_Bool)_pControl->IsEnabled();
719 				break;
720 
721 			case PROPERTY_FLAG_VISIBLE:
722 				aReturn <<= (sal_Bool)_pControl->IsVisible();
723 				break;
724 
725 			case PROPERTY_FLAG_HELPURL:
726 				aReturn <<= getHelpURL( _pControl, m_pFileView == _pControl );
727 				break;
728 
729 			case PROPERTY_FLAG_LISTITEMS:
730 			{
731 				DBG_ASSERT( WINDOW_LISTBOX == _pControl->GetType(),
732 					"OControlAccess::implGetControlProperty: invalid control/property combination!" );
733 
734 				Sequence< ::rtl::OUString > aItems( static_cast< ListBox* >( _pControl )->GetEntryCount() );
735 				::rtl::OUString* pItems = aItems.getArray();
736 				for ( sal_uInt16 i=0; i<static_cast< ListBox* >( _pControl )->GetEntryCount(); ++i )
737 					*pItems++ = static_cast< ListBox* >( _pControl )->GetEntry( i );
738 
739 				aReturn <<= aItems;
740 			}
741 			break;
742 
743 			case PROPERTY_FLAG_SELECTEDITEM:
744 			{
745 				DBG_ASSERT( WINDOW_LISTBOX == _pControl->GetType(),
746 					"OControlAccess::implGetControlProperty: invalid control/property combination!" );
747 
748 				sal_uInt16 nSelected = static_cast< ListBox* >( _pControl )->GetSelectEntryPos();
749 				::rtl::OUString sSelected;
750 				if ( LISTBOX_ENTRY_NOTFOUND != nSelected )
751 					sSelected = static_cast< ListBox* >( _pControl )->GetSelectEntry();
752 				aReturn <<= sSelected;
753 			}
754 			break;
755 
756 			case PROPERTY_FLAG_SELECTEDITEMINDEX:
757 			{
758 				DBG_ASSERT( WINDOW_LISTBOX == _pControl->GetType(),
759 					"OControlAccess::implGetControlProperty: invalid control/property combination!" );
760 
761 				sal_uInt16 nSelected = static_cast< ListBox* >( _pControl )->GetSelectEntryPos();
762 				if ( LISTBOX_ENTRY_NOTFOUND != nSelected )
763 					aReturn <<= (sal_Int32)static_cast< ListBox* >( _pControl )->GetSelectEntryPos();
764 				else
765 					aReturn <<= (sal_Int32)-1;
766 			}
767 			break;
768 
769 			case PROPERTY_FLAG_CHECKED:
770 				DBG_ASSERT( WINDOW_CHECKBOX == _pControl->GetType(),
771 					"OControlAccess::implGetControlProperty: invalid control/property combination!" );
772 
773 				aReturn <<= (sal_Bool)static_cast< CheckBox* >( _pControl )->IsChecked( );
774 				break;
775 
776 			default:
777 				DBG_ERROR( "OControlAccess::implGetControlProperty: invalid property id!" );
778 		}
779 		return aReturn;
780 	}
781 
782 //.........................................................................
783 }	// namespace svt
784 //.........................................................................
785 
786