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