1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_basctl.hxx" 30 31 #include <vector> 32 #include <algorithm> 33 #include <dlgeddef.hxx> 34 #include "dlgedobj.hxx" 35 #include "dlged.hxx" 36 #include "dlgedmod.hxx" 37 #include "dlgedpage.hxx" 38 #include "dlgedview.hxx" 39 #include "dlgedlist.hxx" 40 #include <iderid.hxx> 41 #include <localizationmgr.hxx> 42 43 #ifndef _BASCTL_DLGRESID_HRC 44 #include <dlgresid.hrc> 45 #endif 46 #include <tools/resmgr.hxx> 47 #include <tools/shl.hxx> 48 #include <unotools/sharedunocomponent.hxx> 49 #include <com/sun/star/awt/XTabControllerModel.hpp> 50 #include <com/sun/star/awt/XUnoControlContainer.hpp> 51 #include <com/sun/star/awt/XVclContainerPeer.hpp> 52 #include <com/sun/star/awt/XWindow.hpp> 53 #include <com/sun/star/beans/XPropertySet.hpp> 54 #include <com/sun/star/beans/PropertyAttribute.hpp> 55 #include <com/sun/star/script/XScriptEventsSupplier.hpp> 56 #include <com/sun/star/container/XContainer.hpp> 57 #include <com/sun/star/lang/XServiceInfo.hpp> 58 #include <comphelper/processfactory.hxx> 59 #include <comphelper/types.hxx> 60 #include <vcl/svapp.hxx> 61 62 #include <algorithm> 63 #include <functional> 64 65 using namespace ::com::sun::star; 66 using namespace ::com::sun::star::uno; 67 using namespace ::com::sun::star::beans; 68 using namespace ::com::sun::star::container; 69 using namespace ::com::sun::star::script; 70 using ::rtl::OUString; 71 72 73 TYPEINIT1(DlgEdObj, SdrUnoObj); 74 DBG_NAME(DlgEdObj); 75 76 //---------------------------------------------------------------------------- 77 78 DlgEdObj::DlgEdObj() 79 :SdrUnoObj(String(), sal_False) 80 ,bIsListening(sal_False) 81 ,pDlgEdForm( NULL ) 82 { 83 DBG_CTOR(DlgEdObj, NULL); 84 } 85 86 //---------------------------------------------------------------------------- 87 88 DlgEdObj::DlgEdObj(const ::rtl::OUString& rModelName, 89 const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory >& rxSFac) 90 :SdrUnoObj(rModelName, rxSFac, sal_False) 91 ,bIsListening(sal_False) 92 ,pDlgEdForm( NULL ) 93 { 94 DBG_CTOR(DlgEdObj, NULL); 95 } 96 97 //---------------------------------------------------------------------------- 98 99 DlgEdObj::~DlgEdObj() 100 { 101 DBG_DTOR(DlgEdObj, NULL); 102 103 if ( isListening() ) 104 EndListening(); 105 } 106 107 //---------------------------------------------------------------------------- 108 109 void DlgEdObj::SetPage(SdrPage* _pNewPage) 110 { 111 // now set the page 112 SdrUnoObj::SetPage(_pNewPage); 113 } 114 115 //---------------------------------------------------------------------------- 116 117 namespace 118 { 119 /** returns the DlgEdForm which the given DlgEdObj belongs to 120 (which might in fact be the object itself) 121 122 Failure to obtain the form will be reported with an assertion in the non-product 123 version. 124 */ 125 bool lcl_getDlgEdForm( DlgEdObj* _pObject, DlgEdForm*& _out_pDlgEdForm ) 126 { 127 _out_pDlgEdForm = dynamic_cast< DlgEdForm* >( _pObject ); 128 if ( !_out_pDlgEdForm ) 129 _out_pDlgEdForm = _pObject->GetDlgEdForm(); 130 DBG_ASSERT( _out_pDlgEdForm, "lcl_getDlgEdForm: no form!" ); 131 return ( _out_pDlgEdForm != NULL ); 132 } 133 } 134 135 //---------------------------------------------------------------------------- 136 137 uno::Reference< awt::XControl > DlgEdObj::GetControl() const 138 { 139 const DlgEdForm* pForm = GetDlgEdForm(); 140 const DlgEditor* pEditor = pForm ? pForm->GetDlgEditor() : NULL; 141 SdrView* pView = pEditor ? pEditor->GetView() : NULL; 142 Window* pWindow = pEditor ? pEditor->GetWindow() : NULL; 143 OSL_ENSURE( ( pView && pWindow ) || !pForm, "DlgEdObj::GetControl: no view or no window!" ); 144 145 uno::Reference< awt::XControl > xControl; 146 if ( pView && pWindow ) 147 xControl = GetUnoControl( *pView, *pWindow ); 148 149 return xControl; 150 } 151 152 //---------------------------------------------------------------------------- 153 154 bool DlgEdObj::TransformSdrToControlCoordinates( 155 sal_Int32 nXIn, sal_Int32 nYIn, sal_Int32 nWidthIn, sal_Int32 nHeightIn, 156 sal_Int32& nXOut, sal_Int32& nYOut, sal_Int32& nWidthOut, sal_Int32& nHeightOut ) 157 { 158 // input position and size 159 Size aPos( nXIn, nYIn ); 160 Size aSize( nWidthIn, nHeightIn ); 161 162 // form position 163 DlgEdForm* pForm = NULL; 164 if ( !lcl_getDlgEdForm( this, pForm ) ) 165 return false; 166 Rectangle aFormRect = pForm->GetSnapRect(); 167 Size aFormPos( aFormRect.Left(), aFormRect.Top() ); 168 169 // convert 100th_mm to pixel 170 OutputDevice* pDevice = Application::GetDefaultDevice(); 171 DBG_ASSERT( pDevice, "DlgEdObj::TransformSdrToControlCoordinates: missing default device!" ); 172 if ( !pDevice ) 173 return false; 174 aPos = pDevice->LogicToPixel( aPos, MapMode( MAP_100TH_MM ) ); 175 aSize = pDevice->LogicToPixel( aSize, MapMode( MAP_100TH_MM ) ); 176 aFormPos = pDevice->LogicToPixel( aFormPos, MapMode( MAP_100TH_MM ) ); 177 178 // subtract form position 179 aPos.Width() -= aFormPos.Width(); 180 aPos.Height() -= aFormPos.Height(); 181 182 // take window borders into account 183 Reference< beans::XPropertySet > xPSetForm( pForm->GetUnoControlModel(), UNO_QUERY ); 184 DBG_ASSERT( xPSetForm.is(), "DlgEdObj::TransformFormToSdrCoordinates: no form property set!" ); 185 if ( !xPSetForm.is() ) 186 return false; 187 bool bDecoration = true; 188 xPSetForm->getPropertyValue( DLGED_PROP_DECORATION ) >>= bDecoration; 189 if( bDecoration ) 190 { 191 awt::DeviceInfo aDeviceInfo = pForm->getDeviceInfo(); 192 aPos.Width() -= aDeviceInfo.LeftInset; 193 aPos.Height() -= aDeviceInfo.TopInset; 194 } 195 196 // convert pixel to logic units 197 aPos = pDevice->PixelToLogic( aPos, MapMode( MAP_APPFONT ) ); 198 aSize = pDevice->PixelToLogic( aSize, MapMode( MAP_APPFONT ) ); 199 200 // set out parameters 201 nXOut = aPos.Width(); 202 nYOut = aPos.Height(); 203 nWidthOut = aSize.Width(); 204 nHeightOut = aSize.Height(); 205 206 return true; 207 } 208 209 //---------------------------------------------------------------------------- 210 211 bool DlgEdObj::TransformSdrToFormCoordinates( 212 sal_Int32 nXIn, sal_Int32 nYIn, sal_Int32 nWidthIn, sal_Int32 nHeightIn, 213 sal_Int32& nXOut, sal_Int32& nYOut, sal_Int32& nWidthOut, sal_Int32& nHeightOut ) 214 { 215 // input position and size 216 Size aPos( nXIn, nYIn ); 217 Size aSize( nWidthIn, nHeightIn ); 218 219 // convert 100th_mm to pixel 220 OutputDevice* pDevice = Application::GetDefaultDevice(); 221 DBG_ASSERT( pDevice, "DlgEdObj::TransformSdrToFormCoordinates: missing default device!" ); 222 if ( !pDevice ) 223 return false; 224 aPos = pDevice->LogicToPixel( aPos, MapMode( MAP_100TH_MM ) ); 225 aSize = pDevice->LogicToPixel( aSize, MapMode( MAP_100TH_MM ) ); 226 227 // take window borders into account 228 DlgEdForm* pForm = NULL; 229 if ( !lcl_getDlgEdForm( this, pForm ) ) 230 return false; 231 232 // take window borders into account 233 Reference< beans::XPropertySet > xPSetForm( pForm->GetUnoControlModel(), UNO_QUERY ); 234 DBG_ASSERT( xPSetForm.is(), "DlgEdObj::TransformFormToSdrCoordinates: no form property set!" ); 235 if ( !xPSetForm.is() ) 236 return false; 237 bool bDecoration = true; 238 xPSetForm->getPropertyValue( DLGED_PROP_DECORATION ) >>= bDecoration; 239 if( bDecoration ) 240 { 241 awt::DeviceInfo aDeviceInfo = pForm->getDeviceInfo(); 242 aSize.Width() -= aDeviceInfo.LeftInset + aDeviceInfo.RightInset; 243 aSize.Height() -= aDeviceInfo.TopInset + aDeviceInfo.BottomInset; 244 } 245 246 // convert pixel to logic units 247 aPos = pDevice->PixelToLogic( aPos, MapMode( MAP_APPFONT ) ); 248 aSize = pDevice->PixelToLogic( aSize, MapMode( MAP_APPFONT ) ); 249 250 // set out parameters 251 nXOut = aPos.Width(); 252 nYOut = aPos.Height(); 253 nWidthOut = aSize.Width(); 254 nHeightOut = aSize.Height(); 255 256 return true; 257 } 258 259 //---------------------------------------------------------------------------- 260 261 bool DlgEdObj::TransformControlToSdrCoordinates( 262 sal_Int32 nXIn, sal_Int32 nYIn, sal_Int32 nWidthIn, sal_Int32 nHeightIn, 263 sal_Int32& nXOut, sal_Int32& nYOut, sal_Int32& nWidthOut, sal_Int32& nHeightOut ) 264 { 265 // input position and size 266 Size aPos( nXIn, nYIn ); 267 Size aSize( nWidthIn, nHeightIn ); 268 269 // form position 270 DlgEdForm* pForm = NULL; 271 if ( !lcl_getDlgEdForm( this, pForm ) ) 272 return false; 273 274 Reference< beans::XPropertySet > xPSetForm( pForm->GetUnoControlModel(), UNO_QUERY ); 275 DBG_ASSERT( xPSetForm.is(), "DlgEdObj::TransformControlToSdrCoordinates: no form property set!" ); 276 if ( !xPSetForm.is() ) 277 return false; 278 sal_Int32 nFormX = 0, nFormY = 0, nFormWidth, nFormHeight; 279 xPSetForm->getPropertyValue( DLGED_PROP_POSITIONX ) >>= nFormX; 280 xPSetForm->getPropertyValue( DLGED_PROP_POSITIONY ) >>= nFormY; 281 xPSetForm->getPropertyValue( DLGED_PROP_WIDTH ) >>= nFormWidth; 282 xPSetForm->getPropertyValue( DLGED_PROP_HEIGHT ) >>= nFormHeight; 283 Size aFormPos( nFormX, nFormY ); 284 285 // convert logic units to pixel 286 OutputDevice* pDevice = Application::GetDefaultDevice(); 287 DBG_ASSERT( pDevice, "DlgEdObj::TransformControlToSdrCoordinates: missing default device!" ); 288 if ( !pDevice ) 289 return false; 290 aPos = pDevice->LogicToPixel( aPos, MapMode( MAP_APPFONT ) ); 291 aSize = pDevice->LogicToPixel( aSize, MapMode( MAP_APPFONT ) ); 292 aFormPos = pDevice->LogicToPixel( aFormPos, MapMode( MAP_APPFONT ) ); 293 294 // add form position 295 aPos.Width() += aFormPos.Width(); 296 aPos.Height() += aFormPos.Height(); 297 298 // take window borders into account 299 bool bDecoration = true; 300 xPSetForm->getPropertyValue( DLGED_PROP_DECORATION ) >>= bDecoration; 301 if( bDecoration ) 302 { 303 awt::DeviceInfo aDeviceInfo = pForm->getDeviceInfo(); 304 aPos.Width() += aDeviceInfo.LeftInset; 305 aPos.Height() += aDeviceInfo.TopInset; 306 } 307 308 // convert pixel to 100th_mm 309 aPos = pDevice->PixelToLogic( aPos, MapMode( MAP_100TH_MM ) ); 310 aSize = pDevice->PixelToLogic( aSize, MapMode( MAP_100TH_MM ) ); 311 312 // set out parameters 313 nXOut = aPos.Width(); 314 nYOut = aPos.Height(); 315 nWidthOut = aSize.Width(); 316 nHeightOut = aSize.Height(); 317 318 return true; 319 } 320 321 //---------------------------------------------------------------------------- 322 323 bool DlgEdObj::TransformFormToSdrCoordinates( 324 sal_Int32 nXIn, sal_Int32 nYIn, sal_Int32 nWidthIn, sal_Int32 nHeightIn, 325 sal_Int32& nXOut, sal_Int32& nYOut, sal_Int32& nWidthOut, sal_Int32& nHeightOut ) 326 { 327 // input position and size 328 Size aPos( nXIn, nYIn ); 329 Size aSize( nWidthIn, nHeightIn ); 330 331 // convert logic units to pixel 332 OutputDevice* pDevice = Application::GetDefaultDevice(); 333 DBG_ASSERT( pDevice, "DlgEdObj::TransformFormToSdrCoordinates: missing default device!" ); 334 if ( !pDevice ) 335 return false; 336 aPos = pDevice->LogicToPixel( aPos, MapMode( MAP_APPFONT ) ); 337 aSize = pDevice->LogicToPixel( aSize, MapMode( MAP_APPFONT ) ); 338 339 // take window borders into account 340 DlgEdForm* pForm = NULL; 341 if ( !lcl_getDlgEdForm( this, pForm ) ) 342 return false; 343 344 // take window borders into account 345 Reference< beans::XPropertySet > xPSetForm( pForm->GetUnoControlModel(), UNO_QUERY ); 346 DBG_ASSERT( xPSetForm.is(), "DlgEdObj::TransformFormToSdrCoordinates: no form property set!" ); 347 if ( !xPSetForm.is() ) 348 return false; 349 bool bDecoration = true; 350 xPSetForm->getPropertyValue( DLGED_PROP_DECORATION ) >>= bDecoration; 351 if( bDecoration ) 352 { 353 awt::DeviceInfo aDeviceInfo = pForm->getDeviceInfo(); 354 aSize.Width() += aDeviceInfo.LeftInset + aDeviceInfo.RightInset; 355 aSize.Height() += aDeviceInfo.TopInset + aDeviceInfo.BottomInset; 356 } 357 358 // convert pixel to 100th_mm 359 aPos = pDevice->PixelToLogic( aPos, MapMode( MAP_100TH_MM ) ); 360 aSize = pDevice->PixelToLogic( aSize, MapMode( MAP_100TH_MM ) ); 361 362 // set out parameters 363 nXOut = aPos.Width(); 364 nYOut = aPos.Height(); 365 nWidthOut = aSize.Width(); 366 nHeightOut = aSize.Height(); 367 368 return true; 369 } 370 371 //---------------------------------------------------------------------------- 372 373 void DlgEdObj::SetRectFromProps() 374 { 375 // get control position and size from properties 376 Reference< beans::XPropertySet > xPSet( GetUnoControlModel(), UNO_QUERY ); 377 if ( xPSet.is() ) 378 { 379 sal_Int32 nXIn = 0, nYIn = 0, nWidthIn = 0, nHeightIn = 0; 380 xPSet->getPropertyValue( DLGED_PROP_POSITIONX ) >>= nXIn; 381 xPSet->getPropertyValue( DLGED_PROP_POSITIONY ) >>= nYIn; 382 xPSet->getPropertyValue( DLGED_PROP_WIDTH ) >>= nWidthIn; 383 xPSet->getPropertyValue( DLGED_PROP_HEIGHT ) >>= nHeightIn; 384 385 // transform coordinates 386 sal_Int32 nXOut, nYOut, nWidthOut, nHeightOut; 387 if ( TransformControlToSdrCoordinates( nXIn, nYIn, nWidthIn, nHeightIn, nXOut, nYOut, nWidthOut, nHeightOut ) ) 388 { 389 // set rectangle position and size 390 Point aPoint( nXOut, nYOut ); 391 Size aSize( nWidthOut, nHeightOut ); 392 SetSnapRect( Rectangle( aPoint, aSize ) ); 393 } 394 } 395 } 396 397 //---------------------------------------------------------------------------- 398 399 void DlgEdObj::SetPropsFromRect() 400 { 401 // get control position and size from rectangle 402 Rectangle aRect_ = GetSnapRect(); 403 sal_Int32 nXIn = aRect_.Left(); 404 sal_Int32 nYIn = aRect_.Top(); 405 sal_Int32 nWidthIn = aRect_.GetWidth(); 406 sal_Int32 nHeightIn = aRect_.GetHeight(); 407 408 // transform coordinates 409 sal_Int32 nXOut, nYOut, nWidthOut, nHeightOut; 410 if ( TransformSdrToControlCoordinates( nXIn, nYIn, nWidthIn, nHeightIn, nXOut, nYOut, nWidthOut, nHeightOut ) ) 411 { 412 // set properties 413 Reference< beans::XPropertySet > xPSet( GetUnoControlModel(), UNO_QUERY ); 414 if ( xPSet.is() ) 415 { 416 Any aValue; 417 aValue <<= nXOut; 418 xPSet->setPropertyValue( DLGED_PROP_POSITIONX, aValue ); 419 aValue <<= nYOut; 420 xPSet->setPropertyValue( DLGED_PROP_POSITIONY, aValue ); 421 aValue <<= nWidthOut; 422 xPSet->setPropertyValue( DLGED_PROP_WIDTH, aValue ); 423 aValue <<= nHeightOut; 424 xPSet->setPropertyValue( DLGED_PROP_HEIGHT, aValue ); 425 } 426 } 427 } 428 429 //---------------------------------------------------------------------------- 430 431 void DlgEdObj::PositionAndSizeChange( const beans::PropertyChangeEvent& evt ) 432 { 433 DlgEdPage* pPage_ = 0; 434 if ( pDlgEdForm ) 435 { 436 DlgEditor* pEditor = pDlgEdForm->GetDlgEditor(); 437 if ( pEditor ) 438 pPage_ = pEditor->GetPage(); 439 } 440 DBG_ASSERT( pPage_, "DlgEdObj::PositionAndSizeChange: no page!" ); 441 if ( pPage_ ) 442 { 443 sal_Int32 nPageXIn = 0; 444 sal_Int32 nPageYIn = 0; 445 Size aPageSize = pPage_->GetSize(); 446 sal_Int32 nPageWidthIn = aPageSize.Width(); 447 sal_Int32 nPageHeightIn = aPageSize.Height(); 448 sal_Int32 nPageX, nPageY, nPageWidth, nPageHeight; 449 if ( TransformSdrToControlCoordinates( nPageXIn, nPageYIn, nPageWidthIn, nPageHeightIn, nPageX, nPageY, nPageWidth, nPageHeight ) ) 450 { 451 Reference< beans::XPropertySet > xPSet( GetUnoControlModel(), UNO_QUERY ); 452 if ( xPSet.is() ) 453 { 454 sal_Int32 nX = 0, nY = 0, nWidth = 0, nHeight = 0; 455 xPSet->getPropertyValue( DLGED_PROP_POSITIONX ) >>= nX; 456 xPSet->getPropertyValue( DLGED_PROP_POSITIONY ) >>= nY; 457 xPSet->getPropertyValue( DLGED_PROP_WIDTH ) >>= nWidth; 458 xPSet->getPropertyValue( DLGED_PROP_HEIGHT ) >>= nHeight; 459 460 sal_Int32 nValue = 0; 461 evt.NewValue >>= nValue; 462 sal_Int32 nNewValue = nValue; 463 464 if ( evt.PropertyName == DLGED_PROP_POSITIONX ) 465 { 466 if ( nNewValue + nWidth > nPageX + nPageWidth ) 467 nNewValue = nPageX + nPageWidth - nWidth; 468 if ( nNewValue < nPageX ) 469 nNewValue = nPageX; 470 } 471 else if ( evt.PropertyName == DLGED_PROP_POSITIONY ) 472 { 473 if ( nNewValue + nHeight > nPageY + nPageHeight ) 474 nNewValue = nPageY + nPageHeight - nHeight; 475 if ( nNewValue < nPageY ) 476 nNewValue = nPageY; 477 } 478 else if ( evt.PropertyName == DLGED_PROP_WIDTH ) 479 { 480 if ( nX + nNewValue > nPageX + nPageWidth ) 481 nNewValue = nPageX + nPageWidth - nX; 482 if ( nNewValue < 1 ) 483 nNewValue = 1; 484 } 485 else if ( evt.PropertyName == DLGED_PROP_HEIGHT ) 486 { 487 if ( nY + nNewValue > nPageY + nPageHeight ) 488 nNewValue = nPageY + nPageHeight - nY; 489 if ( nNewValue < 1 ) 490 nNewValue = 1; 491 } 492 493 if ( nNewValue != nValue ) 494 { 495 Any aNewValue; 496 aNewValue <<= nNewValue; 497 EndListening( sal_False ); 498 xPSet->setPropertyValue( evt.PropertyName, aNewValue ); 499 StartListening(); 500 } 501 } 502 } 503 } 504 505 SetRectFromProps(); 506 } 507 508 //---------------------------------------------------------------------------- 509 510 void SAL_CALL DlgEdObj::NameChange( const ::com::sun::star::beans::PropertyChangeEvent& evt ) throw( ::com::sun::star::uno::RuntimeException) 511 { 512 // get old name 513 ::rtl::OUString aOldName; 514 evt.OldValue >>= aOldName; 515 516 // get new name 517 ::rtl::OUString aNewName; 518 evt.NewValue >>= aNewName; 519 520 if ( !aNewName.equals(aOldName) ) 521 { 522 Reference< container::XNameAccess > xNameAcc((GetDlgEdForm()->GetUnoControlModel()), UNO_QUERY); 523 if ( xNameAcc.is() && xNameAcc->hasByName(aOldName) ) 524 { 525 if ( !xNameAcc->hasByName(aNewName) && aNewName.getLength() != 0 ) 526 { 527 // remove the control by the old name and insert the control by the new name in the container 528 Reference< container::XNameContainer > xCont(xNameAcc, UNO_QUERY ); 529 if ( xCont.is() ) 530 { 531 Reference< awt::XControlModel > xCtrl(GetUnoControlModel(), UNO_QUERY); 532 Any aAny; 533 aAny <<= xCtrl; 534 xCont->removeByName( aOldName ); 535 xCont->insertByName( aNewName , aAny ); 536 537 DlgEditor* pEditor; 538 if ( ISA(DlgEdForm) ) 539 pEditor = ((DlgEdForm*)this)->GetDlgEditor(); 540 else 541 pEditor = GetDlgEdForm()->GetDlgEditor(); 542 LocalizationMgr::renameControlResourceIDsForEditorObject( pEditor, aAny, aNewName ); 543 } 544 } 545 else 546 { 547 // set old name property 548 EndListening(sal_False); 549 Reference< beans::XPropertySet > xPSet(GetUnoControlModel(), UNO_QUERY); 550 Any aName; 551 aName <<= aOldName; 552 xPSet->setPropertyValue( DLGED_PROP_NAME, aName ); 553 StartListening(); 554 } 555 } 556 } 557 } 558 559 //---------------------------------------------------------------------------- 560 561 sal_Int32 DlgEdObj::GetStep() const 562 { 563 // get step property 564 sal_Int32 nStep = 0; 565 uno::Reference< beans::XPropertySet > xPSet( GetUnoControlModel(), uno::UNO_QUERY ); 566 if (xPSet.is()) 567 { 568 xPSet->getPropertyValue( DLGED_PROP_STEP ) >>= nStep; 569 } 570 return nStep; 571 } 572 573 //---------------------------------------------------------------------------- 574 575 void DlgEdObj::UpdateStep() 576 { 577 sal_Int32 nCurStep = GetDlgEdForm()->GetStep(); 578 sal_Int32 nStep = GetStep(); 579 580 SdrLayerAdmin& rLayerAdmin = GetModel()->GetLayerAdmin(); 581 SdrLayerID nHiddenLayerId = rLayerAdmin.GetLayerID( String( RTL_CONSTASCII_USTRINGPARAM( "HiddenLayer" ) ), sal_False ); 582 SdrLayerID nControlLayerId = rLayerAdmin.GetLayerID( rLayerAdmin.GetControlLayerName(), sal_False ); 583 584 if( nCurStep ) 585 { 586 if ( nStep && (nStep != nCurStep) ) 587 { 588 SetLayer( nHiddenLayerId ); 589 } 590 else 591 { 592 SetLayer( nControlLayerId ); 593 } 594 } 595 else 596 { 597 SetLayer( nControlLayerId ); 598 } 599 } 600 601 //---------------------------------------------------------------------------- 602 603 void DlgEdObj::TabIndexChange( const beans::PropertyChangeEvent& evt ) throw (RuntimeException) 604 { 605 DlgEdForm* pForm = GetDlgEdForm(); 606 if ( pForm ) 607 { 608 // stop listening with all children 609 ::std::vector<DlgEdObj*> aChildList = pForm->GetChilds(); 610 ::std::vector<DlgEdObj*>::iterator aIter; 611 for ( aIter = aChildList.begin() ; aIter != aChildList.end() ; ++aIter ) 612 { 613 (*aIter)->EndListening( sal_False ); 614 } 615 616 Reference< container::XNameAccess > xNameAcc( pForm->GetUnoControlModel() , UNO_QUERY ); 617 if ( xNameAcc.is() ) 618 { 619 // get sequence of control names 620 Sequence< ::rtl::OUString > aNames = xNameAcc->getElementNames(); 621 const ::rtl::OUString* pNames = aNames.getConstArray(); 622 sal_Int32 nCtrls = aNames.getLength(); 623 sal_Int16 i; 624 625 // create a map of tab indices and control names, sorted by tab index 626 IndexToNameMap aIndexToNameMap; 627 for ( i = 0; i < nCtrls; ++i ) 628 { 629 // get control name 630 ::rtl::OUString aName( pNames[i] ); 631 632 // get tab index 633 sal_Int16 nTabIndex = -1; 634 Any aCtrl = xNameAcc->getByName( aName ); 635 Reference< beans::XPropertySet > xPSet; 636 aCtrl >>= xPSet; 637 if ( xPSet.is() && xPSet == Reference< beans::XPropertySet >( evt.Source, UNO_QUERY ) ) 638 evt.OldValue >>= nTabIndex; 639 else if ( xPSet.is() ) 640 xPSet->getPropertyValue( DLGED_PROP_TABINDEX ) >>= nTabIndex; 641 642 // insert into map 643 aIndexToNameMap.insert( IndexToNameMap::value_type( nTabIndex, aName ) ); 644 } 645 646 // create a helper list of control names, sorted by tab index 647 ::std::vector< ::rtl::OUString > aNameList( aIndexToNameMap.size() ); 648 ::std::transform( 649 aIndexToNameMap.begin(), aIndexToNameMap.end(), 650 aNameList.begin(), 651 ::std::select2nd< IndexToNameMap::value_type >( ) 652 ); 653 654 // check tab index 655 sal_Int16 nOldTabIndex = 0; 656 evt.OldValue >>= nOldTabIndex; 657 sal_Int16 nNewTabIndex = 0; 658 evt.NewValue >>= nNewTabIndex; 659 if ( nNewTabIndex < 0 ) 660 nNewTabIndex = 0; 661 else if ( nNewTabIndex > nCtrls - 1 ) 662 nNewTabIndex = sal::static_int_cast<sal_Int16>( nCtrls - 1 ); 663 664 // reorder helper list 665 ::rtl::OUString aCtrlName = aNameList[nOldTabIndex]; 666 aNameList.erase( aNameList.begin() + nOldTabIndex ); 667 aNameList.insert( aNameList.begin() + nNewTabIndex , aCtrlName ); 668 669 // set new tab indices 670 for ( i = 0; i < nCtrls; ++i ) 671 { 672 Any aCtrl = xNameAcc->getByName( aNameList[i] ); 673 Reference< beans::XPropertySet > xPSet; 674 aCtrl >>= xPSet; 675 if ( xPSet.is() ) 676 { 677 Any aTabIndex; 678 aTabIndex <<= (sal_Int16) i; 679 xPSet->setPropertyValue( DLGED_PROP_TABINDEX, aTabIndex ); 680 } 681 } 682 683 // reorder objects in drawing page 684 GetModel()->GetPage(0)->SetObjectOrdNum( nOldTabIndex + 1, nNewTabIndex + 1 ); 685 686 // #110559# 687 pForm->UpdateTabOrderAndGroups(); 688 } 689 690 // start listening with all children 691 for ( aIter = aChildList.begin() ; aIter != aChildList.end() ; ++aIter ) 692 { 693 (*aIter)->StartListening(); 694 } 695 } 696 } 697 698 //---------------------------------------------------------------------------- 699 700 sal_Bool DlgEdObj::supportsService( const sal_Char* _pServiceName ) const 701 { 702 sal_Bool bSupports = sal_False; 703 704 Reference< lang::XServiceInfo > xServiceInfo( GetUnoControlModel() , UNO_QUERY ); 705 // TODO: cache xServiceInfo as member? 706 if ( xServiceInfo.is() ) 707 bSupports = xServiceInfo->supportsService( ::rtl::OUString::createFromAscii( _pServiceName ) ); 708 709 return bSupports; 710 } 711 712 //---------------------------------------------------------------------------- 713 714 ::rtl::OUString DlgEdObj::GetDefaultName() const 715 { 716 sal_uInt16 nResId = 0; 717 ::rtl::OUString aDefaultName; 718 if ( supportsService( "com.sun.star.awt.UnoControlDialogModel" ) ) 719 { 720 nResId = RID_STR_CLASS_DIALOG; 721 } 722 else if ( supportsService( "com.sun.star.awt.UnoControlButtonModel" ) ) 723 { 724 nResId = RID_STR_CLASS_BUTTON; 725 } 726 else if ( supportsService( "com.sun.star.awt.UnoControlRadioButtonModel" ) ) 727 { 728 nResId = RID_STR_CLASS_RADIOBUTTON; 729 } 730 else if ( supportsService( "com.sun.star.awt.UnoControlCheckBoxModel" ) ) 731 { 732 nResId = RID_STR_CLASS_CHECKBOX; 733 } 734 else if ( supportsService( "com.sun.star.awt.UnoControlListBoxModel" ) ) 735 { 736 nResId = RID_STR_CLASS_LISTBOX; 737 } 738 else if ( supportsService( "com.sun.star.awt.UnoControlComboBoxModel" ) ) 739 { 740 nResId = RID_STR_CLASS_COMBOBOX; 741 } 742 else if ( supportsService( "com.sun.star.awt.UnoControlGroupBoxModel" ) ) 743 { 744 nResId = RID_STR_CLASS_GROUPBOX; 745 } 746 else if ( supportsService( "com.sun.star.awt.UnoControlEditModel" ) ) 747 { 748 nResId = RID_STR_CLASS_EDIT; 749 } 750 else if ( supportsService( "com.sun.star.awt.UnoControlFixedTextModel" ) ) 751 { 752 nResId = RID_STR_CLASS_FIXEDTEXT; 753 } 754 else if ( supportsService( "com.sun.star.awt.UnoControlImageControlModel" ) ) 755 { 756 nResId = RID_STR_CLASS_IMAGECONTROL; 757 } 758 else if ( supportsService( "com.sun.star.awt.UnoControlProgressBarModel" ) ) 759 { 760 nResId = RID_STR_CLASS_PROGRESSBAR; 761 } 762 else if ( supportsService( "com.sun.star.awt.UnoControlScrollBarModel" ) ) 763 { 764 nResId = RID_STR_CLASS_SCROLLBAR; 765 } 766 else if ( supportsService( "com.sun.star.awt.UnoControlFixedLineModel" ) ) 767 { 768 nResId = RID_STR_CLASS_FIXEDLINE; 769 } 770 else if ( supportsService( "com.sun.star.awt.UnoControlDateFieldModel" ) ) 771 { 772 nResId = RID_STR_CLASS_DATEFIELD; 773 } 774 else if ( supportsService( "com.sun.star.awt.UnoControlTimeFieldModel" ) ) 775 { 776 nResId = RID_STR_CLASS_TIMEFIELD; 777 } 778 else if ( supportsService( "com.sun.star.awt.UnoControlNumericFieldModel" ) ) 779 { 780 nResId = RID_STR_CLASS_NUMERICFIELD; 781 } 782 else if ( supportsService( "com.sun.star.awt.UnoControlCurrencyFieldModel" ) ) 783 { 784 nResId = RID_STR_CLASS_CURRENCYFIELD; 785 } 786 else if ( supportsService( "com.sun.star.awt.UnoControlFormattedFieldModel" ) ) 787 { 788 nResId = RID_STR_CLASS_FORMATTEDFIELD; 789 } 790 else if ( supportsService( "com.sun.star.awt.UnoControlPatternFieldModel" ) ) 791 { 792 nResId = RID_STR_CLASS_PATTERNFIELD; 793 } 794 else if ( supportsService( "com.sun.star.awt.UnoControlFileControlModel" ) ) 795 { 796 nResId = RID_STR_CLASS_FILECONTROL; 797 } 798 else if ( supportsService( "com.sun.star.awt.tree.TreeControlModel" ) ) 799 { 800 nResId = RID_STR_CLASS_TREECONTROL; 801 } 802 803 else 804 { 805 nResId = RID_STR_CLASS_CONTROL; 806 } 807 808 if (nResId) 809 { 810 aDefaultName = ::rtl::OUString( String(IDEResId(nResId)) ); 811 } 812 813 return aDefaultName; 814 } 815 816 //---------------------------------------------------------------------------- 817 818 ::rtl::OUString DlgEdObj::GetUniqueName() const 819 { 820 ::rtl::OUString aUniqueName; 821 uno::Reference< container::XNameAccess > xNameAcc((GetDlgEdForm()->GetUnoControlModel()), uno::UNO_QUERY); 822 823 if ( xNameAcc.is() ) 824 { 825 sal_Int32 n = 0; 826 ::rtl::OUString aDefaultName = GetDefaultName(); 827 828 do 829 { 830 aUniqueName = aDefaultName + ::rtl::OUString::valueOf(++n); 831 } while (xNameAcc->hasByName(aUniqueName)); 832 } 833 834 return aUniqueName; 835 } 836 837 //---------------------------------------------------------------------------- 838 839 sal_uInt32 DlgEdObj::GetObjInventor() const 840 { 841 return DlgInventor; 842 } 843 844 //---------------------------------------------------------------------------- 845 846 sal_uInt16 DlgEdObj::GetObjIdentifier() const 847 { 848 if ( supportsService( "com.sun.star.awt.UnoControlDialogModel" )) 849 { 850 return OBJ_DLG_DIALOG; 851 } 852 else if ( supportsService( "com.sun.star.awt.UnoControlButtonModel" )) 853 { 854 return OBJ_DLG_PUSHBUTTON; 855 } 856 else if ( supportsService( "com.sun.star.awt.UnoControlRadioButtonModel" )) 857 { 858 return OBJ_DLG_RADIOBUTTON; 859 } 860 else if ( supportsService( "com.sun.star.awt.UnoControlCheckBoxModel" )) 861 { 862 return OBJ_DLG_CHECKBOX; 863 } 864 else if ( supportsService( "com.sun.star.awt.UnoControlListBoxModel" )) 865 { 866 return OBJ_DLG_LISTBOX; 867 } 868 else if ( supportsService( "com.sun.star.awt.UnoControlComboBoxModel" )) 869 { 870 return OBJ_DLG_COMBOBOX; 871 } 872 else if ( supportsService( "com.sun.star.awt.UnoControlGroupBoxModel" )) 873 { 874 return OBJ_DLG_GROUPBOX; 875 } 876 else if ( supportsService( "com.sun.star.awt.UnoControlEditModel" )) 877 { 878 return OBJ_DLG_EDIT; 879 } 880 else if ( supportsService( "com.sun.star.awt.UnoControlFixedTextModel" )) 881 { 882 return OBJ_DLG_FIXEDTEXT; 883 } 884 else if ( supportsService( "com.sun.star.awt.UnoControlImageControlModel" )) 885 { 886 return OBJ_DLG_IMAGECONTROL; 887 } 888 else if ( supportsService( "com.sun.star.awt.UnoControlProgressBarModel" )) 889 { 890 return OBJ_DLG_PROGRESSBAR; 891 } 892 else if ( supportsService( "com.sun.star.awt.UnoControlScrollBarModel" )) 893 { 894 return OBJ_DLG_HSCROLLBAR; 895 } 896 else if ( supportsService( "com.sun.star.awt.UnoControlFixedLineModel" )) 897 { 898 return OBJ_DLG_HFIXEDLINE; 899 } 900 else if ( supportsService( "com.sun.star.awt.UnoControlDateFieldModel" )) 901 { 902 return OBJ_DLG_DATEFIELD; 903 } 904 else if ( supportsService( "com.sun.star.awt.UnoControlTimeFieldModel" )) 905 { 906 return OBJ_DLG_TIMEFIELD; 907 } 908 else if ( supportsService( "com.sun.star.awt.UnoControlNumericFieldModel" )) 909 { 910 return OBJ_DLG_NUMERICFIELD; 911 } 912 else if ( supportsService( "com.sun.star.awt.UnoControlCurrencyFieldModel" )) 913 { 914 return OBJ_DLG_CURRENCYFIELD; 915 } 916 else if ( supportsService( "com.sun.star.awt.UnoControlFormattedFieldModel" )) 917 { 918 return OBJ_DLG_FORMATTEDFIELD; 919 } 920 else if ( supportsService( "com.sun.star.awt.UnoControlPatternFieldModel" )) 921 { 922 return OBJ_DLG_PATTERNFIELD; 923 } 924 else if ( supportsService( "com.sun.star.awt.UnoControlFileControlModel" )) 925 { 926 return OBJ_DLG_FILECONTROL; 927 } 928 else if ( supportsService( "com.sun.star.awt.tree.TreeControlModel" )) 929 { 930 return OBJ_DLG_TREECONTROL; 931 } 932 else 933 { 934 return OBJ_DLG_CONTROL; 935 } 936 } 937 938 //---------------------------------------------------------------------------- 939 940 void DlgEdObj::clonedFrom(const DlgEdObj* _pSource) 941 { 942 // set parent form 943 pDlgEdForm = _pSource->pDlgEdForm; 944 945 // add child to parent form 946 pDlgEdForm->AddChild( this ); 947 948 Reference< beans::XPropertySet > xPSet( GetUnoControlModel(), UNO_QUERY ); 949 if ( xPSet.is() ) 950 { 951 // set new name 952 ::rtl::OUString aOUniqueName( GetUniqueName() ); 953 Any aUniqueName; 954 aUniqueName <<= aOUniqueName; 955 xPSet->setPropertyValue( DLGED_PROP_NAME, aUniqueName ); 956 957 Reference< container::XNameContainer > xCont( GetDlgEdForm()->GetUnoControlModel() , UNO_QUERY ); 958 if ( xCont.is() ) 959 { 960 // set tabindex 961 Sequence< OUString > aNames = xCont->getElementNames(); 962 Any aTabIndex; 963 aTabIndex <<= (sal_Int16) aNames.getLength(); 964 xPSet->setPropertyValue( DLGED_PROP_TABINDEX, aTabIndex ); 965 966 // insert control model in dialog model 967 Reference< awt::XControlModel > xCtrl( xPSet , UNO_QUERY ); 968 Any aCtrl; 969 aCtrl <<= xCtrl; 970 xCont->insertByName( aOUniqueName , aCtrl ); 971 972 // #110559# 973 pDlgEdForm->UpdateTabOrderAndGroups(); 974 } 975 } 976 977 // start listening 978 StartListening(); 979 } 980 981 //---------------------------------------------------------------------------- 982 983 SdrObject* DlgEdObj::Clone() const 984 { 985 SdrObject* pReturn = SdrUnoObj::Clone(); 986 987 DlgEdObj* pDlgEdObj = PTR_CAST(DlgEdObj, pReturn); 988 DBG_ASSERT( pDlgEdObj != NULL, "DlgEdObj::Clone: invalid clone!" ); 989 if ( pDlgEdObj ) 990 pDlgEdObj->clonedFrom( this ); 991 992 return pReturn; 993 } 994 995 //---------------------------------------------------------------------------- 996 997 SdrObject* DlgEdObj::getFullDragClone() const 998 { 999 // no need to really add the clone for dragging, it's a temporary 1000 // object 1001 SdrObject* pObj = new SdrUnoObj(String()); 1002 *pObj = *((const SdrUnoObj*)this); 1003 1004 return pObj; 1005 } 1006 1007 //---------------------------------------------------------------------------- 1008 1009 void DlgEdObj::operator= (const SdrObject& rObj) 1010 { 1011 SdrUnoObj::operator= (rObj); 1012 } 1013 1014 //---------------------------------------------------------------------------- 1015 1016 void DlgEdObj::NbcMove( const Size& rSize ) 1017 { 1018 SdrUnoObj::NbcMove( rSize ); 1019 1020 // stop listening 1021 EndListening(sal_False); 1022 1023 // set geometry properties 1024 SetPropsFromRect(); 1025 1026 // start listening 1027 StartListening(); 1028 1029 // dialog model changed 1030 GetDlgEdForm()->GetDlgEditor()->SetDialogModelChanged(sal_True); 1031 } 1032 1033 //---------------------------------------------------------------------------- 1034 1035 void DlgEdObj::NbcResize(const Point& rRef, const Fraction& xFract, const Fraction& yFract) 1036 { 1037 SdrUnoObj::NbcResize( rRef, xFract, yFract ); 1038 1039 // stop listening 1040 EndListening(sal_False); 1041 1042 // set geometry properties 1043 SetPropsFromRect(); 1044 1045 // start listening 1046 StartListening(); 1047 1048 // dialog model changed 1049 GetDlgEdForm()->GetDlgEditor()->SetDialogModelChanged(sal_True); 1050 } 1051 1052 //---------------------------------------------------------------------------- 1053 1054 FASTBOOL DlgEdObj::EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd) 1055 { 1056 FASTBOOL bResult = SdrUnoObj::EndCreate(rStat, eCmd); 1057 1058 SetDefaults(); 1059 StartListening(); 1060 1061 return bResult; 1062 } 1063 1064 //---------------------------------------------------------------------------- 1065 1066 void DlgEdObj::SetDefaults() 1067 { 1068 // set parent form 1069 pDlgEdForm = ((DlgEdPage*)GetPage())->GetDlgEdForm(); 1070 1071 if ( pDlgEdForm ) 1072 { 1073 // add child to parent form 1074 pDlgEdForm->AddChild( this ); 1075 1076 Reference< beans::XPropertySet > xPSet( GetUnoControlModel(), UNO_QUERY ); 1077 if ( xPSet.is() ) 1078 { 1079 // get unique name 1080 ::rtl::OUString aOUniqueName( GetUniqueName() ); 1081 1082 // set name property 1083 Any aUniqueName; 1084 aUniqueName <<= aOUniqueName; 1085 xPSet->setPropertyValue( DLGED_PROP_NAME, aUniqueName ); 1086 1087 // set labels 1088 if ( supportsService( "com.sun.star.awt.UnoControlButtonModel" ) || 1089 supportsService( "com.sun.star.awt.UnoControlRadioButtonModel" ) || 1090 supportsService( "com.sun.star.awt.UnoControlCheckBoxModel" ) || 1091 supportsService( "com.sun.star.awt.UnoControlGroupBoxModel" ) || 1092 supportsService( "com.sun.star.awt.UnoControlFixedTextModel" ) ) 1093 { 1094 xPSet->setPropertyValue( DLGED_PROP_LABEL, aUniqueName ); 1095 } 1096 1097 // set number formats supplier for formatted field 1098 if ( supportsService( "com.sun.star.awt.UnoControlFormattedFieldModel" ) ) 1099 { 1100 Reference< util::XNumberFormatsSupplier > xSupplier = GetDlgEdForm()->GetDlgEditor()->GetNumberFormatsSupplier(); 1101 if ( xSupplier.is() ) 1102 { 1103 Any aSupplier; 1104 aSupplier <<= xSupplier; 1105 xPSet->setPropertyValue( DLGED_PROP_FORMATSSUPPLIER, aSupplier ); 1106 } 1107 } 1108 1109 // set geometry properties 1110 SetPropsFromRect(); 1111 1112 Reference< container::XNameContainer > xCont( GetDlgEdForm()->GetUnoControlModel() , UNO_QUERY ); 1113 if ( xCont.is() ) 1114 { 1115 // set tabindex 1116 Sequence< OUString > aNames = xCont->getElementNames(); 1117 uno::Any aTabIndex; 1118 aTabIndex <<= (sal_Int16) aNames.getLength(); 1119 xPSet->setPropertyValue( DLGED_PROP_TABINDEX, aTabIndex ); 1120 1121 // set step 1122 Reference< beans::XPropertySet > xPSetForm( xCont, UNO_QUERY ); 1123 if ( xPSetForm.is() ) 1124 { 1125 Any aStep = xPSetForm->getPropertyValue( DLGED_PROP_STEP ); 1126 xPSet->setPropertyValue( DLGED_PROP_STEP, aStep ); 1127 } 1128 1129 // insert control model in dialog model 1130 Reference< awt::XControlModel > xCtrl( xPSet , UNO_QUERY ); 1131 Any aAny; 1132 aAny <<= xCtrl; 1133 xCont->insertByName( aOUniqueName , aAny ); 1134 1135 DlgEditor* pEditor; 1136 if ( ISA(DlgEdForm) ) 1137 pEditor = ((DlgEdForm*)this)->GetDlgEditor(); 1138 else 1139 pEditor = GetDlgEdForm()->GetDlgEditor(); 1140 LocalizationMgr::setControlResourceIDsForNewEditorObject( pEditor, aAny, aOUniqueName ); 1141 1142 // #110559# 1143 pDlgEdForm->UpdateTabOrderAndGroups(); 1144 } 1145 } 1146 1147 // dialog model changed 1148 pDlgEdForm->GetDlgEditor()->SetDialogModelChanged( sal_True ); 1149 } 1150 } 1151 1152 //---------------------------------------------------------------------------- 1153 1154 IMPL_LINK(DlgEdObj, OnCreate, void*, EMPTYTAG) 1155 { 1156 (void)EMPTYTAG; 1157 /* 1158 if (pTempView) 1159 pTempView->ObjectCreated(this); 1160 */ 1161 return 0; 1162 } 1163 1164 //---------------------------------------------------------------------------- 1165 1166 void DlgEdObj::StartListening() 1167 { 1168 DBG_ASSERT(!isListening(), "DlgEdObj::StartListening: already listening!"); 1169 1170 if (!isListening()) 1171 { 1172 bIsListening = sal_True; 1173 1174 // XPropertyChangeListener 1175 Reference< XPropertySet > xControlModel( GetUnoControlModel() , UNO_QUERY ); 1176 if (!m_xPropertyChangeListener.is() && xControlModel.is()) 1177 { 1178 // create listener 1179 m_xPropertyChangeListener = static_cast< ::com::sun::star::beans::XPropertyChangeListener*>( new DlgEdPropListenerImpl( (DlgEdObj*)this ) ); 1180 1181 // register listener to properties 1182 xControlModel->addPropertyChangeListener( ::rtl::OUString() , m_xPropertyChangeListener ); 1183 } 1184 1185 // XContainerListener 1186 Reference< XScriptEventsSupplier > xEventsSupplier( GetUnoControlModel() , UNO_QUERY ); 1187 if( !m_xContainerListener.is() && xEventsSupplier.is() ) 1188 { 1189 // create listener 1190 m_xContainerListener = static_cast< ::com::sun::star::container::XContainerListener*>( new DlgEdEvtContListenerImpl( (DlgEdObj*)this ) ); 1191 1192 // register listener to script event container 1193 Reference< XNameContainer > xEventCont = xEventsSupplier->getEvents(); 1194 DBG_ASSERT(xEventCont.is(), "DlgEdObj::StartListening: control model has no script event container!"); 1195 Reference< XContainer > xCont( xEventCont , UNO_QUERY ); 1196 if (xCont.is()) 1197 xCont->addContainerListener( m_xContainerListener ); 1198 } 1199 } 1200 } 1201 1202 //---------------------------------------------------------------------------- 1203 1204 void DlgEdObj::EndListening(sal_Bool bRemoveListener) 1205 { 1206 DBG_ASSERT(isListening(), "DlgEdObj::EndListening: not listening currently!"); 1207 1208 if (isListening()) 1209 { 1210 bIsListening = sal_False; 1211 1212 if (bRemoveListener) 1213 { 1214 // XPropertyChangeListener 1215 Reference< XPropertySet > xControlModel(GetUnoControlModel(), UNO_QUERY); 1216 if ( m_xPropertyChangeListener.is() && xControlModel.is() ) 1217 { 1218 // remove listener 1219 xControlModel->removePropertyChangeListener( ::rtl::OUString() , m_xPropertyChangeListener ); 1220 } 1221 m_xPropertyChangeListener.clear(); 1222 1223 // XContainerListener 1224 Reference< XScriptEventsSupplier > xEventsSupplier( GetUnoControlModel() , UNO_QUERY ); 1225 if( m_xContainerListener.is() && xEventsSupplier.is() ) 1226 { 1227 // remove listener 1228 Reference< XNameContainer > xEventCont = xEventsSupplier->getEvents(); 1229 DBG_ASSERT(xEventCont.is(), "DlgEdObj::EndListening: control model has no script event container!"); 1230 Reference< XContainer > xCont( xEventCont , UNO_QUERY ); 1231 if (xCont.is()) 1232 xCont->removeContainerListener( m_xContainerListener ); 1233 } 1234 m_xContainerListener.clear(); 1235 } 1236 } 1237 } 1238 1239 //---------------------------------------------------------------------------- 1240 1241 void SAL_CALL DlgEdObj::_propertyChange( const ::com::sun::star::beans::PropertyChangeEvent& evt ) throw( ::com::sun::star::uno::RuntimeException) 1242 { 1243 if (isListening()) 1244 { 1245 DlgEdForm* pRealDlgEdForm = dynamic_cast< DlgEdForm* >(this); 1246 if( pRealDlgEdForm == 0 ) 1247 pRealDlgEdForm = GetDlgEdForm(); 1248 1249 DlgEditor* pDlgEditor = pRealDlgEdForm ? pRealDlgEdForm->GetDlgEditor() : 0; 1250 1251 if( !pDlgEditor || pDlgEditor->isInPaint() ) 1252 return; 1253 1254 // dialog model changed 1255 pDlgEditor->SetDialogModelChanged(sal_True); 1256 1257 // update position and size 1258 if ( evt.PropertyName == DLGED_PROP_POSITIONX || evt.PropertyName == DLGED_PROP_POSITIONY || 1259 evt.PropertyName == DLGED_PROP_WIDTH || evt.PropertyName == DLGED_PROP_HEIGHT || 1260 evt.PropertyName == DLGED_PROP_DECORATION ) 1261 { 1262 PositionAndSizeChange( evt ); 1263 1264 if ( evt.PropertyName == DLGED_PROP_DECORATION ) 1265 { 1266 if ( ISA(DlgEdForm) ) 1267 ((DlgEdForm*)this)->GetDlgEditor()->ResetDialog(); 1268 else 1269 GetDlgEdForm()->GetDlgEditor()->ResetDialog(); 1270 } 1271 } 1272 // change name of control in dialog model 1273 else if ( evt.PropertyName == DLGED_PROP_NAME ) 1274 { 1275 if ( !ISA(DlgEdForm) ) 1276 { 1277 NameChange(evt); 1278 } 1279 } 1280 // update step 1281 else if ( evt.PropertyName == DLGED_PROP_STEP ) 1282 { 1283 UpdateStep(); 1284 } 1285 // change tabindex 1286 else if ( evt.PropertyName == DLGED_PROP_TABINDEX ) 1287 { 1288 if ( !ISA(DlgEdForm) ) 1289 { 1290 TabIndexChange(evt); 1291 } 1292 } 1293 } 1294 } 1295 1296 //---------------------------------------------------------------------------- 1297 1298 void SAL_CALL DlgEdObj::_elementInserted(const ::com::sun::star::container::ContainerEvent& ) throw(::com::sun::star::uno::RuntimeException) 1299 { 1300 if (isListening()) 1301 { 1302 // dialog model changed 1303 if ( ISA(DlgEdForm) ) 1304 { 1305 ((DlgEdForm*)this)->GetDlgEditor()->SetDialogModelChanged(sal_True); 1306 } 1307 else 1308 { 1309 GetDlgEdForm()->GetDlgEditor()->SetDialogModelChanged(sal_True); 1310 } 1311 } 1312 } 1313 1314 //---------------------------------------------------------------------------- 1315 1316 void SAL_CALL DlgEdObj::_elementReplaced(const ::com::sun::star::container::ContainerEvent& ) throw(::com::sun::star::uno::RuntimeException) 1317 { 1318 if (isListening()) 1319 { 1320 // dialog model changed 1321 if ( ISA(DlgEdForm) ) 1322 { 1323 ((DlgEdForm*)this)->GetDlgEditor()->SetDialogModelChanged(sal_True); 1324 } 1325 else 1326 { 1327 GetDlgEdForm()->GetDlgEditor()->SetDialogModelChanged(sal_True); 1328 } 1329 } 1330 } 1331 1332 //---------------------------------------------------------------------------- 1333 1334 void SAL_CALL DlgEdObj::_elementRemoved(const ::com::sun::star::container::ContainerEvent& ) throw(::com::sun::star::uno::RuntimeException) 1335 { 1336 if (isListening()) 1337 { 1338 // dialog model changed 1339 if ( ISA(DlgEdForm) ) 1340 { 1341 ((DlgEdForm*)this)->GetDlgEditor()->SetDialogModelChanged(sal_True); 1342 } 1343 else 1344 { 1345 GetDlgEdForm()->GetDlgEditor()->SetDialogModelChanged(sal_True); 1346 } 1347 } 1348 } 1349 1350 //---------------------------------------------------------------------------- 1351 1352 void DlgEdObj::SetLayer(SdrLayerID nLayer) 1353 { 1354 SdrLayerID nOldLayer = GetLayer(); 1355 1356 if ( nLayer != nOldLayer ) 1357 { 1358 SdrUnoObj::SetLayer( nLayer ); 1359 1360 DlgEdHint aHint( DLGED_HINT_LAYERCHANGED, this ); 1361 GetDlgEdForm()->GetDlgEditor()->Broadcast( aHint ); 1362 } 1363 } 1364 1365 //---------------------------------------------------------------------------- 1366 1367 TYPEINIT1(DlgEdForm, DlgEdObj); 1368 DBG_NAME(DlgEdForm); 1369 1370 //---------------------------------------------------------------------------- 1371 1372 DlgEdForm::DlgEdForm() 1373 :DlgEdObj() 1374 { 1375 DBG_CTOR(DlgEdForm, NULL); 1376 } 1377 1378 //---------------------------------------------------------------------------- 1379 1380 DlgEdForm::~DlgEdForm() 1381 { 1382 DBG_DTOR(DlgEdForm, NULL); 1383 } 1384 1385 //---------------------------------------------------------------------------- 1386 1387 void DlgEdForm::SetDlgEditor( DlgEditor* pEditor ) 1388 { 1389 pDlgEditor = pEditor; 1390 ImplInvalidateDeviceInfo(); 1391 } 1392 1393 //---------------------------------------------------------------------------- 1394 1395 void DlgEdForm::ImplInvalidateDeviceInfo() 1396 { 1397 mpDeviceInfo.reset(); 1398 } 1399 1400 //---------------------------------------------------------------------------- 1401 1402 void DlgEdForm::SetRectFromProps() 1403 { 1404 // get form position and size from properties 1405 Reference< beans::XPropertySet > xPSet( GetUnoControlModel(), UNO_QUERY ); 1406 if ( xPSet.is() ) 1407 { 1408 sal_Int32 nXIn = 0, nYIn = 0, nWidthIn = 0, nHeightIn = 0; 1409 xPSet->getPropertyValue( DLGED_PROP_POSITIONX ) >>= nXIn; 1410 xPSet->getPropertyValue( DLGED_PROP_POSITIONY ) >>= nYIn; 1411 xPSet->getPropertyValue( DLGED_PROP_WIDTH ) >>= nWidthIn; 1412 xPSet->getPropertyValue( DLGED_PROP_HEIGHT ) >>= nHeightIn; 1413 1414 // transform coordinates 1415 sal_Int32 nXOut, nYOut, nWidthOut, nHeightOut; 1416 if ( TransformFormToSdrCoordinates( nXIn, nYIn, nWidthIn, nHeightIn, nXOut, nYOut, nWidthOut, nHeightOut ) ) 1417 { 1418 // set rectangle position and size 1419 Point aPoint( nXOut, nYOut ); 1420 Size aSize( nWidthOut, nHeightOut ); 1421 SetSnapRect( Rectangle( aPoint, aSize ) ); 1422 } 1423 } 1424 } 1425 1426 //---------------------------------------------------------------------------- 1427 1428 void DlgEdForm::SetPropsFromRect() 1429 { 1430 // get form position and size from rectangle 1431 Rectangle aRect_ = GetSnapRect(); 1432 sal_Int32 nXIn = aRect_.Left(); 1433 sal_Int32 nYIn = aRect_.Top(); 1434 sal_Int32 nWidthIn = aRect_.GetWidth(); 1435 sal_Int32 nHeightIn = aRect_.GetHeight(); 1436 1437 // transform coordinates 1438 sal_Int32 nXOut, nYOut, nWidthOut, nHeightOut; 1439 if ( TransformSdrToFormCoordinates( nXIn, nYIn, nWidthIn, nHeightIn, nXOut, nYOut, nWidthOut, nHeightOut ) ) 1440 { 1441 // set properties 1442 Reference< beans::XPropertySet > xPSet( GetUnoControlModel(), UNO_QUERY ); 1443 if ( xPSet.is() ) 1444 { 1445 Any aValue; 1446 aValue <<= nXOut; 1447 xPSet->setPropertyValue( DLGED_PROP_POSITIONX, aValue ); 1448 aValue <<= nYOut; 1449 xPSet->setPropertyValue( DLGED_PROP_POSITIONY, aValue ); 1450 aValue <<= nWidthOut; 1451 xPSet->setPropertyValue( DLGED_PROP_WIDTH, aValue ); 1452 aValue <<= nHeightOut; 1453 xPSet->setPropertyValue( DLGED_PROP_HEIGHT, aValue ); 1454 } 1455 } 1456 } 1457 1458 //---------------------------------------------------------------------------- 1459 1460 void DlgEdForm::AddChild( DlgEdObj* pDlgEdObj ) 1461 { 1462 pChilds.push_back( pDlgEdObj ); 1463 } 1464 1465 //---------------------------------------------------------------------------- 1466 1467 void DlgEdForm::RemoveChild( DlgEdObj* pDlgEdObj ) 1468 { 1469 pChilds.erase( ::std::find( pChilds.begin() , pChilds.end() , pDlgEdObj ) ); 1470 } 1471 1472 //---------------------------------------------------------------------------- 1473 1474 void DlgEdForm::PositionAndSizeChange( const beans::PropertyChangeEvent& evt ) 1475 { 1476 DlgEditor* pEditor = GetDlgEditor(); 1477 DBG_ASSERT( pEditor, "DlgEdForm::PositionAndSizeChange: no dialog editor!" ); 1478 if ( pEditor ) 1479 { 1480 DlgEdPage* pPage_ = pEditor->GetPage(); 1481 DBG_ASSERT( pPage_, "DlgEdForm::PositionAndSizeChange: no page!" ); 1482 if ( pPage_ ) 1483 { 1484 sal_Int32 nPageXIn = 0; 1485 sal_Int32 nPageYIn = 0; 1486 Size aPageSize = pPage_->GetSize(); 1487 sal_Int32 nPageWidthIn = aPageSize.Width(); 1488 sal_Int32 nPageHeightIn = aPageSize.Height(); 1489 sal_Int32 nPageX, nPageY, nPageWidth, nPageHeight; 1490 if ( TransformSdrToFormCoordinates( nPageXIn, nPageYIn, nPageWidthIn, nPageHeightIn, nPageX, nPageY, nPageWidth, nPageHeight ) ) 1491 { 1492 Reference< beans::XPropertySet > xPSetForm( GetUnoControlModel(), UNO_QUERY ); 1493 if ( xPSetForm.is() ) 1494 { 1495 sal_Int32 nValue = 0; 1496 evt.NewValue >>= nValue; 1497 sal_Int32 nNewValue = nValue; 1498 1499 if ( evt.PropertyName == DLGED_PROP_POSITIONX ) 1500 { 1501 if ( nNewValue < nPageX ) 1502 nNewValue = nPageX; 1503 } 1504 else if ( evt.PropertyName == DLGED_PROP_POSITIONY ) 1505 { 1506 if ( nNewValue < nPageY ) 1507 nNewValue = nPageY; 1508 } 1509 else if ( evt.PropertyName == DLGED_PROP_WIDTH ) 1510 { 1511 if ( nNewValue < 1 ) 1512 nNewValue = 1; 1513 } 1514 else if ( evt.PropertyName == DLGED_PROP_HEIGHT ) 1515 { 1516 if ( nNewValue < 1 ) 1517 nNewValue = 1; 1518 } 1519 1520 if ( nNewValue != nValue ) 1521 { 1522 Any aNewValue; 1523 aNewValue <<= nNewValue; 1524 EndListening( sal_False ); 1525 xPSetForm->setPropertyValue( evt.PropertyName, aNewValue ); 1526 StartListening(); 1527 } 1528 } 1529 } 1530 1531 bool bAdjustedPageSize = pEditor->AdjustPageSize(); 1532 SetRectFromProps(); 1533 ::std::vector< DlgEdObj* >::iterator aIter; 1534 ::std::vector< DlgEdObj* > aChildList = ((DlgEdForm*)this)->GetChilds(); 1535 1536 if ( bAdjustedPageSize ) 1537 { 1538 pEditor->InitScrollBars(); 1539 aPageSize = pPage_->GetSize(); 1540 nPageWidthIn = aPageSize.Width(); 1541 nPageHeightIn = aPageSize.Height(); 1542 if ( TransformSdrToControlCoordinates( nPageXIn, nPageYIn, nPageWidthIn, nPageHeightIn, nPageX, nPageY, nPageWidth, nPageHeight ) ) 1543 { 1544 for ( aIter = aChildList.begin(); aIter != aChildList.end(); aIter++ ) 1545 { 1546 Reference< beans::XPropertySet > xPSet( (*aIter)->GetUnoControlModel(), UNO_QUERY ); 1547 if ( xPSet.is() ) 1548 { 1549 sal_Int32 nX = 0, nY = 0, nWidth = 0, nHeight = 0; 1550 xPSet->getPropertyValue( DLGED_PROP_POSITIONX ) >>= nX; 1551 xPSet->getPropertyValue( DLGED_PROP_POSITIONY ) >>= nY; 1552 xPSet->getPropertyValue( DLGED_PROP_WIDTH ) >>= nWidth; 1553 xPSet->getPropertyValue( DLGED_PROP_HEIGHT ) >>= nHeight; 1554 1555 sal_Int32 nNewX = nX; 1556 if ( nX + nWidth > nPageX + nPageWidth ) 1557 { 1558 nNewX = nPageX + nPageWidth - nWidth; 1559 if ( nNewX < nPageX ) 1560 nNewX = nPageX; 1561 } 1562 if ( nNewX != nX ) 1563 { 1564 Any aValue; 1565 aValue <<= nNewX; 1566 EndListening( sal_False ); 1567 xPSet->setPropertyValue( DLGED_PROP_POSITIONX, aValue ); 1568 StartListening(); 1569 } 1570 1571 sal_Int32 nNewY = nY; 1572 if ( nY + nHeight > nPageY + nPageHeight ) 1573 { 1574 nNewY = nPageY + nPageHeight - nHeight; 1575 if ( nNewY < nPageY ) 1576 nNewY = nPageY; 1577 } 1578 if ( nNewY != nY ) 1579 { 1580 Any aValue; 1581 aValue <<= nNewY; 1582 EndListening( sal_False ); 1583 xPSet->setPropertyValue( DLGED_PROP_POSITIONY, aValue ); 1584 StartListening(); 1585 } 1586 } 1587 } 1588 } 1589 } 1590 1591 for ( aIter = aChildList.begin(); aIter != aChildList.end(); aIter++ ) 1592 { 1593 (*aIter)->SetRectFromProps(); 1594 } 1595 } 1596 } 1597 } 1598 1599 //---------------------------------------------------------------------------- 1600 1601 void DlgEdForm::UpdateStep() 1602 { 1603 sal_uLong nObjCount; 1604 SdrPage* pSdrPage = GetPage(); 1605 1606 if ( pSdrPage && ( ( nObjCount = pSdrPage->GetObjCount() ) > 0 ) ) 1607 { 1608 for ( sal_uLong i = 0 ; i < nObjCount ; i++ ) 1609 { 1610 SdrObject* pObj = pSdrPage->GetObj(i); 1611 DlgEdObj* pDlgEdObj = PTR_CAST(DlgEdObj, pObj); 1612 if ( pDlgEdObj && !pDlgEdObj->ISA(DlgEdForm) ) 1613 pDlgEdObj->UpdateStep(); 1614 } 1615 } 1616 } 1617 1618 //---------------------------------------------------------------------------- 1619 1620 void DlgEdForm::UpdateTabIndices() 1621 { 1622 // stop listening with all children 1623 ::std::vector<DlgEdObj*>::iterator aIter; 1624 for ( aIter = pChilds.begin() ; aIter != pChilds.end() ; ++aIter ) 1625 { 1626 (*aIter)->EndListening( sal_False ); 1627 } 1628 1629 Reference< ::com::sun::star::container::XNameAccess > xNameAcc( GetUnoControlModel() , UNO_QUERY ); 1630 if ( xNameAcc.is() ) 1631 { 1632 // get sequence of control names 1633 Sequence< ::rtl::OUString > aNames = xNameAcc->getElementNames(); 1634 const ::rtl::OUString* pNames = aNames.getConstArray(); 1635 sal_Int32 nCtrls = aNames.getLength(); 1636 1637 // create a map of tab indices and control names, sorted by tab index 1638 IndexToNameMap aIndexToNameMap; 1639 for ( sal_Int16 i = 0; i < nCtrls; ++i ) 1640 { 1641 // get name 1642 ::rtl::OUString aName( pNames[i] ); 1643 1644 // get tab index 1645 sal_Int16 nTabIndex = -1; 1646 Any aCtrl = xNameAcc->getByName( aName ); 1647 Reference< ::com::sun::star::beans::XPropertySet > xPSet; 1648 aCtrl >>= xPSet; 1649 if ( xPSet.is() ) 1650 xPSet->getPropertyValue( DLGED_PROP_TABINDEX ) >>= nTabIndex; 1651 1652 // insert into map 1653 aIndexToNameMap.insert( IndexToNameMap::value_type( nTabIndex, aName ) ); 1654 } 1655 1656 // set new tab indices 1657 sal_Int16 nNewTabIndex = 0; 1658 for ( IndexToNameMap::iterator aIt = aIndexToNameMap.begin(); aIt != aIndexToNameMap.end(); ++aIt ) 1659 { 1660 Any aCtrl = xNameAcc->getByName( aIt->second ); 1661 Reference< beans::XPropertySet > xPSet; 1662 aCtrl >>= xPSet; 1663 if ( xPSet.is() ) 1664 { 1665 Any aTabIndex; 1666 aTabIndex <<= (sal_Int16) nNewTabIndex++; 1667 xPSet->setPropertyValue( DLGED_PROP_TABINDEX, aTabIndex ); 1668 } 1669 } 1670 1671 // #110559# 1672 UpdateTabOrderAndGroups(); 1673 } 1674 1675 // start listening with all children 1676 for ( aIter = pChilds.begin() ; aIter != pChilds.end() ; ++aIter ) 1677 { 1678 (*aIter)->StartListening(); 1679 } 1680 } 1681 1682 //---------------------------------------------------------------------------- 1683 1684 void DlgEdForm::UpdateTabOrder() 1685 { 1686 // #110559# 1687 // When the tabindex of a control model changes, the dialog control is 1688 // notified about those changes. Due to #109067# (bad performance of 1689 // dialog editor) the dialog control doesn't activate the tab order 1690 // in design mode. When the dialog editor has reordered all 1691 // tabindices, this method allows to activate the taborder afterwards. 1692 1693 Reference< awt::XUnoControlContainer > xCont( GetControl(), UNO_QUERY ); 1694 if ( xCont.is() ) 1695 { 1696 Sequence< Reference< awt::XTabController > > aSeqTabCtrls = xCont->getTabControllers(); 1697 const Reference< awt::XTabController >* pTabCtrls = aSeqTabCtrls.getConstArray(); 1698 sal_Int32 nCount = aSeqTabCtrls.getLength(); 1699 for ( sal_Int32 i = 0; i < nCount; ++i ) 1700 pTabCtrls[i]->activateTabOrder(); 1701 } 1702 } 1703 1704 //---------------------------------------------------------------------------- 1705 1706 void DlgEdForm::UpdateGroups() 1707 { 1708 // #110559# 1709 // The grouping of radio buttons in a dialog is done by vcl. 1710 // In the dialog editor we have two views (=controls) for one 1711 // radio button model. One control is owned by the dialog control, 1712 // but not visible in design mode. The other control is owned by 1713 // the drawing layer object. Whereas the grouping of the first 1714 // control is done by vcl, the grouping of the control in the 1715 // drawing layer has to be done here. 1716 1717 Reference< awt::XTabControllerModel > xTabModel( GetUnoControlModel() , UNO_QUERY ); 1718 if ( xTabModel.is() ) 1719 { 1720 // create a global list of controls that belong to the dialog 1721 ::std::vector<DlgEdObj*> aChildList = GetChilds(); 1722 sal_uInt32 nSize = aChildList.size(); 1723 Sequence< Reference< awt::XControl > > aSeqControls( nSize ); 1724 for ( sal_uInt32 i = 0; i < nSize; ++i ) 1725 aSeqControls.getArray()[i] = Reference< awt::XControl >( aChildList[i]->GetControl(), UNO_QUERY ); 1726 1727 sal_Int32 nGroupCount = xTabModel->getGroupCount(); 1728 for ( sal_Int32 nGroup = 0; nGroup < nGroupCount; ++nGroup ) 1729 { 1730 // get a list of control models that belong to this group 1731 ::rtl::OUString aName; 1732 Sequence< Reference< awt::XControlModel > > aSeqModels; 1733 xTabModel->getGroup( nGroup, aSeqModels, aName ); 1734 const Reference< awt::XControlModel >* pModels = aSeqModels.getConstArray(); 1735 sal_Int32 nModelCount = aSeqModels.getLength(); 1736 1737 // create a list of peers that belong to this group 1738 Sequence< Reference< awt::XWindow > > aSeqPeers( nModelCount ); 1739 for ( sal_Int32 nModel = 0; nModel < nModelCount; ++nModel ) 1740 { 1741 // for each control model find the corresponding control in the global list 1742 const Reference< awt::XControl >* pControls = aSeqControls.getConstArray(); 1743 sal_Int32 nControlCount = aSeqControls.getLength(); 1744 for ( sal_Int32 nControl = 0; nControl < nControlCount; ++nControl ) 1745 { 1746 const Reference< awt::XControl > xCtrl( pControls[nControl] ); 1747 if ( xCtrl.is() ) 1748 { 1749 Reference< awt::XControlModel > xCtrlModel( xCtrl->getModel() ); 1750 if ( (awt::XControlModel*)xCtrlModel.get() == (awt::XControlModel*)pModels[nModel].get() ) 1751 { 1752 // get the control peer and insert into the list of peers 1753 aSeqPeers.getArray()[ nModel ] = Reference< awt::XWindow >( xCtrl->getPeer(), UNO_QUERY ); 1754 break; 1755 } 1756 } 1757 } 1758 } 1759 1760 // set the group at the dialog peer 1761 Reference< awt::XControl > xDlg( GetControl(), UNO_QUERY ); 1762 if ( xDlg.is() ) 1763 { 1764 Reference< awt::XVclContainerPeer > xDlgPeer( xDlg->getPeer(), UNO_QUERY ); 1765 if ( xDlgPeer.is() ) 1766 xDlgPeer->setGroup( aSeqPeers ); 1767 } 1768 } 1769 } 1770 } 1771 1772 //---------------------------------------------------------------------------- 1773 1774 void DlgEdForm::UpdateTabOrderAndGroups() 1775 { 1776 UpdateTabOrder(); 1777 UpdateGroups(); 1778 } 1779 1780 //---------------------------------------------------------------------------- 1781 1782 void DlgEdForm::NbcMove( const Size& rSize ) 1783 { 1784 SdrUnoObj::NbcMove( rSize ); 1785 1786 // set geometry properties of form 1787 EndListening(sal_False); 1788 SetPropsFromRect(); 1789 StartListening(); 1790 1791 // set geometry properties of all childs 1792 ::std::vector<DlgEdObj*>::iterator aIter; 1793 for ( aIter = pChilds.begin() ; aIter != pChilds.end() ; aIter++ ) 1794 { 1795 (*aIter)->EndListening(sal_False); 1796 (*aIter)->SetPropsFromRect(); 1797 (*aIter)->StartListening(); 1798 } 1799 1800 // dialog model changed 1801 GetDlgEditor()->SetDialogModelChanged(sal_True); 1802 } 1803 1804 //---------------------------------------------------------------------------- 1805 1806 void DlgEdForm::NbcResize(const Point& rRef, const Fraction& xFract, const Fraction& yFract) 1807 { 1808 SdrUnoObj::NbcResize( rRef, xFract, yFract ); 1809 1810 // set geometry properties of form 1811 EndListening(sal_False); 1812 SetPropsFromRect(); 1813 StartListening(); 1814 1815 // set geometry properties of all childs 1816 ::std::vector<DlgEdObj*>::iterator aIter; 1817 for ( aIter = pChilds.begin() ; aIter != pChilds.end() ; aIter++ ) 1818 { 1819 (*aIter)->EndListening(sal_False); 1820 (*aIter)->SetPropsFromRect(); 1821 (*aIter)->StartListening(); 1822 } 1823 1824 // dialog model changed 1825 GetDlgEditor()->SetDialogModelChanged(sal_True); 1826 } 1827 1828 //---------------------------------------------------------------------------- 1829 1830 FASTBOOL DlgEdForm::EndCreate(SdrDragStat& rStat, SdrCreateCmd eCmd) 1831 { 1832 FASTBOOL bResult = SdrUnoObj::EndCreate(rStat, eCmd); 1833 1834 // stop listening 1835 EndListening(sal_False); 1836 1837 // set geometry properties 1838 SetPropsFromRect(); 1839 1840 // dialog model changed 1841 GetDlgEditor()->SetDialogModelChanged(sal_True); 1842 1843 // start listening 1844 StartListening(); 1845 1846 return bResult; 1847 } 1848 1849 //---------------------------------------------------------------------------- 1850 1851 awt::DeviceInfo DlgEdForm::getDeviceInfo() const 1852 { 1853 awt::DeviceInfo aDeviceInfo; 1854 1855 DlgEditor* pEditor = GetDlgEditor(); 1856 DBG_ASSERT( pEditor, "DlgEdForm::getDeviceInfo: no editor associated with the form object!" ); 1857 if ( !pEditor ) 1858 return aDeviceInfo; 1859 1860 Window* pWindow = pEditor->GetWindow(); 1861 DBG_ASSERT( pWindow, "DlgEdForm::getDeviceInfo: no window associated with the editor!" ); 1862 if ( !pWindow ) 1863 return aDeviceInfo; 1864 1865 // obtain an XControl 1866 ::utl::SharedUNOComponent< awt::XControl > xDialogControl; // ensures auto-disposal, if needed 1867 xDialogControl.reset( GetControl(), ::utl::SharedUNOComponent< awt::XControl >::NoTakeOwnership ); 1868 if ( !xDialogControl.is() ) 1869 { 1870 // don't create a temporary control all the time, this method here is called 1871 // way too often. Instead, use a cached DeviceInfo. 1872 // 2007-02-05 / i74065 / frank.schoenheit@sun.com 1873 if ( !!mpDeviceInfo ) 1874 return *mpDeviceInfo; 1875 1876 Reference< awt::XControlContainer > xEditorControlContainer( pEditor->GetWindowControlContainer() ); 1877 xDialogControl.reset( 1878 GetTemporaryControlForWindow( *pWindow, xEditorControlContainer ), 1879 ::utl::SharedUNOComponent< awt::XControl >::TakeOwnership ); 1880 } 1881 1882 Reference< awt::XDevice > xDialogDevice; 1883 if ( xDialogControl.is() ) 1884 xDialogDevice.set( xDialogControl->getPeer(), UNO_QUERY ); 1885 DBG_ASSERT( xDialogDevice.is(), "DlgEdForm::getDeviceInfo: no device!" ); 1886 if ( xDialogDevice.is() ) 1887 aDeviceInfo = xDialogDevice->getInfo(); 1888 1889 mpDeviceInfo.reset( aDeviceInfo ); 1890 1891 return aDeviceInfo; 1892 } 1893 1894 //---------------------------------------------------------------------------- 1895 1896 1897