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