    /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
    /*
     * This file is part of the LibreOffice project.
     *
     * This Source Code Form is subject to the terms of the Mozilla Public
     * License, v. 2.0. If a copy of the MPL was not distributed with this
     * file, You can obtain one at http://mozilla.org/MPL/2.0/.
     *
     * This file incorporates work covered by the following license notice:
     *
     *   Licensed to the Apache Software Foundation (ASF) under one or more
     *   contributor license agreements. See the NOTICE file distributed
     *   with this work for additional information regarding copyright
     *   ownership. The ASF licenses this file to you under the Apache
     *   License, Version 2.0 (the "License"); you may not use this file
     *   except in compliance with the License. You may obtain a copy of
     *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
     */

    #include "optimizerdialog.hxx"
    #include "impoptimizer.hxx"
    #include "fileopendialog.hxx"
    #include "errordialog.hxx"
    #include <com/sun/star/frame/XStorable.hpp>
    #include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
    #include <com/sun/star/ucb/XSimpleFileAccess.hpp>
    #include <com/sun/star/io/XInputStream.hpp>
    #include <com/sun/star/io/IOException.hpp>
    #include <com/sun/star/util/XCloseBroadcaster.hpp>
    #include <sal/macros.h>
    #include <osl/time.h>
    #include <tools/urlobj.hxx>
    #include <bitmaps.hlst>

    using namespace ::com::sun::star::io;
    using namespace ::com::sun::star::ui;
    using namespace ::com::sun::star::awt;
    using namespace ::com::sun::star::ucb;
    using namespace ::com::sun::star::uno;
    using namespace ::com::sun::star::util;
    using namespace ::com::sun::star::lang;
    using namespace ::com::sun::star::frame;
    using namespace ::com::sun::star::beans;
    using namespace ::com::sun::star::container;

    void OptimizerDialog::InitDialog()
    {
       // setting the dialog properties
        OUString pNames[] = {
            OUString("Closeable"),
            OUString("Height"),
            OUString("Moveable"),
            OUString("PositionX"),
            OUString("PositionY"),
            OUString("Title"),
            OUString("Width") };

        Any pValues[] = {
            Any( true ),
            Any( sal_Int32( DIALOG_HEIGHT ) ),
            Any( true ),
            Any( sal_Int32( 200 ) ),
            Any( sal_Int32( 52 ) ),
            Any( getString( STR_SUN_OPTIMIZATION_WIZARD2 ) ),
            Any( sal_Int32( OD_DIALOG_WIDTH ) ) };

        sal_Int32 nCount = SAL_N_ELEMENTS( pNames );

        Sequence< OUString >   aNames( pNames, nCount );
        Sequence< Any >             aValues( pValues, nCount );

        mxDialogModelMultiPropertySet->setPropertyValues( aNames, aValues );
    }

    void OptimizerDialog::InitRoadmap()
    {
        try
        {
            OUString pNames[] = {
                OUString("Height"),
                OUString("PositionX"),
                OUString("PositionY"),
                OUString("Step"),
                OUString("TabIndex"),
                OUString("Width") };

            Any pValues[] = {
                Any( sal_Int32( DIALOG_HEIGHT - 26 ) ),
                Any( sal_Int32( 0 ) ),
                Any( sal_Int32( 0 ) ),
                Any( sal_Int32( 0 ) ),
                Any( mnTabIndex++ ),
                Any( sal_Int32( 85 ) ) };

            sal_Int32 nCount = SAL_N_ELEMENTS( pNames );

            Sequence< OUString >   aNames( pNames, nCount );
            Sequence< Any >        aValues( pValues, nCount );

            mxRoadmapControlModel = insertControlModel( "com.sun.star.awt.UnoControlRoadmapModel",
                                                                  "rdmNavi", aNames, aValues  );

            Reference< XPropertySet > xPropertySet( mxRoadmapControlModel, UNO_QUERY_THROW );
            xPropertySet->setPropertyValue( "Name", Any( OUString("rdmNavi") ) );
            mxRoadmapControl = mxDialog->getControl( "rdmNavi" );
            InsertRoadmapItem( 0, getString( STR_INTRODUCTION ), ITEM_ID_INTRODUCTION );
            InsertRoadmapItem( 1, getString( STR_SLIDES ), ITEM_ID_SLIDES );
            InsertRoadmapItem( 2, getString( STR_IMAGE_OPTIMIZATION ), ITEM_ID_GRAPHIC_OPTIMIZATION );
            InsertRoadmapItem( 3, getString( STR_OLE_OBJECTS ), ITEM_ID_OLE_OPTIMIZATION );
            InsertRoadmapItem( 4, getString( STR_SUMMARY ), ITEM_ID_SUMMARY );

            OUString const sURL("private:graphicrepository/" BMP_PRESENTATION_MINIMIZER);

            xPropertySet->setPropertyValue( "ImageURL", Any( sURL ) );
            xPropertySet->setPropertyValue( "Activated", Any( true ) );
            xPropertySet->setPropertyValue( "Complete", Any( true ) );
            xPropertySet->setPropertyValue( "CurrentItemID", Any( sal_Int16(ITEM_ID_INTRODUCTION) ) );
            xPropertySet->setPropertyValue( "Text", Any( getString( STR_STEPS ) ) );
        }
        catch( Exception& )
        {
        }
    }

    void OptimizerDialog::InsertRoadmapItem( const sal_Int32 nIndex, const OUString& rLabel, const sal_Int32 nItemID )
    {
        try
        {
            Reference< XSingleServiceFactory > xSFRoadmap( mxRoadmapControlModel, UNO_QUERY_THROW );
            Reference< XIndexContainer > aIndexContainerRoadmap( mxRoadmapControlModel, UNO_QUERY_THROW );
            Reference< XInterface > xRoadmapItem( xSFRoadmap->createInstance(), UNO_QUERY_THROW );
            Reference< XPropertySet > xPropertySet( xRoadmapItem, UNO_QUERY_THROW );
            xPropertySet->setPropertyValue( "Label", Any( rLabel ) );
            xPropertySet->setPropertyValue( "Enabled", Any( true ) );
            xPropertySet->setPropertyValue( "ID", Any( nItemID ) );
            aIndexContainerRoadmap->insertByIndex( nIndex, Any( xRoadmapItem ) );
        }
        catch( Exception& )
        {

        }
    }

    void OptimizerDialog::UpdateConfiguration()
    {
        sal_Int16   nInt16 = 0;
        Any         aAny;

        Sequence< sal_Int16 > aSelectedItems;
        Sequence< OUString > aStringItemList;

        // page0
        aAny = getControlProperty( "ListBox0Pg0", "SelectedItems" );
        if ( aAny >>= aSelectedItems )
        {
            if ( aSelectedItems.getLength() )
            {
                sal_Int16 nSelectedItem = aSelectedItems[ 0 ];
                aAny = getControlProperty( "ListBox0Pg0", "StringItemList" );
                if ( aAny >>= aStringItemList )
                {
                    if ( aStringItemList.getLength() > nSelectedItem )
                        SetConfigProperty( TK_Name, Any( aStringItemList[ nSelectedItem ] ) );
                }
            }
        }

        aAny = getControlProperty( "CheckBox3Pg3", "State" );
        if ( aAny >>= nInt16 )
        {
            if ( nInt16 )
            {
                aAny = getControlProperty( "ListBox0Pg3", "SelectedItems" );
                if ( aAny >>= aSelectedItems )
                {
                    if ( aSelectedItems.getLength() )
                    {
                        sal_Int16 nSelectedItem = aSelectedItems[ 0 ];
                        aAny = getControlProperty( "ListBox0Pg3", "StringItemList" );
                        if ( aAny >>= aStringItemList )
                        {
                            if ( aStringItemList.getLength() > nSelectedItem )
                                SetConfigProperty( TK_CustomShowName, Any( aStringItemList[ nSelectedItem ] ) );
                        }
                    }
                }
            }
        }
    }

    OptimizerDialog::OptimizerDialog( const Reference< XComponentContext > &rxContext, Reference< XFrame > const & rxFrame, Reference< XDispatch > const & rxStatusDispatcher ) :
        UnoDialog( rxContext, rxFrame ),
        ConfigurationAccess( rxContext ),
        mnCurrentStep( 0 ),
        mnTabIndex( 0 ),
        mxFrame( rxFrame ),
        mxItemListener( new ItemListener( *this ) ),
        mxActionListener( new ActionListener( *this ) ),
        mxActionListenerListBox0Pg0( new ActionListenerListBox0Pg0( *this ) ),
        mxTextListenerFormattedField0Pg1( new TextListenerFormattedField0Pg1( *this ) ),
        mxTextListenerComboBox0Pg1( new TextListenerComboBox0Pg1( *this ) ),
        mxSpinListenerFormattedField0Pg1( new SpinListenerFormattedField0Pg1( *this ) ),
        mxStatusDispatcher( rxStatusDispatcher )
    {
        Reference< XStorable > xStorable( mxController->getModel(), UNO_QUERY_THROW );
        mbIsReadonly = xStorable->isReadonly();

        InitDialog();
        InitRoadmap();
        InitNavigationBar();
        InitPage0();
        InitPage1();
        InitPage2();
        InitPage3();
        InitPage4();
        ActivatePage( 0 );

        OptimizationStats aStats;
        aStats.InitializeStatusValuesFromDocument( mxController->getModel() );
        Sequence< PropertyValue > aStatusSequence( aStats.GetStatusSequence() );
        UpdateStatus( aStatusSequence );
    }

    OptimizerDialog::~OptimizerDialog()
    {
        // not saving configuration if the dialog has been finished via cancel or close window
        if ( mbStatus )
            SaveConfiguration();
    }

    void OptimizerDialog::execute()
    {
        Reference< XItemEventBroadcaster > xRoadmapBroadcaster( mxRoadmapControl, UNO_QUERY_THROW );
        xRoadmapBroadcaster->addItemListener( mxItemListener );
        UnoDialog::execute();
        UpdateConfiguration();          // taking actual control settings for the configuration
        xRoadmapBroadcaster->removeItemListener( mxItemListener );
    }

    void OptimizerDialog::SwitchPage( sal_Int16 nNewStep )
    {
        if ( ( nNewStep != mnCurrentStep ) && ( nNewStep <= MAX_STEP ) && ( nNewStep >= 0 ) )
        {
            sal_Int16 nOldStep = mnCurrentStep;
            if ( nNewStep == 0 )
                disableControl( "btnNavBack" );
            else if ( nOldStep == 0 )
                enableControl( "btnNavBack" );

            if ( nNewStep == MAX_STEP )
                disableControl( "btnNavNext" );
            else if ( nOldStep == MAX_STEP )
                enableControl( "btnNavNext" );

            setControlProperty( "rdmNavi", "CurrentItemID", Any( nNewStep ) );

            DeactivatePage( nOldStep );
            UpdateControlStates( nNewStep );

            ActivatePage( nNewStep );
            mnCurrentStep = nNewStep;
        }
    }

    void OptimizerDialog::UpdateControlStates( sal_Int16 nPage )
    {
        switch( nPage )
        {
            case 0 : UpdateControlStatesPage0(); break;
            case 1 : UpdateControlStatesPage1(); break;
            case 2 : UpdateControlStatesPage2(); break;
            case 3 : UpdateControlStatesPage3(); break;
            case 4 : UpdateControlStatesPage4(); break;
            default:
            {
                UpdateControlStatesPage0();
                UpdateControlStatesPage1();
                UpdateControlStatesPage2();
                UpdateControlStatesPage3();
                UpdateControlStatesPage4();
            }
        }
    }

    OUString OptimizerDialog::GetSelectedString( OUString const & token )
    {
        OUString aSelectedItem;
        Sequence< sal_Int16 > sSelectedItems;
        Sequence< OUString >  sItemList;

        if ( ( getControlProperty( token, "SelectedItems" ) >>= sSelectedItems ) &&
                ( getControlProperty( token, "StringItemList" ) >>= sItemList ) )
        {
            if ( sSelectedItems.getLength() == 1 )
            {
                sal_Int16 nSelectedItem = sSelectedItems[ 0 ];
                if ( nSelectedItem < sItemList.getLength() )
                    aSelectedItem = sItemList[ nSelectedItem ];
            }
        }
        return aSelectedItem;
    }

    void OptimizerDialog::UpdateStatus( const css::uno::Sequence< css::beans::PropertyValue >& rStatus )
    {
        if ( mxReschedule.is() )
        {
            maStats.InitializeStatusValues( rStatus );
            const Any* pVal( maStats.GetStatusValue( TK_Status ) );
            if ( pVal )
            {
                OUString sStatus;
                if ( *pVal >>= sStatus )
                {
                    setControlProperty( "FixedText1Pg4", "Enabled", Any( true ) );
                    setControlProperty( "FixedText1Pg4", "Label", Any( getString( TKGet( sStatus ) ) ) );
                }
            }
            pVal = maStats.GetStatusValue( TK_Progress );
            if ( pVal )
            {
                sal_Int32 nProgress = 0;
                if ( *pVal >>= nProgress )
                    setControlProperty( "Progress", "ProgressValue", Any( nProgress ) );
            }
            pVal = maStats.GetStatusValue( TK_OpenNewDocument );
            if ( pVal )
                SetConfigProperty( TK_OpenNewDocument, *pVal );

            mxReschedule->reschedule();
        }
    }

    void ItemListener::itemStateChanged( const ItemEvent& Event )
    {
        try
        {
            sal_Int16 nState;
            OUString aControlName;
            Reference< XControl > xControl;
            Any aSource( Event.Source );
            if ( aSource >>= xControl )
            {
                Reference< XPropertySet > xPropertySet( xControl->getModel(), UNO_QUERY_THROW );
                xPropertySet->getPropertyValue( "Name" ) >>= aControlName;
                PPPOptimizerTokenEnum eControl( TKGet( aControlName ) );
                switch( eControl )
                {
                    case TK_rdmNavi :
                    {
                        mrOptimizerDialog.SwitchPage( static_cast< sal_Int16 >( Event.ItemId ) );
                    }
                    break;
                    case TK_CheckBox1Pg1 :
                    {
                        if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
                            mrOptimizerDialog.SetConfigProperty( TK_RemoveCropArea, Any( nState != 0 ) );
                    }
                    break;
                    case TK_CheckBox2Pg1 :
                    {
                        if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
                            mrOptimizerDialog.SetConfigProperty( TK_EmbedLinkedGraphics, Any( nState != 0 ) );
                    }
                    break;
                    case TK_CheckBox0Pg2 :
                    {
                        if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
                        {
                            mrOptimizerDialog.SetConfigProperty( TK_OLEOptimization, Any( nState != 0 ) );
                            mrOptimizerDialog.setControlProperty( "RadioButton0Pg2", "Enabled", Any( nState != 0 ) );
                            mrOptimizerDialog.setControlProperty( "RadioButton1Pg2", "Enabled", Any( nState != 0 ) );
                        }
                    }
                    break;
                    case TK_RadioButton0Pg1 :
                    {
                        sal_Int16 nInt16 = 0;
                        if ( xPropertySet->getPropertyValue( "State" ) >>= nInt16 )
                        {
                            nInt16 ^= 1;
                            mrOptimizerDialog.SetConfigProperty( TK_JPEGCompression, Any( nInt16 != 0 ) );
                            mrOptimizerDialog.setControlProperty( "FixedText1Pg1", "Enabled", Any( nInt16 != 0 ) );
                            mrOptimizerDialog.setControlProperty( "FormattedField0Pg1", "Enabled", Any( nInt16 != 0 ) );
                        }
                    }
                    break;
                    case TK_RadioButton1Pg1 :
                    {
                        if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
                        {
                            mrOptimizerDialog.SetConfigProperty( TK_JPEGCompression, Any( nState != 0 ) );
                            mrOptimizerDialog.setControlProperty( "FixedText1Pg1", "Enabled", Any( nState != 0 ) );
                            mrOptimizerDialog.setControlProperty( "FormattedField0Pg1", "Enabled", Any( nState != 0 ) );
                        }
                    }
                    break;
                    case TK_RadioButton0Pg2 :
                    {
                        sal_Int16 nInt16;
                        if ( xPropertySet->getPropertyValue( "State" ) >>= nInt16 )
                        {
                            nInt16 ^= 1;
                            mrOptimizerDialog.SetConfigProperty( TK_OLEOptimizationType, Any( nInt16 ) );
                        }
                    }
                    break;
                    case TK_RadioButton1Pg2 :
                    {
                        if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
                            mrOptimizerDialog.SetConfigProperty( TK_OLEOptimizationType, Any( nState ) );
                    }
                    break;
                    case TK_CheckBox0Pg3 :
                    {
                        if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
                            mrOptimizerDialog.SetConfigProperty( TK_DeleteUnusedMasterPages, Any( nState != 0 ) );
                    }
                    break;
                    case TK_CheckBox1Pg3 :
                    {
                        if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
                            mrOptimizerDialog.SetConfigProperty( TK_DeleteNotesPages, Any( nState != 0 ) );
                    }
                    break;
                    case TK_CheckBox2Pg3 :
                    {
                        if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
                            mrOptimizerDialog.SetConfigProperty( TK_DeleteHiddenSlides, Any( nState != 0 ) );
                    }
                    break;
                    case TK_CheckBox3Pg3 :
                    {
                        if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
                            mrOptimizerDialog.setControlProperty( "ListBox0Pg3", "Enabled", Any( nState != 0 ) );
                    }
                    break;
                    case TK_CheckBox1Pg4 :
                    {
                        if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
                            mrOptimizerDialog.setControlProperty( "ComboBox0Pg4", "Enabled", Any( nState != 0 ) );
                    }
                    break;
                    case TK_RadioButton0Pg4 :
                    case TK_RadioButton1Pg4 :
                    {
                        if ( xPropertySet->getPropertyValue( "State" ) >>= nState )
                            mrOptimizerDialog.SetConfigProperty( TK_SaveAs, Any( eControl == TK_RadioButton1Pg4 ? nState != 0 : nState == 0 ) );
                    }
                    break;
                    default:
                    break;
                }
            }
        }
        catch ( Exception& )
        {

        }
    }
    void ItemListener::disposing( const css::lang::EventObject& /* Source */ )
    {
    }

    void ActionListener::actionPerformed( const ActionEvent& rEvent )
    {
        switch( TKGet( rEvent.ActionCommand ) )
        {
            case TK_btnNavBack :    mrOptimizerDialog.SwitchPage( mrOptimizerDialog.mnCurrentStep - 1 ); break;
            case TK_btnNavNext :    mrOptimizerDialog.SwitchPage( mrOptimizerDialog.mnCurrentStep + 1 ); break;
            case TK_btnNavFinish :
            {
                mrOptimizerDialog.UpdateConfiguration();

                mrOptimizerDialog.SwitchPage( ITEM_ID_SUMMARY );
                mrOptimizerDialog.DisablePage( ITEM_ID_SUMMARY );
                mrOptimizerDialog.setControlProperty( "btnNavBack", "Enabled", Any( false ) );
                mrOptimizerDialog.setControlProperty( "btnNavNext", "Enabled", Any( false ) );
                mrOptimizerDialog.setControlProperty( "btnNavFinish", "Enabled", Any( false ) );
                mrOptimizerDialog.setControlProperty( "btnNavCancel", "Enabled", Any( false ) );
                mrOptimizerDialog.setControlProperty( "FixedText0Pg4", "Enabled", Any( true ) );

                // check if we have to open the FileDialog
                bool    bSuccessfullyExecuted = true;
                sal_Int16   nInt16 = 0;
                mrOptimizerDialog.getControlProperty( "RadioButton1Pg4", "State" ) >>= nInt16;
                if ( nInt16 )
                {
                    OUString aSaveAsURL;
                    FileOpenDialog aFileOpenDialog( mrOptimizerDialog.GetComponentContext() );

                    // generating default file name
                    Reference< XStorable > xStorable( mrOptimizerDialog.mxController->getModel(), UNO_QUERY );
                    if ( xStorable.is() && xStorable->hasLocation() )
                    {
                        INetURLObject aURLObj( xStorable->getLocation() );
                        if ( !aURLObj.hasFinalSlash() &&
                             aURLObj.setExtension( "mini", INetURLObject::LAST_SEGMENT, false ) ) {
                            // tdf#105382 uri-decode file name
                            auto aName( aURLObj.getName( INetURLObject::LAST_SEGMENT,
                                                         false,
                                                         INetURLObject::DecodeMechanism::WithCharset ) );
                            aFileOpenDialog.setDefaultName( aName );
                        }
                    }
                     bool bDialogExecuted = aFileOpenDialog.execute() == dialogs::ExecutableDialogResults::OK;
                    if ( bDialogExecuted )
                    {
                        aSaveAsURL = aFileOpenDialog.getURL();
                        mrOptimizerDialog.SetConfigProperty( TK_SaveAsURL, Any( aSaveAsURL ) );
                        mrOptimizerDialog.SetConfigProperty( TK_FilterName, Any( aFileOpenDialog.getFilterName() ) );
                    }
                    if ( aSaveAsURL.isEmpty() )
                    {
                        // something goes wrong...
                        bSuccessfullyExecuted = false;
                    }

                    // waiting for 500ms
                    if ( mrOptimizerDialog.mxReschedule.is() )
                    {
                        mrOptimizerDialog.mxReschedule->reschedule();
                        for ( sal_uInt32 i = osl_getGlobalTimer(); ( i + 500 ) > ( osl_getGlobalTimer() ); )
                        mrOptimizerDialog.mxReschedule->reschedule();
                    }
                }
                if ( bSuccessfullyExecuted )
                {   // now check if we have to store a session template
                    nInt16 = 0;
                    OUString aSettingsName;
                    mrOptimizerDialog.getControlProperty( "CheckBox1Pg4", "State" ) >>= nInt16;
                    mrOptimizerDialog.getControlProperty( "ComboBox0Pg4", "Text" ) >>= aSettingsName;
                    if ( nInt16 && !aSettingsName.isEmpty() )
                    {
                        std::vector< OptimizerSettings >::iterator aIter( mrOptimizerDialog.GetOptimizerSettingsByName( aSettingsName ) );
                        std::vector< OptimizerSettings >& rSettings( mrOptimizerDialog.GetOptimizerSettings() );
                        OptimizerSettings aNewSettings( rSettings[ 0 ] );
                        aNewSettings.maName = aSettingsName;
                        if ( aIter == rSettings.end() )
                            rSettings.push_back( aNewSettings );
                        else
                            *aIter = aNewSettings;
                    }
                }
                if ( bSuccessfullyExecuted )
                {
                    URL aURL;
                    aURL.Protocol = "vnd.com.sun.star.comp.PPPOptimizer:";
                    aURL.Path = "optimize";

                    Sequence< PropertyValue > lArguments( 3 );
                    lArguments[ 0 ].Name = "Settings";
                    lArguments[ 0 ].Value <<= mrOptimizerDialog.GetConfigurationSequence();
                    lArguments[ 1 ].Name = "StatusDispatcher";
                    lArguments[ 1 ].Value <<= mrOptimizerDialog.GetStatusDispatcher();
                    lArguments[ 2 ].Name = "InformationDialog";
                    lArguments[ 2 ].Value <<= mrOptimizerDialog.GetFrame();

                    try
                    {
                        ImpOptimizer aOptimizer(
                            mrOptimizerDialog.GetComponentContext(),
                            mrOptimizerDialog.GetFrame()->getController()->getModel());
                        aOptimizer.Optimize(lArguments);
                    }
                    catch (css::io::IOException&)
                    {
                        mrOptimizerDialog.maStats.SetStatusValue(TK_Progress, Any(static_cast<sal_Int32>(0)));
                        mrOptimizerDialog.setControlProperty("btnNavBack", "Enabled", Any(true));
                        mrOptimizerDialog.setControlProperty("btnNavNext", "Enabled", Any(false));
                        mrOptimizerDialog.setControlProperty("btnNavFinish", "Enabled", Any(true));
                        mrOptimizerDialog.setControlProperty("btnNavCancel", "Enabled", Any(true));
                        ErrorDialog aInformationDialog(
                            mrOptimizerDialog.UnoDialog::mxContext, mrOptimizerDialog.GetFrame(),
                            mrOptimizerDialog.getString(STR_ERROR_IO));
                        aInformationDialog.execute();
                        break;
                    }

                    mrOptimizerDialog.endExecute( bSuccessfullyExecuted );
                }
                else
                {
                    mrOptimizerDialog.setControlProperty( "btnNavBack", "Enabled", Any( true ) );
                    mrOptimizerDialog.setControlProperty( "btnNavNext", "Enabled", Any( false ) );
                    mrOptimizerDialog.setControlProperty( "btnNavFinish", "Enabled", Any( true ) );
                    mrOptimizerDialog.setControlProperty( "btnNavCancel", "Enabled", Any( true ) );
                    mrOptimizerDialog.EnablePage( ITEM_ID_SUMMARY );
                }
            }
            break;
            case TK_btnNavCancel :  mrOptimizerDialog.endExecute( false ); break;
            case TK_Button0Pg0 :    // delete configuration
            {
                OUString aSelectedItem( mrOptimizerDialog.GetSelectedString( "ListBox0Pg0" ) );
                if ( !aSelectedItem.isEmpty() )
                {
                    std::vector< OptimizerSettings >::iterator aIter( mrOptimizerDialog.GetOptimizerSettingsByName( aSelectedItem ) );
                    std::vector< OptimizerSettings >& rList( mrOptimizerDialog.GetOptimizerSettings() );
                    if ( aIter != rList.end() )
                    {
                        rList.erase( aIter );
                        mrOptimizerDialog.UpdateControlStates();
                    }
                }
            }
            break;
            default: break;
        }
    }
    void ActionListener::disposing( const css::lang::EventObject& /* Source */ )
    {
    }

    void ActionListenerListBox0Pg0::actionPerformed( const ActionEvent& rEvent )
    {
        if ( !rEvent.ActionCommand.isEmpty() )
        {
            std::vector< OptimizerSettings >::iterator aIter( mrOptimizerDialog.GetOptimizerSettingsByName( rEvent.ActionCommand ) );
            std::vector< OptimizerSettings >& rList( mrOptimizerDialog.GetOptimizerSettings() );
            if ( aIter != rList.end() )
                rList[ 0 ] = *aIter;
        }
        mrOptimizerDialog.UpdateControlStates();
    }
    void ActionListenerListBox0Pg0::disposing( const css::lang::EventObject& /* Source */ )
    {
    }

    void TextListenerFormattedField0Pg1::textChanged( const TextEvent& /* rEvent */ )
    {
        double fDouble = 0;
        Any aAny = mrOptimizerDialog.getControlProperty( "FormattedField0Pg1", "EffectiveValue" );
        if ( aAny >>= fDouble )
            mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( static_cast<sal_Int32>(fDouble) ) );
    }
    void TextListenerFormattedField0Pg1::disposing( const css::lang::EventObject& /* Source */ )
    {
    }

    void TextListenerComboBox0Pg1::textChanged( const TextEvent& /* rEvent */ )
    {
        OUString aString;
        Any aAny = mrOptimizerDialog.getControlProperty( "ComboBox0Pg1", "Text" );
        if ( aAny >>= aString )
        {
            sal_Int32 nI0, nI1, nI2, nI3, nI4;
            nI0 = nI1 = nI2 = nI3 = nI4 = 0;

            if ( mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_0 ).getToken( 1, ';', nI0 ) == aString )
                aString = mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_0 ).getToken( 0, ';', nI4 );
            else if ( mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_1 ).getToken( 1, ';', nI1 ) == aString )
                aString = mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_1 ).getToken( 0, ';', nI4 );
            else if ( mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_2 ).getToken( 1, ';', nI2 ) == aString )
                aString = mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_2 ).getToken( 0, ';', nI4 );
            else if ( mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_3 ).getToken( 1, ';', nI3 ) == aString )
                aString = mrOptimizerDialog.getString( STR_IMAGE_RESOLUTION_3 ).getToken( 0, ';', nI4 );

            mrOptimizerDialog.SetConfigProperty( TK_ImageResolution, Any( aString.toInt32() ) );
        }
    }
    void TextListenerComboBox0Pg1::disposing( const css::lang::EventObject& /* Source */ )
    {
    }

    void SpinListenerFormattedField0Pg1::up( const SpinEvent& /* rEvent */ )
    {
        double fDouble;
        Any aAny = mrOptimizerDialog.getControlProperty( "FormattedField0Pg1", "EffectiveValue" );
        if ( aAny >>= fDouble )
        {
            fDouble += 9;
            if ( fDouble > 100 )
                fDouble = 100;
            mrOptimizerDialog.setControlProperty( "FormattedField0Pg1", "EffectiveValue", Any( fDouble ) );
            mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( static_cast<sal_Int32>(fDouble) ) );
        }
    }
    void SpinListenerFormattedField0Pg1::down( const SpinEvent& /* rEvent */ )
    {
        double fDouble;
        Any aAny = mrOptimizerDialog.getControlProperty( "FormattedField0Pg1", "EffectiveValue" );
        if ( aAny >>= fDouble )
        {
            fDouble -= 9;
            if ( fDouble < 0 )
                fDouble = 0;
            mrOptimizerDialog.setControlProperty( "FormattedField0Pg1", "EffectiveValue", Any( fDouble ) );
            mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( static_cast<sal_Int32>(fDouble) ) );
        }
    }
    void SpinListenerFormattedField0Pg1::first( const SpinEvent& /* rEvent */ )
    {
        mrOptimizerDialog.setControlProperty( "FormattedField0Pg1", "EffectiveValue", Any( static_cast< double >( 0 ) ) );
        mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( sal_Int32(0) ) );
    }
    void SpinListenerFormattedField0Pg1::last( const SpinEvent& /* rEvent */ )
    {
        mrOptimizerDialog.setControlProperty( "FormattedField0Pg1", "EffectiveValue", Any( static_cast< double >( 100 ) ) );
        mrOptimizerDialog.SetConfigProperty( TK_JPEGQuality, Any( sal_Int32(100) ) );
    }
    void SpinListenerFormattedField0Pg1::disposing( const css::lang::EventObject& /* Source */ )
    {
    }

    /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

↑ V1019 Compound assignment expression is used inside condition.