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 //____________________________________________________________________________________________________________ 25 // my own includes 26 //____________________________________________________________________________________________________________ 27 28 #include "progressmonitor.hxx" 29 30 //____________________________________________________________________________________________________________ 31 // includes of other projects 32 //____________________________________________________________________________________________________________ 33 #include <com/sun/star/awt/GradientStyle.hpp> 34 #include <com/sun/star/awt/RasterOperation.hpp> 35 #include <com/sun/star/awt/Gradient.hpp> 36 #include <com/sun/star/awt/XGraphics.hpp> 37 #include <com/sun/star/awt/PosSize.hpp> 38 #include <cppuhelper/typeprovider.hxx> 39 #include <tools/debug.hxx> 40 #include <tools/solar.h> 41 42 //____________________________________________________________________________________________________________ 43 // includes of my project 44 //____________________________________________________________________________________________________________ 45 #include "progressbar.hxx" 46 47 //____________________________________________________________________________________________________________ 48 // namespace 49 //____________________________________________________________________________________________________________ 50 51 using namespace ::cppu ; 52 using namespace ::osl ; 53 using namespace ::rtl ; 54 using namespace ::com::sun::star::uno ; 55 using namespace ::com::sun::star::lang ; 56 using namespace ::com::sun::star::awt ; 57 58 namespace unocontrols{ 59 60 //____________________________________________________________________________________________________________ 61 // construct/destruct 62 //____________________________________________________________________________________________________________ 63 64 ProgressMonitor::ProgressMonitor( const Reference< XMultiServiceFactory >& xFactory ) 65 : BaseContainerControl ( xFactory ) 66 { 67 // Its not allowed to work with member in this method (refcounter !!!) 68 // But with a HACK (++refcount) its "OK" :-( 69 ++m_refCount ; 70 71 // Create instances for fixedtext, button and progress ... 72 m_xTopic_Top = Reference< XFixedText > ( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_SERVICENAME ) ), UNO_QUERY ) ; 73 m_xText_Top = Reference< XFixedText > ( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_SERVICENAME ) ), UNO_QUERY ) ; 74 m_xTopic_Bottom = Reference< XFixedText > ( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_SERVICENAME ) ), UNO_QUERY ) ; 75 m_xText_Bottom = Reference< XFixedText > ( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_SERVICENAME ) ), UNO_QUERY ) ; 76 m_xButton = Reference< XButton > ( xFactory->createInstance ( OUString::createFromAscii( BUTTON_SERVICENAME ) ), UNO_QUERY ) ; 77 m_xProgressBar = Reference< XProgressBar > ( xFactory->createInstance ( OUString::createFromAscii( SERVICENAME_PROGRESSBAR ) ), UNO_QUERY ) ; 78 79 // ... cast controls to Reference< XControl > (for "setModel"!) ... 80 Reference< XControl > xRef_Topic_Top ( m_xTopic_Top , UNO_QUERY ) ; 81 Reference< XControl > xRef_Text_Top ( m_xText_Top , UNO_QUERY ) ; 82 Reference< XControl > xRef_Topic_Bottom ( m_xTopic_Bottom , UNO_QUERY ) ; 83 Reference< XControl > xRef_Text_Bottom ( m_xText_Bottom , UNO_QUERY ) ; 84 Reference< XControl > xRef_Button ( m_xButton , UNO_QUERY ) ; 85 Reference< XControl > xRef_ProgressBar ( m_xProgressBar , UNO_QUERY ) ; 86 87 // ... set models ... 88 xRef_Topic_Top->setModel ( Reference< XControlModel > ( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_MODELNAME ) ), UNO_QUERY ) ) ; 89 xRef_Text_Top->setModel ( Reference< XControlModel > ( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_MODELNAME ) ), UNO_QUERY ) ) ; 90 xRef_Topic_Bottom->setModel ( Reference< XControlModel > ( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_MODELNAME ) ), UNO_QUERY ) ) ; 91 xRef_Text_Bottom->setModel ( Reference< XControlModel > ( xFactory->createInstance ( OUString::createFromAscii( FIXEDTEXT_MODELNAME ) ), UNO_QUERY ) ) ; 92 xRef_Button->setModel ( Reference< XControlModel > ( xFactory->createInstance ( OUString::createFromAscii( BUTTON_MODELNAME ) ), UNO_QUERY ) ) ; 93 // ProgressBar has no model !!! 94 95 // ... and add controls to basecontainercontrol! 96 addControl ( OUString::createFromAscii( CONTROLNAME_TEXT ) , xRef_Topic_Top ) ; 97 addControl ( OUString::createFromAscii( CONTROLNAME_TEXT ) , xRef_Text_Top ) ; 98 addControl ( OUString::createFromAscii( CONTROLNAME_TEXT ) , xRef_Topic_Bottom ) ; 99 addControl ( OUString::createFromAscii( CONTROLNAME_TEXT ) , xRef_Text_Bottom ) ; 100 addControl ( OUString::createFromAscii( CONTROLNAME_BUTTON ) , xRef_Button ) ; 101 addControl ( OUString::createFromAscii( CONTROLNAME_PROGRESSBAR ) , xRef_ProgressBar ) ; 102 103 // FixedText make it automaticly visible by himself ... but not the progressbar !!! 104 // it must be set explicitly 105 Reference< XWindow > xWindowRef_ProgressBar( m_xProgressBar, UNO_QUERY ); 106 xWindowRef_ProgressBar->setVisible( sal_True ); 107 108 // Reset to defaults !!! 109 // (progressbar take automaticly its own defaults) 110 m_xButton->setLabel ( OUString::createFromAscii( DEFAULT_BUTTONLABEL ) ) ; 111 m_xTopic_Top->setText ( OUString::createFromAscii( DEFAULT_TOPIC ) ) ; 112 m_xText_Top->setText ( OUString::createFromAscii( DEFAULT_TEXT ) ) ; 113 m_xTopic_Bottom->setText ( OUString::createFromAscii( DEFAULT_TOPIC ) ) ; 114 m_xText_Bottom->setText ( OUString::createFromAscii( DEFAULT_TEXT ) ) ; 115 116 --m_refCount ; 117 118 // Initialize info lists for fixedtext's 119 m_pTextlist_Top = new IMPL_Textlist ; 120 m_pTextlist_Bottom = new IMPL_Textlist ; 121 } 122 123 ProgressMonitor::~ProgressMonitor() 124 { 125 impl_cleanMemory () ; 126 } 127 128 //____________________________________________________________________________________________________________ 129 // XInterface 130 //____________________________________________________________________________________________________________ 131 132 Any SAL_CALL ProgressMonitor::queryInterface( const Type& rType ) throw( RuntimeException ) 133 { 134 // Attention: 135 // Don't use mutex or guard in this method!!! Is a method of XInterface. 136 Any aReturn ; 137 Reference< XInterface > xDel = BaseContainerControl::impl_getDelegator(); 138 if ( xDel.is() ) 139 { 140 // If an delegator exist, forward question to his queryInterface. 141 // Delegator will ask his own queryAggregation! 142 aReturn = xDel->queryInterface( rType ); 143 } 144 else 145 { 146 // If an delegator unknown, forward question to own queryAggregation. 147 aReturn = queryAggregation( rType ); 148 } 149 150 return aReturn ; 151 } 152 153 //____________________________________________________________________________________________________________ 154 // XInterface 155 //____________________________________________________________________________________________________________ 156 157 void SAL_CALL ProgressMonitor::acquire() throw() 158 { 159 // Attention: 160 // Don't use mutex or guard in this method!!! Is a method of XInterface. 161 162 // Forward to baseclass 163 BaseControl::acquire(); 164 } 165 166 //____________________________________________________________________________________________________________ 167 // XInterface 168 //____________________________________________________________________________________________________________ 169 170 void SAL_CALL ProgressMonitor::release() throw() 171 { 172 // Attention: 173 // Don't use mutex or guard in this method!!! Is a method of XInterface. 174 175 // Forward to baseclass 176 BaseControl::release(); 177 } 178 179 //____________________________________________________________________________________________________________ 180 // XTypeProvider 181 //____________________________________________________________________________________________________________ 182 183 Sequence< Type > SAL_CALL ProgressMonitor::getTypes() throw( RuntimeException ) 184 { 185 // Optimize this method ! 186 // We initialize a static variable only one time. And we don't must use a mutex at every call! 187 // For the first call; pTypeCollection is NULL - for the second call pTypeCollection is different from NULL! 188 static OTypeCollection* pTypeCollection = NULL ; 189 190 if ( pTypeCollection == NULL ) 191 { 192 // Ready for multithreading; get global mutex for first call of this method only! see before 193 MutexGuard aGuard( Mutex::getGlobalMutex() ); 194 195 // Control these pointer again ... it can be, that another instance will be faster then these! 196 if ( pTypeCollection == NULL ) 197 { 198 // Create a static typecollection ... 199 static OTypeCollection aTypeCollection ( ::getCppuType(( const Reference< XLayoutConstrains >*)NULL ) , 200 ::getCppuType(( const Reference< XButton >*)NULL ) , 201 ::getCppuType(( const Reference< XProgressMonitor >*)NULL ) , 202 BaseContainerControl::getTypes() 203 ); 204 // ... and set his address to static pointer! 205 pTypeCollection = &aTypeCollection ; 206 } 207 } 208 209 return pTypeCollection->getTypes(); 210 } 211 212 //____________________________________________________________________________________________________________ 213 // XAggregation 214 //____________________________________________________________________________________________________________ 215 216 Any SAL_CALL ProgressMonitor::queryAggregation( const Type& aType ) throw( RuntimeException ) 217 { 218 // Ask for my own supported interfaces ... 219 // Attention: XTypeProvider and XInterface are supported by OComponentHelper! 220 Any aReturn ( ::cppu::queryInterface( aType , 221 static_cast< XLayoutConstrains* > ( this ) , 222 static_cast< XButton* > ( this ) , 223 static_cast< XProgressMonitor* > ( this ) 224 ) 225 ); 226 227 // If searched interface not supported by this class ... 228 if ( aReturn.hasValue() == sal_False ) 229 { 230 // ... ask baseclasses. 231 aReturn = BaseControl::queryAggregation( aType ); 232 } 233 234 return aReturn ; 235 } 236 237 //____________________________________________________________________________________________________________ 238 // XProgressMonitor 239 //____________________________________________________________________________________________________________ 240 241 void SAL_CALL ProgressMonitor::addText( const OUString& rTopic, const OUString& rText, sal_Bool bbeforeProgress ) throw( RuntimeException ) 242 { 243 // Safe impossible cases 244 // Check valid call of this method. 245 DBG_ASSERT ( impl_debug_checkParameter ( rTopic, rText, bbeforeProgress ) , "ProgressMonitor::addText()\nCall without valid parameters!\n") ; 246 DBG_ASSERT ( !(impl_searchTopic ( rTopic, bbeforeProgress ) != NULL ) , "ProgresMonitor::addText()\nThe text already exist.\n" ) ; 247 248 // Do nothing (in Release), if topic already exist. 249 if ( impl_searchTopic ( rTopic, bbeforeProgress ) != NULL ) 250 { 251 return ; 252 } 253 254 // Else ... take memory for new item ... 255 IMPL_TextlistItem* pTextItem = new IMPL_TextlistItem ; 256 257 if ( pTextItem != NULL ) 258 { 259 // Set values ... 260 pTextItem->sTopic = rTopic ; 261 pTextItem->sText = rText ; 262 263 // Ready for multithreading 264 MutexGuard aGuard ( m_aMutex ) ; 265 266 // ... and insert it in right list. 267 if ( bbeforeProgress == sal_True ) 268 { 269 m_pTextlist_Top->Insert ( pTextItem, LIST_APPEND ) ; 270 } 271 else 272 { 273 m_pTextlist_Bottom->Insert ( pTextItem, LIST_APPEND ) ; 274 } 275 } 276 277 // ... update window 278 impl_rebuildFixedText () ; 279 impl_recalcLayout () ; 280 } 281 282 //____________________________________________________________________________________________________________ 283 // XProgressMonitor 284 //____________________________________________________________________________________________________________ 285 286 void SAL_CALL ProgressMonitor::removeText ( const OUString& rTopic, sal_Bool bbeforeProgress ) throw( RuntimeException ) 287 { 288 // Safe impossible cases 289 // Check valid call of this method. 290 DBG_ASSERT ( impl_debug_checkParameter ( rTopic, bbeforeProgress ), "ProgressMonitor::removeText()\nCall without valid parameters!\n" ) ; 291 292 // Search the topic ... 293 IMPL_TextlistItem* pSearchItem = impl_searchTopic ( rTopic, bbeforeProgress ) ; 294 295 if ( pSearchItem != NULL ) 296 { 297 // Ready for multithreading 298 MutexGuard aGuard ( m_aMutex ) ; 299 300 // ... delete item from right list ... 301 if ( bbeforeProgress == sal_True ) 302 { 303 m_pTextlist_Top->Remove ( pSearchItem ) ; 304 } 305 else 306 { 307 m_pTextlist_Bottom->Remove ( pSearchItem ) ; 308 } 309 310 delete pSearchItem ; 311 312 // ... and update window. 313 impl_rebuildFixedText () ; 314 impl_recalcLayout () ; 315 } 316 } 317 318 //____________________________________________________________________________________________________________ 319 // XProgressMonitor 320 //____________________________________________________________________________________________________________ 321 322 void SAL_CALL ProgressMonitor::updateText ( const OUString& rTopic, const OUString& rText, sal_Bool bbeforeProgress ) throw( RuntimeException ) 323 { 324 // Safe impossible cases 325 // Check valid call of this method. 326 DBG_ASSERT ( impl_debug_checkParameter ( rTopic, rText, bbeforeProgress ), "ProgressMonitor::updateText()\nCall without valid parameters!\n" ) ; 327 328 // Search topic ... 329 IMPL_TextlistItem* pSearchItem = impl_searchTopic ( rTopic, bbeforeProgress ) ; 330 331 if ( pSearchItem != NULL ) 332 { 333 // Ready for multithreading 334 MutexGuard aGuard ( m_aMutex ) ; 335 336 // ... update text ... 337 pSearchItem->sText = rText ; 338 339 // ... and update window. 340 impl_rebuildFixedText () ; 341 impl_recalcLayout () ; 342 } 343 } 344 345 //____________________________________________________________________________________________________________ 346 // XProgressBar 347 //____________________________________________________________________________________________________________ 348 349 void SAL_CALL ProgressMonitor::setForegroundColor ( sal_Int32 nColor ) throw( RuntimeException ) 350 { 351 // Ready for multithreading 352 MutexGuard aGuard ( m_aMutex ) ; 353 354 if ( m_xProgressBar.is () ) 355 { 356 m_xProgressBar->setForegroundColor ( nColor ) ; 357 } 358 } 359 360 //____________________________________________________________________________________________________________ 361 // XProgressBar 362 //____________________________________________________________________________________________________________ 363 364 void SAL_CALL ProgressMonitor::setBackgroundColor ( sal_Int32 nColor ) throw( RuntimeException ) 365 { 366 // Ready for multithreading 367 MutexGuard aGuard ( m_aMutex ) ; 368 369 if ( m_xProgressBar.is () ) 370 { 371 m_xProgressBar->setBackgroundColor ( nColor ) ; 372 } 373 } 374 375 //____________________________________________________________________________________________________________ 376 // XProgressBar 377 //____________________________________________________________________________________________________________ 378 379 void SAL_CALL ProgressMonitor::setValue ( sal_Int32 nValue ) throw( RuntimeException ) 380 { 381 // Ready for multithreading 382 MutexGuard aGuard ( m_aMutex ) ; 383 384 if ( m_xProgressBar.is () ) 385 { 386 m_xProgressBar->setValue ( nValue ) ; 387 } 388 } 389 390 //____________________________________________________________________________________________________________ 391 // XProgressBar 392 //____________________________________________________________________________________________________________ 393 394 void SAL_CALL ProgressMonitor::setRange ( sal_Int32 nMin, sal_Int32 nMax ) throw( RuntimeException ) 395 { 396 // Ready for multithreading 397 MutexGuard aGuard ( m_aMutex ) ; 398 399 if ( m_xProgressBar.is () ) 400 { 401 m_xProgressBar->setRange ( nMin, nMax ) ; 402 } 403 } 404 405 //____________________________________________________________________________________________________________ 406 // XProgressBar 407 //____________________________________________________________________________________________________________ 408 409 sal_Int32 SAL_CALL ProgressMonitor::getValue () throw( RuntimeException ) 410 { 411 // Ready for multithreading 412 MutexGuard aGuard ( m_aMutex ) ; 413 414 if (m_xProgressBar.is()) 415 { 416 return m_xProgressBar->getValue () ; 417 } 418 419 return 0 ; 420 } 421 422 //____________________________________________________________________________________________________________ 423 // XButton 424 //____________________________________________________________________________________________________________ 425 426 void SAL_CALL ProgressMonitor::addActionListener ( const Reference< XActionListener > & rListener ) throw( RuntimeException ) 427 { 428 // Ready for multithreading 429 MutexGuard aGuard ( m_aMutex ) ; 430 431 if ( m_xButton.is () ) 432 { 433 m_xButton->addActionListener ( rListener ) ; 434 } 435 } 436 437 //____________________________________________________________________________________________________________ 438 // XButton 439 //____________________________________________________________________________________________________________ 440 441 void SAL_CALL ProgressMonitor::removeActionListener ( const Reference< XActionListener > & rListener ) throw( RuntimeException ) 442 { 443 // Ready for multithreading 444 MutexGuard aGuard ( m_aMutex ) ; 445 446 if ( m_xButton.is () ) 447 { 448 m_xButton->removeActionListener ( rListener ) ; 449 } 450 } 451 452 //____________________________________________________________________________________________________________ 453 // XButton 454 //____________________________________________________________________________________________________________ 455 456 void SAL_CALL ProgressMonitor::setLabel ( const OUString& rLabel ) throw( RuntimeException ) 457 { 458 // Ready for multithreading 459 MutexGuard aGuard ( m_aMutex ) ; 460 461 if ( m_xButton.is () ) 462 { 463 m_xButton->setLabel ( rLabel ) ; 464 } 465 } 466 467 //____________________________________________________________________________________________________________ 468 // XButton 469 //____________________________________________________________________________________________________________ 470 471 void SAL_CALL ProgressMonitor::setActionCommand ( const OUString& rCommand ) throw( RuntimeException ) 472 { 473 // Ready for multithreading 474 MutexGuard aGuard ( m_aMutex ) ; 475 476 if ( m_xButton.is () ) 477 { 478 m_xButton->setActionCommand ( rCommand ) ; 479 } 480 } 481 482 //____________________________________________________________________________________________________________ 483 // XLayoutConstrains 484 //____________________________________________________________________________________________________________ 485 486 Size SAL_CALL ProgressMonitor::getMinimumSize () throw( RuntimeException ) 487 { 488 return Size (DEFAULT_WIDTH, DEFAULT_HEIGHT) ; 489 } 490 491 //____________________________________________________________________________________________________________ 492 // XLayoutConstrains 493 //____________________________________________________________________________________________________________ 494 495 Size SAL_CALL ProgressMonitor::getPreferredSize () throw( RuntimeException ) 496 { 497 // Ready for multithreading 498 ClearableMutexGuard aGuard ( m_aMutex ) ; 499 500 // get information about required place of child controls 501 Reference< XLayoutConstrains > xTopicLayout_Top ( m_xTopic_Top , UNO_QUERY ) ; 502 Reference< XLayoutConstrains > xTopicLayout_Bottom ( m_xTopic_Bottom , UNO_QUERY ) ; 503 Reference< XLayoutConstrains > xButtonLayout ( m_xButton , UNO_QUERY ) ; 504 Reference< XWindow > xProgressBarWindow ( m_xProgressBar , UNO_QUERY ) ; 505 506 Size aTopicSize_Top = xTopicLayout_Top->getPreferredSize (); 507 Size aTopicSize_Bottom = xTopicLayout_Bottom->getPreferredSize (); 508 Size aButtonSize = xButtonLayout->getPreferredSize (); 509 Rectangle aTempRectangle = xProgressBarWindow->getPosSize (); 510 Size aProgressBarSize = Size( aTempRectangle.Width, aTempRectangle.Height ); 511 512 aGuard.clear () ; 513 514 // calc preferred size of progressmonitor 515 sal_Int32 nWidth = 0 ; 516 sal_Int32 nHeight = 0 ; 517 518 nWidth = 3 * FREEBORDER ; 519 nWidth += aProgressBarSize.Width ; 520 521 nHeight = 6 * FREEBORDER ; 522 nHeight += aTopicSize_Top.Height ; 523 nHeight += aProgressBarSize.Height ; 524 nHeight += aTopicSize_Bottom.Height; 525 nHeight += 2 ; // 1 for black line, 1 for white line = 3D-Line! 526 nHeight += aButtonSize.Height ; 527 528 // norm to minimum 529 if ( nWidth<DEFAULT_WIDTH ) 530 { 531 nWidth = DEFAULT_WIDTH ; 532 } 533 if ( nHeight<DEFAULT_HEIGHT ) 534 { 535 nHeight = DEFAULT_HEIGHT ; 536 } 537 538 // return to caller 539 return Size ( nWidth, nHeight ) ; 540 } 541 542 //____________________________________________________________________________________________________________ 543 // XLayoutConstrains 544 //____________________________________________________________________________________________________________ 545 546 Size SAL_CALL ProgressMonitor::calcAdjustedSize ( const Size& /*rNewSize*/ ) throw( RuntimeException ) 547 { 548 return getPreferredSize () ; 549 } 550 551 //____________________________________________________________________________________________________________ 552 // XControl 553 //____________________________________________________________________________________________________________ 554 555 void SAL_CALL ProgressMonitor::createPeer ( const Reference< XToolkit > & rToolkit, const Reference< XWindowPeer > & rParent ) throw( RuntimeException ) 556 { 557 if (!getPeer().is()) 558 { 559 BaseContainerControl::createPeer ( rToolkit, rParent ) ; 560 561 // If user forget to call "setPosSize()", we have still a correct size. 562 // And a "MinimumSize" IS A "MinimumSize"! 563 // We change not the position of control at this point. 564 Size aDefaultSize = getMinimumSize () ; 565 setPosSize ( 0, 0, aDefaultSize.Width, aDefaultSize.Height, PosSize::SIZE ) ; 566 } 567 } 568 569 //____________________________________________________________________________________________________________ 570 // XControl 571 //____________________________________________________________________________________________________________ 572 573 sal_Bool SAL_CALL ProgressMonitor::setModel ( const Reference< XControlModel > & /*rModel*/ ) throw( RuntimeException ) 574 { 575 // We have no model. 576 return sal_False ; 577 } 578 579 //____________________________________________________________________________________________________________ 580 // XControl 581 //____________________________________________________________________________________________________________ 582 583 Reference< XControlModel > SAL_CALL ProgressMonitor::getModel () throw( RuntimeException ) 584 { 585 // We have no model. 586 // return (XControlModel*)this ; 587 return Reference< XControlModel > () ; 588 } 589 590 //____________________________________________________________________________________________________________ 591 // XComponent 592 //____________________________________________________________________________________________________________ 593 594 void SAL_CALL ProgressMonitor::dispose () throw( RuntimeException ) 595 { 596 // Ready for multithreading 597 MutexGuard aGuard ( m_aMutex ) ; 598 599 // "removeControl()" control the state of a reference 600 Reference< XControl > xRef_Topic_Top ( m_xTopic_Top , UNO_QUERY ) ; 601 Reference< XControl > xRef_Text_Top ( m_xText_Top , UNO_QUERY ) ; 602 Reference< XControl > xRef_Topic_Bottom ( m_xTopic_Bottom , UNO_QUERY ) ; 603 Reference< XControl > xRef_Text_Bottom ( m_xText_Bottom , UNO_QUERY ) ; 604 Reference< XControl > xRef_Button ( m_xButton , UNO_QUERY ) ; 605 Reference< XControl > xRef_ProgressBar ( m_xProgressBar , UNO_QUERY ) ; 606 607 removeControl ( xRef_Topic_Top ) ; 608 removeControl ( xRef_Text_Top ) ; 609 removeControl ( xRef_Topic_Bottom ) ; 610 removeControl ( xRef_Text_Bottom ) ; 611 removeControl ( xRef_Button ) ; 612 removeControl ( xRef_ProgressBar ) ; 613 614 // do'nt use "...->clear ()" or "... = XFixedText ()" 615 // when other hold a reference at this object !!! 616 xRef_Topic_Top->dispose () ; 617 xRef_Text_Top->dispose () ; 618 xRef_Topic_Bottom->dispose () ; 619 xRef_Text_Bottom->dispose () ; 620 xRef_Button->dispose () ; 621 xRef_ProgressBar->dispose () ; 622 623 BaseContainerControl::dispose () ; 624 } 625 626 //____________________________________________________________________________________________________________ 627 // XWindow 628 //____________________________________________________________________________________________________________ 629 630 void SAL_CALL ProgressMonitor::setPosSize ( sal_Int32 nX, sal_Int32 nY, sal_Int32 nWidth, sal_Int32 nHeight, sal_Int16 nFlags ) throw( RuntimeException ) 631 { 632 Rectangle aBasePosSize = getPosSize () ; 633 BaseContainerControl::setPosSize (nX, nY, nWidth, nHeight, nFlags) ; 634 635 // if position or size changed 636 if ( 637 ( nWidth != aBasePosSize.Width ) || 638 ( nHeight != aBasePosSize.Height) 639 ) 640 { 641 // calc new layout for controls 642 impl_recalcLayout () ; 643 // clear background (!) 644 // [Childs was repainted in "recalcLayout" by setPosSize() automaticly!] 645 getPeer()->invalidate(2); 646 // and repaint the control 647 impl_paint ( 0, 0, impl_getGraphicsPeer() ) ; 648 } 649 } 650 651 //____________________________________________________________________________________________________________ 652 // impl but public method to register service 653 //____________________________________________________________________________________________________________ 654 655 const Sequence< OUString > ProgressMonitor::impl_getStaticSupportedServiceNames() 656 { 657 MutexGuard aGuard( Mutex::getGlobalMutex() ); 658 Sequence< OUString > seqServiceNames( 1 ); 659 seqServiceNames.getArray() [0] = OUString::createFromAscii( SERVICENAME_PROGRESSMONITOR ); 660 return seqServiceNames ; 661 } 662 663 //____________________________________________________________________________________________________________ 664 // impl but public method to register service 665 //____________________________________________________________________________________________________________ 666 667 const OUString ProgressMonitor::impl_getStaticImplementationName() 668 { 669 return OUString::createFromAscii( IMPLEMENTATIONNAME_PROGRESSMONITOR ); 670 } 671 672 //____________________________________________________________________________________________________________ 673 // protected method 674 //____________________________________________________________________________________________________________ 675 676 void ProgressMonitor::impl_paint ( sal_Int32 nX, sal_Int32 nY, const Reference< XGraphics > & rGraphics ) 677 { 678 if (rGraphics.is()) 679 { 680 // Ready for multithreading 681 MutexGuard aGuard ( m_aMutex ) ; 682 683 // paint shadowed border around the progressmonitor 684 rGraphics->setLineColor ( LINECOLOR_SHADOW ) ; 685 rGraphics->drawLine ( impl_getWidth()-1, impl_getHeight()-1, impl_getWidth()-1, nY ) ; 686 rGraphics->drawLine ( impl_getWidth()-1, impl_getHeight()-1, nX , impl_getHeight()-1 ) ; 687 688 rGraphics->setLineColor ( LINECOLOR_BRIGHT ) ; 689 rGraphics->drawLine ( nX, nY, impl_getWidth(), nY ) ; 690 rGraphics->drawLine ( nX, nY, nX , impl_getHeight() ) ; 691 692 // Paint 3D-line 693 rGraphics->setLineColor ( LINECOLOR_SHADOW ) ; 694 rGraphics->drawLine ( m_a3DLine.X, m_a3DLine.Y, m_a3DLine.X+m_a3DLine.Width, m_a3DLine.Y ) ; 695 696 rGraphics->setLineColor ( LINECOLOR_BRIGHT ) ; 697 rGraphics->drawLine ( m_a3DLine.X, m_a3DLine.Y+1, m_a3DLine.X+m_a3DLine.Width, m_a3DLine.Y+1 ) ; 698 } 699 } 700 701 //____________________________________________________________________________________________________________ 702 // private method 703 //____________________________________________________________________________________________________________ 704 705 void ProgressMonitor::impl_recalcLayout () 706 { 707 sal_Int32 nX_Button ; 708 sal_Int32 nY_Button ; 709 sal_Int32 nWidth_Button ; 710 sal_Int32 nHeight_Button ; 711 712 sal_Int32 nX_ProgressBar ; 713 sal_Int32 nY_ProgressBar ; 714 sal_Int32 nWidth_ProgressBar ; 715 sal_Int32 nHeight_ProgressBar ; 716 717 sal_Int32 nX_3DLine ; 718 sal_Int32 nY_3DLine ; 719 sal_Int32 nWidth_3DLine ; 720 sal_Int32 nHeight_3DLine ; 721 722 sal_Int32 nX_Text_Top ; 723 sal_Int32 nY_Text_Top ; 724 sal_Int32 nWidth_Text_Top ; 725 sal_Int32 nHeight_Text_Top ; 726 727 sal_Int32 nX_Topic_Top ; 728 sal_Int32 nY_Topic_Top ; 729 sal_Int32 nWidth_Topic_Top ; 730 sal_Int32 nHeight_Topic_Top ; 731 732 sal_Int32 nX_Text_Bottom ; 733 sal_Int32 nY_Text_Bottom ; 734 sal_Int32 nWidth_Text_Bottom ; 735 sal_Int32 nHeight_Text_Bottom ; 736 737 sal_Int32 nX_Topic_Bottom ; 738 sal_Int32 nY_Topic_Bottom ; 739 sal_Int32 nWidth_Topic_Bottom ; 740 sal_Int32 nHeight_Topic_Bottom ; 741 742 // Ready for multithreading 743 MutexGuard aGuard ( m_aMutex ) ; 744 745 // get information about required place of child controls 746 Reference< XLayoutConstrains > xTopicLayout_Top ( m_xTopic_Top , UNO_QUERY ) ; 747 Reference< XLayoutConstrains > xTextLayout_Top ( m_xText_Top , UNO_QUERY ) ; 748 Reference< XLayoutConstrains > xTopicLayout_Bottom ( m_xTopic_Bottom , UNO_QUERY ) ; 749 Reference< XLayoutConstrains > xTextLayout_Bottom ( m_xText_Bottom , UNO_QUERY ) ; 750 Reference< XLayoutConstrains > xButtonLayout ( m_xButton , UNO_QUERY ) ; 751 752 Size aTopicSize_Top = xTopicLayout_Top->getPreferredSize () ; 753 Size aTextSize_Top = xTextLayout_Top->getPreferredSize () ; 754 Size aTopicSize_Bottom = xTopicLayout_Bottom->getPreferredSize () ; 755 Size aTextSize_Bottom = xTextLayout_Bottom->getPreferredSize () ; 756 Size aButtonSize = xButtonLayout->getPreferredSize () ; 757 758 // calc position and size of child controls 759 // Button has preferred size! 760 nWidth_Button = aButtonSize.Width ; 761 nHeight_Button = aButtonSize.Height ; 762 763 // Left column before progressbar has preferred size and fixed position. 764 // But "Width" is oriented on left column below progressbar to!!! "max(...)" 765 nX_Topic_Top = FREEBORDER ; 766 nY_Topic_Top = FREEBORDER ; 767 nWidth_Topic_Top = Max ( aTopicSize_Top.Width, aTopicSize_Bottom.Width ) ; 768 nHeight_Topic_Top = aTopicSize_Top.Height ; 769 770 // Right column before progressbar has relativ position to left column ... 771 // ... and a size as rest of dialog size! 772 nX_Text_Top = nX_Topic_Top+nWidth_Topic_Top+FREEBORDER ; 773 nY_Text_Top = nY_Topic_Top ; 774 nWidth_Text_Top = Max ( aTextSize_Top.Width, aTextSize_Bottom.Width ) ; 775 // Fix size of this column to minimum! 776 sal_Int32 nSummaryWidth = nWidth_Text_Top+nWidth_Topic_Top+(3*FREEBORDER) ; 777 if ( nSummaryWidth < DEFAULT_WIDTH ) 778 nWidth_Text_Top = DEFAULT_WIDTH-nWidth_Topic_Top-(3*FREEBORDER); 779 // Fix size of column to maximum! 780 if ( nSummaryWidth > impl_getWidth() ) 781 nWidth_Text_Top = impl_getWidth()-nWidth_Topic_Top-(3*FREEBORDER) ; 782 nHeight_Text_Top = nHeight_Topic_Top ; 783 784 // Position of progressbar is relativ to columns before. 785 // Progressbar.Width = Dialog.Width !!! 786 // Progressbar.Height = Button.Height 787 nX_ProgressBar = nX_Topic_Top ; 788 nY_ProgressBar = nY_Topic_Top+nHeight_Topic_Top+FREEBORDER ; 789 nWidth_ProgressBar = FREEBORDER+nWidth_Topic_Top+nWidth_Text_Top ; 790 nHeight_ProgressBar = nHeight_Button ; 791 792 // Oriented by left column before progressbar. 793 nX_Topic_Bottom = nX_Topic_Top ; 794 nY_Topic_Bottom = nY_ProgressBar+nHeight_ProgressBar+FREEBORDER ; 795 nWidth_Topic_Bottom = nWidth_Topic_Top ; 796 nHeight_Topic_Bottom = aTopicSize_Bottom.Height ; 797 798 // Oriented by right column before progressbar. 799 nX_Text_Bottom = nX_Topic_Bottom+nWidth_Topic_Bottom+FREEBORDER ; 800 nY_Text_Bottom = nY_Topic_Bottom ; 801 nWidth_Text_Bottom = nWidth_Text_Top ; 802 nHeight_Text_Bottom = nHeight_Topic_Bottom ; 803 804 // Oriented by progressbar. 805 nX_3DLine = nX_Topic_Top ; 806 nY_3DLine = nY_Topic_Bottom+nHeight_Topic_Bottom+(FREEBORDER/2) ; 807 nWidth_3DLine = nWidth_ProgressBar ; 808 nHeight_3DLine = 1 ; // Height for ONE line ! (But we paint two lines!) 809 810 // Oriented by progressbar. 811 nX_Button = nX_ProgressBar+nWidth_ProgressBar-nWidth_Button ; 812 nY_Button = nY_Topic_Bottom+nHeight_Topic_Bottom+FREEBORDER ; 813 814 // Calc offsets to center controls 815 sal_Int32 nDx ; 816 sal_Int32 nDy ; 817 818 nDx = ( (2*FREEBORDER)+nWidth_ProgressBar ) ; 819 nDy = ( (6*FREEBORDER)+nHeight_Topic_Top+nHeight_ProgressBar+nHeight_Topic_Bottom+2+nHeight_Button ) ; 820 821 // At this point use original dialog size to center controls! 822 nDx = (impl_getWidth ()/2)-(nDx/2) ; 823 nDy = (impl_getHeight()/2)-(nDy/2) ; 824 825 if ( nDx<0 ) 826 { 827 nDx=0 ; 828 } 829 if ( nDy<0 ) 830 { 831 nDy=0 ; 832 } 833 834 // Set new position and size on all controls 835 Reference< XWindow > xRef_Topic_Top ( m_xTopic_Top , UNO_QUERY ) ; 836 Reference< XWindow > xRef_Text_Top ( m_xText_Top , UNO_QUERY ) ; 837 Reference< XWindow > xRef_Topic_Bottom ( m_xTopic_Bottom , UNO_QUERY ) ; 838 Reference< XWindow > xRef_Text_Bottom ( m_xText_Bottom , UNO_QUERY ) ; 839 Reference< XWindow > xRef_Button ( m_xButton , UNO_QUERY ) ; 840 Reference< XWindow > xRef_ProgressBar ( m_xProgressBar , UNO_QUERY ) ; 841 842 xRef_Topic_Top->setPosSize ( nDx+nX_Topic_Top , nDy+nY_Topic_Top , nWidth_Topic_Top , nHeight_Topic_Top , 15 ) ; 843 xRef_Text_Top->setPosSize ( nDx+nX_Text_Top , nDy+nY_Text_Top , nWidth_Text_Top , nHeight_Text_Top , 15 ) ; 844 xRef_Topic_Bottom->setPosSize ( nDx+nX_Topic_Bottom , nDy+nY_Topic_Bottom , nWidth_Topic_Bottom , nHeight_Topic_Bottom , 15 ) ; 845 xRef_Text_Bottom->setPosSize ( nDx+nX_Text_Bottom , nDy+nY_Text_Bottom , nWidth_Text_Bottom , nHeight_Text_Bottom , 15 ) ; 846 xRef_Button->setPosSize ( nDx+nX_Button , nDy+nY_Button , nWidth_Button , nHeight_Button , 15 ) ; 847 xRef_ProgressBar->setPosSize ( nDx+nX_ProgressBar , nDy+nY_ProgressBar , nWidth_ProgressBar , nHeight_ProgressBar , 15 ) ; 848 849 m_a3DLine.X = nDx+nX_Topic_Top ; 850 m_a3DLine.Y = nDy+nY_Topic_Bottom+nHeight_Topic_Bottom+(FREEBORDER/2) ; 851 m_a3DLine.Width = nWidth_ProgressBar ; 852 m_a3DLine.Height = nHeight_ProgressBar ; 853 854 // All childcontrols make an implicit repaint in setPosSize()! 855 // Make it also for this 3D-line ... 856 Reference< XGraphics > xGraphics = impl_getGraphicsPeer () ; 857 858 xGraphics->setLineColor ( LINECOLOR_SHADOW ) ; 859 xGraphics->drawLine ( m_a3DLine.X, m_a3DLine.Y, m_a3DLine.X+m_a3DLine.Width, m_a3DLine.Y ) ; 860 861 xGraphics->setLineColor ( LINECOLOR_BRIGHT ) ; 862 xGraphics->drawLine ( m_a3DLine.X, m_a3DLine.Y+1, m_a3DLine.X+m_a3DLine.Width, m_a3DLine.Y+1 ) ; 863 } 864 865 //____________________________________________________________________________________________________________ 866 // private method 867 //____________________________________________________________________________________________________________ 868 869 void ProgressMonitor::impl_rebuildFixedText () 870 { 871 // Ready for multithreading 872 MutexGuard aGuard ( m_aMutex ) ; 873 874 // Rebuild fixedtext before progress 875 876 // Rebuild left site of text 877 if (m_xTopic_Top.is()) 878 { 879 OUString aCollectString ; 880 881 // Collect all topics from list and format text. 882 // "\n" MUST BE at the end of line!!! => Else ... topic and his text are not in the same line!!! 883 for ( sal_uInt32 n=0; n<m_pTextlist_Top->Count(); ++n ) 884 { 885 IMPL_TextlistItem* pSearchItem = m_pTextlist_Top->GetObject (n) ; 886 aCollectString += pSearchItem->sTopic ; 887 aCollectString += OUString::createFromAscii("\n") ; 888 } 889 aCollectString += OUString::createFromAscii("\0") ; // It's better :-) 890 891 m_xTopic_Top->setText ( aCollectString ) ; 892 } 893 894 // Rebuild right site of text 895 if (m_xText_Top.is()) 896 { 897 OUString aCollectString ; 898 899 // Collect all topics from list and format text. 900 // "\n" MUST BE at the end of line!!! => Else ... topic and his text are not in the same line!!! 901 for ( sal_uInt32 n=0; n<m_pTextlist_Top->Count(); ++n ) 902 { 903 IMPL_TextlistItem* pSearchItem = m_pTextlist_Top->GetObject (n) ; 904 aCollectString += pSearchItem->sText ; 905 aCollectString += OUString::createFromAscii("\n") ; 906 } 907 aCollectString += OUString::createFromAscii("\0") ; // It's better :-) 908 909 m_xText_Top->setText ( aCollectString ) ; 910 } 911 912 // Rebuild fixedtext below progress 913 914 // Rebuild left site of text 915 if (m_xTopic_Bottom.is()) 916 { 917 OUString aCollectString ; 918 919 // Collect all topics from list and format text. 920 // "\n" MUST BE at the end of line!!! => Else ... topic and his text are not in the same line!!! 921 for ( sal_uInt32 n=0; n<m_pTextlist_Bottom->Count(); ++n ) 922 { 923 IMPL_TextlistItem* pSearchItem = m_pTextlist_Bottom->GetObject (n) ; 924 aCollectString += pSearchItem->sTopic ; 925 aCollectString += OUString::createFromAscii("\n") ; 926 } 927 aCollectString += OUString::createFromAscii("\0") ; // It's better :-) 928 929 m_xTopic_Bottom->setText ( aCollectString ) ; 930 } 931 932 // Rebuild right site of text 933 if (m_xText_Bottom.is()) 934 { 935 OUString aCollectString ; 936 937 // Collect all topics from list and format text. 938 // "\n" MUST BE at the end of line!!! => Else ... topic and his text are not in the same line!!! 939 for ( sal_uInt32 n=0; n<m_pTextlist_Bottom->Count(); ++n ) 940 { 941 IMPL_TextlistItem* pSearchItem = m_pTextlist_Bottom->GetObject (n) ; 942 aCollectString += pSearchItem->sText ; 943 aCollectString += OUString::createFromAscii("\n") ; 944 } 945 aCollectString += OUString::createFromAscii("\0") ; // It's better :-) 946 947 m_xText_Bottom->setText ( aCollectString ) ; 948 } 949 } 950 951 //____________________________________________________________________________________________________________ 952 // private method 953 //____________________________________________________________________________________________________________ 954 955 void ProgressMonitor::impl_cleanMemory () 956 { 957 // Ready for multithreading 958 MutexGuard aGuard ( m_aMutex ) ; 959 960 // Delete all of lists. 961 962 sal_uInt32 nPosition ; 963 964 for ( nPosition = 0; nPosition < m_pTextlist_Top->Count () ; ++nPosition ) 965 { 966 IMPL_TextlistItem* pSearchItem = m_pTextlist_Top->GetObject ( nPosition ) ; 967 delete pSearchItem ; 968 } 969 m_pTextlist_Top->Clear () ; 970 delete m_pTextlist_Top ; 971 972 for ( nPosition = 0; nPosition < m_pTextlist_Bottom->Count () ; ++nPosition ) 973 { 974 IMPL_TextlistItem* pSearchItem = m_pTextlist_Bottom->GetObject ( nPosition ) ; 975 delete pSearchItem ; 976 } 977 m_pTextlist_Bottom->Clear () ; 978 delete m_pTextlist_Bottom ; 979 } 980 981 //____________________________________________________________________________________________________________ 982 // private method 983 //____________________________________________________________________________________________________________ 984 985 IMPL_TextlistItem* ProgressMonitor::impl_searchTopic ( const OUString& rTopic, sal_Bool bbeforeProgress ) 986 { 987 // Get right textlist for following operations. 988 IMPL_Textlist* pTextList ; 989 990 // Ready for multithreading 991 ClearableMutexGuard aGuard ( m_aMutex ) ; 992 993 if ( bbeforeProgress == sal_True ) 994 { 995 pTextList = m_pTextlist_Top ; 996 } 997 else 998 { 999 pTextList = m_pTextlist_Bottom ; 1000 } 1001 1002 // Switch off guard. 1003 aGuard.clear () ; 1004 1005 // Search the topic in textlist. 1006 sal_uInt32 nPosition = 0 ; 1007 sal_uInt32 nCount = pTextList->Count () ; 1008 1009 for ( nPosition = 0; nPosition < nCount ; ++nPosition ) 1010 { 1011 IMPL_TextlistItem* pSearchItem = pTextList->GetObject ( nPosition ) ; 1012 1013 if ( pSearchItem->sTopic == rTopic ) 1014 { 1015 // We have found this topic ... return a valid pointer. 1016 return pSearchItem ; 1017 } 1018 } 1019 1020 // We have'nt found this topic ... return a nonvalid pointer. 1021 return NULL ; 1022 } 1023 1024 //____________________________________________________________________________________________________________ 1025 // debug methods 1026 //____________________________________________________________________________________________________________ 1027 1028 #ifdef DBG_UTIL 1029 1030 // addText, updateText 1031 sal_Bool ProgressMonitor::impl_debug_checkParameter ( const OUString& rTopic, const OUString& rText, sal_Bool /*bbeforeProgress*/ ) 1032 { 1033 // Check "rTopic" 1034 if ( &rTopic == NULL ) return sal_False ; // NULL-pointer for reference ???!!! 1035 if ( rTopic.getLength () < 1 ) return sal_False ; // "" 1036 1037 // Check "rText" 1038 if ( &rText == NULL ) return sal_False ; // NULL-pointer for reference ???!!! 1039 if ( rText.getLength () < 1 ) return sal_False ; // "" 1040 1041 // "bbeforeProgress" is valid in everyway! 1042 1043 // Parameter OK ... return sal_True. 1044 return sal_True ; 1045 } 1046 1047 // removeText 1048 sal_Bool ProgressMonitor::impl_debug_checkParameter ( const OUString& rTopic, sal_Bool /*bbeforeProgress*/ ) 1049 { 1050 // Check "rTopic" 1051 if ( &rTopic == NULL ) return sal_False ; // NULL-pointer for reference ???!!! 1052 if ( rTopic.getLength () < 1 ) return sal_False ; // "" 1053 1054 // "bbeforeProgress" is valid in everyway! 1055 1056 // Parameter OK ... return sal_True. 1057 return sal_True ; 1058 } 1059 1060 #endif // #ifdef DBG_UTIL 1061 1062 } // namespace unocontrols 1063