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