xref: /AOO41X/main/sdext/source/minimizer/unodialog.cxx (revision ca62e2c2083b5d0995f1245bad6c2edfb455fbec)
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_sdext.hxx"
26 
27 #include "unodialog.hxx"
28 
29 #include <com/sun/star/awt/MessageBoxButtons.hpp>
30 #include <com/sun/star/awt/XVclWindowPeer.hpp>
31 #include <com/sun/star/awt/PosSize.hpp>
32 #include <com/sun/star/awt/XMessageBoxFactory.hpp>
33 #include <com/sun/star/awt/XStyleSettingsSupplier.hpp>
34 #include <com/sun/star/container/XIndexAccess.hpp>
35 #include <com/sun/star/drawing/XShapes.hpp>
36 #include <com/sun/star/frame/XDispatch.hpp>
37 #include <com/sun/star/text/XTextRange.hpp>
38 #include <com/sun/star/view/XControlAccess.hpp>
39 #include <com/sun/star/view/XSelectionSupplier.hpp>
40 
41 // -------------
42 // - UnoDialog -
43 // -------------
44 
45 using namespace ::com::sun::star::awt;
46 using namespace ::com::sun::star::uno;
47 using namespace ::com::sun::star::util;
48 using namespace ::com::sun::star::lang;
49 using namespace ::com::sun::star::view;
50 using namespace ::com::sun::star::frame;
51 using namespace ::com::sun::star::beans;
52 using namespace ::com::sun::star::script;
53 
54 using ::rtl::OUString;
55 
UnoDialog(const Reference<XComponentContext> & rxContext,const Reference<XWindowPeer> & rxParent)56 UnoDialog::UnoDialog(
57     const Reference< XComponentContext > &rxContext,
58     const Reference< XWindowPeer >& rxParent ) :
59     mxContext( rxContext ),
60     mxParent( rxParent ),
61     mxDialogModel( mxContext->getServiceManager()->createInstanceWithContext( OUString( RTL_CONSTASCII_USTRINGPARAM(
62         "com.sun.star.awt.UnoControlDialogModel" ) ), mxContext ), UNO_QUERY_THROW ),
63     mxDialogModelMultiPropertySet( mxDialogModel, UNO_QUERY_THROW ),
64     mxDialogModelPropertySet( mxDialogModel, UNO_QUERY_THROW ),
65     mxDialogModelMSF( mxDialogModel, UNO_QUERY_THROW ),
66     mxDialogModelNameContainer( mxDialogModel, UNO_QUERY_THROW ),
67     mxDialogModelNameAccess( mxDialogModel, UNO_QUERY_THROW ),
68     mxControlModel( mxDialogModel, UNO_QUERY_THROW ),
69     mxDialog( mxContext->getServiceManager()->createInstanceWithContext( OUString( RTL_CONSTASCII_USTRINGPARAM(
70         "com.sun.star.awt.UnoControlDialog" ) ), mxContext ), UNO_QUERY_THROW ),
71     mxControl( mxDialog, UNO_QUERY_THROW ),
72     mbStatus( sal_False )
73 {
74     OSL_TRACE("UnoDialog::UnoDialog");
75     mxControl->setModel( mxControlModel );
76     mxDialogControlContainer = Reference< XControlContainer >( mxDialog, UNO_QUERY_THROW );
77     mxDialogWindow = Reference< XWindow >( mxDialog, UNO_QUERY );
78     mxDialogWindowPeer = createWindowPeer();
79 }
80 
81 // -----------------------------------------------------------------------------
82 
~UnoDialog()83 UnoDialog::~UnoDialog()
84 {
85     OSL_TRACE("UnoDialog::~UnoDialog");
86     Reference< XComponent > xComponent( mxDialog, UNO_QUERY );
87     if ( xComponent.is() )
88     {
89         xComponent->dispose();
90     }
91 }
92 
93 // -----------------------------------------------------------------------------
94 
setTitle(const rtl::OUString & rTitle)95 void UnoDialog::setTitle( const rtl::OUString &rTitle )
96 {
97     if ( rTitle.getLength() )
98     {
99         mxDialog->setTitle( rTitle );
100     }
101 }
102 
execute()103 void UnoDialog::execute()
104 {
105     OSL_TRACE("UnoDialog::execute");
106     mxDialogWindow->setEnable( sal_True );
107     mxDialogWindow->setVisible( sal_True );
108     mxDialog->execute();
109 }
110 
endExecute(sal_Bool bStatus)111 void UnoDialog::endExecute( sal_Bool bStatus )
112 {
113     OSL_TRACE("UnoDialog::endExecute");
114     mbStatus = bStatus;
115     mxDialog->endExecute();
116 }
117 
centerDialog()118 void UnoDialog::centerDialog()
119 {
120     Reference< XWindow > xParent( mxParent, UNO_QUERY );
121     if ( !xParent.is() )
122         return;
123 
124     Rectangle aParentPosSize = xParent->getPosSize();
125     Rectangle aWinPosSize = mxDialogWindow->getPosSize();
126     Point aWinPos((aParentPosSize.Width - aWinPosSize.Width) / 2,
127                   (aParentPosSize.Height - aWinPosSize.Height) / 2);
128 
129     if ( ( aWinPos.X + aWinPosSize.Width ) > ( aParentPosSize.X + aParentPosSize.Width ) )
130         aWinPos.X = aParentPosSize.X + aParentPosSize.Width - aWinPosSize.Width;
131 
132     if ( ( aWinPos.Y + aWinPosSize.Height ) > ( aParentPosSize.Y + aParentPosSize.Height ) )
133         aWinPos.Y = aParentPosSize.Y + aParentPosSize.Height - aWinPosSize.Height;
134 
135     mxDialogWindow->setPosSize( aWinPos.X, aWinPos.Y,
136                                 aWinPosSize.Width,
137                                 aWinPosSize.Height,
138                                 PosSize::POS );
139 }
140 
141 // -----------------------------------------------------------------------------
142 
createWindowPeer()143 Reference< XWindowPeer > UnoDialog::createWindowPeer()
144     throw ( Exception )
145 {
146     mxDialogWindow->setVisible( sal_False );
147 
148     // reuse the parent's toolkit
149     Reference< XToolkit > xToolkit;
150     if ( mxParent.is() )
151         xToolkit.set( mxParent->getToolkit() );
152 
153     if ( !xToolkit.is() )
154          xToolkit.set( mxContext->getServiceManager()->createInstanceWithContext(
155              OUString( RTL_CONSTASCII_USTRINGPARAM(
156                  "com.sun.star.awt.Toolkit" ) ), mxContext ),
157                     UNO_QUERY_THROW  );
158 
159     mxReschedule = Reference< XReschedule >( xToolkit, UNO_QUERY );
160     mxControl->createPeer( xToolkit, mxParent );
161 
162     return mxControl->getPeer();
163 }
164 
165 // -----------------------------------------------------------------------------
166 
insertControlModel(const OUString & rServiceName,const OUString & rName,const Sequence<OUString> & rPropertyNames,const Sequence<Any> & rPropertyValues)167 Reference< XInterface > UnoDialog::insertControlModel( const OUString& rServiceName, const OUString& rName,
168                                                         const Sequence< OUString >& rPropertyNames, const Sequence< Any >& rPropertyValues )
169 {
170     Reference< XInterface > xControlModel;
171     try
172     {
173         xControlModel = mxDialogModelMSF->createInstance( rServiceName );
174         Reference< XMultiPropertySet > xMultiPropSet( xControlModel, UNO_QUERY_THROW );
175         xMultiPropSet->setPropertyValues( rPropertyNames, rPropertyValues );
176         mxDialogModelNameContainer->insertByName( rName, Any( xControlModel ) );
177     }
178     catch( Exception& )
179     {
180     }
181     return xControlModel;
182 }
183 
184 // -----------------------------------------------------------------------------
185 
setVisible(const OUString & rName,sal_Bool bVisible)186 void UnoDialog::setVisible( const OUString& rName, sal_Bool bVisible )
187 {
188     try
189     {
190         Reference< XInterface > xControl( mxDialogControlContainer->getControl( rName ), UNO_QUERY_THROW );
191         Reference< XWindow > xWindow( xControl, UNO_QUERY_THROW );
192         xWindow->setVisible( bVisible );
193     }
194     catch ( Exception& )
195     {
196     }
197 }
198 
199 // -----------------------------------------------------------------------------
200 
isHighContrast()201 sal_Bool UnoDialog::isHighContrast()
202 {
203     sal_Bool bHighContrast = sal_False;
204     try
205     {
206         Reference< XStyleSettingsSupplier > xStyleSettingsSuppl( mxDialogWindow, UNO_QUERY_THROW );
207         Reference< XStyleSettings > xStyleSettings( xStyleSettingsSuppl->getStyleSettings() );
208         bHighContrast = xStyleSettings->getHighContrastMode();
209     }
210     catch( Exception& )
211     {
212     }
213     return bHighContrast;
214 }
215 
216 // -----------------------------------------------------------------------------
217 
insertButton(const OUString & rName,Reference<XActionListener> xActionListener,const Sequence<OUString> & rPropertyNames,const Sequence<Any> & rPropertyValues)218 Reference< XButton > UnoDialog::insertButton( const OUString& rName, Reference< XActionListener > xActionListener,
219             const Sequence< OUString >& rPropertyNames, const Sequence< Any >& rPropertyValues )
220 {
221     Reference< XButton > xButton;
222     try
223     {
224         Reference< XInterface > xButtonModel( insertControlModel( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlButtonModel" ) ),
225             rName, rPropertyNames, rPropertyValues ) );
226         Reference< XPropertySet > xPropertySet( xButtonModel, UNO_QUERY_THROW );
227         xPropertySet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ) ), Any( rName ) );
228         xButton = Reference< XButton >( mxDialogControlContainer->getControl( rName ), UNO_QUERY_THROW );
229 
230         if ( xActionListener.is() )
231         {
232             xButton->addActionListener( xActionListener );
233             xButton->setActionCommand( rName );
234         }
235         return xButton;
236     }
237     catch( Exception& )
238     {
239     }
240     return xButton;
241 }
242 
243 // -----------------------------------------------------------------------------
244 
insertFixedText(const OUString & rName,const Sequence<OUString> rPropertyNames,const Sequence<Any> rPropertyValues)245 Reference< XFixedText > UnoDialog::insertFixedText( const OUString& rName, const Sequence< OUString > rPropertyNames, const Sequence< Any > rPropertyValues )
246 {
247     Reference< XFixedText > xFixedText;
248     try
249     {
250         Reference< XPropertySet > xPropertySet( insertControlModel( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlFixedTextModel" ) ),
251             rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
252         xPropertySet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ) ), Any( rName ) );
253         xFixedText = Reference< XFixedText >( mxDialogControlContainer->getControl( rName ), UNO_QUERY_THROW );
254     }
255     catch ( Exception& )
256     {
257     }
258     return xFixedText;
259 }
260 
261 // -----------------------------------------------------------------------------
262 
insertCheckBox(const OUString & rName,const Sequence<OUString> rPropertyNames,const Sequence<Any> rPropertyValues)263 Reference< XCheckBox > UnoDialog::insertCheckBox( const OUString& rName, const Sequence< OUString > rPropertyNames, const Sequence< Any > rPropertyValues )
264 {
265     Reference< XCheckBox > xCheckBox;
266     try
267     {
268         Reference< XPropertySet > xPropertySet( insertControlModel( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlCheckBoxModel" ) ),
269             rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
270         xPropertySet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ) ), Any( rName ) );
271         xCheckBox = Reference< XCheckBox >( mxDialogControlContainer->getControl( rName ), UNO_QUERY_THROW );
272     }
273     catch ( Exception& )
274     {
275     }
276     return xCheckBox;
277 }
278 
279 // -----------------------------------------------------------------------------
280 
insertFormattedField(const OUString & rName,const Sequence<OUString> rPropertyNames,const Sequence<Any> rPropertyValues)281 Reference< XControl > UnoDialog::insertFormattedField( const OUString& rName, const Sequence< OUString > rPropertyNames, const Sequence< Any > rPropertyValues )
282 {
283     Reference< XControl > xControl;
284     try
285     {
286         Reference< XPropertySet > xPropertySet( insertControlModel( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlFormattedFieldModel" ) ),
287             rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
288         xPropertySet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ) ), Any( rName ) );
289         xControl = Reference< XControl >( mxDialogControlContainer->getControl( rName ), UNO_QUERY_THROW );
290     }
291     catch ( Exception& )
292     {
293     }
294     return xControl;
295 }
296 
297 // -----------------------------------------------------------------------------
298 
insertComboBox(const OUString & rName,const Sequence<OUString> rPropertyNames,const Sequence<Any> rPropertyValues)299 Reference< XComboBox > UnoDialog::insertComboBox( const OUString& rName, const Sequence< OUString > rPropertyNames, const Sequence< Any > rPropertyValues )
300 {
301     Reference< XComboBox > xControl;
302     try
303     {
304         Reference< XPropertySet > xPropertySet( insertControlModel( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlComboBoxModel" ) ),
305             rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
306         xPropertySet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ) ), Any( rName ) );
307         xControl = Reference< XComboBox >( mxDialogControlContainer->getControl( rName ), UNO_QUERY_THROW );
308     }
309     catch ( Exception& )
310     {
311     }
312     return xControl;
313 }
314 
315 // -----------------------------------------------------------------------------
316 
insertRadioButton(const OUString & rName,const Sequence<OUString> rPropertyNames,const Sequence<Any> rPropertyValues)317 Reference< XRadioButton > UnoDialog::insertRadioButton( const OUString& rName, const Sequence< OUString > rPropertyNames, const Sequence< Any > rPropertyValues )
318 {
319     Reference< XRadioButton > xControl;
320     try
321     {
322         Reference< XPropertySet > xPropertySet( insertControlModel( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlRadioButtonModel" ) ),
323             rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
324         xPropertySet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ) ), Any( rName ) );
325         xControl = Reference< XRadioButton >( mxDialogControlContainer->getControl( rName ), UNO_QUERY_THROW );
326     }
327     catch ( Exception& )
328     {
329     }
330     return xControl;
331 }
332 
333 // -----------------------------------------------------------------------------
334 
insertListBox(const OUString & rName,const Sequence<OUString> rPropertyNames,const Sequence<Any> rPropertyValues)335 Reference< XListBox > UnoDialog::insertListBox( const OUString& rName, const Sequence< OUString > rPropertyNames, const Sequence< Any > rPropertyValues )
336 {
337     Reference< XListBox > xControl;
338     try
339     {
340         Reference< XPropertySet > xPropertySet( insertControlModel( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlListBoxModel" ) ),
341             rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
342         xPropertySet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ) ), Any( rName ) );
343         xControl = Reference< XListBox >( mxDialogControlContainer->getControl( rName ), UNO_QUERY_THROW );
344     }
345     catch ( Exception& )
346     {
347     }
348     return xControl;
349 }
350 
351 // -----------------------------------------------------------------------------
352 
insertImage(const OUString & rName,const Sequence<OUString> rPropertyNames,const Sequence<Any> rPropertyValues)353 Reference< XControl > UnoDialog::insertImage( const OUString& rName, const Sequence< OUString > rPropertyNames, const Sequence< Any > rPropertyValues )
354 {
355     Reference< XControl > xControl;
356     try
357     {
358         Reference< XPropertySet > xPropertySet( insertControlModel( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlImageControlModel" ) ),
359             rName, rPropertyNames, rPropertyValues ), UNO_QUERY_THROW );
360         xPropertySet->setPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Name" ) ), Any( rName ) );
361         xControl = Reference< XControl >( mxDialogControlContainer->getControl( rName ), UNO_QUERY_THROW );
362     }
363     catch ( Exception& )
364     {
365     }
366     return xControl;
367 }
368 
369 // -----------------------------------------------------------------------------
370 
setControlProperty(const OUString & rControlName,const OUString & rPropertyName,const Any & rPropertyValue)371 void UnoDialog::setControlProperty( const OUString& rControlName, const OUString& rPropertyName, const Any& rPropertyValue )
372 {
373     try
374     {
375         if ( mxDialogModelNameAccess->hasByName( rControlName ) )
376         {
377             Reference< XPropertySet > xPropertySet( mxDialogModelNameAccess->getByName( rControlName ), UNO_QUERY_THROW );
378             xPropertySet->setPropertyValue( rPropertyName, rPropertyValue );
379         }
380     }
381     catch ( Exception& )
382     {
383     }
384 }
385 
386 // -----------------------------------------------------------------------------
387 
getMapsFromPixels(sal_Int32 nPixels) const388 sal_Int32 UnoDialog::getMapsFromPixels( sal_Int32 nPixels ) const
389 {
390     double dMaps = 0;
391     try
392     {
393         sal_Int32 nMapWidth = 0;
394         const OUString sWidth( RTL_CONSTASCII_USTRINGPARAM( "Width" ) );
395         if ( mxDialogModelPropertySet->getPropertyValue( sWidth  ) >>= nMapWidth )
396         {
397             Reference< XWindow > xWindow( mxDialog, UNO_QUERY_THROW );
398             double pxWidth = xWindow->getPosSize().Width;
399             double mapRatio = ( pxWidth / nMapWidth );
400             dMaps = nPixels / mapRatio;
401         }
402     }
403     catch ( Exception& )
404     {
405     }
406     return static_cast< sal_Int32 >( dMaps );
407 }
408 
409 // -----------------------------------------------------------------------------
410 
getControlProperty(const OUString & rControlName,const OUString & rPropertyName)411 Any UnoDialog::getControlProperty( const OUString& rControlName, const OUString& rPropertyName )
412 {
413     Any aRet;
414     try
415     {
416         if ( mxDialogModelNameAccess->hasByName( rControlName ) )
417         {
418             Reference< XPropertySet > xPropertySet( mxDialogModelNameAccess->getByName( rControlName ), UNO_QUERY_THROW );
419             aRet = xPropertySet->getPropertyValue( rPropertyName );
420         }
421     }
422     catch ( Exception& )
423     {
424     }
425     return aRet;
426 }
427 
428 // -----------------------------------------------------------------------------
429 
enableControl(const OUString & rControlName)430 void UnoDialog::enableControl( const OUString& rControlName )
431 {
432     const OUString sEnabled( RTL_CONSTASCII_USTRINGPARAM( "Enabled" ) );
433     setControlProperty( rControlName, sEnabled, Any( sal_True ) );
434 }
435 
436 // -----------------------------------------------------------------------------
437 
disableControl(const OUString & rControlName)438 void UnoDialog::disableControl( const OUString& rControlName )
439 {
440     const OUString sEnabled( RTL_CONSTASCII_USTRINGPARAM( "Enabled" ) );
441     setControlProperty( rControlName, sEnabled, Any( sal_False ) );
442 }
443 
444 // -----------------------------------------------------------------------------
445