xref: /AOO41X/main/sdext/source/minimizer/informationdialog.cxx (revision ff0525f24f03981d56b7579b645949f111420994)
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 "informationdialog.hxx"
28 #include "optimizationstats.hxx"
29 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
30 #include <com/sun/star/graphic/XGraphicProvider.hpp>
31 #include <com/sun/star/graphic/XGraphic.hpp>
32 #include <rtl/ustrbuf.hxx>
33 #include "com/sun/star/util/URL.hpp"
34 #include "com/sun/star/util/XURLTransformer.hpp"
35 
36 #define DIALOG_WIDTH    240
37 #define DIALOG_HEIGHT   80
38 #define PAGE_POS_X      35
39 #define PAGE_WIDTH      ( DIALOG_WIDTH - PAGE_POS_X ) - 6
40 
41 
42 // ---------------------
43 // - INFORMATIONDIALOG -
44 // ---------------------
45 
46 using namespace ::rtl;
47 using namespace ::com::sun::star;
48 using namespace ::com::sun::star::io;
49 using namespace ::com::sun::star::ui;
50 using namespace ::com::sun::star::awt;
51 using namespace ::com::sun::star::uno;
52 using namespace ::com::sun::star::util;
53 using namespace ::com::sun::star::lang;
54 using namespace ::com::sun::star::frame;
55 using namespace ::com::sun::star::beans;
56 using namespace ::com::sun::star::script;
57 using namespace ::com::sun::star::container;
58 
59 
60 
61 // -----------------------------------------------------------------------------
62 
63 rtl::OUString InsertFixedText( InformationDialog& rInformationDialog, const rtl::OUString& rControlName, const OUString& rLabel,
64                                 sal_Int32 nXPos, sal_Int32 nYPos, sal_Int32 nWidth, sal_Int32 nHeight, sal_Bool bMultiLine, sal_Int16 nTabIndex )
65 {
66     OUString pNames[] = {
67         TKGet( TK_Height ),
68         TKGet( TK_Label ),
69         TKGet( TK_MultiLine ),
70         TKGet( TK_PositionX ),
71         TKGet( TK_PositionY ),
72         TKGet( TK_Step ),
73         TKGet( TK_TabIndex ),
74         TKGet( TK_Width ) };
75 
76     Any pValues[] = {
77         Any( nHeight ),
78         Any( rLabel ),
79         Any( bMultiLine ),
80         Any( nXPos ),
81         Any( nYPos ),
82         Any( (sal_Int16)0 ),
83         Any( nTabIndex ),
84         Any( nWidth ) };
85 
86     sal_Int32 nCount = sizeof( pNames ) / sizeof( OUString );
87 
88     Sequence< rtl::OUString >   aNames( pNames, nCount );
89     Sequence< Any >             aValues( pValues, nCount );
90 
91     rInformationDialog.insertFixedText( rControlName, aNames, aValues );
92     return rControlName;
93 }
94 
95 rtl::OUString InsertImage( InformationDialog& rInformationDialog, const OUString& rControlName, const OUString& rURL,
96                         sal_Int32 nPosX, sal_Int32 nPosY, sal_Int32 nWidth, sal_Int32 nHeight )
97 {
98     OUString pNames[] = {
99         TKGet( TK_Border ),
100         TKGet( TK_Height ),
101         TKGet( TK_ImageURL ),
102         TKGet( TK_PositionX ),
103         TKGet( TK_PositionY ),
104         TKGet( TK_ScaleImage ),
105         TKGet( TK_Width ) };
106 
107     Any pValues[] = {
108         Any( sal_Int16( 0 ) ),
109         Any( nHeight ),
110         Any( rURL ),
111         Any( nPosX ),
112         Any( nPosY ),
113         Any( sal_True ),
114         Any( nWidth ) };
115     sal_Int32 nCount = sizeof( pNames ) / sizeof( OUString );
116 
117     Sequence< rtl::OUString >   aNames( pNames, nCount );
118     Sequence< Any >             aValues( pValues, nCount );
119 
120     rInformationDialog.insertImage( rControlName, aNames, aValues );
121     return rControlName;
122 }
123 
124 rtl::OUString InsertCheckBox( InformationDialog& rInformationDialog, const OUString& rControlName,
125     const Reference< XItemListener > xItemListener, const OUString& rLabel,
126         sal_Int32 nXPos, sal_Int32 nYPos, sal_Int32 nWidth, sal_Int32 nHeight, sal_Int16 nTabIndex )
127 {
128     OUString pNames[] = {
129         TKGet( TK_Enabled ),
130         TKGet( TK_Height ),
131         TKGet( TK_Label ),
132         TKGet( TK_PositionX ),
133         TKGet( TK_PositionY ),
134         TKGet( TK_Step ),
135         TKGet( TK_TabIndex ),
136         TKGet( TK_Width ) };
137 
138     Any pValues[] = {
139         Any( sal_True ),
140         Any( nHeight ),
141         Any( rLabel ),
142         Any( nXPos ),
143         Any( nYPos ),
144         Any( (sal_Int16)0 ),
145         Any( nTabIndex ),
146         Any( nWidth ) };
147 
148     sal_Int32 nCount = sizeof( pNames ) / sizeof( OUString );
149 
150     Sequence< rtl::OUString >   aNames( pNames, nCount );
151     Sequence< Any >             aValues( pValues, nCount );
152 
153     Reference< XCheckBox > xCheckBox( rInformationDialog.insertCheckBox( rControlName, aNames, aValues ) );
154     if ( xItemListener.is() )
155         xCheckBox->addItemListener( xItemListener );
156     return rControlName;
157 }
158 
159 rtl::OUString InsertButton( InformationDialog& rInformationDialog, const OUString& rControlName, Reference< XActionListener >& xActionListener,
160     sal_Int32 nXPos, sal_Int32 nYPos, sal_Int32 nWidth, sal_Int32 nHeight, sal_Int16 nTabIndex, PPPOptimizerTokenEnum nResID )
161 {
162     OUString pNames[] = {
163         TKGet( TK_Enabled ),
164         TKGet( TK_Height ),
165         TKGet( TK_Label ),
166         TKGet( TK_PositionX ),
167         TKGet( TK_PositionY ),
168         TKGet( TK_PushButtonType ),
169         TKGet( TK_Step ),
170         TKGet( TK_TabIndex ),
171         TKGet( TK_Width ) };
172 
173     Any pValues[] = {
174         Any( sal_True ),
175         Any( nHeight ),
176         Any( rInformationDialog.getString( nResID ) ),
177         Any( nXPos ),
178         Any( nYPos ),
179         Any( static_cast< sal_Int16 >( PushButtonType_OK ) ),
180         Any( (sal_Int16)0 ),
181         Any( nTabIndex ),
182         Any( nWidth ) };
183 
184 
185     sal_Int32 nCount = sizeof( pNames ) / sizeof( OUString );
186 
187     Sequence< rtl::OUString >   aNames( pNames, nCount );
188     Sequence< Any >             aValues( pValues, nCount );
189 
190     rInformationDialog.insertButton( rControlName, xActionListener, aNames, aValues );
191     return rControlName;
192 }
193 
194 
195 static OUString ImpValueOfInMB( const sal_Int64& rVal )
196 {
197     double fVal( static_cast<double>( rVal ) );
198     fVal /= ( 1 << 20 );
199     fVal += 0.05;
200     rtl::OUStringBuffer aVal( OUString::valueOf( fVal ) );
201     sal_Int32 nX( OUString( aVal.getStr() ).indexOf( '.', 0 ) );
202     if ( nX > 0 )
203         aVal.setLength( nX + 2 );
204     return aVal.makeStringAndClear();
205 }
206 
207 OUString InformationDialog::ImpGetStandardImage( const OUString& sPrivateURL )
208 {
209     rtl::OUString sURL;
210     try
211     {
212         mxTempFile = Reference< XStream >( mxMSF->getServiceManager()->createInstanceWithContext( OUString::createFromAscii( "com.sun.star.io.TempFile" ), mxMSF ), UNO_QUERY_THROW );
213         Reference< XPropertySet > xPropSet( mxTempFile, UNO_QUERY );
214         Reference< XOutputStream > xOutputStream( mxTempFile->getOutputStream() );
215         if ( xOutputStream.is() && xPropSet.is() )
216         {
217             Reference< graphic::XGraphicProvider > xGraphicProvider( mxMSF->getServiceManager()->createInstanceWithContext(
218                         OUString::createFromAscii( "com.sun.star.graphic.GraphicProvider" ), mxMSF ), UNO_QUERY_THROW );
219             Sequence< PropertyValue > aArgs( 1 );
220             aArgs[ 0 ].Name = OUString::createFromAscii( "URL" );
221             aArgs[ 0 ].Value <<= sPrivateURL;
222             Reference< graphic::XGraphic > xGraphic( xGraphicProvider->queryGraphic( aArgs ) );
223             if ( xGraphic.is() )
224             {
225                 OUString aDestMimeType( RTL_CONSTASCII_USTRINGPARAM( "image/png" ) );
226                 Sequence< PropertyValue > aArgs2( 2 );
227                 aArgs2[ 0 ].Name = TKGet( TK_MimeType );                // the GraphicProvider is using "MimeType", the GraphicExporter "MediaType"...
228                 aArgs2[ 0 ].Value <<= aDestMimeType;
229                 aArgs2[ 1 ].Name = TKGet( TK_OutputStream );
230                 aArgs2[ 1 ].Value <<= xOutputStream;
231                 xGraphicProvider->storeGraphic( xGraphic, aArgs2 );
232             }
233             xPropSet->getPropertyValue( OUString::createFromAscii( "Uri" ) ) >>= sURL;
234         }
235     }
236     catch( Exception& )
237     {
238     }
239     return sURL;
240 }
241 
242 void InformationDialog::InitDialog()
243 {
244     sal_Int32 nDialogHeight = DIALOG_HEIGHT;
245     if ( !maSaveAsURL.getLength() )
246         nDialogHeight -= 22;
247 
248    // setting the dialog properties
249     OUString pNames[] = {
250         TKGet( TK_Closeable ),
251         TKGet( TK_Height ),
252         TKGet( TK_Moveable ),
253         TKGet( TK_PositionX ),
254         TKGet( TK_PositionY ),
255         TKGet( TK_Title ),
256         TKGet( TK_Width ) };
257 
258     Any pValues[] = {
259         Any( sal_True ),
260         Any( nDialogHeight ),
261         Any( sal_True ),
262         Any( sal_Int32( 245 ) ),
263         Any( sal_Int32( 115 ) ),
264         Any( getString( STR_SUN_OPTIMIZATION_WIZARD2 ) ),
265         Any( sal_Int32( DIALOG_WIDTH ) ) };
266 
267     sal_Int32 nCount = sizeof( pNames ) / sizeof( OUString );
268 
269     Sequence< rtl::OUString >   aNames( pNames, nCount );
270     Sequence< Any >             aValues( pValues, nCount );
271 
272     mxDialogModelMultiPropertySet->setPropertyValues( aNames, aValues );
273 
274     sal_Int64 nSource = mnSourceSize;
275     sal_Int64 nDest   = mnDestSize;
276 
277     PPPOptimizerTokenEnum eInfoString( STR_INFO_1 );
278     if ( mnSourceSize )
279     {
280         if ( mnDestSize )
281             eInfoString = STR_INFO_1;
282         else
283         {
284             eInfoString = STR_INFO_2;
285             nDest = mnApproxSize;
286         }
287     }
288     else if ( mnDestSize )
289         eInfoString = STR_INFO_3;
290     else
291     {
292         eInfoString = STR_INFO_4;
293         nDest = mnApproxSize;
294     }
295 
296     rtl::OUString aTitle;
297     if ( maSaveAsURL.getLength() )
298     {
299         Reference< XURLTransformer > xURLTransformer( mxMSF->getServiceManager()->createInstanceWithContext(
300                 OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.util.URLTransformer" ) ), mxMSF ), UNO_QUERY );
301         if ( xURLTransformer.is() )
302         {
303             util::URL aURL, aPresentationURL;
304             aURL.Complete = maSaveAsURL;
305             xURLTransformer->parseSmart( aURL, rtl::OUString() );
306 
307             const OUString sFileProtocol( RTL_CONSTASCII_USTRINGPARAM( "file:///" ) );
308             aPresentationURL.Complete = sFileProtocol.concat( aURL.Name );
309             aTitle = xURLTransformer->getPresentation( aPresentationURL, sal_False );
310 
311             if ( aTitle.match( sFileProtocol, 0 ) )
312                 aTitle = aTitle.replaceAt( 0, sFileProtocol.getLength(), rtl::OUString() );
313         }
314     }
315 
316     OUString aInfoString( getString( eInfoString ) );
317     const OUString aOldSizePlaceholder( RTL_CONSTASCII_USTRINGPARAM( "%OLDFILESIZE" ) );
318     const OUString aNewSizePlaceholder( RTL_CONSTASCII_USTRINGPARAM( "%NEWFILESIZE" ) );
319     const OUString aTitlePlaceholder( aTitle.getLength() ? OUString::createFromAscii( "%TITLE" ) : OUString::createFromAscii( "'%TITLE'" ) );
320 
321     sal_Int32 i = aInfoString.indexOf( aOldSizePlaceholder, 0 );
322     if ( i >= 0 )
323         aInfoString = aInfoString.replaceAt( i, aOldSizePlaceholder.getLength(), ImpValueOfInMB( nSource ) );
324 
325     sal_Int32 j = aInfoString.indexOf( aNewSizePlaceholder, 0 );
326     if ( j >= 0 )
327         aInfoString = aInfoString.replaceAt( j, aNewSizePlaceholder.getLength(), ImpValueOfInMB( nDest ) );
328 
329     sal_Int32 k = aInfoString.indexOf( aTitlePlaceholder, 0 );
330     if ( k >= 0 )
331         aInfoString = aInfoString.replaceAt( k, aTitlePlaceholder.getLength(), aTitle );
332 
333     com::sun::star::uno::Reference< com::sun::star::awt::XItemListener > xItemListener;
334     InsertImage( *this, rtl::OUString( rtl::OUString::createFromAscii( "aboutimage" ) ), ImpGetStandardImage( rtl::OUString::createFromAscii( "private:standardimage/query" ) ), 5, 5, 25, 25 );
335     InsertFixedText( *this, rtl::OUString( rtl::OUString::createFromAscii( "fixedtext" ) ), aInfoString, PAGE_POS_X, 6, PAGE_WIDTH, 24, sal_True, 0 );
336     if ( maSaveAsURL.getLength() )
337         InsertCheckBox(  *this, TKGet( TK_OpenNewDocument ), xItemListener, getString( STR_AUTOMATICALLY_OPEN ), PAGE_POS_X, 42, PAGE_WIDTH, 8, 1 );
338     InsertButton( *this, rtl::OUString( rtl::OUString::createFromAscii( "button" ) ), mxActionListener, DIALOG_WIDTH / 2 - 25, nDialogHeight - 20, 50, 14, 2, STR_OK );
339 
340     sal_Bool bOpenNewDocument = mrbOpenNewDocument;
341     setControlProperty( TKGet( TK_OpenNewDocument ), TKGet( TK_State ), Any( (sal_Int16)bOpenNewDocument ) );
342 }
343 
344 // -----------------------------------------------------------------------------
345 
346 InformationDialog::InformationDialog( const Reference< XComponentContext > &rxMSF, Reference< XFrame >& rxFrame, const rtl::OUString& rSaveAsURL, sal_Bool& rbOpenNewDocument, const sal_Int64& rSourceSize, const sal_Int64& rDestSize, const sal_Int64& rApproxSize ) :
347     UnoDialog( rxMSF, rxFrame ),
348     ConfigurationAccess( rxMSF, NULL ),
349     mxMSF( rxMSF ),
350     mxFrame( rxFrame ),
351     mxActionListener( new OKActionListener( *this ) ),
352     mnSourceSize( rSourceSize ),
353     mnDestSize( rDestSize ),
354     mnApproxSize( rApproxSize ),
355     mrbOpenNewDocument( rbOpenNewDocument ),
356     maSaveAsURL( rSaveAsURL )
357 {
358     Reference< XFrame > xFrame( mxController->getFrame() );
359     Reference< XWindow > xContainerWindow( xFrame->getContainerWindow() );
360     Reference< XWindowPeer > xWindowPeer( xContainerWindow, UNO_QUERY_THROW );
361     createWindowPeer( xWindowPeer );
362 
363     InitDialog();
364 }
365 
366 // -----------------------------------------------------------------------------
367 
368 InformationDialog::~InformationDialog()
369 {
370 }
371 
372 // -----------------------------------------------------------------------------
373 
374 sal_Bool InformationDialog::execute()
375 {
376     UnoDialog::execute();
377 
378     if ( maSaveAsURL.getLength() )
379     {
380         sal_Int16 nInt16 = 0;
381         Any aAny( getControlProperty( TKGet( TK_OpenNewDocument ), TKGet( TK_State ) ) );
382         if ( aAny >>= nInt16 )
383         {
384             sal_Bool bOpenNewDocument = static_cast< sal_Bool >( nInt16 );
385             mrbOpenNewDocument = bOpenNewDocument;
386         }
387     }
388     return mbStatus;
389 }
390 
391 // -----------------------------------------------------------------------------
392 
393 void OKActionListener::actionPerformed( const ActionEvent& rEvent )
394     throw ( com::sun::star::uno::RuntimeException )
395 {
396     if ( rEvent.ActionCommand == rtl::OUString( rtl::OUString::createFromAscii( "button" ) ) )
397     {
398         mrInformationDialog.endExecute( sal_True );
399     }
400 }
401 void OKActionListener::disposing( const ::com::sun::star::lang::EventObject& /* Source */ )
402     throw ( com::sun::star::uno::RuntimeException )
403 {
404 }
405