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_svx.hxx" 30 #include <sfx2/docfile.hxx> 31 #ifdef REFERENCE 32 #undef REFERENCE 33 #endif 34 #include <svtools/ehdl.hxx> 35 #include <unotools/moduleoptions.hxx> 36 #include <com/sun/star/sdb/SQLContext.hpp> 37 #include <com/sun/star/uno/XNamingService.hpp> 38 #include <com/sun/star/sdbc/XConnection.hpp> 39 #include <com/sun/star/sdbc/DataType.hpp> 40 #include <com/sun/star/form/XLoadable.hpp> 41 #include <com/sun/star/form/XReset.hpp> 42 #include "fmvwimp.hxx" 43 #include <sfx2/objsh.hxx> 44 #include <sfx2/viewsh.hxx> 45 #include <sfx2/viewfrm.hxx> 46 #include <sfx2/bindings.hxx> 47 #include <sfx2/dispatch.hxx> 48 #include <basic/sbuno.hxx> 49 #include <basic/sbx.hxx> 50 #include "fmitems.hxx" 51 #include "fmobj.hxx" 52 #include "svx/svditer.hxx" 53 #include <svx/svdpagv.hxx> 54 #include <svx/svdogrp.hxx> 55 #include <svx/fmview.hxx> 56 #include <svx/fmmodel.hxx> 57 #include <svx/fmpage.hxx> 58 #include <svx/fmshell.hxx> 59 #include "fmpgeimp.hxx" 60 #include "svx/fmtools.hxx" 61 #include "fmshimp.hxx" 62 #include "fmservs.hxx" 63 #include "fmprop.hrc" 64 #include "fmundo.hxx" 65 #include <svx/dataaccessdescriptor.hxx> 66 #include <comphelper/processfactory.hxx> 67 #include <comphelper/namedvaluecollection.hxx> 68 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp> 69 #include <com/sun/star/beans/PropertyValue.hpp> 70 #include <com/sun/star/beans/PropertyState.hpp> 71 #include <com/sun/star/form/FormComponentType.hpp> 72 #include <vcl/svapp.hxx> 73 #include <tools/urlobj.hxx> 74 #include <tools/diagnose_ex.h> 75 #include <vcl/stdtext.hxx> 76 #include <svx/fmglob.hxx> 77 #include <svx/sdrpagewindow.hxx> 78 #include "svx/sdrpaintwindow.hxx" 79 80 using namespace ::com::sun::star; 81 using namespace ::com::sun::star::uno; 82 using namespace ::com::sun::star::lang; 83 using namespace ::com::sun::star::sdbc; 84 using namespace ::com::sun::star::sdb; 85 using namespace ::com::sun::star::beans; 86 using namespace ::com::sun::star::container; 87 using namespace ::com::sun::star::form; 88 using namespace ::com::sun::star::util; 89 using namespace ::svxform; 90 using namespace ::svx; 91 92 //======================================================================== 93 //------------------------------------------------------------------------ 94 TYPEINIT1(FmFormView, E3dView); 95 96 //------------------------------------------------------------------------ 97 FmFormView::FmFormView( FmFormModel* pModel, OutputDevice* pOut ) 98 :E3dView(pModel,pOut) 99 { 100 Init(); 101 } 102 103 //------------------------------------------------------------------------ 104 void FmFormView::Init() 105 { 106 pFormShell = NULL; 107 pImpl = new FmXFormView(::comphelper::getProcessServiceFactory(),this); 108 pImpl->acquire(); 109 110 ////////////////////////////////////////////////////////////////////// 111 // Model setzen 112 SdrModel* pModel = GetModel(); 113 114 DBG_ASSERT( pModel->ISA(FmFormModel), "Falsches Model" ); 115 if( !pModel->ISA(FmFormModel) ) return; 116 FmFormModel* pFormModel = (FmFormModel*)pModel; 117 118 ////////////////////////////////////////////////////////////////////// 119 // DesignMode vom Model holen 120 sal_Bool bInitDesignMode = pFormModel->GetOpenInDesignMode(); 121 if ( pFormModel->OpenInDesignModeIsDefaulted( ) ) 122 { // this means that nobody ever explicitly set this on the model, and the model has never 123 // been loaded from a stream. 124 // This means this is a newly created document. This means, we want to have it in design 125 // mode by default (though a newly created model returns true for GetOpenInDesignMode). 126 // We _want_ to have this because it makes a lot of hacks following the original fix 127 // for #94595# unnecessary 128 // #96399# - 2002-10-11 - fs@openoffice.org 129 DBG_ASSERT( !bInitDesignMode, "FmFormView::Init: doesn't the model default to FALSE anymore?" ); 130 // if this asserts, either the on-contruction default in the model has changed (then this here 131 // may not be necessary anymore), or we're not dealing with a new document .... 132 bInitDesignMode = sal_True; 133 } 134 135 SfxObjectShell* pObjShell = pFormModel->GetObjectShell(); 136 if ( pObjShell && pObjShell->GetMedium() ) 137 { 138 const SfxPoolItem *pItem=0; 139 if ( pObjShell->GetMedium()->GetItemSet()->GetItemState( SID_COMPONENTDATA, sal_False, &pItem ) == SFX_ITEM_SET ) 140 { 141 ::comphelper::NamedValueCollection aComponentData( ((SfxUnoAnyItem*)pItem)->GetValue() ); 142 bInitDesignMode = aComponentData.getOrDefault( "ApplyFormDesignMode", bInitDesignMode ); 143 } 144 } 145 146 if( pObjShell && pObjShell->IsReadOnly() ) 147 bInitDesignMode = sal_False; 148 149 // dieses wird in der Shell vorgenommen 150 // bDesignMode = !bInitDesignMode; // erzwingt, dass SetDesignMode ausgefuehrt wird 151 SetDesignMode( bInitDesignMode ); 152 } 153 154 //------------------------------------------------------------------------ 155 FmFormView::~FmFormView() 156 { 157 if( pFormShell ) 158 pFormShell->SetView( NULL ); 159 160 pImpl->notifyViewDying(); 161 pImpl->release(); 162 pImpl = NULL; 163 } 164 165 //------------------------------------------------------------------------ 166 FmFormPage* FmFormView::GetCurPage() 167 { 168 SdrPageView* pPageView = GetSdrPageView(); 169 FmFormPage* pCurPage = pPageView ? PTR_CAST( FmFormPage, pPageView->GetPage() ) : NULL; 170 return pCurPage; 171 } 172 173 //------------------------------------------------------------------------ 174 void FmFormView::MarkListHasChanged() 175 { 176 E3dView::MarkListHasChanged(); 177 178 if ( pFormShell && IsDesignMode() ) 179 { 180 FmFormObj* pObj = getMarkedGrid(); 181 if ( pImpl->m_pMarkedGrid && pImpl->m_pMarkedGrid != pObj ) 182 { 183 pImpl->m_pMarkedGrid = NULL; 184 if ( pImpl->m_xWindow.is() ) 185 { 186 pImpl->m_xWindow->removeFocusListener(pImpl); 187 pImpl->m_xWindow = NULL; 188 } 189 SetMoveOutside(sal_False); 190 //OLMRefreshAllIAOManagers(); 191 } 192 193 pFormShell->GetImpl()->SetSelectionDelayed(); 194 } 195 } 196 197 namespace 198 { 199 const SdrPageWindow* findPageWindow( const SdrPaintView* _pView, OutputDevice* _pWindow ) 200 { 201 SdrPageView* pPageView = _pView->GetSdrPageView(); 202 if(pPageView) 203 { 204 for ( sal_uInt32 window = 0; window < pPageView->PageWindowCount(); ++window ) 205 { 206 const SdrPageWindow* pPageWindow = pPageView->GetPageWindow( window ); 207 if ( !pPageWindow || &pPageWindow->GetPaintWindow().GetOutputDevice() != _pWindow ) 208 continue; 209 210 return pPageWindow; 211 } 212 } 213 return NULL; 214 } 215 } 216 217 //------------------------------------------------------------------------ 218 void FmFormView::AddWindowToPaintView(OutputDevice* pNewWin) 219 { 220 E3dView::AddWindowToPaintView(pNewWin); 221 222 if ( !pNewWin ) 223 return; 224 225 // look up the PageViewWindow for the newly inserted window, and care for it 226 // #i39269# / 2004-12-20 / frank.schoenheit@sun.com 227 const SdrPageWindow* pPageWindow = findPageWindow( this, pNewWin ); 228 if ( pPageWindow ) 229 pImpl->addWindow( *pPageWindow ); 230 } 231 232 //------------------------------------------------------------------------ 233 void FmFormView::DeleteWindowFromPaintView(OutputDevice* pNewWin) 234 { 235 const SdrPageWindow* pPageWindow = findPageWindow( this, pNewWin ); 236 if ( pPageWindow ) 237 pImpl->removeWindow( pPageWindow->GetControlContainer() ); 238 239 E3dView::DeleteWindowFromPaintView(pNewWin); 240 } 241 242 //------------------------------------------------------------------------ 243 void FmFormView::ChangeDesignMode(sal_Bool bDesign) 244 { 245 if (bDesign == IsDesignMode()) 246 return; 247 248 FmFormModel* pModel = PTR_CAST(FmFormModel, GetModel()); 249 if (pModel) 250 { // fuer die Zeit des Uebergangs das Undo-Environment ausschalten, das sichert, dass man dort auch nicht-transiente 251 // Properties mal eben aendern kann (sollte allerdings mit Vorsicht genossen und beim Rueckschalten des Modes 252 // auch immer wieder rueckgaegig gemacht werden. Ein Beispiel ist das Setzen der maximalen Text-Laenge durch das 253 // FmXEditModel an seinem Control.) 254 pModel->GetUndoEnv().Lock(); 255 } 256 257 // --- 1. deactivate all controls if we are switching to design mode 258 if ( bDesign ) 259 DeactivateControls( GetSdrPageView() ); 260 261 // --- 2. simulate a deactivation (the shell will handle some things there ...?) 262 if ( pFormShell && pFormShell->GetImpl() ) 263 pFormShell->GetImpl()->viewDeactivated( *this, sal_True ); 264 else 265 pImpl->Deactivate( sal_True ); 266 267 // --- 3. activate all controls, if we're switching to alive mode 268 if ( !bDesign ) 269 ActivateControls( GetSdrPageView() ); 270 271 // --- 4. load resp. unload the forms 272 FmFormPage* pCurPage = GetCurPage(); 273 if ( pCurPage ) 274 { 275 if ( pFormShell && pFormShell->GetImpl() ) 276 pFormShell->GetImpl()->loadForms( pCurPage, ( bDesign ? FORMS_UNLOAD : FORMS_LOAD ) ); 277 } 278 279 // --- 5. base class functionality 280 SetDesignMode( bDesign ); 281 282 // --- 6. simulate a activation (the shell will handle some things there ...?) 283 OSL_PRECOND( pFormShell && pFormShell->GetImpl(), "FmFormView::ChangeDesignMode: is this really allowed? No shell?" ); 284 if ( pFormShell && pFormShell->GetImpl() ) 285 pFormShell->GetImpl()->viewActivated( *this ); 286 else 287 pImpl->Activate(); 288 289 if ( pCurPage ) 290 { 291 if ( bDesign ) 292 { 293 if ( GetActualOutDev() && GetActualOutDev()->GetOutDevType() == OUTDEV_WINDOW ) 294 { 295 const Window* pWindow = static_cast< const Window* >( GetActualOutDev() ); 296 const_cast< Window* >( pWindow )->GrabFocus(); 297 } 298 299 // redraw UNO objects 300 if ( GetSdrPageView() ) 301 { 302 SdrObjListIter aIter(*pCurPage); 303 while( aIter.IsMore() ) 304 { 305 SdrObject* pObj = aIter.Next(); 306 if (pObj && pObj->IsUnoObj()) 307 { 308 // For redraw just use ActionChanged() 309 // pObj->BroadcastObjectChange(); 310 pObj->ActionChanged(); 311 } 312 } 313 } 314 } 315 else 316 { 317 // set the auto focus to the first control (if indicated by the model to do so) 318 sal_Bool bForceControlFocus = pModel ? pModel->GetAutoControlFocus() : sal_False; 319 if (bForceControlFocus) 320 pImpl->AutoFocus(); 321 } 322 } 323 324 // und mein Undo-Environment wieder an 325 if (pModel) 326 pModel->GetUndoEnv().UnLock(); 327 } 328 329 //------------------------------------------------------------------------ 330 void FmFormView::GrabFirstControlFocus( sal_Bool _bForceSync ) 331 { 332 if ( !IsDesignMode() ) 333 pImpl->AutoFocus( _bForceSync ); 334 } 335 336 //------------------------------------------------------------------------ 337 SdrPageView* FmFormView::ShowSdrPage(SdrPage* pPage) 338 { 339 SdrPageView* pPV = E3dView::ShowSdrPage(pPage); 340 341 if (pPage) 342 { 343 if (!IsDesignMode()) 344 { 345 // creating the controllers 346 ActivateControls(pPV); 347 348 // Alles deselektieren 349 UnmarkAll(); 350 } 351 else if ( pFormShell && pFormShell->IsDesignMode() ) 352 { 353 FmXFormShell* pFormShellImpl = pFormShell->GetImpl(); 354 pFormShellImpl->UpdateForms( sal_True ); 355 356 // damit der Formular-Navigator auf den Seitenwechsel reagieren kann 357 pFormShell->GetViewShell()->GetViewFrame()->GetBindings().Invalidate(SID_FM_FMEXPLORER_CONTROL , sal_True, sal_False); 358 359 pFormShellImpl->SetSelection(GetMarkedObjectList()); 360 } 361 } 362 363 // notify our shell that we have been activated 364 if ( pFormShell && pFormShell->GetImpl() ) 365 pFormShell->GetImpl()->viewActivated( *this ); 366 else 367 pImpl->Activate(); 368 369 return pPV; 370 } 371 372 //------------------------------------------------------------------------ 373 void FmFormView::HideSdrPage() 374 { 375 // --- 1. deactivate controls 376 if ( !IsDesignMode() ) 377 DeactivateControls(GetSdrPageView()); 378 379 // --- 2. tell the shell the view is (going to be) deactivated 380 if ( pFormShell && pFormShell->GetImpl() ) 381 pFormShell->GetImpl()->viewDeactivated( *this, sal_True ); 382 else 383 pImpl->Deactivate( sal_True ); 384 385 // --- 3. base class behavior 386 E3dView::HideSdrPage(); 387 } 388 389 //------------------------------------------------------------------------ 390 SdrModel* FmFormView::GetMarkedObjModel() const 391 { 392 return E3dView::GetMarkedObjModel(); 393 } 394 395 //------------------------------------------------------------------------ 396 sal_Bool FmFormView::Paste(const SdrModel& rMod, const Point& rPos, SdrObjList* pLst, sal_uInt32 nOptions) 397 { 398 return E3dView::Paste(rMod, rPos, pLst, nOptions); 399 } 400 401 //------------------------------------------------------------------------ 402 void FmFormView::ActivateControls(SdrPageView* pPageView) 403 { 404 if (!pPageView) 405 return; 406 407 for (sal_uInt32 i = 0L; i < pPageView->PageWindowCount(); ++i) 408 { 409 const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(i); 410 pImpl->addWindow(rPageWindow); 411 } 412 } 413 414 //------------------------------------------------------------------------ 415 void FmFormView::DeactivateControls(SdrPageView* pPageView) 416 { 417 if( !pPageView ) 418 return; 419 420 for (sal_uInt32 i = 0L; i < pPageView->PageWindowCount(); ++i) 421 { 422 const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(i); 423 pImpl->removeWindow(rPageWindow.GetControlContainer() ); 424 } 425 } 426 427 //------------------------------------------------------------------------ 428 SdrObject* FmFormView::CreateFieldControl( const ODataAccessDescriptor& _rColumnDescriptor ) 429 { 430 return pImpl->implCreateFieldControl( _rColumnDescriptor ); 431 } 432 433 //------------------------------------------------------------------------ 434 SdrObject* FmFormView::CreateXFormsControl( const OXFormsDescriptor &_rDesc ) 435 { 436 return pImpl->implCreateXFormsControl(_rDesc); 437 } 438 439 //------------------------------------------------------------------------ 440 SdrObject* FmFormView::CreateFieldControl(const UniString& rFieldDesc) const 441 { 442 ::rtl::OUString sDataSource = rFieldDesc.GetToken(0,sal_Unicode(11)); 443 ::rtl::OUString sObjectName = rFieldDesc.GetToken(1,sal_Unicode(11)); 444 sal_uInt16 nObjectType = (sal_uInt16)rFieldDesc.GetToken(2,sal_Unicode(11)).ToInt32(); 445 ::rtl::OUString sFieldName = rFieldDesc.GetToken(3,sal_Unicode(11)); 446 447 if (!sFieldName.getLength() || !sObjectName.getLength() || !sDataSource.getLength()) 448 return NULL; 449 450 ODataAccessDescriptor aColumnDescriptor; 451 aColumnDescriptor.setDataSource(sDataSource); 452 aColumnDescriptor[ daCommand ] <<= sObjectName; 453 aColumnDescriptor[ daCommandType ] <<= nObjectType; 454 aColumnDescriptor[ daColumnName ] <<= sFieldName; 455 456 return pImpl->implCreateFieldControl( aColumnDescriptor ); 457 } 458 459 //------------------------------------------------------------------------ 460 void FmFormView::InsertControlContainer(const Reference< ::com::sun::star::awt::XControlContainer > & xCC) 461 { 462 if( !IsDesignMode() ) 463 { 464 SdrPageView* pPageView = GetSdrPageView(); 465 if( pPageView ) 466 { 467 for( sal_uInt32 i = 0L; i < pPageView->PageWindowCount(); i++ ) 468 { 469 const SdrPageWindow& rPageWindow = *pPageView->GetPageWindow(i); 470 471 if( rPageWindow.GetControlContainer( false ) == xCC ) 472 { 473 pImpl->addWindow(rPageWindow); 474 break; 475 } 476 } 477 } 478 } 479 } 480 481 //------------------------------------------------------------------------ 482 void FmFormView::RemoveControlContainer(const Reference< ::com::sun::star::awt::XControlContainer > & xCC) 483 { 484 if( !IsDesignMode() ) 485 { 486 pImpl->removeWindow( xCC ); 487 } 488 } 489 490 // ----------------------------------------------------------------------------- 491 SdrPaintWindow* FmFormView::BeginCompleteRedraw(OutputDevice* pOut) 492 { 493 SdrPaintWindow* pPaintWindow = E3dView::BeginCompleteRedraw( pOut ); 494 pImpl->suspendTabOrderUpdate(); 495 return pPaintWindow; 496 } 497 498 // ----------------------------------------------------------------------------- 499 void FmFormView::EndCompleteRedraw( SdrPaintWindow& rPaintWindow, bool bPaintFormLayer ) 500 { 501 E3dView::EndCompleteRedraw( rPaintWindow, bPaintFormLayer ); 502 pImpl->resumeTabOrderUpdate(); 503 } 504 505 // ----------------------------------------------------------------------------- 506 sal_Bool FmFormView::KeyInput(const KeyEvent& rKEvt, Window* pWin) 507 { 508 sal_Bool bDone = sal_False; 509 const KeyCode& rKeyCode = rKEvt.GetKeyCode(); 510 if ( IsDesignMode() 511 && rKeyCode.GetCode() == KEY_RETURN 512 ) 513 { 514 // RETURN alone enters grid controls, for keyboard accessibility 515 if ( pWin 516 && !rKeyCode.IsShift() 517 && !rKeyCode.IsMod1() 518 && !rKeyCode.IsMod2() 519 ) 520 { 521 FmFormObj* pObj = getMarkedGrid(); 522 if ( pObj ) 523 { 524 Reference< awt::XWindow > xWindow( pObj->GetUnoControl( *this, *pWin ), UNO_QUERY ); 525 if ( xWindow.is() ) 526 { 527 pImpl->m_pMarkedGrid = pObj; 528 pImpl->m_xWindow = xWindow; 529 // add as listener to get notified when ESC will be pressed inside the grid 530 pImpl->m_xWindow->addFocusListener(pImpl); 531 SetMoveOutside(sal_True); 532 //OLMRefreshAllIAOManagers(); 533 xWindow->setFocus(); 534 bDone = sal_True; 535 } 536 } 537 } 538 // Alt-RETURN alone shows the properties of the selection 539 if ( pFormShell 540 && pFormShell->GetImpl() 541 && !rKeyCode.IsShift() 542 && !rKeyCode.IsMod1() 543 && rKeyCode.IsMod2() 544 ) 545 { 546 pFormShell->GetImpl()->handleShowPropertiesRequest(); 547 } 548 549 } 550 551 if ( !bDone ) 552 bDone = E3dView::KeyInput(rKEvt,pWin); 553 return bDone; 554 } 555 // ----------------------------------------------------------------------------- 556 sal_Bool FmFormView::checkUnMarkAll(const Reference< XInterface >& _xSource) 557 { 558 Reference< ::com::sun::star::awt::XControl> xControl(pImpl->m_xWindow,UNO_QUERY); 559 sal_Bool bRet = !xControl.is() || !_xSource.is() || _xSource != xControl->getModel(); 560 if ( bRet ) 561 UnmarkAll(); 562 563 return bRet; 564 } 565 566 // ----------------------------------------------------------------------------- 567 sal_Bool FmFormView::MouseButtonDown( const MouseEvent& _rMEvt, Window* _pWin ) 568 { 569 sal_Bool bReturn = E3dView::MouseButtonDown( _rMEvt, _pWin ); 570 571 if ( pFormShell && pFormShell->GetImpl() ) 572 { 573 SdrViewEvent aViewEvent; 574 PickAnything( _rMEvt, SDRMOUSEBUTTONDOWN, aViewEvent ); 575 pFormShell->GetImpl()->handleMouseButtonDown( aViewEvent ); 576 } 577 578 return bReturn; 579 } 580 581 // ----------------------------------------------------------------------------- 582 FmFormObj* FmFormView::getMarkedGrid() const 583 { 584 FmFormObj* pFormObject = NULL; 585 const SdrMarkList& rMarkList = GetMarkedObjectList(); 586 if ( 1 == rMarkList.GetMarkCount() ) 587 { 588 SdrMark* pMark = rMarkList.GetMark(0); 589 if ( pMark ) 590 { 591 pFormObject = FmFormObj::GetFormObject( pMark->GetMarkedSdrObj() ); 592 if ( pFormObject ) 593 { 594 Reference< XServiceInfo > xServInfo( pFormObject->GetUnoControlModel(), UNO_QUERY ); 595 if ( !xServInfo.is() || !xServInfo->supportsService( FM_SUN_COMPONENT_GRIDCONTROL ) ) 596 pFormObject = NULL; 597 } 598 } 599 } 600 return pFormObject; 601 } 602 603 // ----------------------------------------------------------------------------- 604 void FmFormView::createControlLabelPair( OutputDevice* _pOutDev, sal_Int32 _nXOffsetMM, sal_Int32 _nYOffsetMM, 605 const Reference< XPropertySet >& _rxField, const Reference< XNumberFormats >& _rxNumberFormats, 606 sal_uInt16 _nControlObjectID, const ::rtl::OUString& _rFieldPostfix, sal_uInt32 _nInventor, sal_uInt16 _nLabelObjectID, 607 SdrPage* _pLabelPage, SdrPage* _pControlPage, SdrModel* _pModel, SdrUnoObj*& _rpLabel, SdrUnoObj*& _rpControl ) 608 { 609 FmXFormView::createControlLabelPair( 610 ::comphelper::getProcessServiceFactory(), 611 *_pOutDev, _nXOffsetMM, _nYOffsetMM, 612 _rxField, _rxNumberFormats, 613 _nControlObjectID, _rFieldPostfix, _nInventor, _nLabelObjectID, 614 _pLabelPage, _pControlPage, _pModel, 615 _rpLabel, _rpControl 616 ); 617 } 618 // ----------------------------------------------------------------------------- 619 Reference< runtime::XFormController > FmFormView::GetFormController( const Reference< XForm >& _rxForm, const OutputDevice& _rDevice ) const 620 { 621 return pImpl->getFormController( _rxForm, _rDevice ); 622 } 623 624