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 #include "helper.hxx" 25 26 #include <assert.h> 27 #include <list> 28 #include <com/sun/star/awt/WindowAttribute.hpp> 29 #include <com/sun/star/awt/XWindow.hpp> 30 #include <com/sun/star/awt/VclWindowPeerAttribute.hpp> 31 #include <toolkit/awt/vclxwindow.hxx> 32 #include <tools/debug.hxx> 33 34 #include "proplist.hxx" 35 36 #if TEST_LAYOUT && !defined( DBG_UTIL ) 37 #undef DBG_ERROR 38 #define DBG_ERROR OSL_TRACE 39 #undef DBG_ERROR1 40 #define DBG_ERROR1 OSL_TRACE 41 #undef DBG_ERROR2 42 #define DBG_ERROR2 OSL_TRACE 43 #endif /* TEST_LAYOUT && !DBG_UTIL */ 44 45 namespace layoutimpl 46 { 47 using namespace com::sun::star; 48 using rtl::OUString; 49 50 uno::Reference< awt::XWindowPeer > 51 getParent( uno::Reference< uno::XInterface > xRef ) 52 { 53 do 54 { 55 uno::Reference< awt::XWindowPeer > xPeer( xRef, uno::UNO_QUERY ); 56 if ( xPeer.is() ) 57 return xPeer; 58 59 uno::Reference< awt::XLayoutContainer > xCont( xRef, uno::UNO_QUERY ); 60 if ( xCont.is() ) 61 xRef = xCont->getParent(); 62 } 63 while ( xRef.is() ); 64 65 return uno::Reference< awt::XWindowPeer >(); 66 } 67 68 #if 0 69 static uno::Reference< awt::XWindowPeer > 70 getToplevel( uno::Reference< uno::XInterface > xRef ) 71 { 72 uno::Reference< awt::XWindowPeer > xTop, i; 73 while ( ( i = uno::Reference< awt::XWindowPeer >( xRef, uno::UNO_QUERY ) ).is() ) 74 { 75 xTop = i; 76 77 uno::Reference< awt::XLayoutContainer > xCont( xRef, uno::UNO_QUERY ); 78 if ( xCont.is() ) 79 xRef = xCont->getParent(); 80 else 81 xRef = uno::Reference< awt::XWindowPeer >(); 82 } 83 84 return xTop; 85 } 86 #endif 87 88 } 89 90 #include "bin.hxx" 91 #include "box.hxx" 92 #include "dialogbuttonhbox.hxx" 93 #include "flow.hxx" 94 #include "localized-string.hxx" 95 #include "table.hxx" 96 97 namespace layoutimpl 98 { 99 100 oslModule WidgetFactory::mSfx2Library = 0; 101 WindowCreator WidgetFactory::mSfx2CreateWidget = 0; 102 103 uno::Reference <awt::XLayoutContainer> WidgetFactory::createContainer (OUString const& name) 104 { 105 uno::Reference< awt::XLayoutContainer > xPeer; 106 107 if ( name.equalsAscii( "hbox" ) ) 108 xPeer = uno::Reference< awt::XLayoutContainer >( new HBox() ); 109 else if ( name.equalsAscii( "vbox" ) ) 110 xPeer = uno::Reference< awt::XLayoutContainer >( new VBox() ); 111 else if ( name.equalsAscii( "table" ) ) 112 xPeer = uno::Reference< awt::XLayoutContainer >( new Table() ); 113 else if ( name.equalsAscii( "flow" ) ) 114 xPeer = uno::Reference< awt::XLayoutContainer >( new Flow() ); 115 else if ( name.equalsAscii( "bin" ) ) 116 xPeer = uno::Reference< awt::XLayoutContainer >( new Bin() ); 117 else if ( name.equalsAscii( "min-size" ) ) 118 xPeer = uno::Reference< awt::XLayoutContainer >( new MinSize() ); 119 else if ( name.equalsAscii( "align" ) ) 120 xPeer = uno::Reference< awt::XLayoutContainer >( new Align() ); 121 else if ( name.equalsAscii( "dialogbuttonhbox" ) ) 122 xPeer = uno::Reference< awt::XLayoutContainer >( new DialogButtonHBox() ); 123 124 return xPeer; 125 } 126 127 uno::Reference <awt::XLayoutConstrains> WidgetFactory::toolkitCreateWidget (uno::Reference <awt::XToolkit> xToolkit, uno::Reference <uno::XInterface> xParent, OUString const& name, long properties) 128 { 129 uno::Reference< awt::XLayoutConstrains > xPeer; 130 bool bToplevel = !xParent.is(); 131 132 // UNO Control Widget 133 awt::WindowDescriptor desc; 134 if ( bToplevel ) 135 desc.Type = awt::WindowClass_TOP; 136 else 137 { 138 desc.Type = awt::WindowClass_SIMPLE; 139 140 #if 0 141 // top container -- a wrapper for framewindow -- is de-coupled 142 // from awt::XWindowPeer. So, getParent() fails at it. 143 uno::Reference< awt::XWindowPeer > xWinParent = getParent( xParent ); 144 #else 145 uno::Reference< awt::XWindowPeer > xWinParent( xParent, uno::UNO_QUERY ); 146 #endif 147 assert( xParent.is() ); 148 assert( xWinParent.is() ); 149 /* 150 With the new three layer instarr/rpath feature, when 151 prepending toolkit/unxlngx6.pro/lib or $SOLARVER/lib to 152 LD_LIBRARY_PATH, VCLXWindow::GetImplementation returns 0x0 153 vclxtoolkit::ImplCreateWindow failing to create any widget; 154 although it succeeds here. 155 156 While developing, one now must copy libtlx.so to 157 $OOO_INSTALL_PREFIX/openoffice.org/basis3.0/program/libtklx.so 158 each time. 159 */ 160 VCLXWindow* parentComponent = VCLXWindow::GetImplementation( xWinParent ); 161 if ( !parentComponent ) 162 throw uno::RuntimeException( 163 OUString::createFromAscii( "parent has no implementation" ), 164 uno::Reference< uno::XInterface >() ); 165 desc.Parent = xWinParent; 166 } 167 168 desc.ParentIndex = 0; 169 // debugging help ... 170 desc.Bounds.X = 0; 171 desc.Bounds.Y = 0; 172 desc.Bounds.Width = 300; 173 desc.Bounds.Height = 200; 174 175 desc.WindowAttributes = properties; 176 desc.WindowServiceName = name; 177 178 uno::Reference< awt::XWindowPeer > xWinPeer; 179 try 180 { 181 OSL_TRACE("Asking toolkit: %s", OUSTRING_CSTR( desc.WindowServiceName ) ); 182 xWinPeer = xToolkit->createWindow( desc ); 183 if ( !xWinPeer.is() ) 184 throw uno::RuntimeException( 185 OUString( RTL_CONSTASCII_USTRINGPARAM( "Cannot create peer" ) ), 186 uno::Reference< uno::XInterface >() ); 187 xPeer = uno::Reference< awt::XLayoutConstrains >( xWinPeer, uno::UNO_QUERY ); 188 } 189 catch( uno::Exception & ) 190 { 191 DBG_ERROR1( "Warning: %s is not a recognized type\n", OUSTRING_CSTR( name ) ); 192 return uno::Reference< awt::XLayoutConstrains >(); 193 } 194 195 #if 0 // This shadows the show="false" property and seems otherwise 196 // unnecessary 197 198 // default to visible, let then people change it on properties 199 if ( ! bToplevel ) 200 { 201 uno::Reference< awt::XWindow> xWindow( xPeer, uno::UNO_QUERY ); 202 if ( xWindow.is() ) 203 xWindow->setVisible( true ); 204 } 205 #endif 206 207 return xPeer; 208 } 209 210 uno::Reference< awt::XLayoutConstrains > 211 WidgetFactory::createWidget (uno::Reference< awt::XToolkit > xToolkit, uno::Reference< uno::XInterface > xParent, OUString const& name, long properties) 212 { 213 uno::Reference< awt::XLayoutConstrains > xPeer; 214 215 xPeer = uno::Reference <awt::XLayoutConstrains> (createContainer (name), uno::UNO_QUERY); 216 if ( xPeer.is() ) 217 return xPeer; 218 219 xPeer = implCreateWidget (xParent, name, properties); 220 if (xPeer.is ()) 221 return xPeer; 222 223 #define FIXED_INFO 1 224 #if FIXED_INFO 225 OUString tName = name; 226 // FIXME 227 if ( name.equalsAscii( "fixedinfo" ) ) 228 tName = OUString::createFromAscii( "fixedtext" ); 229 xPeer = toolkitCreateWidget (xToolkit, xParent, tName, properties); 230 #else 231 xPeer = toolkitCreateWidget (xToolkit, xParent, name, properties); 232 #endif 233 234 return xPeer; 235 } 236 237 PropHelper::PropHelper() : LockHelper() 238 , cppu::OPropertySetHelper( maBrdcstHelper ) 239 , pHelper( NULL ) 240 { 241 } 242 243 void 244 PropHelper::addProp (const char *pName, sal_Int32 nNameLen, rtl_TextEncoding e, 245 uno::Type aType, void *pPtr) 246 { 247 // this sucks rocks for effiency ... 248 PropDetails aDetails; 249 aDetails.aName = rtl::OUString::intern( pName, nNameLen, e ); 250 aDetails.aType = aType; 251 aDetails.pValue = pPtr; 252 maDetails.push_back( aDetails ); 253 } 254 255 cppu::IPropertyArrayHelper & SAL_CALL 256 PropHelper::getInfoHelper() 257 { 258 if ( ! pHelper ) 259 { 260 uno::Sequence< beans::Property > aProps( maDetails.size() ); 261 for ( unsigned int i = 0; i < maDetails.size(); i++) 262 { 263 aProps[i].Name = maDetails[i].aName; 264 aProps[i].Type = maDetails[i].aType; 265 aProps[i].Handle = i; 266 aProps[i].Attributes = 0; 267 } 268 pHelper = new cppu::OPropertyArrayHelper( aProps, false /* fixme: faster ? */ ); 269 270 } 271 return *pHelper; 272 } 273 274 sal_Bool SAL_CALL 275 PropHelper::convertFastPropertyValue( 276 uno::Any & rConvertedValue, 277 uno::Any & rOldValue, 278 sal_Int32 nHandle, 279 const uno::Any& rValue ) 280 { 281 OSL_ASSERT( nHandle >= 0 && nHandle < (sal_Int32) maDetails.size() ); 282 283 // FIXME: no Any::getValue ... 284 getFastPropertyValue( rOldValue, nHandle ); 285 if ( rOldValue != rValue ) 286 { 287 rConvertedValue = rValue; 288 return sal_True; // changed 289 } 290 else 291 { 292 rConvertedValue.clear(); 293 rOldValue.clear(); 294 } 295 return sal_False; 296 } 297 298 299 void SAL_CALL 300 PropHelper::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, 301 const uno::Any& rValue ) 302 { 303 OSL_ASSERT( nHandle >= 0 && nHandle < (sal_Int32) maDetails.size() ); 304 305 const PropDetails &rInfo = maDetails[ nHandle ]; 306 307 uno_type_assignData( rInfo.pValue, rInfo.aType.getTypeLibType(), 308 rValue.pData, rValue.pType, 309 0, 0, 0 ); 310 311 if ( mpListener ) 312 mpListener->propertiesChanged(); 313 } 314 315 void SAL_CALL 316 PropHelper::getFastPropertyValue( uno::Any& rValue, 317 sal_Int32 nHandle ) const 318 { 319 OSL_ASSERT( nHandle >= 0 && nHandle < (sal_Int32) maDetails.size() ); 320 const PropDetails &rInfo = maDetails[ nHandle ]; 321 #if 0 322 switch ( rInfo.aType.getTypeClass() ) 323 { 324 #define MAP(classtype,ctype) \ 325 case uno::TypeClass_##classtype: \ 326 rValue <<= *(ctype *)(rInfo.pValue); \ 327 break 328 MAP( DOUBLE, double ); 329 MAP( SHORT, sal_Int16 ); 330 MAP( LONG, sal_Int32 ); 331 MAP( UNSIGNED_SHORT, sal_uInt16 ); 332 MAP( UNSIGNED_LONG, sal_uInt32 ); 333 MAP( STRING, ::rtl::OUString ); 334 default: 335 DBG_ERROR( "ERROR: unknown type to map!" ); 336 break; 337 } 338 #undef MAP 339 #endif 340 rValue.setValue( rInfo.pValue, rInfo.aType ); 341 } 342 343 ::com::sun::star::uno::Any 344 PropHelper::queryInterface( const ::com::sun::star::uno::Type & rType ) 345 { 346 return OPropertySetHelper::queryInterface( rType ); 347 } 348 349 uno::Reference <beans::XPropertySetInfo> SAL_CALL PropHelper::getPropertySetInfo () 350 { 351 return css::uno::Reference <css::beans::XPropertySetInfo> (createPropertySetInfo (getInfoHelper ())); 352 } 353 354 } // namespace layoutimpl 355 356 #include <awt/vclxbutton.hxx> 357 #include <awt/vclxdialog.hxx> 358 #include <awt/vclxfixedline.hxx> 359 #include <awt/vclxplugin.hxx> 360 #include <awt/vclxscroller.hxx> 361 #include <awt/vclxsplitter.hxx> 362 #include <awt/vclxtabcontrol.hxx> 363 #include <awt/vclxtabpage.hxx> 364 #include <toolkit/awt/vclxtoolkit.hxx> 365 #include <toolkit/awt/vclxwindow.hxx> 366 #include <vcl/button.hxx> 367 #include <vcl/dialog.hxx> 368 #include <vcl/fixed.hxx> 369 #include <vcl/tabctrl.hxx> 370 #include <vcl/tabpage.hxx> 371 #include <vcl/unohelp.hxx> 372 373 #include <layout/layout.hxx> 374 #include <toolkit/awt/vclxwindows.hxx> 375 #include <vcl/lstbox.hxx> 376 #include <vcl.hxx> 377 378 #include <typeinfo> 379 380 namespace layoutimpl 381 { 382 383 uno::Reference <awt::XLayoutConstrains> WidgetFactory::implCreateWidget (uno::Reference <uno::XInterface> xParent, OUString name, long attributes) 384 { 385 Window* parent = 0; 386 387 if (VCLXWindow* parentComponent = VCLXWindow::GetImplementation (xParent)) 388 parent = parentComponent->GetWindow (); 389 390 VCLXWindow* component = 0; 391 Window* window = 0; //sfx2CreateWindow (&component, parent, name, attributes); 392 if (!window) 393 window = layoutCreateWindow (&component, parent, name, attributes); 394 395 uno::Reference <awt::XLayoutConstrains> reference; 396 if (window) 397 { 398 window->SetCreatedWithToolkit( sal_True ); 399 if ( component ) 400 component->SetCreatedWithToolkit( true ); 401 reference = component; 402 window->SetComponentInterface( component ); 403 if ( attributes & awt::WindowAttribute::SHOW ) 404 window->Show(); 405 } 406 407 return reference; 408 } 409 410 extern "C" { static void SAL_CALL thisModule() {} } 411 412 Window* WidgetFactory::sfx2CreateWindow (VCLXWindow** component, Window* parent, OUString const& name, long& attributes) 413 { 414 OSL_TRACE("Asking sfx2: %s", OUSTRING_CSTR (name)); 415 416 if (!mSfx2Library) 417 { 418 OUString libraryName = ::vcl::unohelper::CreateLibraryName ("sfx", sal_True); 419 mSfx2Library = osl_loadModuleRelative (&thisModule, libraryName.pData, SAL_LOADMODULE_DEFAULT); 420 if (mSfx2Library) 421 { 422 OUString functionName (RTL_CONSTASCII_USTRINGPARAM ("CreateWindow")); 423 mSfx2CreateWidget = (WindowCreator) osl_getFunctionSymbol (mSfx2Library, functionName.pData); 424 } 425 } 426 427 if (mSfx2CreateWidget) 428 return mSfx2CreateWidget (component, name, parent, attributes); 429 430 return 0; 431 } 432 433 Window* WidgetFactory::layoutCreateWindow (VCLXWindow** component, Window *parent, OUString const& name, long& attributes) 434 { 435 Window* window = 0; 436 437 if (0) 438 { 439 ; 440 } 441 if ( name.equalsAscii( "dialog" ) ) 442 { 443 if ( parent == NULL ) 444 parent = DIALOG_NO_PARENT; 445 window = new Dialog( parent, ImplGetWinBits( attributes, 0 ) ); 446 *component = new layoutimpl::VCLXDialog(); 447 448 attributes ^= awt::WindowAttribute::SHOW; 449 } 450 else if ( name.equalsAscii( "modaldialog" ) ) 451 { 452 if ( parent == NULL ) 453 parent = DIALOG_NO_PARENT; 454 window = new ModalDialog( parent, ImplGetWinBits( attributes, 0 ) ); 455 *component = new layoutimpl::VCLXDialog(); 456 457 attributes ^= awt::WindowAttribute::SHOW; 458 } 459 else if ( name.equalsAscii( "modelessdialog" ) ) 460 { 461 if ( parent == NULL ) 462 parent = DIALOG_NO_PARENT; 463 window = new ModelessDialog (parent, ImplGetWinBits (attributes, 0)); 464 *component = new layoutimpl::VCLXDialog(); 465 466 attributes ^= awt::WindowAttribute::SHOW; 467 } 468 else if ( name.equalsAscii( "sfxdialog" ) ) 469 { 470 if ( parent == NULL ) 471 parent = DIALOG_NO_PARENT; 472 window = new ClosingDialog (parent, ImplGetWinBits (attributes, 0)); 473 *component = new layoutimpl::VCLXDialog(); 474 475 attributes ^= awt::WindowAttribute::SHOW; 476 } 477 else if ( name.equalsAscii( "sfxmodaldialog" ) ) 478 { 479 if ( parent == NULL ) 480 parent = DIALOG_NO_PARENT; 481 window = new ClosingModalDialog( parent, 482 ImplGetWinBits( attributes, 0 ) ); 483 *component = new layoutimpl::VCLXDialog(); 484 485 attributes ^= awt::WindowAttribute::SHOW; 486 } 487 else if ( name.equalsAscii( "sfxmodelessdialog" ) ) 488 { 489 if ( parent == NULL ) 490 parent = DIALOG_NO_PARENT; 491 window = new ClosingModelessDialog (parent, ImplGetWinBits (attributes, 0)); 492 *component = new layoutimpl::VCLXDialog(); 493 494 attributes ^= awt::WindowAttribute::SHOW; 495 } 496 else if ( name.equalsAscii( "tabcontrol" ) ) 497 { 498 window = new TabControl( parent, ImplGetWinBits( attributes, WINDOW_TABCONTROL ) ); 499 *component = new layoutimpl::VCLXTabControl(); 500 } 501 else if ( name.equalsAscii( "scroller" ) ) 502 { 503 // used FixedImage because I just want some empty non-intrusive widget 504 window = new FixedImage( parent, ImplGetWinBits( attributes, 0 ) ); 505 *component = new layoutimpl::VCLXScroller(); 506 } 507 else if ( name.equalsAscii( "hsplitter" ) || name.equalsAscii( "vsplitter" ) ) 508 { 509 window = new FixedImage( parent, ImplGetWinBits( attributes, 0 ) ); 510 *component = new layoutimpl::VCLXSplitter( name.equalsAscii( "hsplitter" ) ); 511 } 512 else if ( name.equalsAscii( "hfixedline" ) || name.equalsAscii( "vfixedline" ) ) 513 { 514 WinBits nStyle = ImplGetWinBits( attributes, 0 ); 515 nStyle ^= WB_HORZ; 516 if ( name.equalsAscii( "hfixedline" ) ) 517 nStyle |= WB_HORZ; 518 else 519 nStyle |= WB_VERT; 520 window = new FixedLine( parent, nStyle ); 521 *component = new layoutimpl::VCLXFixedLine(); 522 } 523 else if ( name.equalsAscii( "okbutton" ) ) 524 { 525 window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); 526 *component = new layoutimpl::VCLXOKButton( window ); 527 window->SetType (WINDOW_OKBUTTON); 528 } 529 else if ( name.equalsAscii( "cancelbutton" ) ) 530 { 531 window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); 532 *component = new layoutimpl::VCLXCancelButton( window ); 533 window->SetType (WINDOW_CANCELBUTTON); 534 } 535 else if ( name.equalsAscii( "yesbutton" ) ) 536 { 537 window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); 538 *component = new layoutimpl::VCLXYesButton( window ); 539 window->SetType (WINDOW_OKBUTTON); 540 } 541 else if ( name.equalsAscii( "nobutton" ) ) 542 { 543 window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); 544 window->SetType (WINDOW_CANCELBUTTON); 545 *component = new layoutimpl::VCLXNoButton( window ); 546 } 547 else if ( name.equalsAscii( "retrybutton" ) ) 548 { 549 window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); 550 *component = new layoutimpl::VCLXRetryButton( window ); 551 } 552 else if ( name.equalsAscii( "ignorebutton" ) ) 553 { 554 window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); 555 *component = new layoutimpl::VCLXIgnoreButton( window ); 556 } 557 else if ( name.equalsAscii( "resetbutton" ) ) 558 { 559 window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); 560 *component = new layoutimpl::VCLXResetButton( window ); 561 } 562 else if ( name.equalsAscii( "applybutton" ) ) 563 { 564 window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); 565 *component = new layoutimpl::VCLXApplyButton( window ); 566 } 567 else if ( name.equalsAscii( "helpbutton" ) ) 568 { 569 window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); 570 *component = new layoutimpl::VCLXHelpButton( window ); 571 window->SetType (WINDOW_HELPBUTTON); 572 } 573 else if ( name.equalsAscii( "morebutton" ) ) 574 { 575 window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); 576 *component = new layoutimpl::VCLXMoreButton( window ); 577 window->SetType (WINDOW_MOREBUTTON); 578 } 579 else if ( name.equalsAscii( "advancedbutton" ) ) 580 { 581 window = new PushButton( parent, ImplGetWinBits( attributes, 0 ) ); 582 *component = new layoutimpl::VCLXAdvancedButton( window ); 583 } 584 else if ( name.equalsAscii( "plugin" ) ) 585 { 586 window = new Control( parent, ImplGetWinBits( attributes, 0 ) ); 587 #ifndef __SUNPRO_CC 588 OSL_TRACE( "%s: parent=%p (%s)\n", __FUNCTION__, parent, typeid( *parent ).name() ); 589 #endif 590 *component = new layoutimpl::VCLXPlugin( window, ImplGetWinBits( attributes, 0 ) ); 591 } 592 else if ( name.equalsAscii( "tabpage" ) ) 593 { 594 #if 0 595 if ( !parent ) 596 parent = layout::TabPage::global_parent; 597 #else 598 if (layout::TabPage::global_parent) 599 parent = layout::TabPage::global_parent; 600 layout::TabPage::global_parent = 0; 601 #endif 602 //window = new TabPage( parent, ImplGetWinBits( attributes, 0 ) ); 603 attributes ^= awt::WindowAttribute::SHOW; 604 WinBits nStyle = ImplGetWinBits( attributes, 0 ); 605 nStyle |= WB_HIDE; 606 607 if (!parent) 608 { 609 window = new Dialog( parent, nStyle ); 610 *component = new VCLXDialog(); 611 } 612 else 613 { 614 window = new TabPage( parent, nStyle ); 615 *component = new VCLXTabPage( window ); 616 } 617 } 618 else if ( name.equalsAscii( "string" ) ) 619 { 620 // FIXME: move <string>s.text to simple map<string> in root? 621 attributes &= ~awt::WindowAttribute::SHOW; 622 window = new Window( parent, ImplGetWinBits( attributes, 0 ) ); 623 *component = new layoutimpl::LocalizedString(); 624 } 625 #if 0 // parent paranoia 626 else if ( name.equalsAscii( "listbox" ) ) 627 { 628 window = new ListBox (parent, ImplGetWinBits (attributes, 0)); 629 *component = new VCLXListBox (); 630 } 631 #endif 632 else if (name.equalsAscii ("svxfontlistbox") 633 || name.equalsAscii ("svxlanguagebox")) 634 { 635 window = new ListBox (parent, ImplGetWinBits (attributes, 0)); 636 *component = new VCLXListBox (); 637 } 638 return window; 639 } 640 641 } // namespace layoutimpl 642 643 // Avoid polluting the rest of the code with vcl linkage pieces ... 644 645 #include <vcl/imagerepository.hxx> 646 #include <vcl/bitmapex.hxx> 647 #include <vcl/graph.hxx> 648 649 namespace layoutimpl 650 { 651 652 uno::Reference< graphic::XGraphic > loadGraphic( const char *pName ) 653 { 654 BitmapEx aBmp; 655 656 OUString aStr( pName, strlen( pName ), RTL_TEXTENCODING_ASCII_US ); 657 if ( aStr.compareToAscii( ".uno:" ) == 0 ) 658 aStr = aStr.copy( 5 ).toAsciiLowerCase(); 659 660 if ( !vcl::ImageRepository::loadImage( OUString::createFromAscii( pName ), aBmp, true ) ) 661 return uno::Reference< graphic::XGraphic >(); 662 663 return Graphic( aBmp ).GetXGraphic(); 664 } 665 666 } // namespace layoutimpl 667