weld chart CreationWizard

Change-Id: I7ee88c1e1b0eca5c2510a4bbba8b60c0d8a4e3e8
Reviewed-on: https://gerrit.libreoffice.org/77954
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/chart2/source/controller/dialogs/dlg_CreationWizard.cxx b/chart2/source/controller/dialogs/dlg_CreationWizard.cxx
index db54937..58a7449 100644
--- a/chart2/source/controller/dialogs/dlg_CreationWizard.cxx
+++ b/chart2/source/controller/dialogs/dlg_CreationWizard.cxx
@@ -22,6 +22,7 @@
#include <strings.hrc>
#include <helpids.h>
#include <ChartModel.hxx>
#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>

#include "tp_ChartType.hxx"
#include "tp_RangeChooser.hxx"
@@ -30,9 +31,6 @@
#include "ChartTypeTemplateProvider.hxx"
#include "DialogModel.hxx"

#define CHART_WIZARD_PAGEWIDTH  250
#define CHART_WIZARD_PAGEHEIGHT 170

using namespace css;

namespace chart
@@ -45,14 +43,14 @@
#define STATE_OBJECTS      3
#define STATE_LAST         STATE_OBJECTS

CreationWizard::CreationWizard(vcl::Window* pParent, const uno::Reference<frame::XModel>& xChartModel,
CreationWizard::CreationWizard(weld::Window* pParent, const uno::Reference<frame::XModel>& xChartModel,
                               const uno::Reference<uno::XComponentContext>& xContext)
                : vcl::RoadmapWizard(pParent)
                , m_xChartModel(xChartModel,uno::UNO_QUERY)
                , m_xComponentContext(xContext)
                , m_pTemplateProvider(nullptr)
                , m_aTimerTriggeredControllerLock(xChartModel)
                , m_bCanTravel(true)
    : vcl::RoadmapWizardMachine(pParent)
    , m_xChartModel(xChartModel,uno::UNO_QUERY)
    , m_xComponentContext(xContext)
    , m_pTemplateProvider(nullptr)
    , m_aTimerTriggeredControllerLock(xChartModel)
    , m_bCanTravel(true)
{
    m_pDialogModel.reset(new DialogModel(m_xChartModel, m_xComponentContext));
    defaultButton(WizardButtonFlags::FINISH);
@@ -69,12 +67,6 @@
    declarePath(PATH_FULL, aPath);

    SetRoadmapHelpId(HID_SCH_WIZARD_ROADMAP);
    SetRoadmapInteractive(true);

    Size aAdditionalRoadmapSize(LogicToPixel(Size(85, 0), MapMode(MapUnit::MapAppFont)));
    Size aSize(LogicToPixel(Size(CHART_WIZARD_PAGEWIDTH, CHART_WIZARD_PAGEHEIGHT), MapMode(MapUnit::MapAppFont)));
    aSize.AdjustWidth(aAdditionalRoadmapSize.Width() );
    SetSizePixel(aSize);

    if (!m_pDialogModel->getModel().isDataFromSpreadsheet())
    {
@@ -84,6 +76,16 @@

    // Call ActivatePage, to create and activate the first page
    ActivatePage();

    m_xAssistant->set_current_page(0);
}

short CreationWizard::run()
{
    int nRet = vcl::RoadmapWizardMachine::run();
    if (nRet == static_cast<int>(WizardButtonFlags::FINISH))
        return ui::dialogs::ExecutableDialogResults::OK;
    return ui::dialogs::ExecutableDialogResults::CANCEL;
}

CreationWizard::~CreationWizard() = default;
@@ -91,12 +93,18 @@
VclPtr<TabPage> CreationWizard::createPage(WizardState nState)
{
    VclPtr<vcl::OWizardPage> pRet;

    OString sIdent(OString::number(nState));
    weld::Container* pPageContainer = m_xAssistant->append_page(sIdent);
    // TODO eventually pass DialogController as distinct argument instead of bundling into TabPageParent
    TabPageParent aParent(pPageContainer, this);

    switch( nState )
    {
    case STATE_CHARTTYPE:
        {
        m_aTimerTriggeredControllerLock.startTimer();
        VclPtrInstance<ChartTypeTabPage> pChartTypeTabPage(this,m_xChartModel);
        VclPtrInstance<ChartTypeTabPage> pChartTypeTabPage(aParent, m_xChartModel);
        pRet  = pChartTypeTabPage;
        m_pTemplateProvider = pChartTypeTabPage;
        if (m_pDialogModel)
@@ -106,18 +114,18 @@
    case STATE_SIMPLE_RANGE:
        {
        m_aTimerTriggeredControllerLock.startTimer();
        pRet = VclPtr<RangeChooserTabPage>::Create(this, *m_pDialogModel, m_pTemplateProvider, this);
        pRet = VclPtr<RangeChooserTabPage>::Create(aParent, *m_pDialogModel, m_pTemplateProvider, this);
        }
        break;
    case STATE_DATA_SERIES:
        {
        m_aTimerTriggeredControllerLock.startTimer();
        pRet = VclPtr<DataSourceTabPage>::Create(this, *m_pDialogModel, m_pTemplateProvider, this);
        pRet = VclPtr<DataSourceTabPage>::Create(aParent, *m_pDialogModel, m_pTemplateProvider, this);
        }
        break;
    case STATE_OBJECTS:
        {
        pRet  = VclPtr<TitlesAndObjectsTabPage>::Create(this,m_xChartModel, m_xComponentContext);
        pRet  = VclPtr<TitlesAndObjectsTabPage>::Create(aParent, m_xChartModel, m_xComponentContext);
        m_aTimerTriggeredControllerLock.startTimer();
        }
        break;
@@ -147,13 +155,14 @@
        ++nNextState;
    return (nNextState==STATE_LAST+1) ? WZS_INVALID_STATE : nNextState;
}

void CreationWizard::enterState(WizardState nState)
{
    m_aTimerTriggeredControllerLock.startTimer();
    enableButtons( WizardButtonFlags::PREVIOUS, nState > STATE_FIRST );
    enableButtons( WizardButtonFlags::NEXT, nState < STATE_LAST );
    if( isStateEnabled( nState ))
        vcl::RoadmapWizard::enterState(nState);
        vcl::RoadmapWizardMachine::enterState(nState);
}

void CreationWizard::setInvalidPage( TabPage * /* pTabPage */ )
diff --git a/chart2/source/controller/dialogs/dlg_CreationWizard_UNO.cxx b/chart2/source/controller/dialogs/dlg_CreationWizard_UNO.cxx
index 9234a58..ceca927 100644
--- a/chart2/source/controller/dialogs/dlg_CreationWizard_UNO.cxx
+++ b/chart2/source/controller/dialogs/dlg_CreationWizard_UNO.cxx
@@ -28,27 +28,29 @@
#include <com/sun/star/awt/Size.hpp>
#include <com/sun/star/beans/PropertyValue.hpp>
#include <com/sun/star/frame/Desktop.hpp>
#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
#include <tools/diagnose_ex.h>

namespace chart
{
using namespace ::com::sun::star;

CreationWizardUnoDlg::CreationWizardUnoDlg( const uno::Reference< uno::XComponentContext >& xContext )
                    : OComponentHelper( m_aMutex )
                    , m_xCC( xContext )
                    , m_pDialog( nullptr )
                    , m_bUnlockControllersOnExecute(false)
CreationWizardUnoDlg::CreationWizardUnoDlg(const uno::Reference<uno::XComponentContext>& xContext)
    : OComponentHelper(m_aMutex)
    , m_xCC(xContext)
    , m_bUnlockControllersOnExecute(false)
{
    uno::Reference< frame::XDesktop2 > xDesktop = frame::Desktop::create(m_xCC);
    uno::Reference< frame::XTerminateListener > xListener( this );
    xDesktop->addTerminateListener( xListener );
}

CreationWizardUnoDlg::~CreationWizardUnoDlg()
{
    SolarMutexGuard aSolarGuard;
    m_pDialog.disposeAndClear();
    m_xDialog.reset();
}

// lang::XServiceInfo
OUString SAL_CALL CreationWizardUnoDlg::getImplementationName()
{
@@ -150,9 +152,8 @@
void CreationWizardUnoDlg::createDialogOnDemand()
{
    SolarMutexGuard aSolarGuard;
    if( !m_pDialog )
    if (!m_xDialog)
    {
        vcl::Window* pParent = nullptr;
        if( !m_xParentWindow.is() && m_xChartModel.is() )
        {
            uno::Reference< frame::XController > xController(
@@ -165,38 +166,26 @@
                    m_xParentWindow = xFrame->getContainerWindow();
            }
        }
        if( m_xParentWindow.is() )
        {
            VCLXWindow* pImplementation = comphelper::getUnoTunnelImplementation<VCLXWindow>(m_xParentWindow);
            if (pImplementation)
                pParent = pImplementation->GetWindow().get();
        }
        uno::Reference< XComponent > xComp( this );
        if( m_xChartModel.is() )
        {
            m_pDialog = VclPtr<CreationWizard>::Create( pParent, m_xChartModel, m_xCC );
            m_pDialog->AddEventListener( LINK( this, CreationWizardUnoDlg, DialogEventHdl ) );
            m_xDialog = std::make_unique<CreationWizard>(Application::GetFrameWeld(m_xParentWindow), m_xChartModel, m_xCC);
        }
    }
}
IMPL_LINK( CreationWizardUnoDlg, DialogEventHdl, VclWindowEvent&, rEvent, void )
{
    if(rEvent.GetId() == VclEventId::ObjectDying)
        m_pDialog = nullptr;//avoid duplicate destruction of m_pDialog
}

sal_Int16 SAL_CALL CreationWizardUnoDlg::execute(  )
{
    sal_Int16 nRet = RET_CANCEL;
    sal_Int16 nRet = ui::dialogs::ExecutableDialogResults::CANCEL;
    {
        SolarMutexGuard aSolarGuard;
        createDialogOnDemand();
        if( !m_pDialog )
        if (!m_xDialog)
            return nRet;
        TimerTriggeredControllerLock aTimerTriggeredControllerLock( m_xChartModel );
        if( m_bUnlockControllersOnExecute && m_xChartModel.is() )
            m_xChartModel->unlockControllers();
        nRet = m_pDialog->Execute();
        nRet = m_xDialog->run();
    }
    return nRet;
}
@@ -228,7 +217,7 @@
    m_xParentWindow.clear();

    SolarMutexGuard aSolarGuard;
    m_pDialog.disposeAndClear();
    m_xDialog.reset();

    try
    {
@@ -249,27 +238,15 @@
    return nullptr;
}

void SAL_CALL CreationWizardUnoDlg::setPropertyValue( const OUString& rPropertyName
                                                     , const uno::Any& rValue )
void SAL_CALL CreationWizardUnoDlg::setPropertyValue(const OUString& rPropertyName,
                                                     const uno::Any& rValue)
{
    if( rPropertyName == "Position" )
    {
        awt::Point aPos;
        if( ! (rValue >>= aPos) )
            throw lang::IllegalArgumentException( "Property 'Position' requires value of type awt::Point", nullptr, 0 );

        //set left upper outer corner relative to screen
        //pixels, screen position
        SolarMutexGuard aSolarGuard;
        createDialogOnDemand();
        if( m_pDialog )
        {
            m_pDialog->SetPosPixel( Point(0,0) );
            tools::Rectangle aRect( m_pDialog->GetWindowExtentsRelative( nullptr ) );

            Point aNewOuterPos( aPos.X - aRect.Left(), aPos.Y - aRect.Top() );
            m_pDialog->SetPosPixel( aNewOuterPos );
        }
        //read only property, do nothing else
    }
    else if( rPropertyName == "Size")
    {
@@ -293,10 +270,10 @@
        //pixels, screen position
        SolarMutexGuard aSolarGuard;
        createDialogOnDemand();
        if( m_pDialog )
        if (m_xDialog)
        {
            tools::Rectangle aRect( m_pDialog->GetWindowExtentsRelative( nullptr ) );
            awt::Point aPoint(aRect.Left(),aRect.Top());
            Point aPos(m_xDialog->getDialog()->get_position());
            awt::Point aPoint(aPos.X(), aPos.Y());
            aRet <<= aPoint;
        }
    }
@@ -306,10 +283,10 @@
        //pixels, screen position
        SolarMutexGuard aSolarGuard;
        createDialogOnDemand();
        if( m_pDialog )
        if (m_xDialog)
        {
            tools::Rectangle aRect( m_pDialog->GetWindowExtentsRelative( nullptr ) );
            awt::Size aSize(aRect.GetWidth(),aRect.GetHeight());
            Size aRect(m_xDialog->getDialog()->get_size());
            awt::Size aSize(aRect.Width(), aRect.Height());
            aRet <<= aSize;
        }
    }
diff --git a/chart2/source/controller/dialogs/dlg_DataSource.cxx b/chart2/source/controller/dialogs/dlg_DataSource.cxx
index 856420b..4bd8264 100644
--- a/chart2/source/controller/dialogs/dlg_DataSource.cxx
+++ b/chart2/source/controller/dialogs/dlg_DataSource.cxx
@@ -92,10 +92,10 @@
{
    TabPageParent aRangeParent(m_xTabControl->get_page("range"), this);
    m_pRangeChooserTabPage = VclPtr<RangeChooserTabPage>::Create(aRangeParent, *(m_apDialogModel.get()),
                                     m_apDocTemplateProvider.get(), nullptr, true /* bHideDescription */ );
                                     m_apDocTemplateProvider.get(), true /* bHideDescription */ );
    TabPageParent aSeriesParent(m_xTabControl->get_page("series"), this);
    m_pDataSourceTabPage = VclPtr<DataSourceTabPage>::Create(aSeriesParent, *(m_apDialogModel.get()),
                                    m_apDocTemplateProvider.get(), nullptr, true /* bHideDescription */ );
                                    m_apDocTemplateProvider.get(), true /* bHideDescription */ );
    m_xTabControl->connect_enter_page(LINK(this, DataSourceDialog, ActivatePageHdl));
    m_xTabControl->connect_leave_page(LINK(this, DataSourceDialog, DeactivatePageHdl));
    ActivatePageHdl(m_xTabControl->get_current_page_ident());
diff --git a/chart2/source/controller/dialogs/tp_DataSource.cxx b/chart2/source/controller/dialogs/tp_DataSource.cxx
index 452b4f0..e1ce453 100644
--- a/chart2/source/controller/dialogs/tp_DataSource.cxx
+++ b/chart2/source/controller/dialogs/tp_DataSource.cxx
@@ -110,15 +110,6 @@
    return aResult;
}

void lcl_enableRangeChoosing( bool bEnable, Dialog * pDialog )
{
    if( pDialog )
    {
        pDialog->SetModalInputMode( !bEnable );
        pDialog->Show( !bEnable );
    }
}

void lcl_enableRangeChoosing(bool bEnable, weld::DialogController* pDialog)
{
    if (!pDialog)
@@ -169,17 +160,14 @@

DataSourceTabPage::DataSourceTabPage(TabPageParent pParent, DialogModel & rDialogModel,
                                     ChartTypeTemplateProvider* pTemplateProvider,
                                     Dialog * pParentDialog,
                                     bool bHideDescription /* = false */)
    : ::vcl::OWizardPage(pParent, "modules/schart/ui/tp_DataSource.ui", "tp_DataSource")
    , m_pTemplateProvider(pTemplateProvider)
    , m_rDialogModel(rDialogModel)
    , m_pCurrentRangeChoosingField( nullptr )
    , m_bIsDirty( false )
    , m_pParentDialog( pParentDialog )
    , m_pParentController(pParent.pController)
    , m_pTabPageNotifiable(pParentDialog ? dynamic_cast<TabPageNotifiable*>(pParentDialog)
                                         : dynamic_cast<TabPageNotifiable*>(m_pParentController))
    , m_pTabPageNotifiable(dynamic_cast<TabPageNotifiable*>(m_pParentController))
    , m_xFT_CAPTION(m_xBuilder->weld_label("FT_CAPTION_FOR_WIZARD"))
    , m_xFT_SERIES(m_xBuilder->weld_label("FT_SERIES"))
    , m_xLB_SERIES(m_xBuilder->weld_tree_view("LB_SERIES"))
@@ -247,13 +235,6 @@

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

void DataSourceTabPage::dispose()
{
    m_pParentDialog.clear();
    ::vcl::OWizardPage::dispose();
}

void DataSourceTabPage::ActivatePage()
@@ -548,7 +529,6 @@
                                      m_xLB_SERIES->get_text(nEntry));
        }

        lcl_enableRangeChoosing( true, m_pParentDialog );
        lcl_enableRangeChoosing( true, m_pParentController );
        m_rDialogModel.getRangeSelectionHelper()->chooseRange( aSelectedRolesRange, aUIStr, *this );
    }
@@ -565,7 +545,6 @@
        return;

    OUString aStr(SchResId(m_xFT_CATEGORIES->get_visible() ? STR_DATA_SELECT_RANGE_FOR_CATEGORIES : STR_DATA_SELECT_RANGE_FOR_DATALABELS));
    lcl_enableRangeChoosing(true, m_pParentDialog);
    lcl_enableRangeChoosing(true, m_pParentController);
    m_rDialogModel.getRangeSelectionHelper()->chooseRange(
        m_rDialogModel.getCategoriesRange(), aStr, *this );
@@ -746,7 +725,6 @@
    m_pCurrentRangeChoosingField = nullptr;

    updateControlState();
    lcl_enableRangeChoosing(false, m_pParentDialog);
    lcl_enableRangeChoosing(false, m_pParentController);
}

diff --git a/chart2/source/controller/dialogs/tp_DataSource.hxx b/chart2/source/controller/dialogs/tp_DataSource.hxx
index 26698ce..5386ae1 100644
--- a/chart2/source/controller/dialogs/tp_DataSource.hxx
+++ b/chart2/source/controller/dialogs/tp_DataSource.hxx
@@ -54,7 +54,6 @@
    explicit DataSourceTabPage(TabPageParent pParent,
                               DialogModel & rDialogModel,
                               ChartTypeTemplateProvider* pTemplateProvider,
                               Dialog * pParentDialog,
                               bool bHideDescription = false);
    virtual ~DataSourceTabPage() override;

@@ -64,7 +63,6 @@

private:
    // OWizardPage
    virtual void dispose() override;
    virtual bool commitPage( ::vcl::WizardTypes::CommitPageReason eReason ) override;

    //TabPage
@@ -123,7 +121,6 @@
    weld::Entry*                m_pCurrentRangeChoosingField;
    bool                        m_bIsDirty;

    VclPtr<Dialog>              m_pParentDialog;
    weld::DialogController*     m_pParentController;
    TabPageNotifiable *         m_pTabPageNotifiable;

diff --git a/chart2/source/controller/dialogs/tp_RangeChooser.cxx b/chart2/source/controller/dialogs/tp_RangeChooser.cxx
index 39bc4eb..e0f0338 100644
--- a/chart2/source/controller/dialogs/tp_RangeChooser.cxx
+++ b/chart2/source/controller/dialogs/tp_RangeChooser.cxx
@@ -40,15 +40,6 @@
        }
    }

    void lcl_enableRangeChoosing(bool bEnable, Dialog * pDialog)
    {
        if( pDialog )
        {
            pDialog->SetModalInputMode( !bEnable );
            pDialog->Show(!bEnable);
        }
    }

    void lcl_enableRangeChoosing(bool bEnable, weld::DialogController* pDialog)
    {
        if (!pDialog)
@@ -69,17 +60,15 @@

RangeChooserTabPage::RangeChooserTabPage(TabPageParent pParent, DialogModel & rDialogModel,
                                         ChartTypeTemplateProvider* pTemplateProvider,
                                         Dialog* pParentDialog, bool bHideDescription /* = false */)
                                         bool bHideDescription /* = false */)
    : OWizardPage(pParent, "modules/schart/ui/tp_RangeChooser.ui", "tp_RangeChooser")
    , m_nChangingControlCalls(0)
    , m_bIsDirty(false)
    , m_aLastValidRangeString()
    , m_pTemplateProvider(pTemplateProvider)
    , m_rDialogModel( rDialogModel )
    , m_pParentDialog(pParentDialog)
    , m_pParentController(pParent.pController)
    , m_pTabPageNotifiable(pParentDialog ? dynamic_cast<TabPageNotifiable*>(pParentDialog)
                                         : dynamic_cast<TabPageNotifiable*>(m_pParentController))
    , m_pTabPageNotifiable(dynamic_cast<TabPageNotifiable*>(m_pParentController))
    , m_xFT_Caption(m_xBuilder->weld_label("FT_CAPTION_FOR_WIZARD"))
    , m_xFT_Range(m_xBuilder->weld_label("FT_RANGE"))
    , m_xED_Range(m_xBuilder->weld_entry("ED_RANGE"))
@@ -135,13 +124,6 @@

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

void RangeChooserTabPage::dispose()
{
    m_pParentDialog.clear();
    OWizardPage::dispose();
}

void RangeChooserTabPage::ActivatePage()
@@ -358,7 +340,6 @@
    OUString aRange = m_xED_Range->get_text();
    OUString aTitle = m_xFTTitle->get_label();

    lcl_enableRangeChoosing( true, m_pParentDialog );
    lcl_enableRangeChoosing( true, m_pParentController );
    m_rDialogModel.getRangeSelectionHelper()->chooseRange( aRange, aTitle, *this );
}
@@ -385,7 +366,6 @@
    if( isValid())
        changeDialogModelAccordingToControls();

    lcl_enableRangeChoosing( false, m_pParentDialog );
    lcl_enableRangeChoosing( false, m_pParentController );
}
void RangeChooserTabPage::disposingRangeSelection()
diff --git a/chart2/source/controller/dialogs/tp_RangeChooser.hxx b/chart2/source/controller/dialogs/tp_RangeChooser.hxx
index 6bf8f28..d630fc59 100644
--- a/chart2/source/controller/dialogs/tp_RangeChooser.hxx
+++ b/chart2/source/controller/dialogs/tp_RangeChooser.hxx
@@ -39,9 +39,8 @@

    RangeChooserTabPage(TabPageParent pParent, DialogModel & rDialogModel,
                        ChartTypeTemplateProvider* pTemplateProvider,
                        Dialog * pParentDialog, bool bHideDescription = false);
                        bool bHideDescription = false);
    virtual ~RangeChooserTabPage() override;
    virtual void dispose() override;

    //RangeSelectionListenerParent
    virtual void listeningFinished( const OUString & rNewRange ) override;
@@ -78,7 +77,6 @@
    ChartTypeTemplateProvider*                              m_pTemplateProvider;

    DialogModel &                                           m_rDialogModel;
    VclPtr<Dialog>                                          m_pParentDialog;
    weld::DialogController*                                 m_pParentController;
    TabPageNotifiable *                                     m_pTabPageNotifiable;

diff --git a/chart2/source/controller/inc/dlg_CreationWizard.hxx b/chart2/source/controller/inc/dlg_CreationWizard.hxx
index 0f05f62..8562d63 100644
--- a/chart2/source/controller/inc/dlg_CreationWizard.hxx
+++ b/chart2/source/controller/inc/dlg_CreationWizard.hxx
@@ -36,10 +36,10 @@
class DialogModel;
class ChartTypeTemplateProvider;

class CreationWizard : public vcl::RoadmapWizard, public TabPageNotifiable
class CreationWizard : public vcl::RoadmapWizardMachine, public TabPageNotifiable
{
public:
    CreationWizard(vcl::Window* pParent,
    CreationWizard(weld::Window* pParent,
        const css::uno::Reference<css::frame::XModel>& xChartModel,
        const css::uno::Reference<css::uno::XComponentContext>& xContext);

@@ -50,6 +50,8 @@
    virtual void setInvalidPage(TabPage * pTabPage) override;
    virtual void setValidPage(TabPage * pTabPage) override;

    virtual short run() override;

protected:
    virtual bool leaveState( WizardState _nState ) override;
    virtual WizardState determineNextState(WizardState nCurrentState) const override;
diff --git a/chart2/source/controller/inc/dlg_CreationWizard_UNO.hxx b/chart2/source/controller/inc/dlg_CreationWizard_UNO.hxx
index a54adb5..230cac8 100644
--- a/chart2/source/controller/inc/dlg_CreationWizard_UNO.hxx
+++ b/chart2/source/controller/inc/dlg_CreationWizard_UNO.hxx
@@ -92,8 +92,6 @@
    virtual void SAL_CALL addVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;
    virtual void SAL_CALL removeVetoableChangeListener( const OUString& PropertyName, const css::uno::Reference< css::beans::XVetoableChangeListener >& aListener ) override;

    DECL_LINK( DialogEventHdl, VclWindowEvent&, void );

protected:
    // ____ OComponentHelper ____
    /// Called in dispose method after the listeners were notified.
@@ -107,7 +105,7 @@
    css::uno::Reference< css::uno::XComponentContext>    m_xCC;
    css::uno::Reference< css::awt::XWindow >             m_xParentWindow;

    VclPtr<CreationWizard>     m_pDialog;
    std::unique_ptr<CreationWizard> m_xDialog;
    bool            m_bUnlockControllersOnExecute;
};

diff --git a/chart2/uiconfig/ui/tp_RangeChooser.ui b/chart2/uiconfig/ui/tp_RangeChooser.ui
index 2684913d3..9a74a3d 100644
--- a/chart2/uiconfig/ui/tp_RangeChooser.ui
+++ b/chart2/uiconfig/ui/tp_RangeChooser.ui
@@ -11,6 +11,7 @@
  <object class="GtkGrid" id="tp_RangeChooser">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="hexpand">True</property>
    <property name="border_width">6</property>
    <child>
      <object class="GtkGrid" id="box1">
diff --git a/chart2/uiconfig/ui/wizelementspage.ui b/chart2/uiconfig/ui/wizelementspage.ui
index b301b82..5749070 100644
--- a/chart2/uiconfig/ui/wizelementspage.ui
+++ b/chart2/uiconfig/ui/wizelementspage.ui
@@ -5,6 +5,7 @@
  <object class="GtkBox" id="WizElementsPage">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="hexpand">True</property>
    <property name="border_width">6</property>
    <property name="orientation">vertical</property>
    <property name="spacing">12</property>
@@ -12,18 +13,21 @@
      <object class="GtkFrame" id="frameAxes">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="hexpand">True</property>
        <property name="label_xalign">0</property>
        <property name="shadow_type">none</property>
        <child>
          <object class="GtkAlignment" id="alignment1">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="hexpand">True</property>
            <property name="top_padding">6</property>
            <property name="left_padding">12</property>
            <child>
              <object class="GtkGrid" id="grid2">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="hexpand">True</property>
                <property name="column_spacing">18</property>
                <child>
                  <object class="GtkGrid" id="grid4">
diff --git a/dbaccess/UIConfig_dbaccess.mk b/dbaccess/UIConfig_dbaccess.mk
index ff79be0..eacb9eb 100644
--- a/dbaccess/UIConfig_dbaccess.mk
+++ b/dbaccess/UIConfig_dbaccess.mk
@@ -21,7 +21,6 @@
    dbaccess/uiconfig/ui/colwidthdialog \
    dbaccess/uiconfig/ui/connectionpage \
    dbaccess/uiconfig/ui/copytablepage \
    dbaccess/uiconfig/ui/databasewizard \
    dbaccess/uiconfig/ui/dbaseindexdialog \
    dbaccess/uiconfig/ui/dbasepage \
    dbaccess/uiconfig/ui/dbwizconnectionpage \
diff --git a/dbaccess/source/ui/dlg/dbwizsetup.cxx b/dbaccess/source/ui/dlg/dbwizsetup.cxx
index e878a7d..78ec885 100644
--- a/dbaccess/source/ui/dlg/dbwizsetup.cxx
+++ b/dbaccess/source/ui/dlg/dbwizsetup.cxx
@@ -68,6 +68,7 @@
#include <com/sun/star/ucb/IOErrorCode.hpp>
#include <com/sun/star/task/InteractionHandler.hpp>
#include <com/sun/star/task/XInteractionHandler2.hpp>
#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>

#include <svl/filenotation.hxx>
@@ -173,6 +174,14 @@
    m_xAssistant->set_current_page(0);
}

short ODbTypeWizDialogSetup::run()
{
    int nRet = vcl::RoadmapWizardMachine::run();
    if (nRet == static_cast<int>(WizardButtonFlags::FINISH))
        return ui::dialogs::ExecutableDialogResults::OK;
    return ui::dialogs::ExecutableDialogResults::CANCEL;
}

void ODbTypeWizDialogSetup::declareAuthDepPath( const OUString& _sURL, PathId _nPathId, const vcl::RoadmapWizardTypes::WizardPath& _rPaths)
{
    bool bHasAuthentication = DataSourceMetaData::getAuthentication( _sURL ) != AuthNone;
diff --git a/dbaccess/source/ui/inc/dbwizsetup.hxx b/dbaccess/source/ui/inc/dbwizsetup.hxx
index 16969b4..171c58b 100644
--- a/dbaccess/source/ui/inc/dbwizsetup.hxx
+++ b/dbaccess/source/ui/inc/dbwizsetup.hxx
@@ -118,6 +118,7 @@
    */
    bool IsTableWizardToBeStarted() const;

    virtual short run() override;
private:
    /// to override to create new pages
    virtual VclPtr<TabPage> createPage(WizardState _nState) override;
diff --git a/dbaccess/source/ui/uno/DBTypeWizDlgSetup.cxx b/dbaccess/source/ui/uno/DBTypeWizDlgSetup.cxx
index 8361a23..e372cbe 100644
--- a/dbaccess/source/ui/uno/DBTypeWizDlgSetup.cxx
+++ b/dbaccess/source/ui/uno/DBTypeWizDlgSetup.cxx
@@ -26,6 +26,7 @@
#include <com/sun/star/beans/PropertyAttribute.hpp>
#include <com/sun/star/sdb/XOfficeDatabaseDocument.hpp>
#include <com/sun/star/sdbc/XDataSource.hpp>
#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>
#include <comphelper/processfactory.hxx>
#include <vcl/svapp.hxx>

@@ -111,9 +112,9 @@
    return svt::OGenericUnoDialog::Dialog(std::make_unique<ODbTypeWizDialogSetup>(Application::GetFrameWeld(rParent), m_pDatasourceItems.get(), m_aContext, m_aInitialSelection));
}

void ODBTypeWizDialogSetup::executedDialog(sal_Int16 _nExecutionResult)
void ODBTypeWizDialogSetup::executedDialog(sal_Int16 nExecutionResult)
{
    if ( _nExecutionResult == RET_OK )
    if (nExecutionResult == css::ui::dialogs::ExecutableDialogResults::OK)
    {
        const ODbTypeWizDialogSetup* pDialog = static_cast<ODbTypeWizDialogSetup*>(m_aDialog.m_xWeldDialog.get());
        m_bOpenDatabase = pDialog->IsDatabaseDocumentToBeOpened();
diff --git a/include/vcl/roadmapwizard.hxx b/include/vcl/roadmapwizard.hxx
index df0632a..de70169 100644
--- a/include/vcl/roadmapwizard.hxx
+++ b/include/vcl/roadmapwizard.hxx
@@ -230,8 +230,6 @@

        void            SetRoadmapHelpId( const OString& _rId );

        void            SetRoadmapInteractive( bool _bInteractive );

        // returns whether a given state is enabled
        bool            isStateEnabled( WizardState _nState ) const;

diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index d4b6882..61deac2 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -480,6 +480,8 @@
    virtual void set_page_sensitive(const OString& rIdent, bool bSensitive) = 0;
    virtual weld::Container* append_page(const OString& rIdent) = 0;

    virtual void set_page_side_help_id(const OString& rHelpId) = 0;

    void connect_jump_page(const Link<const OString&, bool>& rLink) { m_aJumpPageHdl = rLink; }
};

diff --git a/vcl/UIConfig_vcl.mk b/vcl/UIConfig_vcl.mk
index 3184aae..638fc9a 100644
--- a/vcl/UIConfig_vcl.mk
+++ b/vcl/UIConfig_vcl.mk
@@ -11,6 +11,7 @@

$(eval $(call gb_UIConfig_add_uifiles,vcl,\
	vcl/uiconfig/ui/aboutbox \
	vcl/uiconfig/ui/wizard \
	vcl/uiconfig/ui/cupspassworddialog \
	vcl/uiconfig/ui/editmenu \
	vcl/uiconfig/ui/errornocontentdialog \
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index e0f3ad3..547bac4 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -1653,6 +1653,11 @@
        }
    }

    virtual void set_page_side_help_id(const OString& rHelpId) override
    {
        m_xWizard->SetRoadmapHelpId(rHelpId);
    }

    weld::Button* weld_widget_for_response(int nResponse) override;

    virtual ~SalInstanceAssistant() override
diff --git a/vcl/source/control/roadmapwizard.cxx b/vcl/source/control/roadmapwizard.cxx
index 2d29a71..66f098e 100644
--- a/vcl/source/control/roadmapwizard.cxx
+++ b/vcl/source/control/roadmapwizard.cxx
@@ -170,12 +170,12 @@
        m_pImpl->pRoadmap->SetHelpId( _rId );
    }

    void RoadmapWizard::SetRoadmapInteractive( bool _bInteractive )
    void RoadmapWizardMachine::SetRoadmapHelpId(const OString& rId)
    {
        m_pImpl->pRoadmap->SetRoadmapInteractive( _bInteractive );
        m_xAssistant->set_page_side_help_id(rId);
    }

    void RoadmapWizardMachine::SetRoadmapInteractive( bool _bInteractive )
    void RoadmapWizard::SetRoadmapInteractive( bool _bInteractive )
    {
        m_pImpl->pRoadmap->SetRoadmapInteractive( _bInteractive );
    }
diff --git a/vcl/source/control/wizardmachine.cxx b/vcl/source/control/wizardmachine.cxx
index 8a1a92a..8f291ce 100644
--- a/vcl/source/control/wizardmachine.cxx
+++ b/vcl/source/control/wizardmachine.cxx
@@ -685,7 +685,7 @@
    }

    WizardMachine::WizardMachine(weld::Window* pParent, WizardButtonFlags nButtonFlags)
        : AssistantController(pParent, "dbaccess/ui/databasewizard.ui", "DatabaseWizard")
        : AssistantController(pParent, "vcl/ui/wizard.ui", "Wizard")
        , m_nCurState(0)
        , m_pFirstPage(nullptr)
        , m_xFinish(m_xAssistant->weld_widget_for_response(static_cast<int>(WizardButtonFlags::FINISH)))
@@ -892,7 +892,7 @@

    bool WizardMachine::onFinish()
    {
        return Finish( RET_OK );
        return Finish(static_cast<int>(WizardButtonFlags::FINISH));
    }

    IMPL_LINK_NOARG(WizardMachine, OnFinish, weld::Button&, void)
diff --git a/dbaccess/uiconfig/ui/databasewizard.ui b/vcl/uiconfig/ui/wizard.ui
similarity index 72%
rename from dbaccess/uiconfig/ui/databasewizard.ui
rename to vcl/uiconfig/ui/wizard.ui
index 5f07332..e1f68da 100644
--- a/dbaccess/uiconfig/ui/databasewizard.ui
+++ b/vcl/uiconfig/ui/wizard.ui
@@ -1,11 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface domain="dba">
<interface domain="vcl">
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkAssistant" id="DatabaseWizard">
  <object class="GtkAssistant" id="Wizard">
    <property name="can_focus">True</property>
    <property name="border_width">6</property>
    <property name="title" translatable="yes" context="databasewizard|DatabaseWizard">Database Wizard</property>
    <property name="modal">True</property>
    <property name="default_width">0</property>
    <property name="default_height">0</property>
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 45f6ae5..4045e1c 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -3012,10 +3012,16 @@
    static void signal_response(GtkDialog*, gint nResponseId, gpointer data);
    static void signal_cancel(GtkDialog*, gpointer data);

    static gboolean signal_delete(GtkDialog*, GdkEventAny*, gpointer data)
    static gboolean signal_delete(GtkDialog* pDialog, GdkEventAny*, gpointer data)
    {
        DialogRunner* pThis = static_cast<DialogRunner*>(data);
        pThis->loop_quit();
        if (GTK_IS_ASSISTANT(pThis->m_pDialog))
        {
            // An assistant isn't a dialog, but we want to treat it like one
            signal_response(pDialog, GTK_RESPONSE_DELETE_EVENT, data);
        }
        else
            pThis->loop_quit();
        return true; /* Do not destroy */
    }

@@ -3835,6 +3841,13 @@
        return m_aPages.back().get();
    }

    virtual void set_page_side_help_id(const OString& rHelpId) override
    {
        if (!m_pSidebar)
            return;
        ::set_help_id(m_pSidebar, rHelpId);
    }

    virtual GtkButton* get_widget_for_response(int nGtkResponse) override
    {
        GtkButton* pButton = nullptr;