1  /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sdext.hxx"
30 
31 #include "optimizerdialog.hxx"
32 #include "fileopendialog.hxx"
33 #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
34 #include <com/sun/star/ucb/XSimpleFileAccess.hpp>
35 #include <com/sun/star/io/XInputStream.hpp>
36 #ifndef _COM_SUN_STAR_UTIL_XCloseBroadcaster_HPP_
37 #include <com/sun/star/util/XCloseBroadcaster.hpp>
38 #endif
39 #include <com/sun/star/frame/XComponentLoader.hpp>
40 #include <com/sun/star/frame/XLayoutManager.hpp>
41 #include <osl/time.h>
42 
43 // -------------------
44 // - OPTIMIZERDIALOG -
45 // -------------------
46 
47 using namespace ::rtl;
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::ucb;
52 using namespace ::com::sun::star::uno;
53 using namespace ::com::sun::star::util;
54 using namespace ::com::sun::star::lang;
55 using namespace ::com::sun::star::frame;
56 using namespace ::com::sun::star::beans;
57 using namespace ::com::sun::star::script;
58 using namespace ::com::sun::star::container;
59 
60 
61 // -----------------------------------------------------------------------------
62 
63 void OptimizerDialog::InitDialog()
64 {
65    // setting the dialog properties
66 	OUString pNames[] = {
67 		TKGet( TK_Closeable ),
68 		TKGet( TK_Height ),
69 		TKGet( TK_Moveable ),
70 		TKGet( TK_PositionX ),
71 		TKGet( TK_PositionY ),
72 		TKGet( TK_Title ),
73 		TKGet( TK_Width ) };
74 
75 	Any	pValues[] = {
76 		Any( sal_True ),
77 		Any( sal_Int32( DIALOG_HEIGHT ) ),
78 		Any( sal_True ),
79 		Any( sal_Int32( 200 ) ),
80 		Any( sal_Int32( 52 ) ),
81 		Any( getString( STR_SUN_OPTIMIZATION_WIZARD2 ) ),
82 		Any( sal_Int32( OD_DIALOG_WIDTH ) ) };
83 
84 	sal_Int32 nCount = sizeof( pNames ) / sizeof( OUString );
85 
86 	Sequence< rtl::OUString >	aNames( pNames, nCount );
87 	Sequence< Any >				aValues( pValues, nCount );
88 
89 	mxDialogModelMultiPropertySet->setPropertyValues( aNames, aValues );
90 }
91 
92 // -----------------------------------------------------------------------------
93 
94 void OptimizerDialog::InitRoadmap()
95 {
96 	try
97 	{
98 		OUString pNames[] = {
99 			TKGet( TK_Height ),
100 			TKGet( TK_PositionX ),
101 			TKGet( TK_PositionY ),
102 			TKGet( TK_Step ),
103 			TKGet( TK_TabIndex ),
104 			TKGet( TK_Width ) };
105 
106 		Any	pValues[] = {
107 			Any( sal_Int32( DIALOG_HEIGHT - 26 ) ),
108 			Any( sal_Int32( 0 ) ),
109 			Any( sal_Int32( 0 ) ),
110 			Any( sal_Int32( 0 ) ),
111 			Any( mnTabIndex++ ),
112 			Any( sal_Int32( 85 ) ) };
113 
114 		sal_Int32 nCount = sizeof( pNames ) / sizeof( OUString );
115 
116 		Sequence< rtl::OUString >	aNames( pNames, nCount );
117 		Sequence< Any >				aValues( pValues, nCount );
118 
119         mxRoadmapControlModel = insertControlModel( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.awt.UnoControlRoadmapModel" ) ),
120 															  TKGet( TK_rdmNavi ), aNames, aValues	);
121 
122 		Reference< XPropertySet > xPropertySet( mxRoadmapControlModel, UNO_QUERY_THROW );
123         xPropertySet->setPropertyValue( TKGet( TK_Name ), Any( TKGet( TK_rdmNavi ) ) );
124 		mxRoadmapControl = mxDialogControlContainer->getControl( TKGet( TK_rdmNavi ) );
125 		InsertRoadmapItem( 0, sal_True, getString( STR_INTRODUCTION ), ITEM_ID_INTRODUCTION );
126 		InsertRoadmapItem( 1, sal_True, getString( STR_SLIDES ), ITEM_ID_SLIDES );
127 		InsertRoadmapItem( 2, sal_True, getString( STR_IMAGE_OPTIMIZATION ), ITEM_ID_GRAPHIC_OPTIMIZATION );
128 		InsertRoadmapItem( 3, sal_True, getString( STR_OLE_OBJECTS ), ITEM_ID_OLE_OPTIMIZATION );
129 		InsertRoadmapItem( 4, sal_True, getString( STR_SUMMARY ), ITEM_ID_SUMMARY );
130 
131 		rtl::OUString sBitmapPath( getPath( TK_BitmapPath ) );
132 		rtl::OUString sBitmap( isHighContrast() ? rtl::OUString::createFromAscii( "/minimizepresi_80_h.png" )
133 												: rtl::OUString::createFromAscii( "/minimizepresi_80.png" ) );
134 		rtl::OUString sURL( sBitmapPath += sBitmap );
135 
136 		xPropertySet->setPropertyValue( TKGet( TK_ImageURL ), Any( sURL ) );
137 		xPropertySet->setPropertyValue( TKGet( TK_Activated ), Any( (sal_Bool)sal_True ) );
138 		xPropertySet->setPropertyValue( TKGet( TK_Complete ), Any( (sal_Bool)sal_True ) );
139 		xPropertySet->setPropertyValue( TKGet( TK_CurrentItemID ), Any( (sal_Int16)ITEM_ID_INTRODUCTION ) );
140 		xPropertySet->setPropertyValue( TKGet( TK_Text ), Any( getString( STR_STEPS ) ) );
141 	}
142 	catch( Exception& )
143 	{
144     }
145 }
146 
147 // -----------------------------------------------------------------------------
148 
149 void OptimizerDialog::InsertRoadmapItem( const sal_Int32 nIndex, const sal_Bool bEnabled, const rtl::OUString& rLabel, const sal_Int32 nItemID )
150 {
151 	try
152 	{
153 		Reference< XSingleServiceFactory > xSFRoadmap( mxRoadmapControlModel, UNO_QUERY_THROW );
154 		Reference< XIndexContainer > aIndexContainerRoadmap( mxRoadmapControlModel, UNO_QUERY_THROW );
155 		Reference< XInterface > xRoadmapItem( xSFRoadmap->createInstance(), UNO_QUERY_THROW );
156 		Reference< XPropertySet > xPropertySet( xRoadmapItem, UNO_QUERY_THROW );
157 		xPropertySet->setPropertyValue( TKGet( TK_Label ), Any( rLabel ) );
158 		xPropertySet->setPropertyValue( TKGet( TK_Enabled ), Any( bEnabled ) );
159 		xPropertySet->setPropertyValue( TKGet( TK_ID ), Any( nItemID ) );
160 		aIndexContainerRoadmap->insertByIndex( nIndex, Any( xRoadmapItem ) );
161 	}
162 	catch( Exception& )
163 	{
164 
165 	}
166 }
167 
168 // -----------------------------------------------------------------------------
169 
170 void OptimizerDialog::UpdateConfiguration()
171 {
172 	sal_Int16	nInt16 = 0;
173 	OUString	aString;
174 	Any			aAny;
175 
176 	Sequence< sal_Int16 > aSelectedItems;
177 	Sequence< OUString > aStringItemList;
178 
179 	// page0
180 	aAny = getControlProperty( TKGet( TK_ListBox0Pg0 ), TKGet( TK_SelectedItems ) );
181 	if ( aAny >>= aSelectedItems )
182 	{
183 		if ( aSelectedItems.getLength() )
184 		{
185 			sal_Int16 nSelectedItem = aSelectedItems[ 0 ];
186 			aAny = getControlProperty( TKGet( TK_ListBox0Pg0 ), TKGet( TK_StringItemList ) );
187 			if ( aAny >>= aStringItemList )
188 			{
189 				if ( aStringItemList.getLength() > nSelectedItem )
190 					SetConfigProperty( TK_Name, Any( aStringItemList[ nSelectedItem ] ) );
191 			}
192 		}
193 	}
194 
195 	aAny = getControlProperty( TKGet( TK_CheckBox3Pg3 ), TKGet( TK_State ) );
196 	if ( aAny >>= nInt16 )
197 	{
198 		if ( nInt16 )
199 		{
200 			aAny = getControlProperty( TKGet( TK_ListBox0Pg3 ), TKGet( TK_SelectedItems ) );
201 			if ( aAny >>= aSelectedItems )
202 			{
203 				if ( aSelectedItems.getLength() )
204 				{
205 					sal_Int16 nSelectedItem = aSelectedItems[ 0 ];
206 					aAny = getControlProperty( TKGet( TK_ListBox0Pg3 ), TKGet( TK_StringItemList ) );
207 					if ( aAny >>= aStringItemList )
208 					{
209 						if ( aStringItemList.getLength() > nSelectedItem )
210 							SetConfigProperty( TK_CustomShowName, Any( aStringItemList[ nSelectedItem ] ) );
211 					}
212 				}
213 			}
214 		}
215 	}
216 }
217 
218 // -----------------------------------------------------------------------------
219 
220 OptimizerDialog::OptimizerDialog( const Reference< XComponentContext > &rxMSF, Reference< XFrame >& rxFrame, Reference< XDispatch > rxStatusDispatcher ) :
221 	UnoDialog( rxMSF, rxFrame ),
222 	ConfigurationAccess( rxMSF, NULL ),
223 	mnCurrentStep( 0 ),
224 	mnTabIndex( 0 ),
225 	mxMSF( rxMSF ),
226 	mxFrame( rxFrame ),
227 	mxItemListener( new ItemListener( *this ) ),
228 	mxActionListener( new ActionListener( *this ) ),
229 	mxActionListenerListBox0Pg0( new ActionListenerListBox0Pg0( *this ) ),
230 	mxTextListenerFormattedField0Pg1( new TextListenerFormattedField0Pg1( *this ) ),
231 	mxTextListenerComboBox0Pg1( new TextListenerComboBox0Pg1( *this ) ),
232 	mxSpinListenerFormattedField0Pg1( new SpinListenerFormattedField0Pg1( *this ) ),
233 	mxStatusDispatcher( rxStatusDispatcher )
234 {
235 	Reference< XStorable > xStorable( mxController->getModel(), UNO_QUERY_THROW );
236 	mbIsReadonly = xStorable->isReadonly();
237 
238 	InitDialog();
239 	InitRoadmap();
240 	InitNavigationBar();
241 	InitPage0();
242 	InitPage1();
243 	InitPage2();
244 	InitPage3();
245 	InitPage4();
246 	ActivatePage( 0 );
247 
248 	OptimizationStats aStats;
249 	aStats.InitializeStatusValuesFromDocument( mxController->getModel() );
250 	Sequence< PropertyValue > aStatusSequence( aStats.GetStatusSequence() );
251 	UpdateStatus( aStatusSequence );
252 }
253 
254 // -----------------------------------------------------------------------------
255 
256 OptimizerDialog::~OptimizerDialog()
257 {
258 	// not saving configuration if the dialog has been finished via cancel or close window
259 	if ( mbStatus )
260 		SaveConfiguration();
261 }
262 
263 // -----------------------------------------------------------------------------
264 
265 sal_Bool OptimizerDialog::execute()
266 {
267 	Reference< XItemEventBroadcaster > maRoadmapBroadcaster( mxRoadmapControl, UNO_QUERY_THROW );
268 	maRoadmapBroadcaster->addItemListener( mxItemListener );
269 	UnoDialog::execute();
270 	UpdateConfiguration();			// taking actual control settings for the configuration
271 	maRoadmapBroadcaster->removeItemListener( mxItemListener );
272 	return mbStatus;
273 }
274 
275 // -----------------------------------------------------------------------------
276 
277 void OptimizerDialog::SwitchPage( sal_Int16 nNewStep )
278 {
279 	if ( ( nNewStep != mnCurrentStep ) && ( ( nNewStep <= MAX_STEP ) || ( nNewStep >= 0 ) ) )
280 	{
281 		sal_Int16 nOldStep = mnCurrentStep;
282 		if ( nNewStep == 0 )
283 			disableControl( TKGet( TK_btnNavBack ) );
284 		else if ( nOldStep == 0 )
285 			enableControl( TKGet( TK_btnNavBack ) );
286 
287 		if ( nNewStep == MAX_STEP )
288 			disableControl( TKGet( TK_btnNavNext ) );
289 		else if ( nOldStep == MAX_STEP )
290 			enableControl( TKGet( TK_btnNavNext ) );
291 
292 		setControlProperty( TKGet( TK_rdmNavi ), TKGet( TK_CurrentItemID ), Any( nNewStep ) );
293 
294 		DeactivatePage( nOldStep );
295 		UpdateControlStates( nNewStep );
296 
297 		ActivatePage( nNewStep );
298 		mnCurrentStep = nNewStep;
299 	}
300 }
301 
302 void OptimizerDialog::UpdateControlStates( sal_Int16 nPage )
303 {
304 	switch( nPage )
305 	{
306 		case 0 : UpdateControlStatesPage0(); break;
307 		case 1 : UpdateControlStatesPage1(); break;
308 		case 2 : UpdateControlStatesPage2(); break;
309 		case 3 : UpdateControlStatesPage3(); break;
310 		case 4 : UpdateControlStatesPage4(); break;
311 		default:
312 		{
313 			UpdateControlStatesPage0();
314 			UpdateControlStatesPage1();
315 			UpdateControlStatesPage2();
316 			UpdateControlStatesPage3();
317 			UpdateControlStatesPage4();
318 		}
319 	}
320 }
321 
322 // -----------------------------------------------------------------------------
323 
324 rtl::OUString OptimizerDialog::GetSelectedString( const PPPOptimizerTokenEnum eToken )
325 {
326 	OUString aSelectedItem;
327 	Sequence< sal_Int16 > sSelectedItems;
328 	Sequence< OUString >  sItemList;
329 
330 	if ( ( getControlProperty( TKGet( eToken ), TKGet( TK_SelectedItems ) ) >>= sSelectedItems ) &&
331 			( getControlProperty( TKGet( eToken ), TKGet( TK_StringItemList ) ) >>= sItemList ) )
332 	{
333 		if ( sSelectedItems.getLength() == 1 )
334 		{
335 			sal_Int16 nSelectedItem = sSelectedItems[ 0 ];
336 			if ( nSelectedItem < sItemList.getLength() )
337 				aSelectedItem = sItemList[ nSelectedItem ];
338 		}
339 	}
340 	return aSelectedItem;
341 }
342 
343 // -----------------------------------------------------------------------------
344 
345 void OptimizerDialog::UpdateStatus( const com::sun::star::uno::Sequence< com::sun::star::beans::PropertyValue >& rStatus )
346 {
347 	if ( mxReschedule.is() )
348 	{
349 		maStats.InitializeStatusValues( rStatus );
350 		const Any* pVal( maStats.GetStatusValue( TK_Status ) );
351 		if ( pVal )
352 		{
353 			rtl::OUString sStatus;
354 			if ( *pVal >>= sStatus )
355 			{
356 				setControlProperty( TKGet( TK_FixedText1Pg4 ), TKGet( TK_Enabled ), Any( sal_True ) );
357 				setControlProperty( TKGet( TK_FixedText1Pg4 ), TKGet( TK_Label ), Any( getString( TKGet( sStatus ) ) ) );
358 			}
359 		}
360 		pVal = maStats.GetStatusValue( TK_Progress );
361 		if ( pVal )
362 		{
363 			sal_Int32 nProgress = 0;
364 			if ( *pVal >>= nProgress )
365 				setControlProperty( TKGet( TK_Progress ), TKGet( TK_ProgressValue ), Any( nProgress ) );
366 		}
367 		pVal = maStats.GetStatusValue( TK_OpenNewDocument );
368 		if ( pVal )
369 			SetConfigProperty( TK_OpenNewDocument, *pVal );
370 
371 		mxReschedule->reschedule();
372 	}
373 }
374 
375 // -----------------------------------------------------------------------------
376 
377 void ItemListener::itemStateChanged( const ItemEvent& Event )
378 	throw ( RuntimeException )
379 {
380 	try
381 	{
382 		sal_Int16 nState;
383 		OUString aControlName;
384 		Reference< XControl > xControl;
385 		Any aSource( Event.Source );
386 		if ( aSource >>= xControl )
387 		{
388 			Reference< XPropertySet > xPropertySet( xControl->getModel(), UNO_QUERY_THROW );
389 			xPropertySet->getPropertyValue( TKGet( TK_Name ) ) >>= aControlName;
390 			PPPOptimizerTokenEnum eControl( TKGet( aControlName ) );
391 			switch( eControl )
392 			{
393 				case TK_rdmNavi :
394 				{
395 					mrOptimizerDialog.SwitchPage( static_cast< sal_Int16 >( Event.ItemId ) );
396 				}
397 				break;
398 				case TK_CheckBox1Pg1 :
399 				{
400 					if ( xPropertySet->getPropertyValue( TKGet( TK_State ) ) >>= nState )
401 						mrOptimizerDialog.SetConfigProperty( TK_RemoveCropArea, Any( nState != 0 ) );
402 				}
403 				break;
404 				case TK_CheckBox2Pg1 :
405 				{
406 					if ( xPropertySet->getPropertyValue( TKGet( TK_State ) ) >>= nState )
407 						mrOptimizerDialog.SetConfigProperty( TK_EmbedLinkedGraphics, Any( nState != 0 ) );
408 				}
409 				break;
410 				case TK_CheckBox0Pg2 :
411 				{
412 					if ( xPropertySet->getPropertyValue( TKGet( TK_State ) ) >>= nState )
413 					{
414 						mrOptimizerDialog.SetConfigProperty( TK_OLEOptimization, Any( nState != 0 ) );
415 						mrOptimizerDialog.setControlProperty( TKGet( TK_RadioButton0Pg2 ), TKGet( TK_Enabled ), Any( nState != 0 ) );
416 						mrOptimizerDialog.setControlProperty( TKGet( TK_RadioButton1Pg2 ), TKGet( TK_Enabled ), Any( nState != 0 ) );
417 					}
418 				}
419 				break;
420 				case TK_RadioButton0Pg1 :
421 				{
422 					sal_Int16 nInt16 = 0;
423 					if ( xPropertySet->getPropertyValue( TKGet( TK_State ) ) >>= nInt16 )
424 					{
425 						nInt16 ^= 1;
426 						mrOptimizerDialog.SetConfigProperty( TK_JPEGCompression, Any( nInt16 != 0 ) );
427 						mrOptimizerDialog.setControlProperty( TKGet( TK_FixedText1Pg1 ), TKGet( TK_Enabled ), Any( nInt16 != 0 ) );
428 						mrOptimizerDialog.setControlProperty( TKGet( TK_FormattedField0Pg1 ), TKGet( TK_Enabled ), Any( nInt16 != 0 ) );
429 					}
430 				}
431 				break;
432 				case TK_RadioButton1Pg1 :
433 				{
434 					if ( xPropertySet->getPropertyValue( TKGet( TK_State ) ) >>= nState )
435 					{
436 						mrOptimizerDialog.SetConfigProperty( TK_JPEGCompression, Any( nState != 0 ) );
437 						mrOptimizerDialog.setControlProperty( TKGet( TK_FixedText1Pg1 ), TKGet( TK_Enabled ), Any( nState != 0 ) );
438 						mrOptimizerDialog.setControlProperty( TKGet( TK_FormattedField0Pg1 ), TKGet( TK_Enabled ), Any( nState != 0 ) );
439 					}
440 				}
441 				break;
442 				case TK_RadioButton0Pg2 :
443 				{
444 					sal_Int16 nInt16;
445 					if ( xPropertySet->getPropertyValue( TKGet( TK_State ) ) >>= nInt16 )
446 					{
447 						nInt16 ^= 1;
448 						mrOptimizerDialog.SetConfigProperty( TK_OLEOptimizationType, Any( nInt16 ) );
449 					}
450 				}
451 				break;
452 				case TK_RadioButton1Pg2 :
453 				{
454 					if ( xPropertySet->getPropertyValue( TKGet( TK_State ) ) >>= nState )
455 						mrOptimizerDialog.SetConfigProperty( TK_OLEOptimizationType, Any( nState ) );
456 				}
457 				break;
458 				case TK_CheckBox0Pg3 :
459 				{
460 					if ( xPropertySet->getPropertyValue( TKGet( TK_State ) ) >>= nState )
461 						mrOptimizerDialog.SetConfigProperty( TK_DeleteUnusedMasterPages, Any( nState != 0 ) );
462 				}
463 				break;
464 				case TK_CheckBox1Pg3 :
465 				{
466 					if ( xPropertySet->getPropertyValue( TKGet( TK_State ) ) >>= nState )
467 						mrOptimizerDialog.SetConfigProperty( TK_DeleteNotesPages, Any( nState != 0 ) );
468 				}
469 				break;
470 				case TK_CheckBox2Pg3 :
471 				{
472 					if ( xPropertySet->getPropertyValue( TKGet( TK_State ) ) >>= nState )
473 						mrOptimizerDialog.SetConfigProperty( TK_DeleteHiddenSlides, Any( nState != 0 ) );
474 				}
475 				break;
476 				case TK_CheckBox3Pg3 :
477 				{
478 					if ( xPropertySet->getPropertyValue( TKGet( TK_State ) ) >>= nState )
479 						mrOptimizerDialog.setControlProperty( TKGet( TK_ListBox0Pg3 ), TKGet( TK_Enabled ), Any( nState != 0 ) );
480 				}
481 				break;
482 				case TK_CheckBox1Pg4 :
483 				{
484 					if ( xPropertySet->getPropertyValue( TKGet( TK_State ) ) >>= nState )
485 						mrOptimizerDialog.setControlProperty( TKGet( TK_ComboBox0Pg4 ), TKGet( TK_Enabled ), Any( nState != 0 ) );
486 				}
487 				break;
488 				case TK_RadioButton0Pg4 :
489 				case TK_RadioButton1Pg4 :
490 				{
491 					if ( xPropertySet->getPropertyValue( TKGet( TK_State ) ) >>= nState )
492 						mrOptimizerDialog.SetConfigProperty( TK_SaveAs, Any( eControl == TK_RadioButton1Pg4 ? nState != 0 : nState == 0 ) );
493 				}
494 				break;
495 				default:
496 				break;
497 			}
498 		}
499 	}
500 	catch ( Exception& )
501 	{
502 
503 	}
504 }
505 void ItemListener::disposing( const ::com::sun::star::lang::EventObject& /* Source */ )
506 	throw ( com::sun::star::uno::RuntimeException )
507 {
508 }
509 
510 // -----------------------------------------------------------------------------
511 
512 void ActionListener::actionPerformed( const ActionEvent& rEvent )
513 	throw ( com::sun::star::uno::RuntimeException )
514 {
515 	switch( TKGet( rEvent.ActionCommand ) )
516 	{
517 		case TK_btnNavHelp :
518 		{
519 			try
520 			{
521 				static Reference< XFrame > xHelpFrame;
522 				if ( !xHelpFrame.is() )
523 				{
524 					rtl::OUString sHelpFile( mrOptimizerDialog.getPath( TK_HelpFile ) );
525 					Reference< XDesktop > desktop( mrOptimizerDialog.GetComponentContext()->getServiceManager()->createInstanceWithContext(
526 							OUString::createFromAscii( "com.sun.star.frame.Desktop" ), mrOptimizerDialog.GetComponentContext() ), UNO_QUERY_THROW );
527 					Reference< XSimpleFileAccess > xSimpleFileAccess( mrOptimizerDialog.GetComponentContext()->getServiceManager()->createInstanceWithContext(
528 							OUString::createFromAscii( "com.sun.star.ucb.SimpleFileAccess" ), mrOptimizerDialog.GetComponentContext() ), UNO_QUERY_THROW );
529 					Reference< XInputStream > xInputStream( xSimpleFileAccess->openFileRead( sHelpFile ) );
530 					Reference< XDesktop > xDesktop( mrOptimizerDialog.GetComponentContext()->getServiceManager()->createInstanceWithContext(
531 							OUString::createFromAscii( "com.sun.star.frame.Desktop" ), mrOptimizerDialog.GetComponentContext() ), UNO_QUERY_THROW );
532 					Reference< XFrame > xDesktopFrame( xDesktop, UNO_QUERY_THROW );
533 					xHelpFrame = Reference< XFrame >( xDesktopFrame->findFrame( TKGet( TK__blank ), 0 ) );
534 					Reference< XCloseBroadcaster > xCloseBroadcaster( xHelpFrame, UNO_QUERY_THROW );
535 					xCloseBroadcaster->addCloseListener( new HelpCloseListener( xHelpFrame ) );
536 					Reference< XComponentLoader > xLoader( xHelpFrame, UNO_QUERY_THROW );
537 
538 					Sequence< PropertyValue > aLoadProps( 2 );
539 					aLoadProps[ 0 ].Name = TKGet( TK_ReadOnly );
540 					aLoadProps[ 0 ].Value <<= (sal_Bool)( sal_True );
541 					aLoadProps[ 1 ].Name = TKGet( TK_InputStream );
542 					aLoadProps[ 1 ].Value <<= xInputStream;
543 
544 					Reference< XComponent >( xLoader->loadComponentFromURL( OUString::createFromAscii( "private:stream" ),
545 						TKGet( TK__self ), 0, aLoadProps ) );
546 
547 					Reference< XPropertySet > xPropSet( xHelpFrame, UNO_QUERY_THROW );
548 					Reference< XLayoutManager > xLayoutManager;
549 					if ( xPropSet->getPropertyValue( OUString::createFromAscii( "LayoutManager" ) ) >>= xLayoutManager )
550 					{
551 						xLayoutManager->setVisible( sal_False );
552 						xLayoutManager->hideElement( OUString::createFromAscii( "private:resource/menubar/menubar" ) );
553 						xLayoutManager->destroyElement( OUString::createFromAscii( "private:resource/statusbar/statusbar" ) );
554 					}
555 				}
556 			}
557 			catch( Exception& )
558 			{
559 
560 			}
561 		}
562 		break;
563 		case TK_btnNavBack :	mrOptimizerDialog.SwitchPage( mrOptimizerDialog.mnCurrentStep - 1 ); break;
564 		case TK_btnNavNext :	mrOptimizerDialog.SwitchPage( mrOptimizerDialog.mnCurrentStep + 1 ); break;
565 		case TK_btnNavFinish :
566 		{
567 			mrOptimizerDialog.UpdateConfiguration();
568 
569 			mrOptimizerDialog.SwitchPage( ITEM_ID_SUMMARY );
570 			mrOptimizerDialog.DisablePage( ITEM_ID_SUMMARY );
571 			mrOptimizerDialog.setControlProperty( TKGet( TK_btnNavHelp ), TKGet( TK_Enabled ), Any( sal_False ) );
572 			mrOptimizerDialog.setControlProperty( TKGet( TK_btnNavBack ), TKGet( TK_Enabled ), Any( sal_False ) );
573 			mrOptimizerDialog.setControlProperty( TKGet( TK_btnNavNext ), TKGet( TK_Enabled ), Any( sal_False ) );
574 			mrOptimizerDialog.setControlProperty( TKGet( TK_btnNavFinish ), TKGet( TK_Enabled ), Any( sal_False ) );
575 			mrOptimizerDialog.setControlProperty( TKGet( TK_btnNavCancel ), TKGet( TK_Enabled ), Any( sal_False ) );
576 			mrOptimizerDialog.setControlProperty( TKGet( TK_FixedText0Pg4 ), TKGet( TK_Enabled ), Any( sal_True ) );
577 
578 			// check if we have to open the FileDialog
579 			sal_Bool	bSuccessfullyExecuted = sal_True;
580 			sal_Int16	nInt16 = 0;
581 			mrOptimizerDialog.getControlProperty( TKGet( TK_RadioButton1Pg4 ), TKGet( TK_State ) ) >>= nInt16;
582 			if ( nInt16 )
583 			{
584 				rtl::OUString aSaveAsURL;
585 				FileOpenDialog aFileOpenDialog( ((UnoDialog&)mrOptimizerDialog).mxMSF );
586 
587 				// generating default file name
588 				Reference< XStorable > xStorable( mrOptimizerDialog.mxController->getModel(), UNO_QUERY );
589 				if ( xStorable.is() && xStorable->hasLocation() )
590 				{
591 					rtl::OUString aLocation( xStorable->getLocation() );
592 					if ( aLocation.getLength() )
593 					{
594 						sal_Int32 nIndex = aLocation.lastIndexOf( '/', aLocation.getLength() - 1 );
595 						if ( nIndex >= 0 )
596 						{
597 							if ( nIndex < aLocation.getLength() - 1 )
598 								aLocation = aLocation.copy( nIndex + 1 );
599 
600 							// remove extension
601 							nIndex = aLocation.lastIndexOf( '.', aLocation.getLength() - 1 );
602 							if ( nIndex >= 0 )
603 								aLocation = aLocation.copy( 0, nIndex );
604 
605 							// adding .mini
606 							aLocation = aLocation.concat( OUString::createFromAscii( ".mini" ) );
607 							aFileOpenDialog.setDefaultName( aLocation );
608 						}
609 					}
610 				}
611  				sal_Bool bDialogExecuted = aFileOpenDialog.execute() == dialogs::ExecutableDialogResults::OK;
612 				if ( bDialogExecuted )
613 				{
614 					aSaveAsURL = aFileOpenDialog.getURL();
615 					mrOptimizerDialog.SetConfigProperty( TK_SaveAsURL, Any( aSaveAsURL ) );
616 					mrOptimizerDialog.SetConfigProperty( TK_FilterName, Any( aFileOpenDialog.getFilterName() ) );
617 				}
618 				if ( !aSaveAsURL.getLength() )
619 				{
620 					// something goes wrong...
621 					bSuccessfullyExecuted = sal_False;
622 				}
623 
624 				// waiting for 500ms
625 				if ( mrOptimizerDialog.mxReschedule.is() )
626 				{
627 					mrOptimizerDialog.mxReschedule->reschedule();
628 					for ( sal_uInt32 i = osl_getGlobalTimer(); ( i + 500 ) > ( osl_getGlobalTimer() ); )
629 					mrOptimizerDialog.mxReschedule->reschedule();
630 				}
631 			}
632 			if ( bSuccessfullyExecuted )
633 			{	// now check if we have to store a session template
634 				nInt16 = 0;
635 				OUString aSettingsName;
636 				mrOptimizerDialog.getControlProperty( TKGet( TK_CheckBox1Pg4 ), TKGet( TK_State ) ) >>= nInt16;
637 				mrOptimizerDialog.getControlProperty( TKGet( TK_ComboBox0Pg4 ), TKGet( TK_Text ) ) >>= aSettingsName;
638 				if ( nInt16 && aSettingsName.getLength() )
639 				{
640 					std::vector< OptimizerSettings >::iterator aIter( mrOptimizerDialog.GetOptimizerSettingsByName( aSettingsName ) );
641 					std::vector< OptimizerSettings >& rSettings( mrOptimizerDialog.GetOptimizerSettings() );
642 					OptimizerSettings aNewSettings( rSettings[ 0 ] );
643 					aNewSettings.maName = aSettingsName;
644 					if ( aIter == rSettings.end() )
645 						rSettings.push_back( aNewSettings );
646 					else
647 						*aIter = aNewSettings;
648 				}
649 			}
650 			if ( bSuccessfullyExecuted )
651 			{
652 				Sequence< Any > aArgs( 1 );
653 				aArgs[ 0 ] <<= mrOptimizerDialog.GetFrame();
654 
655 				Reference < XDispatch > xDispatch( mrOptimizerDialog.GetComponentContext()->getServiceManager()->createInstanceWithArgumentsAndContext(
656 					OUString::createFromAscii( "com.sun.star.comp.PPPOptimizer" ), aArgs, mrOptimizerDialog.GetComponentContext() ), UNO_QUERY );
657 
658 				URL aURL;
659 				aURL.Protocol = OUString( RTL_CONSTASCII_USTRINGPARAM( "vnd.com.sun.star.comp.PPPOptimizer:" ) );
660 				aURL.Path = OUString( RTL_CONSTASCII_USTRINGPARAM( "optimize" ) );
661 
662 				Sequence< PropertyValue > lArguments( 3 );
663 				lArguments[ 0 ].Name = TKGet( TK_Settings );
664 				lArguments[ 0 ].Value <<= mrOptimizerDialog.GetConfigurationSequence();
665 				lArguments[ 1 ].Name = TKGet( TK_StatusDispatcher );
666 				lArguments[ 1 ].Value <<= mrOptimizerDialog.GetStatusDispatcher();
667 				lArguments[ 2 ].Name = TKGet( TK_InformationDialog );
668 				lArguments[ 2 ].Value <<= mrOptimizerDialog.GetFrame();
669 
670 				if( xDispatch.is() )
671 					xDispatch->dispatch( aURL, lArguments );
672 
673 				mrOptimizerDialog.endExecute( bSuccessfullyExecuted );
674 			}
675 			else
676 			{
677 				mrOptimizerDialog.setControlProperty( TKGet( TK_btnNavHelp ), TKGet( TK_Enabled ), Any( sal_True ) );
678 				mrOptimizerDialog.setControlProperty( TKGet( TK_btnNavBack ), TKGet( TK_Enabled ), Any( sal_True ) );
679 				mrOptimizerDialog.setControlProperty( TKGet( TK_btnNavNext ), TKGet( TK_Enabled ), Any( sal_False ) );
680 				mrOptimizerDialog.setControlProperty( TKGet( TK_btnNavFinish ), TKGet( TK_Enabled ), Any( sal_True ) );
681 				mrOptimizerDialog.setControlProperty( TKGet( TK_btnNavCancel ), TKGet( TK_Enabled ), Any( sal_True ) );
682 				mrOptimizerDialog.EnablePage( ITEM_ID_SUMMARY );
683 			}
684 		}
685 		break;
686 		case TK_btnNavCancel :	mrOptimizerDialog.endExecute( sal_False ); break;
687 		case TK_Button0Pg0 :	// delete configuration
688 		{
689 			OUString aSelectedItem( mrOptimizerDialog.GetSelectedString( TK_ListBox0Pg0 ) );
690 			if ( aSelectedItem.getLength() )
691 			{
692 				std::vector< OptimizerSettings >::iterator aIter( mrOptimizerDialog.GetOptimizerSettingsByName( aSelectedItem ) );
693 				std::vector< OptimizerSettings >& rList( mrOptimizerDialog.GetOptimizerSettings() );
694 				if ( aIter != rList.end() )
695 				{
696 					rList.erase( aIter );
697 					mrOptimizerDialog.UpdateControlStates();
698 				}
699 			}
700 		}
701 		break;
702 		default: break;
703 	}
704 }
705 void ActionListener::disposing( const ::com::sun::star::lang::EventObject& /* Source */ )
706 	throw ( com::sun::star::uno::RuntimeException )
707 {
708 }
709 
710 // -----------------------------------------------------------------------------
711 
712 void ActionListenerListBox0Pg0::actionPerformed( const ActionEvent& rEvent )
713 	throw ( com::sun::star::uno::RuntimeException )
714 {
715 	if ( rEvent.ActionCommand.getLength() )
716 	{
717 		std::vector< OptimizerSettings >::iterator aIter( mrOptimizerDialog.GetOptimizerSettingsByName( rEvent.ActionCommand ) );
718 		std::vector< OptimizerSettings >& rList( mrOptimizerDialog.GetOptimizerSettings() );
719 		if ( aIter != rList.end() )
720 			rList[ 0 ] = *aIter;
721 	}
722 	mrOptimizerDialog.UpdateControlStates();
723 }
724 void ActionListenerListBox0Pg0::disposing( const ::com::sun::star::lang::EventObject& /* Source */ )
725 	throw ( com::sun::star::uno::RuntimeException )
726 {
727 }
728 
729 // -----------------------------------------------------------------------------
730 
731 void TextListenerFormattedField0Pg1::textChanged( const TextEvent& /* rEvent */ )
732 	throw ( com::sun::star::uno::RuntimeException )
733 {
734 	double fDouble = 0;
735 	Any aAny = mrOptimizerDialog.getControlProperty( TKGet( TK_FormattedField0Pg1 ), TKGet( TK_EffectiveValue ) );
736 	if ( aAny >>= fDouble )
737 		mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( (sal_Int32)fDouble ) );
738 }
739 void TextListenerFormattedField0Pg1::disposing( const ::com::sun::star::lang::EventObject& /* Source */ )
740 	throw ( com::sun::star::uno::RuntimeException )
741 {
742 }
743 
744 // -----------------------------------------------------------------------------
745 
746 void TextListenerComboBox0Pg1::textChanged( const TextEvent& /* rEvent */ )
747 	throw ( com::sun::star::uno::RuntimeException )
748 {
749 	rtl::OUString aString;
750 	Any aAny = mrOptimizerDialog.getControlProperty( TKGet( TK_ComboBox0Pg1 ), TKGet( TK_Text ) );
751 	if ( aAny >>= aString )
752 	{
753 		sal_Int32 nI0, nI1, nI2, nI3, nI4;
754 		nI0 = nI1 = nI2 = nI3 = nI4 = 0;
755 
756 		if ( mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_0 ).getToken( 1, ';', nI0 ) == aString )
757 			aString = mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_0 ).getToken( 0, ';', nI4 );
758 		else if ( mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_1 ).getToken( 1, ';', nI1 ) == aString )
759 			aString = mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_1 ).getToken( 0, ';', nI4 );
760 		else if ( mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_2 ).getToken( 1, ';', nI2 ) == aString )
761 			aString = mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_2 ).getToken( 0, ';', nI4 );
762 		else if ( mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_3 ).getToken( 1, ';', nI3 ) == aString )
763 			aString = mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_3 ).getToken( 0, ';', nI4 );
764 
765 		mrOptimizerDialog.SetConfigProperty( TK_ImageResolution, Any( aString.toInt32() ) );
766 	}
767 }
768 void TextListenerComboBox0Pg1::disposing( const ::com::sun::star::lang::EventObject& /* Source */ )
769 	throw ( com::sun::star::uno::RuntimeException )
770 {
771 }
772 
773 // -----------------------------------------------------------------------------
774 
775 void SpinListenerFormattedField0Pg1::up( const SpinEvent& /* rEvent */ )
776 	throw ( com::sun::star::uno::RuntimeException )
777 {
778 	double fDouble;
779 	Any aAny = mrOptimizerDialog.getControlProperty( TKGet( TK_FormattedField0Pg1 ), TKGet( TK_EffectiveValue ) );
780 	if ( aAny >>= fDouble )
781 	{
782 		fDouble += 9;
783 		if ( fDouble > 100 )
784 			fDouble = 100;
785 		mrOptimizerDialog.setControlProperty( TKGet( TK_FormattedField0Pg1 ), TKGet( TK_EffectiveValue ), Any( fDouble ) );
786 		mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( (sal_Int32)fDouble ) );
787 	}
788 }
789 void SpinListenerFormattedField0Pg1::down( const SpinEvent& /* rEvent */ )
790 	throw ( com::sun::star::uno::RuntimeException )
791 {
792 	double fDouble;
793 	Any aAny = mrOptimizerDialog.getControlProperty( TKGet( TK_FormattedField0Pg1 ), TKGet( TK_EffectiveValue ) );
794 	if ( aAny >>= fDouble )
795 	{
796 		fDouble -= 9;
797 		if ( fDouble < 0 )
798 			fDouble = 0;
799 		mrOptimizerDialog.setControlProperty( TKGet( TK_FormattedField0Pg1 ), TKGet( TK_EffectiveValue ), Any( fDouble ) );
800 		mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( (sal_Int32)fDouble ) );
801 	}
802 }
803 void SpinListenerFormattedField0Pg1::first( const SpinEvent& /* rEvent */ )
804 	throw ( com::sun::star::uno::RuntimeException )
805 {
806 	mrOptimizerDialog.setControlProperty( TKGet( TK_FormattedField0Pg1 ), TKGet( TK_EffectiveValue ), Any( static_cast< double >( 0 ) ) );
807 	mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( (sal_Int32)0 ) );
808 }
809 void SpinListenerFormattedField0Pg1::last( const SpinEvent& /* rEvent */ )
810 	throw ( com::sun::star::uno::RuntimeException )
811 {
812 	mrOptimizerDialog.setControlProperty( TKGet( TK_FormattedField0Pg1 ), TKGet( TK_EffectiveValue ), Any( static_cast< double >( 100 ) ) );
813 	mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( (sal_Int32)100 ) );
814 }
815 void SpinListenerFormattedField0Pg1::disposing( const ::com::sun::star::lang::EventObject& /* Source */ )
816 	throw ( com::sun::star::uno::RuntimeException )
817 {
818 }
819 
820 // -----------------------------------------------------------------------------
821 
822 void HelpCloseListener::addCloseListener( const Reference < XCloseListener >& ) throw( RuntimeException )
823 {
824 }
825 void HelpCloseListener::removeCloseListener( const Reference < XCloseListener >& ) throw( RuntimeException )
826 {
827 }
828 void HelpCloseListener::queryClosing( const EventObject&, sal_Bool /* bDeliverOwnership */ )
829         throw ( RuntimeException, CloseVetoException )
830 {
831 }
832 void HelpCloseListener::notifyClosing( const EventObject& )
833         throw ( RuntimeException )
834 {
835 }
836 void HelpCloseListener::disposing( const EventObject& ) throw ( RuntimeException )
837 {
838     mrXFrame = NULL;
839 }
840