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