    /* -*- 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 "macromigrationpages.hxx"
    #include "macromigrationdialog.hxx"

    #include <com/sun/star/frame/XModel.hpp>

    #include <tools/urlobj.hxx>
    #include <tools/diagnose_ex.h>
    #include <vcl/metric.hxx>

    namespace dbmm
    {

        using ::com::sun::star::uno::Reference;
        using ::com::sun::star::uno::UNO_QUERY_THROW;
        using ::com::sun::star::uno::Exception;
        using ::com::sun::star::frame::XModel;

        MacroMigrationPage::MacroMigrationPage(vcl::Window *pParent, const OString& rID, const OUString& rUIXMLDescription)
            : MacroMigrationPage_Base(pParent, rID, rUIXMLDescription)
        {
        }

        MacroMigrationDialog& MacroMigrationPage::getDialog()
        {
            return *dynamic_cast< MacroMigrationDialog* >( GetParentDialog() );
        }

        // PreparationPage
        PreparationPage::PreparationPage(vcl::Window *pParent)
            : MacroMigrationPage(pParent, "PreparePage" ,"dbaccess/ui/preparepage.ui")
        {
            get(m_pCloseDocError, "closedocerror");
        }

        PreparationPage::~PreparationPage()
        {
            disposeOnce();
        }

        void PreparationPage::dispose()
        {
            m_pCloseDocError.clear();
            MacroMigrationPage::dispose();
        }

        void PreparationPage::showCloseDocsError( bool _bShow )
        {
            m_pCloseDocError->Show( _bShow );
        }

        VclPtr<TabPage> PreparationPage::Create( ::svt::RoadmapWizard& _rParentDialog )
        {
            return VclPtr<PreparationPage>::Create(&_rParentDialog);
        }

        // SaveDBDocPage
        SaveDBDocPage::SaveDBDocPage(MacroMigrationDialog& _rParentDialog)
            : MacroMigrationPage(&_rParentDialog, "BackupPage" ,"dbaccess/ui/backuppage.ui")
        {
            get(m_pStartMigration, "startmigrate");
            get(m_pBrowseSaveAsLocation, "browse");
            get(m_pSaveAsLocation, "location");
            m_pLocationController.reset( new svx::DatabaseLocationInputController(
                _rParentDialog.getComponentContext(), *m_pSaveAsLocation, *m_pBrowseSaveAsLocation) );

            m_pSaveAsLocation->SetModifyHdl( LINK( this, SaveDBDocPage, OnLocationModified ) );
            m_pSaveAsLocation->SetDropDownLineCount( 20 );

            impl_updateLocationDependentItems();
        }

        SaveDBDocPage::~SaveDBDocPage()
        {
            disposeOnce();
        }

        void SaveDBDocPage::dispose()
        {
            m_pLocationController.reset();
            m_pSaveAsLocation.clear();
            m_pBrowseSaveAsLocation.clear();
            m_pStartMigration.clear();
            MacroMigrationPage::dispose();
        }

        void SaveDBDocPage::impl_updateLocationDependentItems()
        {
            updateDialogTravelUI();
            m_pStartMigration->Show(!m_pSaveAsLocation->GetText().isEmpty());
        }

        IMPL_LINK_NOARG( SaveDBDocPage, OnLocationModified, Edit&, void )
        {
            impl_updateLocationDependentItems();
        }

        void SaveDBDocPage::initializePage()
        {
            OWizardPage::initializePage();

            try
            {
                // get the document's current URL
                Reference< XModel > xDocument( getDialog().getDocument(), UNO_QUERY_THROW );
                INetURLObject aURLParser( xDocument->getURL() );
                OSL_ENSURE( aURLParser.GetProtocol() != INetProtocol::NotValid, "SaveDBDocPage::initializePage: illegal document URL!" );

                OUStringBuffer aBaseName( aURLParser.getBase() );
                aBaseName.append( ".backup" );
                aURLParser.setBase( aBaseName.makeStringAndClear() );

                m_pLocationController->setURL( aURLParser.GetMainURL( INetURLObject::DecodeMechanism::NONE ) );
                impl_updateLocationDependentItems();
            }
            catch( const Exception& )
            {
                DBG_UNHANDLED_EXCEPTION("dbaccess");
            }
        }

        bool SaveDBDocPage::canAdvance() const
        {
            if ( !MacroMigrationPage::canAdvance() )
                return false;

            return !m_pSaveAsLocation->GetText().isEmpty();
        }

        bool SaveDBDocPage::commitPage( ::svt::WizardTypes::CommitPageReason _eReason )
        {
            if ( !MacroMigrationPage::commitPage( _eReason ) )
                return false;

            if ( ::svt::WizardTypes::eTravelBackward == _eReason )
                return true;

            if ( !m_pLocationController->prepareCommit() )
                return false;

            return true;
        }

        VclPtr<TabPage> SaveDBDocPage::Create( ::svt::RoadmapWizard& _rParentDialog )
        {
            return VclPtr<SaveDBDocPage>::Create( dynamic_cast< MacroMigrationDialog& >( _rParentDialog ) );
        }

        // ProgressPage
        ProgressPage::ProgressPage(vcl::Window* pParent)
            : MacroMigrationPage(pParent, "MigratePage" ,"dbaccess/ui/migratepage.ui")
        {
            get(m_pObjectCount, "count");
            get(m_pCurrentObject, "object");
            get(m_pCurrentAction, "current");
            m_aCurrentProgress.Set(get<ProgressBar>("currentprogress"));
            get(m_pAllProgressText, "overall");
            m_aAllProgress.Set(get<ProgressBar>("allprogress"));
            get(m_pMigrationDone, "done");
        }

        ProgressPage::~ProgressPage()
        {
            disposeOnce();
        }

        void ProgressPage::dispose()
        {
            m_pObjectCount.clear();
            m_pCurrentObject.clear();
            m_pCurrentAction.clear();
            m_pAllProgressText.clear();
            m_pMigrationDone.clear();
            MacroMigrationPage::dispose();
        }

        VclPtr<TabPage> ProgressPage::Create(::svt::RoadmapWizard& _rParentDialog)
        {
            return VclPtr<ProgressPage>::Create(&_rParentDialog);
        }

        void ProgressPage::setDocumentCounts( const sal_Int32 _nForms, const sal_Int32 _nReports )
        {
            OUString sText( m_pObjectCount->GetText() );
            sText = sText.replaceFirst( "$forms$", OUString::number( _nForms ) );
            sText = sText.replaceFirst( "$reports$", OUString::number( _nReports ) );
            m_pObjectCount->SetText( sText );
        }

        void ProgressPage::onFinishedSuccessfully()
        {
            m_pMigrationDone->Show();
        }

        void ProgressPage::startObject( const OUString& _rObjectName, const OUString& _rCurrentAction, const sal_uInt32 _nRange )
        {
            m_pCurrentObject->SetText( _rObjectName );
            m_pCurrentAction->SetText( _rCurrentAction );
            m_aCurrentProgress.SetRange( _nRange );
            m_aCurrentProgress.SetValue( sal_uInt32(0) );

            // since this is currently called from the main thread, which does not have the chance
            // to re-schedule, we need to explicitly update the display
            m_pCurrentObject->Update();
            m_pCurrentAction->Update();
            Update();
        }

        void ProgressPage::setObjectProgressText( const OUString& _rText )
        {
            m_pCurrentAction->SetText( _rText );
            m_pCurrentAction->Update();
            Update();
        }

        void ProgressPage::setObjectProgressValue( const sal_uInt32 _nValue )
        {
            m_aCurrentProgress.SetValue( _nValue );
            Update();
        }

        void ProgressPage::endObject()
        {
            m_pCurrentAction->SetText( OUString() );
            m_aCurrentProgress.SetValue( m_aCurrentProgress.GetRange() );
            m_pCurrentAction->Update();
            Update();
        }

        void ProgressPage::start( const sal_uInt32 _nOverallRange )
        {
            m_aAllProgress.SetRange( _nOverallRange );
            Update();
        }

        void ProgressPage::setOverallProgressText( const OUString& _rText )
        {
            m_pAllProgressText->SetText( _rText );
            Update();
        }

        void ProgressPage::setOverallProgressValue( const sal_uInt32 _nValue )
        {
            m_aAllProgress.SetValue( _nValue );
            Update();
        }

        // ResultPage
        ResultPage::ResultPage(vcl::Window* pParent)
            : MacroMigrationPage(pParent, "SummaryPage" ,"dbaccess/ui/summarypage.ui")
        {
            get(m_pChanges, "textview");
            m_pChanges->set_height_request(GetTextHeight() * 10);
            m_pChanges->set_width_request(approximate_char_width() * 40);
            get(m_pSuccessLabel, "success");
            get(m_pFailureLabel, "failure");
        }

        ResultPage::~ResultPage()
        {
            disposeOnce();
        }

        void ResultPage::dispose()
        {
            m_pSuccessLabel.clear();
            m_pFailureLabel.clear();
            m_pChanges.clear();
            MacroMigrationPage::dispose();
        }

        VclPtr<TabPage> ResultPage::Create(::svt::RoadmapWizard& _rParentDialog)
        {
            return VclPtr<ResultPage>::Create(&_rParentDialog);
        }

        void ResultPage::displayMigrationLog(const bool _bSuccessful, const OUString& _rSummary)
        {
            if (_bSuccessful)
                m_pFailureLabel->Hide();
            else
                m_pSuccessLabel->Hide();
            m_pChanges->SetText(_rSummary);
        }

    } // namespace dbmm

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

↑ V522 There might be dereferencing of a potential null pointer.