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_framework.hxx" 26 27 #ifndef __FRAMEWORK_UIELEMENT_COMBOBOXTOOLBARCONTROLLER_HXX 28 #include "uielement/comboboxtoolbarcontroller.hxx" 29 #endif 30 31 //_________________________________________________________________________________________________________________ 32 // my own includes 33 //_________________________________________________________________________________________________________________ 34 35 #ifndef __FRAMEWORK_TOOLBAR_HXX_ 36 #include "uielement/toolbar.hxx" 37 #endif 38 39 //_________________________________________________________________________________________________________________ 40 // interface includes 41 //_________________________________________________________________________________________________________________ 42 #include <com/sun/star/util/XURLTransformer.hpp> 43 #include <com/sun/star/frame/XDispatchProvider.hpp> 44 #include <com/sun/star/beans/PropertyValue.hpp> 45 #include <com/sun/star/frame/status/ItemStatus.hpp> 46 #include <com/sun/star/frame/status/ItemState.hpp> 47 #include <com/sun/star/frame/status/Visibility.hpp> 48 #include <com/sun/star/frame/XControlNotificationListener.hpp> 49 #include <com/sun/star/util/Color.hpp> 50 51 //_________________________________________________________________________________________________________________ 52 // other includes 53 //_________________________________________________________________________________________________________________ 54 #include <svtools/toolboxcontroller.hxx> 55 #include <vos/mutex.hxx> 56 #include <vcl/svapp.hxx> 57 #ifndef _VCL_MNEMONIC_HXX_ 58 #include <vcl/mnemonic.hxx> 59 #endif 60 #include <vcl/toolbox.hxx> 61 #include <vcl/combobox.hxx> 62 #include <tools/urlobj.hxx> 63 64 using namespace ::com::sun::star; 65 using namespace ::com::sun::star::uno; 66 using namespace ::com::sun::star::beans; 67 using namespace ::com::sun::star::lang; 68 using namespace ::com::sun::star::frame; 69 using namespace ::com::sun::star::frame::status; 70 using namespace ::com::sun::star::util; 71 72 namespace framework 73 { 74 75 // ------------------------------------------------------------------ 76 77 // Wrapper class to notify controller about events from combobox. 78 // Unfortunaltly the events are notifed through virtual methods instead 79 // of Listeners. 80 81 class ComboBoxControl : public ComboBox 82 { 83 public: 84 ComboBoxControl( Window* pParent, WinBits nStyle, IComboBoxListener* pComboBoxListener ); 85 virtual ~ComboBoxControl(); 86 87 virtual void Select(); 88 virtual void DoubleClick(); 89 virtual void Modify(); 90 virtual void KeyInput( const ::KeyEvent& rKEvt ); 91 virtual void GetFocus(); 92 virtual void LoseFocus(); 93 virtual long PreNotify( NotifyEvent& rNEvt ); 94 95 private: 96 IComboBoxListener* m_pComboBoxListener; 97 }; 98 99 ComboBoxControl::ComboBoxControl( Window* pParent, WinBits nStyle, IComboBoxListener* pComboBoxListener ) : 100 ComboBox( pParent, nStyle ) 101 , m_pComboBoxListener( pComboBoxListener ) 102 { 103 } 104 105 ComboBoxControl::~ComboBoxControl() 106 { 107 m_pComboBoxListener = 0; 108 } 109 110 void ComboBoxControl::Select() 111 { 112 ComboBox::Select(); 113 if ( m_pComboBoxListener ) 114 m_pComboBoxListener->Select(); 115 } 116 117 void ComboBoxControl::DoubleClick() 118 { 119 ComboBox::DoubleClick(); 120 if ( m_pComboBoxListener ) 121 m_pComboBoxListener->DoubleClick(); 122 } 123 124 void ComboBoxControl::Modify() 125 { 126 ComboBox::Modify(); 127 if ( m_pComboBoxListener ) 128 m_pComboBoxListener->Modify(); 129 } 130 131 void ComboBoxControl::KeyInput( const ::KeyEvent& rKEvt ) 132 { 133 ComboBox::KeyInput( rKEvt ); 134 if ( m_pComboBoxListener ) 135 m_pComboBoxListener->KeyInput( rKEvt ); 136 } 137 138 void ComboBoxControl::GetFocus() 139 { 140 ComboBox::GetFocus(); 141 if ( m_pComboBoxListener ) 142 m_pComboBoxListener->GetFocus(); 143 } 144 145 void ComboBoxControl::LoseFocus() 146 { 147 ComboBox::LoseFocus(); 148 if ( m_pComboBoxListener ) 149 m_pComboBoxListener->LoseFocus(); 150 } 151 152 long ComboBoxControl::PreNotify( NotifyEvent& rNEvt ) 153 { 154 long nRet( 0 ); 155 if ( m_pComboBoxListener ) 156 nRet = m_pComboBoxListener->PreNotify( rNEvt ); 157 if ( nRet == 0 ) 158 nRet = ComboBox::PreNotify( rNEvt ); 159 160 return nRet; 161 } 162 163 // ------------------------------------------------------------------ 164 165 ComboboxToolbarController::ComboboxToolbarController( 166 const Reference< XMultiServiceFactory >& rServiceManager, 167 const Reference< XFrame >& rFrame, 168 ToolBox* pToolbar, 169 sal_uInt16 nID, 170 sal_Int32 nWidth, 171 const ::rtl::OUString& aCommand ) : 172 ComplexToolbarController( rServiceManager, rFrame, pToolbar, nID, aCommand ) 173 , m_pComboBox( 0 ) 174 { 175 m_pComboBox = new ComboBoxControl( m_pToolbar, WB_DROPDOWN, this ); 176 if ( nWidth == 0 ) 177 nWidth = 100; 178 179 // default dropdown size 180 ::Size aLogicalSize( 8, 160 ); 181 ::Size aPixelSize = m_pComboBox->LogicToPixel( aLogicalSize, MAP_APPFONT ); 182 183 m_pComboBox->SetSizePixel( ::Size( nWidth, aPixelSize.Height() )); 184 m_pToolbar->SetItemWindow( m_nID, m_pComboBox ); 185 } 186 187 // ------------------------------------------------------------------ 188 189 ComboboxToolbarController::~ComboboxToolbarController() 190 { 191 } 192 193 // ------------------------------------------------------------------ 194 195 void SAL_CALL ComboboxToolbarController::dispose() 196 throw ( RuntimeException ) 197 { 198 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 199 200 m_pToolbar->SetItemWindow( m_nID, 0 ); 201 delete m_pComboBox; 202 203 ComplexToolbarController::dispose(); 204 205 m_pComboBox = 0; 206 } 207 208 // ------------------------------------------------------------------ 209 Sequence<PropertyValue> ComboboxToolbarController::getExecuteArgs(sal_Int16 KeyModifier) const 210 { 211 Sequence<PropertyValue> aArgs( 2 ); 212 ::rtl::OUString aSelectedText = m_pComboBox->GetText(); 213 214 // Add key modifier to argument list 215 aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "KeyModifier" )); 216 aArgs[0].Value <<= KeyModifier; 217 aArgs[1].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Text" )); 218 aArgs[1].Value <<= aSelectedText; 219 return aArgs; 220 } 221 222 // ------------------------------------------------------------------ 223 224 void ComboboxToolbarController::Select() 225 { 226 if ( m_pComboBox->GetEntryCount() > 0 ) 227 { 228 Window::PointerState aState = m_pComboBox->GetPointerState(); 229 230 sal_uInt16 nKeyModifier = sal_uInt16( aState.mnState & KEY_MODTYPE ); 231 execute( nKeyModifier ); 232 } 233 } 234 235 void ComboboxToolbarController::DoubleClick() 236 { 237 } 238 239 void ComboboxToolbarController::Modify() 240 { 241 notifyTextChanged( m_pComboBox->GetText() ); 242 } 243 244 void ComboboxToolbarController::KeyInput( const ::KeyEvent& ) 245 { 246 } 247 248 void ComboboxToolbarController::GetFocus() 249 { 250 notifyFocusGet(); 251 } 252 253 void ComboboxToolbarController::LoseFocus() 254 { 255 notifyFocusLost(); 256 } 257 258 long ComboboxToolbarController::PreNotify( NotifyEvent& rNEvt ) 259 { 260 switch ( rNEvt.GetType() ) 261 { 262 case EVENT_KEYINPUT : 263 { 264 const ::KeyEvent* pKeyEvent = rNEvt.GetKeyEvent(); 265 const KeyCode& rKeyCode = pKeyEvent->GetKeyCode(); 266 if(( rKeyCode.GetModifier() | rKeyCode.GetCode()) == KEY_RETURN ) 267 { 268 // Call execute only with non-empty text 269 if ( m_pComboBox->GetText().Len() > 0 ) 270 execute( rKeyCode.GetModifier() ); 271 return 1; 272 } 273 } 274 break; 275 case EVENT_GETFOCUS : 276 notifyFocusGet(); 277 break; 278 case EVENT_LOSEFOCUS : 279 notifyFocusLost(); 280 break; 281 default : 282 break; 283 } 284 return 0; 285 } 286 287 // -------------------------------------------------------- 288 289 void ComboboxToolbarController::executeControlCommand( const ::com::sun::star::frame::ControlCommand& rControlCommand ) 290 { 291 if ( rControlCommand.Command.equalsAsciiL( "SetText", 7 )) 292 { 293 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 294 { 295 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Text", 4 )) 296 { 297 rtl::OUString aText; 298 rControlCommand.Arguments[i].Value >>= aText; 299 m_pComboBox->SetText( aText ); 300 301 // send notification 302 notifyTextChanged( aText ); 303 break; 304 } 305 } 306 } 307 else if ( rControlCommand.Command.equalsAsciiL( "SetList", 7 )) 308 { 309 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 310 { 311 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "List", 4 )) 312 { 313 Sequence< ::rtl::OUString > aList; 314 m_pComboBox->Clear(); 315 316 rControlCommand.Arguments[i].Value >>= aList; 317 for ( sal_Int32 j = 0; j < aList.getLength(); j++ ) 318 m_pComboBox->InsertEntry( aList[j] ); 319 320 // send notification 321 uno::Sequence< beans::NamedValue > aInfo( 1 ); 322 aInfo[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "List" )); 323 aInfo[0].Value <<= aList; 324 addNotifyInfo( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ListChanged" )), 325 getDispatchFromCommand( m_aCommandURL ), 326 aInfo ); 327 328 break; 329 } 330 } 331 } 332 else if ( rControlCommand.Command.equalsAsciiL( "AddEntry", 8 )) 333 { 334 sal_uInt16 nPos( COMBOBOX_APPEND ); 335 rtl::OUString aText; 336 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 337 { 338 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Text", 4 )) 339 { 340 if ( rControlCommand.Arguments[i].Value >>= aText ) 341 m_pComboBox->InsertEntry( aText, nPos ); 342 break; 343 } 344 } 345 } 346 else if ( rControlCommand.Command.equalsAsciiL( "InsertEntry", 11 )) 347 { 348 sal_uInt16 nPos( COMBOBOX_APPEND ); 349 rtl::OUString aText; 350 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 351 { 352 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Pos", 3 )) 353 { 354 sal_Int32 nTmpPos = 0; 355 if ( rControlCommand.Arguments[i].Value >>= nTmpPos ) 356 { 357 if (( nTmpPos >= 0 ) && 358 ( nTmpPos < sal_Int32( m_pComboBox->GetEntryCount() ))) 359 nPos = sal_uInt16( nTmpPos ); 360 } 361 } 362 else if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Text", 4 )) 363 rControlCommand.Arguments[i].Value >>= aText; 364 } 365 366 m_pComboBox->InsertEntry( aText, nPos ); 367 } 368 else if ( rControlCommand.Command.equalsAsciiL( "RemoveEntryPos", 14 )) 369 { 370 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 371 { 372 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Pos", 3 )) 373 { 374 sal_Int32 nPos( -1 ); 375 if ( rControlCommand.Arguments[i].Value >>= nPos ) 376 { 377 if ( nPos < sal_Int32( m_pComboBox->GetEntryCount() )) 378 m_pComboBox->RemoveEntry( sal_uInt16( nPos )); 379 } 380 break; 381 } 382 } 383 } 384 else if ( rControlCommand.Command.equalsAsciiL( "RemoveEntryText", 15 )) 385 { 386 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 387 { 388 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Text", 4 )) 389 { 390 rtl::OUString aText; 391 if ( rControlCommand.Arguments[i].Value >>= aText ) 392 m_pComboBox->RemoveEntry( aText ); 393 break; 394 } 395 } 396 } 397 else if ( rControlCommand.Command.equalsAsciiL( "SetDropDownLines", 16 )) 398 { 399 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 400 { 401 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Lines", 5 )) 402 { 403 sal_Int32 nValue( 5 ); 404 rControlCommand.Arguments[i].Value >>= nValue; 405 m_pComboBox->SetDropDownLineCount( sal_uInt16( nValue )); 406 break; 407 } 408 } 409 } 410 else if ( rControlCommand.Command.equalsAsciiL( "SetBackgroundColor", 18 )) 411 { 412 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 413 { 414 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Color", 5 )) 415 { 416 com::sun::star::util::Color aColor(0); 417 if ( rControlCommand.Arguments[i].Value >>= aColor ) 418 { 419 ::Color aBackColor( static_cast< sal_uInt32 >( aColor )); 420 m_pComboBox->SetControlBackground( aBackColor ); 421 } 422 break; 423 } 424 } 425 } 426 else if ( rControlCommand.Command.equalsAsciiL( "SetTextColor", 12 )) 427 { 428 for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ ) 429 { 430 if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Color", 5 )) 431 { 432 com::sun::star::util::Color aColor(0); 433 if ( rControlCommand.Arguments[i].Value >>= aColor ) 434 { 435 ::Color aForeColor( static_cast< sal_uInt32 >( aColor )); 436 m_pComboBox->SetControlForeground( aForeColor ); 437 } 438 break; 439 } 440 } 441 } 442 } 443 444 } // namespace 445 446