weld HyperLink Dialog

Change-Id: Ic861b0a593505828a900fe2163125d6f5584a956
Reviewed-on: https://gerrit.libreoffice.org/74634
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/cui/inc/bitmaps.hlst b/cui/inc/bitmaps.hlst
index 8d506a6..94d6227 100644
--- a/cui/inc/bitmaps.hlst
+++ b/cui/inc/bitmaps.hlst
@@ -66,15 +66,7 @@
#define RID_CUIBMP_COLLAPSED            "res/plus.png"
#define RID_CUIBMP_EXPANDED             "res/minus.png"

#define RID_SVXBMP_HLINETTP             "res/hlinettp.png"
#define RID_SVXBMP_HLMAILTP             "res/hlmailtp.png"
#define RID_SVXBMP_HLDOCTP              "res/hldoctp.png"
#define RID_SVXBMP_HLDOCNTP             "res/hldocntp.png"
#define RID_SVXBMP_SCRIPT               "res/script.png"
#define RID_SVXBMP_ADRESSBOOK           "res/adrbook.png"
#define RID_SVXBMP_FILEOPEN             "res/fileopen.png"
#define RID_SVXBMP_TARGET               "res/target.png"
#define RID_SVXBMP_NEWDOC               "res/newdoc.png"

#define RID_SVXBMP_COLLAPSEDNODE        "res/sx18002.png"
#define RID_SVXBMP_EXPANDEDNODE         "res/sx18003.png"
diff --git a/cui/inc/strings.hrc b/cui/inc/strings.hrc
index 9b302e4..d79397b 100644
--- a/cui/inc/strings.hrc
+++ b/cui/inc/strings.hrc
@@ -74,14 +74,6 @@
#define RID_SVXSTR_HYPDLG_MACROACT2                 NC_("RID_SVXSTR_HYPDLG_MACROACT2", "Trigger hyperlink")
#define RID_SVXSTR_HYPDLG_MACROACT3                 NC_("RID_SVXSTR_HYPDLG_MACROACT3", "Mouse leaves object")
#define RID_SVXSTR_HYPDLG_NOVALIDFILENAME           NC_("RID_SVXSTR_HYPDLG_NOVALIDFILENAME", "Please type in a valid file name.")
#define RID_SVXSTR_HYPERDLG_HLINETTP                NC_("RID_SVXSTR_HYPERDLG_HLINETTP", "Internet")
#define RID_SVXSTR_HYPERDLG_HLINETTP_HELP           NC_("RID_SVXSTR_HYPERDLG_HLINETTP_HELP", "This is where you create a hyperlink to a Web page or FTP server connection.")
#define RID_SVXSTR_HYPERDLG_HLMAILTP                NC_("RID_SVXSTR_HYPERDLG_HLMAILTP", "Mail")
#define RID_SVXSTR_HYPERDLG_HLMAILTP_HELP           NC_("RID_SVXSTR_HYPERDLG_HLMAILTP_HELP", "This is where you create a hyperlink to an email address.")
#define RID_SVXSTR_HYPERDLG_HLDOCTP                 NC_("RID_SVXSTR_HYPERDLG_HLDOCTP", "Document")
#define RID_SVXSTR_HYPERDLG_HLDOCTP_HELP            NC_("RID_SVXSTR_HYPERDLG_HLDOCTP_HELP", "This is where you create a hyperlink to an existing document or a target within a document.")
#define RID_SVXSTR_HYPERDLG_HLDOCNTP                NC_("RID_SVXSTR_HYPERDLG_HLDOCNTP", "New Document")
#define RID_SVXSTR_HYPERDLG_HLDOCNTP_HELP           NC_("RID_SVXSTR_HYPERDLG_HLDOCNTP_HELP", "This is where you create a new document to which the new link points.")
#define RID_SVXSTR_HYPERDLG_FORM_BUTTON             NC_("RID_SVXSTR_HYPERDLG_FORM_BUTTON", "Button")
#define RID_SVXSTR_HYPERDLG_FROM_TEXT               NC_("RID_SVXSTR_HYPERDLG_FROM_TEXT", "Text")
#define RID_SVXSTR_HYPERDLG_QUERYOVERWRITE          NC_("RID_SVXSTR_HYPERDLG_QUERYOVERWRITE", "The file already exists. Overwrite?")
diff --git a/cui/source/dialogs/cuihyperdlg.cxx b/cui/source/dialogs/cuihyperdlg.cxx
index 8daedff..65e6eab 100644
--- a/cui/source/dialogs/cuihyperdlg.cxx
+++ b/cui/source/dialogs/cuihyperdlg.cxx
@@ -29,6 +29,7 @@
#include <hldoctp.hxx>
#include <hldocntp.hxx>
#include <bitmaps.hlst>
#include <sfx2/viewfrm.hxx>
#include <svx/svxids.hrc>
#include <dialmgr.hxx>
#include <strings.hrc>
@@ -52,6 +53,7 @@ SvxHlinkCtrl::SvxHlinkCtrl( sal_uInt16 _nId, SfxBindings & rBindings, SvxHpLinkD

void SvxHlinkCtrl::dispose()
{
    pParent = nullptr;
    aRdOnlyForwarder.dispose();
    ::SfxControllerItem::dispose();
}
@@ -59,7 +61,7 @@ void SvxHlinkCtrl::dispose()
void SvxHlinkCtrl::StateChanged( sal_uInt16 nSID, SfxItemState eState,
                                 const SfxPoolItem* pState )
{
    if ( eState == SfxItemState::DEFAULT && !pParent->IsDisposed() )
    if (eState == SfxItemState::DEFAULT && pParent)
    {
        switch ( nSID )
        {
@@ -80,29 +82,21 @@ void SvxHlinkCtrl::StateChanged( sal_uInt16 nSID, SfxItemState eState,
//#                                                                      #
//# Hyperlink - Dialog                                                   #
//#                                                                      #

SvxHpLinkDlg::SvxHpLinkDlg (vcl::Window* pParent, SfxBindings* pBindings)
    : SfxModalDialog(pParent, "HyperlinkDialog", "cui/ui/hyperlinkdialog.ui")
    , mnCurrentPageId(HyperLinkPageType::NONE)
SvxHpLinkDlg::SvxHpLinkDlg(SfxBindings* pBindings, SfxChildWindow* pChild, weld::Window* pParent)
    : SfxModelessDialogController(pBindings, pChild, pParent, "cui/ui/hyperlinkdialog.ui", "HyperlinkDialog")
    , pSet            ( nullptr )
    , pExampleSet     ( nullptr )
    , maCtrl          ( SID_HYPERLINK_GETLINK, *pBindings, this )
    , mpBindings      ( pBindings )
    , mbIsHTMLDoc     ( false )
    , m_xIconCtrl(m_xBuilder->weld_notebook("icon_control"))
    , m_xOKBtn(m_xBuilder->weld_button("ok"))
    , m_xApplyBtn(m_xBuilder->weld_button("apply"))
    , m_xCancelBtn(m_xBuilder->weld_button("cancel"))
    , m_xHelpBtn(m_xBuilder->weld_button("help"))
    , m_xResetBtn(m_xBuilder->weld_button("reset"))
{
    get(m_pOKBtn, "ok");
    get(m_pApplyBtn, "apply");
    get(m_pCancelBtn, "cancel");
    get(m_pHelpBtn, "help");
    get(m_pResetBtn, "reset");
    get(m_pIconCtrl, "icon_control");
    get(m_pTabContainer, "tab");

    SetCtrlStyle();
    m_pIconCtrl->SetClickHdl ( LINK ( this, SvxHpLinkDlg, ChosePageHdl_Impl ) );
    m_pIconCtrl->Show();
    m_pIconCtrl->SetChoiceWithCursor();
    m_pIconCtrl->SetSelectionMode( SelectionMode::Single );
    m_xIconCtrl->connect_enter_page( LINK ( this, SvxHpLinkDlg, ChosePageHdl_Impl ) );
    m_xIconCtrl->show();

    // ItemSet
    if ( pSet )
@@ -112,38 +106,16 @@ SvxHpLinkDlg::SvxHpLinkDlg (vcl::Window* pParent, SfxBindings* pBindings)
    }

    // Buttons
    m_pOKBtn->SetClickHdl   ( LINK( this, SvxHpLinkDlg, OkHdl ) );
    m_pApplyBtn->SetClickHdl   ( LINK( this, SvxHpLinkDlg, ApplyHdl ) );
    m_pResetBtn->SetClickHdl( LINK( this, SvxHpLinkDlg, ResetHdl ) );
    m_pOKBtn->Show();
    m_pApplyBtn->Show();
    m_pCancelBtn->Show();
    m_pHelpBtn->Show();
    m_pResetBtn->Show();
    m_xOKBtn->show();
    m_xApplyBtn->show();
    m_xCancelBtn->show();
    m_xHelpBtn->show();
    m_xResetBtn->show();

    mbGrabFocus = true;
    // insert pages
    OUString aStrTitle;
    SvxIconChoiceCtrlEntry *pEntry;

    aStrTitle = CuiResId( RID_SVXSTR_HYPERDLG_HLINETTP );
    pEntry = AddTabPage ( HyperLinkPageType::Internet, aStrTitle, Image(StockImage::Yes, RID_SVXBMP_HLINETTP), SvxHyperlinkInternetTp::Create );
    pEntry->SetQuickHelpText( CuiResId( RID_SVXSTR_HYPERDLG_HLINETTP_HELP ) );
    aStrTitle = CuiResId( RID_SVXSTR_HYPERDLG_HLMAILTP );
    pEntry = AddTabPage ( HyperLinkPageType::Mail, aStrTitle, Image(StockImage::Yes, RID_SVXBMP_HLMAILTP), SvxHyperlinkMailTp::Create );
    pEntry->SetQuickHelpText( CuiResId( RID_SVXSTR_HYPERDLG_HLMAILTP_HELP ) );
    if (!comphelper::LibreOfficeKit::isActive())
    {
        aStrTitle = CuiResId( RID_SVXSTR_HYPERDLG_HLDOCTP );
        pEntry = AddTabPage ( HyperLinkPageType::Document, aStrTitle, Image(StockImage::Yes, RID_SVXBMP_HLDOCTP), SvxHyperlinkDocTp::Create );
        pEntry->SetQuickHelpText( CuiResId( RID_SVXSTR_HYPERDLG_HLDOCTP_HELP ) );
        aStrTitle = CuiResId( RID_SVXSTR_HYPERDLG_HLDOCNTP );
        pEntry = AddTabPage ( HyperLinkPageType::NewDocument, aStrTitle, Image(StockImage::Yes, RID_SVXBMP_HLDOCNTP), SvxHyperlinkNewDocTp::Create );
        pEntry->SetQuickHelpText( CuiResId( RID_SVXSTR_HYPERDLG_HLDOCNTP_HELP ) );
    }

    // set OK/Cancel - button
    GetCancelButton().SetText ( CuiResId(RID_SVXSTR_HYPDLG_CLOSEBUT) );
    m_xCancelBtn->set_label(CuiResId(RID_SVXSTR_HYPDLG_CLOSEBUT));

    // create itemset for tabpages
    mpItemSet = std::make_unique<SfxItemSet>( SfxGetpApp()->GetPool(), svl::Items<SID_HYPERLINK_GETLINK,
@@ -154,45 +126,30 @@ SvxHpLinkDlg::SvxHpLinkDlg (vcl::Window* pParent, SfxBindings* pBindings)

    SetInputSet (mpItemSet.get());

    //loop through the pages and get their max bounds and lock that down
    ShowPage(HyperLinkPageType::NewDocument);
    VclBox *pBox = get_content_area();
    Size aMaxPrefSize(pBox->get_preferred_size());
    ShowPage(HyperLinkPageType::Document);
    Size aSize(pBox->get_preferred_size());
    aMaxPrefSize.setWidth( std::max(aMaxPrefSize.Width(), aSize.Width()) );
    aMaxPrefSize.setHeight( std::max(aMaxPrefSize.Height(), aSize.Height()) );
    ShowPage(HyperLinkPageType::Mail);
    aSize = pBox->get_preferred_size();
    aMaxPrefSize.setWidth( std::max(aMaxPrefSize.Width(), aSize.Width()) );
    aMaxPrefSize.setHeight( std::max(aMaxPrefSize.Height(), aSize.Height()) );
    ShowPage(HyperLinkPageType::Internet);
    aSize = pBox->get_preferred_size();
    aMaxPrefSize.setWidth( std::max(aMaxPrefSize.Width(), aSize.Width()) );
    aMaxPrefSize.setHeight( std::max(aMaxPrefSize.Height(), aSize.Height()) );
    pBox->set_width_request(aMaxPrefSize.Width());
    pBox->set_height_request(aMaxPrefSize.Height());
    // insert pages
    AddTabPage("internet", SvxHyperlinkInternetTp::Create);
    AddTabPage("mail", SvxHyperlinkMailTp::Create);
    if (!comphelper::LibreOfficeKit::isActive())
    {
        AddTabPage("document", SvxHyperlinkDocTp::Create);
        AddTabPage("newdocument", SvxHyperlinkNewDocTp::Create);
    }

    SetCurPageId(HyperLinkPageType::Internet);
    SetCurPageId("internet");

    // Init Dialog
    Start();

    pBindings->Update( SID_READONLY_MODE );
    GetBindings().Update(SID_READONLY_MODE);

    GetOKButton().SetClickHdl    ( LINK ( this, SvxHpLinkDlg, ClickOkHdl_Impl ) );
    GetApplyButton().SetClickHdl ( LINK ( this, SvxHpLinkDlg, ClickApplyHdl_Impl ) );
    GetCancelButton().SetClickHdl( LINK ( this, SvxHpLinkDlg, ClickCloseHdl_Impl ) );
    m_xResetBtn->connect_clicked( LINK( this, SvxHpLinkDlg, ResetHdl ) );
    m_xOKBtn->connect_clicked( LINK ( this, SvxHpLinkDlg, ClickOkHdl_Impl ) );
    m_xApplyBtn->connect_clicked ( LINK ( this, SvxHpLinkDlg, ClickApplyHdl_Impl ) );
}

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

void SvxHpLinkDlg::dispose()
{
    // delete config item, so the base class (SfxModalDialog) can not load it on the next start
    // delete config item, so the base class (SfxModelessDialogController) can not load it on the next start
    SvtViewOptions aViewOpt( EViewType::TabDialog, OUString::number(SID_HYPERLINK_DIALOG) );
    aViewOpt.Delete();

@@ -200,44 +157,19 @@ void SvxHpLinkDlg::dispose()

    maCtrl.dispose();

    // save configuration at INI-Manager
    // and remove pages
    //SvtViewOptions aTabDlgOpt( EViewType::TabDialog, rId );
    //aTabDlgOpt.SetWindowState(OStringToOUString(GetWindowState((WindowStateMask::X | WindowStateMask::Y | WindowStateMask::State | WindowStateMask::Minimized)), RTL_TEXTENCODING_ASCII_US));
    //aTabDlgOpt.SetPageID( mnCurrentPageId );

    for (std::unique_ptr<IconChoicePageData> & pData : maPageList)
    {
        if ( pData->pPage )
            pData->pPage.disposeAndClear();
    }
    maPageList.clear();

    pRanges.reset();
    pOutSet.reset();

    m_pIconCtrl.clear();
    m_pOKBtn.clear();
    m_pApplyBtn.clear();
    m_pCancelBtn.clear();
    m_pHelpBtn.clear();
    m_pResetBtn.clear();
    m_pTabContainer.clear();
    SfxModalDialog::dispose();
}

/*************************************************************************
|*
|* Close Dialog-Window
|*
|************************************************************************/

bool SvxHpLinkDlg::Close()
void SvxHpLinkDlg::Close()
{
    GetDispatcher()->Execute( SID_HYPERLINK_DIALOG,
                              SfxCallMode::ASYNCHRON |
                              SfxCallMode::RECORD);
    return true;
    if (IsClosing())
        return;
    SfxViewFrame* pViewFrame = SfxViewFrame::Current();
    if (pViewFrame)
        pViewFrame->ToggleChildWindow(SID_HYPERLINK_DIALOG);
}

void SvxHpLinkDlg::Apply()
@@ -261,60 +193,11 @@ void SvxHpLinkDlg::Apply()
    }
}

/*************************************************************************
|*
|* When extra window is visible and its never moved by user, then move that
|* window, too.
|*
|************************************************************************/

void SvxHpLinkDlg::Move()
{
    SvxHyperlinkTabPageBase* pCurrentPage = static_cast<SvxHyperlinkTabPageBase*>(
                                              GetTabPage ( GetCurPageId() ) );

    if( pCurrentPage->IsMarkWndVisible () )
    {
        // Pos&Size of this dialog-window
        Point aDlgPos ( GetPosPixel () );
        Size aDlgSize ( GetSizePixel () );

        // Size of Office-Main-Window
        Size aWindowSize( SfxGetpApp()->GetTopWindow()->GetSizePixel() );

        // Size of Extrawindow
        Size aExtraWndSize( pCurrentPage->GetSizeExtraWnd() );

        if( aDlgPos.X()+(1.02*aDlgSize.Width())+aExtraWndSize.Width() > aWindowSize.Width() )
        {
            if( aDlgPos.X() - ( 0.02*aDlgSize.Width() ) - aExtraWndSize.Width() < 0 )
            {
                // Pos Extrawindow anywhere
                pCurrentPage->MoveToExtraWnd( Point( 1, long(1.1*aDlgPos.Y()) ) );
            }
            else
            {
                // Pos Extrawindow on the left side of Dialog
                pCurrentPage->MoveToExtraWnd( aDlgPos -
                                              Point( long(0.02*aDlgSize.Width()), 0 ) -
                                              Point( aExtraWndSize.Width(), 0 ) );
            }
        }
        else
        {
            // Pos Extrawindow on the right side of Dialog
            pCurrentPage->MoveToExtraWnd ( aDlgPos + Point( long(1.02*aDlgSize.Width()), 0 ) );
        }
    }

    Window::Move();
}

/// Click on OK button
IMPL_LINK_NOARG(SvxHpLinkDlg, ClickOkHdl_Impl, Button*, void)
IMPL_LINK_NOARG(SvxHpLinkDlg, ClickOkHdl_Impl, weld::Button&, void)
{
    Apply();
    Close();
    m_xDialog->response(RET_OK);
}

/*************************************************************************
@@ -322,32 +205,19 @@ IMPL_LINK_NOARG(SvxHpLinkDlg, ClickOkHdl_Impl, Button*, void)
|* Click on Apply-button
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHpLinkDlg, ClickApplyHdl_Impl, Button*, void)
IMPL_LINK_NOARG(SvxHpLinkDlg, ClickApplyHdl_Impl, weld::Button&, void)
{
    Apply();
}

/*************************************************************************
|*
|* Click on Close-button
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHpLinkDlg, ClickCloseHdl_Impl, Button*, void)
{
    Close();
}

/*************************************************************************
|*
|* Set Page
|*
|************************************************************************/

void SvxHpLinkDlg::SetPage ( SvxHyperlinkItem const * pItem )
{
    HyperLinkPageType nPageId = HyperLinkPageType::Internet;
    OString sPageId("internet");

    OUString aStrURL(pItem->GetURL());
    INetURLObject aURL(aStrURL);
@@ -357,32 +227,32 @@ void SvxHpLinkDlg::SetPage ( SvxHyperlinkItem const * pItem )
    {
        case INetProtocol::Http :
        case INetProtocol::Ftp :
            nPageId = HyperLinkPageType::Internet;
            sPageId = "internet";
            break;
        case INetProtocol::File :
            nPageId = HyperLinkPageType::Document;
            sPageId = "document";
            break;
        case INetProtocol::Mailto :
            nPageId = HyperLinkPageType::Mail;
            sPageId = "mail";
            break;
        default :
            if (aStrURL.startsWith("#"))
                nPageId = HyperLinkPageType::Document;
                sPageId = "document";
            else
            {
                // not valid
                nPageId = GetCurPageId();
                sPageId = GetCurPageId();
            }
            break;
    }

    ShowPage (nPageId);
    ShowPage (sPageId);

    SvxHyperlinkTabPageBase* pCurrentPage = static_cast<SvxHyperlinkTabPageBase*>(GetTabPage( nPageId ));
    SvxHyperlinkTabPageBase* pCurrentPage = static_cast<SvxHyperlinkTabPageBase*>(GetTabPage( sPageId ));

    mbIsHTMLDoc = (pItem->GetInsertMode() & HLINK_HTMLMODE) != 0;

    IconChoicePage* pPage = GetTabPage (nPageId);
    IconChoicePage* pPage = GetTabPage (sPageId);
    if(pPage)
    {
        SfxItemSet& aPageSet = const_cast<SfxItemSet&>(pPage->GetItemSet ());
@@ -402,13 +272,9 @@ void SvxHpLinkDlg::SetPage ( SvxHyperlinkItem const * pItem )
|* Enable/Disable ReadOnly mode
|*
|************************************************************************/

void SvxHpLinkDlg::SetReadOnlyMode( bool bRdOnly )
{
    if ( bRdOnly )
        GetOKButton().Disable();
    else
        GetOKButton().Enable();
    GetOKButton().set_sensitive(!bRdOnly);
}

/*************************************************************************
@@ -416,13 +282,10 @@ void SvxHpLinkDlg::SetReadOnlyMode( bool bRdOnly )
|* late-initialization of newly created pages
|*
|************************************************************************/

void SvxHpLinkDlg::PageCreated( HyperLinkPageType /*nId*/, IconChoicePage& rPage )
void SvxHpLinkDlg::PageCreated(const OString& /*rId*/, IconChoicePage& rPage)
{
    SvxHyperlinkTabPageBase& rHyperlinkPage = dynamic_cast< SvxHyperlinkTabPageBase& >( rPage );
    Reference< XFrame > xDocumentFrame;
    if ( mpBindings )
        xDocumentFrame = mpBindings->GetActiveFrame();
    Reference< XFrame > xDocumentFrame = GetBindings().GetActiveFrame();
    OSL_ENSURE( xDocumentFrame.is(), "SvxHpLinkDlg::PageCreated: macro assignment functionality won't work with a proper frame!" );
    rHyperlinkPage.SetDocumentFrame( xDocumentFrame );
}
diff --git a/cui/source/dialogs/hldocntp.cxx b/cui/source/dialogs/hldocntp.cxx
index 65afc25..9ecb6f5 100644
--- a/cui/source/dialogs/hldocntp.cxx
+++ b/cui/source/dialogs/hldocntp.cxx
@@ -42,6 +42,7 @@
#include <com/sun/star/ui/dialogs/ExecutableDialogResults.hpp>

#include <bitmaps.hlst>
#include <cuihyperdlg.hxx>
#include <dialmgr.hxx>
#include <strings.hrc>

@@ -89,9 +90,9 @@ bool SvxHyperlinkNewDocTp::ImplGetURLObject( const OUString& rPath, const OUStri
        }
        if ( bIsValidURL )
        {
            sal_Int32 nPos = m_pLbDocTypes->GetSelectedEntryPos();
            if ( nPos != LISTBOX_ENTRY_NOTFOUND )
                aURLObject.SetExtension( static_cast<DocumentTypeData*>(m_pLbDocTypes->GetEntryData( nPos ))->aStrExt );
            sal_Int32 nPos = m_xLbDocTypes->get_selected_index();
            if (nPos != -1)
                aURLObject.SetExtension(reinterpret_cast<DocumentTypeData*>(m_xLbDocTypes->get_id(nPos).toInt64())->aStrExt);
        }

    }
@@ -104,55 +105,40 @@ bool SvxHyperlinkNewDocTp::ImplGetURLObject( const OUString& rPath, const OUStri
|*
|************************************************************************/

SvxHyperlinkNewDocTp::SvxHyperlinkNewDocTp ( vcl::Window *pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet)
:   SvxHyperlinkTabPageBase ( pParent, pDlg, "HyperlinkNewDocPage", "cui/ui/hyperlinknewdocpage.ui", pItemSet )
SvxHyperlinkNewDocTp::SvxHyperlinkNewDocTp(weld::Container* pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet)
    : SvxHyperlinkTabPageBase(pParent, pDlg, "cui/ui/hyperlinknewdocpage.ui", "HyperlinkNewDocPage", pItemSet)
    , m_xRbtEditNow(xBuilder->weld_radio_button("editnow"))
    , m_xRbtEditLater(xBuilder->weld_radio_button("editlater"))
    , m_xCbbPath(new SvxHyperURLBox(xBuilder->weld_combo_box("path")))
    , m_xBtCreate(xBuilder->weld_button("create"))
    , m_xLbDocTypes(xBuilder->weld_tree_view("types"))
{
    get(m_pRbtEditNow, "editnow");
    get(m_pRbtEditLater, "editlater");
    get(m_pCbbPath, "path");
    m_pCbbPath->SetSmartProtocol(INetProtocol::File);
    get(m_pBtCreate, "create");
    m_pBtCreate->SetModeImage(Image(StockImage::Yes, RID_SVXBMP_NEWDOC));
    get(m_pLbDocTypes, "types");
    m_pLbDocTypes->set_height_request(m_pLbDocTypes->GetTextHeight() * 5);

    // Set HC bitmaps and disable display of bitmap names.
    m_pBtCreate->EnableTextDisplay (false);
    m_xCbbPath->SetSmartProtocol(INetProtocol::File);
    m_xLbDocTypes->set_size_request(-1, m_xLbDocTypes->get_height_rows(5));

    InitStdControls();

    SetExchangeSupport ();

    m_pCbbPath->Show();
    m_pCbbPath->SetBaseURL(SvtPathOptions().GetWorkPath());
    m_xCbbPath->show();
    m_xCbbPath->SetBaseURL(SvtPathOptions().GetWorkPath());

    // set defaults
    m_pRbtEditNow->Check();
    m_xRbtEditNow->set_active(true);

    m_pBtCreate->SetClickHdl        ( LINK ( this, SvxHyperlinkNewDocTp, ClickNewHdl_Impl ) );
    m_xBtCreate->connect_clicked(LINK(this, SvxHyperlinkNewDocTp, ClickNewHdl_Impl));

    FillDocumentList ();
}

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

void SvxHyperlinkNewDocTp::dispose()
{
    if (m_pLbDocTypes)
    if (m_xLbDocTypes)
    {
        for ( sal_Int32 n=0; n<m_pLbDocTypes->GetEntryCount(); n++ )
            delete static_cast<DocumentTypeData*>(m_pLbDocTypes->GetEntryData ( n ));
        m_pLbDocTypes = nullptr;
        for (sal_Int32 n = 0, nEntryCount = m_xLbDocTypes->n_children(); n < nEntryCount; ++n)
            delete reinterpret_cast<DocumentTypeData*>(m_xLbDocTypes->get_id(n).toInt64());
        m_xLbDocTypes = nullptr;
    }
    m_pRbtEditNow.clear();
    m_pRbtEditLater.clear();
    m_pCbbPath.clear();
    m_pBtCreate.clear();
    m_pLbDocTypes.clear();
    SvxHyperlinkTabPageBase::dispose();
}

/*************************************************************************
@@ -166,9 +152,9 @@ void SvxHyperlinkNewDocTp::FillDlgFields(const OUString& /*rStrURL*/)
{
}

void SvxHyperlinkNewDocTp::FillDocumentList ()
void SvxHyperlinkNewDocTp::FillDocumentList()
{
    EnterWait();
    weld::WaitObject aWaitObj(mpDialog->getDialog());

    uno::Sequence< uno::Sequence< beans::PropertyValue > >
        aDynamicMenuEntries( SvtDynamicMenuOptions().GetMenu( EDynamicMenuType::NewMenu ) );
@@ -206,16 +192,14 @@ void SvxHyperlinkNewDocTp::FillDocumentList ()
                // insert doc-name and image
                OUString aTitleName = aTitle.replaceFirst( "~", "" );

                sal_Int16 nPos = m_pLbDocTypes->InsertEntry ( aTitleName );
                OUString aStrDefExt( pFilter->GetDefaultExtension () );
                DocumentTypeData *pTypeData = new DocumentTypeData ( aDocumentUrl, aStrDefExt.copy( 2 ) );
                m_pLbDocTypes->SetEntryData ( nPos, pTypeData );
                OUString aStrDefExt(pFilter->GetDefaultExtension());
                DocumentTypeData *pTypeData = new DocumentTypeData(aDocumentUrl, aStrDefExt.copy(2));
                OUString sId(OUString::number(reinterpret_cast<sal_Int64>(pTypeData)));
                m_xLbDocTypes->append(sId, aTitleName);
            }
        }
    }
    m_pLbDocTypes->SelectEntryPos ( 0 );

    LeaveWait();
    m_xLbDocTypes->select(0);
}

/*************************************************************************
@@ -229,9 +213,9 @@ void SvxHyperlinkNewDocTp::GetCurentItemData ( OUString& rStrURL, OUString& aStr
                                               SvxLinkInsertMode& eMode )
{
    // get data from dialog-controls
    rStrURL = m_pCbbPath->GetText();
    rStrURL = m_xCbbPath->get_active_text();
    INetURLObject aURL;
    if ( ImplGetURLObject( rStrURL, m_pCbbPath->GetBaseURL(), aURL ) )
    if ( ImplGetURLObject( rStrURL, m_xCbbPath->GetBaseURL(), aURL ) )
    {
        rStrURL = aURL.GetMainURL( INetURLObject::DecodeMechanism::NONE );
    }
@@ -245,9 +229,9 @@ void SvxHyperlinkNewDocTp::GetCurentItemData ( OUString& rStrURL, OUString& aStr
|*
|************************************************************************/

VclPtr<IconChoicePage> SvxHyperlinkNewDocTp::Create( vcl::Window* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet )
std::unique_ptr<IconChoicePage> SvxHyperlinkNewDocTp::Create(weld::Container* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet)
{
    return VclPtr<SvxHyperlinkNewDocTp>::Create( pWindow, pDlg, pItemSet );
    return std::make_unique<SvxHyperlinkNewDocTp>(pWindow, pDlg, pItemSet);
}

/*************************************************************************
@@ -255,10 +239,9 @@ VclPtr<IconChoicePage> SvxHyperlinkNewDocTp::Create( vcl::Window* pWindow, SvxHp
|* Set initial focus
|*
|************************************************************************/

void SvxHyperlinkNewDocTp::SetInitFocus()
{
    m_pCbbPath->GrabFocus();
    m_xCbbPath->grab_focus();
}

/*************************************************************************
@@ -266,14 +249,13 @@ void SvxHyperlinkNewDocTp::SetInitFocus()
|* Ask page whether an insert is possible
|*
\************************************************************************/

bool SvxHyperlinkNewDocTp::AskApply()
{
    INetURLObject aINetURLObject;
    bool bRet = ImplGetURLObject( m_pCbbPath->GetText(), m_pCbbPath->GetBaseURL(), aINetURLObject );
    bool bRet = ImplGetURLObject(m_xCbbPath->get_active_text(), m_xCbbPath->GetBaseURL(), aINetURLObject);
    if ( !bRet )
    {
        std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(GetFrameWeld(),
        std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(mpDialog->getDialog(),
                                                   VclMessageType::Warning, VclButtonsType::Ok,
                                                   CuiResId(RID_SVXSTR_HYPDLG_NOVALIDFILENAME)));
        xWarn->run();
@@ -363,20 +345,19 @@ IMPL_STATIC_LINK(SvxHyperlinkNewDocTp, DispatchDocument, void*, p, void)
|* Any action to do after apply-button is pressed
|*
\************************************************************************/

void SvxHyperlinkNewDocTp::DoApply ()
void SvxHyperlinkNewDocTp::DoApply()
{
    EnterWait();
    weld::WaitObject aWait(mpDialog->getDialog());

    // get data from dialog-controls
    OUString aStrNewName = m_pCbbPath->GetText();
    OUString aStrNewName = m_xCbbPath->get_active_text();

    if ( aStrNewName.isEmpty() )
        aStrNewName = maStrInitURL;

    // create a real URL-String
    INetURLObject aURL;
    if ( ImplGetURLObject( aStrNewName, m_pCbbPath->GetBaseURL(), aURL ) )
    if ( ImplGetURLObject( aStrNewName, m_xCbbPath->GetBaseURL(), aURL ) )
    {
        // create Document
        aStrNewName = aURL.GetURLPath( INetURLObject::DecodeMechanism::NONE );
@@ -392,7 +373,7 @@ void SvxHyperlinkNewDocTp::DoApply ()

            if( bOk )
            {
                std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(GetFrameWeld(),
                std::unique_ptr<weld::MessageDialog> xWarn(Application::CreateMessageDialog(mpDialog->getDialog(),
                                                           VclMessageType::Warning, VclButtonsType::YesNo,
                                                           CuiResId(RID_SVXSTR_HYPERDLG_QUERYOVERWRITE)));
                bCreate = xWarn->run() == RET_YES;
@@ -406,15 +387,14 @@ void SvxHyperlinkNewDocTp::DoApply ()
        {
            ExecuteInfo* pExecuteInfo = new ExecuteInfo;

            pExecuteInfo->bRbtEditLater = m_pRbtEditLater->IsChecked();
            pExecuteInfo->bRbtEditNow = m_pRbtEditNow->IsChecked();
            pExecuteInfo->bRbtEditLater = m_xRbtEditLater->get_active();
            pExecuteInfo->bRbtEditNow = m_xRbtEditNow->get_active();
            // get private-url
            sal_Int32 nPos = m_pLbDocTypes->GetSelectedEntryPos();
            if( nPos == LISTBOX_ENTRY_NOTFOUND )
                nPos=0;
            sal_Int32 nPos = m_xLbDocTypes->get_selected_index();
            if (nPos == -1)
                nPos = 0;
            pExecuteInfo->aURL = aURL;
            pExecuteInfo->aStrDocName = static_cast<DocumentTypeData*>(
                                 m_pLbDocTypes->GetEntryData( nPos ))->aStrURL;
            pExecuteInfo->aStrDocName = reinterpret_cast<DocumentTypeData*>(m_xLbDocTypes->get_id(nPos).toInt64())->aStrURL;

            // current document
            pExecuteInfo->xFrame = GetDispatcher()->GetFrame()->GetFrame().GetFrameInterface();
@@ -423,8 +403,6 @@ void SvxHyperlinkNewDocTp::DoApply ()
            Application::PostUserEvent(LINK(nullptr, SvxHyperlinkNewDocTp, DispatchDocument), pExecuteInfo);
        }
    }

    LeaveWait();
}

/*************************************************************************
@@ -432,14 +410,14 @@ void SvxHyperlinkNewDocTp::DoApply ()
|* Click on imagebutton : new
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkNewDocTp, ClickNewHdl_Impl, Button*, void)
IMPL_LINK_NOARG(SvxHyperlinkNewDocTp, ClickNewHdl_Impl, weld::Button&, void)
{
    DisableClose( true );
    uno::Reference < XComponentContext > xContext( ::comphelper::getProcessComponentContext() );
    uno::Reference < XFolderPicker2 >  xFolderPicker = FolderPicker::create(xContext);

    OUString            aStrURL;
    OUString            aTempStrURL( m_pCbbPath->GetText() );
    OUString            aTempStrURL( m_xCbbPath->get_active_text() );
    osl::FileBase::getFileURLFromSystemPath( aTempStrURL, aStrURL );

    OUString            aStrPath = aStrURL;
@@ -453,7 +431,6 @@ IMPL_LINK_NOARG(SvxHyperlinkNewDocTp, ClickNewHdl_Impl, Button*, void)
        bHandleFileName = true;

    xFolderPicker->setDisplayDirectory( aStrPath );
    DisableClose( true );
    sal_Int16 nResult = xFolderPicker->execute();
    DisableClose( false );
    if( ExecutableDialogResults::OK == nResult )
@@ -465,7 +442,7 @@ IMPL_LINK_NOARG(SvxHyperlinkNewDocTp, ClickNewHdl_Impl, Button*, void)
        if( bHandleFileName )
            aStrName = bZeroPath? aTempStrURL : aURL.getName();

        m_pCbbPath->SetBaseURL( xFolderPicker->getDirectory() );
        m_xCbbPath->SetBaseURL( xFolderPicker->getDirectory() );
        OUString          aStrTmp( xFolderPicker->getDirectory() );

        if( aStrTmp[ aStrTmp.getLength() - 1 ] != sSlash[0] )
@@ -477,12 +454,12 @@ IMPL_LINK_NOARG(SvxHyperlinkNewDocTp, ClickNewHdl_Impl, Button*, void)

        INetURLObject   aNewURL( aStrTmp );

        if( !aStrName.isEmpty() && !aNewURL.getExtension().isEmpty() &&
            m_pLbDocTypes->GetSelectedEntryPos() != LISTBOX_ENTRY_NOTFOUND )
        if (!aStrName.isEmpty() && !aNewURL.getExtension().isEmpty() &&
           m_xLbDocTypes->get_selected_index() != -1)
        {
            // get private-url
            const sal_Int32 nPos = m_pLbDocTypes->GetSelectedEntryPos();
            aNewURL.setExtension( static_cast<DocumentTypeData*>(m_pLbDocTypes->GetEntryData( nPos ))->aStrExt );
            const sal_Int32 nPos = m_xLbDocTypes->get_selected_index();
            aNewURL.setExtension(reinterpret_cast<DocumentTypeData*>(m_xLbDocTypes->get_id(nPos).toInt64())->aStrExt);
        }

        if( aNewURL.GetProtocol() == INetProtocol::File )
@@ -494,7 +471,7 @@ IMPL_LINK_NOARG(SvxHyperlinkNewDocTp, ClickNewHdl_Impl, Button*, void)
            aStrTmp = aNewURL.GetMainURL( INetURLObject::DecodeMechanism::Unambiguous );
        }

        m_pCbbPath->SetText ( aStrTmp );
        m_xCbbPath->set_entry_text( aStrTmp );
    }
}

diff --git a/cui/source/dialogs/hldoctp.cxx b/cui/source/dialogs/hldoctp.cxx
index ed4f619..57d3672 100644
--- a/cui/source/dialogs/hldoctp.cxx
+++ b/cui/source/dialogs/hldoctp.cxx
@@ -35,54 +35,37 @@ sal_Char const sFileScheme[]    = INET_FILE_SCHEME;
|*
|************************************************************************/

SvxHyperlinkDocTp::SvxHyperlinkDocTp ( vcl::Window *pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet)
    : SvxHyperlinkTabPageBase ( pParent, pDlg, "HyperlinkDocPage", "cui/ui/hyperlinkdocpage.ui", pItemSet ),
    mbMarkWndOpen   ( false )
SvxHyperlinkDocTp::SvxHyperlinkDocTp(weld::Container* pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet)
    : SvxHyperlinkTabPageBase(pParent, pDlg, "cui/ui/hyperlinkdocpage.ui", "HyperlinkDocPage", pItemSet)
    , m_xCbbPath(new SvxHyperURLBox(xBuilder->weld_combo_box("path")))
    , m_xBtFileopen(xBuilder->weld_button("fileopen"))
    , m_xEdTarget(xBuilder->weld_entry("target"))
    , m_xFtFullURL(xBuilder->weld_label("url"))
    , m_xBtBrowse(xBuilder->weld_button("browse"))
    , m_bMarkWndOpen(false)
{
    get(m_pCbbPath, "path");
    m_pCbbPath->SetSmartProtocol(INetProtocol::File);
    get(m_pBtFileopen, "fileopen");
    m_pBtFileopen->SetModeImage(Image(StockImage::Yes, RID_SVXBMP_FILEOPEN));
    get(m_pEdTarget, "target");
    get(m_pFtFullURL, "url");
    get(m_pBtBrowse, "browse");
    m_pBtBrowse->SetModeImage(Image(StockImage::Yes, RID_SVXBMP_TARGET));

    // Disable display of bitmap names.
    m_pBtBrowse->EnableTextDisplay (false);
    m_pBtFileopen->EnableTextDisplay (false);
    m_xCbbPath->SetSmartProtocol(INetProtocol::File);

    InitStdControls();

    m_pCbbPath->Show();
    m_pCbbPath->SetBaseURL(INET_FILE_SCHEME);
    m_xCbbPath->show();
    m_xCbbPath->SetBaseURL(INET_FILE_SCHEME);

    SetExchangeSupport ();
    SetExchangeSupport();

    // set handlers
    m_pBtFileopen->SetClickHdl ( LINK ( this, SvxHyperlinkDocTp, ClickFileopenHdl_Impl ) );
    m_pBtBrowse->SetClickHdl   ( LINK ( this, SvxHyperlinkDocTp, ClickTargetHdl_Impl ) );
    m_pCbbPath->SetModifyHdl   ( LINK ( this, SvxHyperlinkDocTp, ModifiedPathHdl_Impl ) );
    m_pEdTarget->SetModifyHdl  ( LINK ( this, SvxHyperlinkDocTp, ModifiedTargetHdl_Impl ) );
    m_xBtFileopen->connect_clicked( LINK ( this, SvxHyperlinkDocTp, ClickFileopenHdl_Impl ) );
    m_xBtBrowse->connect_clicked( LINK ( this, SvxHyperlinkDocTp, ClickTargetHdl_Impl ) );
    m_xCbbPath->connect_changed( LINK ( this, SvxHyperlinkDocTp, ModifiedPathHdl_Impl ) );
    m_xEdTarget->connect_changed( LINK ( this, SvxHyperlinkDocTp, ModifiedTargetHdl_Impl ) );

    m_pCbbPath->SetLoseFocusHdl( LINK ( this, SvxHyperlinkDocTp, LostFocusPathHdl_Impl ) );
    m_xCbbPath->connect_focus_out( LINK ( this, SvxHyperlinkDocTp, LostFocusPathHdl_Impl ) );

    maTimer.SetInvokeHandler ( LINK ( this, SvxHyperlinkDocTp, TimeoutHdl_Impl ) );
}

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

void SvxHyperlinkDocTp::dispose()
{
    m_pCbbPath.clear();
    m_pBtFileopen.clear();
    m_pEdTarget.clear();
    m_pFtFullURL.clear();
    m_pBtBrowse.clear();
    SvxHyperlinkTabPageBase::dispose();
}

/*************************************************************************
@@ -90,20 +73,19 @@ void SvxHyperlinkDocTp::dispose()
|* Fill all dialog-controls except controls in groupbox "more..."
|*
|************************************************************************/

void SvxHyperlinkDocTp::FillDlgFields(const OUString& rStrURL)
{
    sal_Int32 nPos = rStrURL.indexOf(sHash);
    // path
    m_pCbbPath->SetText ( rStrURL.copy( 0, ( nPos == -1 ? rStrURL.getLength() : nPos ) ) );
    m_xCbbPath->set_entry_text( rStrURL.copy( 0, ( nPos == -1 ? rStrURL.getLength() : nPos ) ) );

    // set target in document at editfield
    OUString aStrMark;
    if ( nPos != -1 && nPos < rStrURL.getLength()-1 )
        aStrMark = rStrURL.copy( nPos+1 );
    m_pEdTarget->SetText ( aStrMark );
    m_xEdTarget->set_text( aStrMark );

    ModifiedPathHdl_Impl ( *m_pCbbPath );
    ModifiedPathHdl_Impl(*m_xCbbPath->getWidget());
}

/*************************************************************************
@@ -111,13 +93,12 @@ void SvxHyperlinkDocTp::FillDlgFields(const OUString& rStrURL)
|* retrieve current url-string
|*
|************************************************************************/

OUString SvxHyperlinkDocTp::GetCurrentURL ()
{
    // get data from dialog-controls
    OUString aStrURL;
    OUString aStrPath ( m_pCbbPath->GetText() );
    OUString aStrMark( m_pEdTarget->GetText() );
    OUString aStrPath( m_xCbbPath->get_active_text() );
    OUString aStrMark( m_xEdTarget->get_text() );

    if ( !aStrPath.isEmpty() )
    {
@@ -146,7 +127,6 @@ OUString SvxHyperlinkDocTp::GetCurrentURL ()
|* retrieve and prepare data from dialog-fields
|*
|************************************************************************/

void SvxHyperlinkDocTp::GetCurentItemData ( OUString& rStrURL, OUString& aStrName,
                                            OUString& aStrIntName, OUString& aStrFrame,
                                            SvxLinkInsertMode& eMode )
@@ -165,10 +145,9 @@ void SvxHyperlinkDocTp::GetCurentItemData ( OUString& rStrURL, OUString& aStrNam
|* static method to create Tabpage
|*
|************************************************************************/

VclPtr<IconChoicePage> SvxHyperlinkDocTp::Create( vcl::Window* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet )
std::unique_ptr<IconChoicePage> SvxHyperlinkDocTp::Create(weld::Container* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet)
{
    return VclPtr<SvxHyperlinkDocTp>::Create( pWindow, pDlg, pItemSet );
    return std::make_unique<SvxHyperlinkDocTp>(pWindow, pDlg, pItemSet);
}

/*************************************************************************
@@ -176,10 +155,9 @@ VclPtr<IconChoicePage> SvxHyperlinkDocTp::Create( vcl::Window* pWindow, SvxHpLin
|* Set initial focus
|*
|************************************************************************/

void SvxHyperlinkDocTp::SetInitFocus()
{
    m_pCbbPath->GrabFocus();
    m_xCbbPath->grab_focus();
}

/*************************************************************************
@@ -187,13 +165,13 @@ void SvxHyperlinkDocTp::SetInitFocus()
|* Click on imagebutton : fileopen
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkDocTp, ClickFileopenHdl_Impl, Button*, void)
IMPL_LINK_NOARG(SvxHyperlinkDocTp, ClickFileopenHdl_Impl, weld::Button&, void)
{
    DisableClose( true );
    // Open Fileopen-Dialog
    sfx2::FileDialogHelper aDlg(
        css::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE, FileDialogFlags::NONE,
        GetFrameWeld() );
        mpDialog->getDialog() );
    OUString aOldURL( GetCurrentURL() );
    if( aOldURL.startsWithIgnoreAsciiCase( sFileScheme ) )
    {
@@ -202,7 +180,6 @@ IMPL_LINK_NOARG(SvxHyperlinkDocTp, ClickFileopenHdl_Impl, Button*, void)
        aDlg.SetDisplayFolder( aPath );
    }

    DisableClose( true );
    ErrCode nError = aDlg.Execute();
    DisableClose( false );

@@ -213,11 +190,11 @@ IMPL_LINK_NOARG(SvxHyperlinkDocTp, ClickFileopenHdl_Impl, Button*, void)

        osl::FileBase::getSystemPathFromFileURL(aURL, aPath);

        m_pCbbPath->SetBaseURL( aURL );
        m_pCbbPath->SetText( aPath );
        m_xCbbPath->SetBaseURL( aURL );
        m_xCbbPath->set_entry_text(aPath);

        if ( aOldURL != GetCurrentURL() )
            ModifiedPathHdl_Impl(*m_pCbbPath);
            ModifiedPathHdl_Impl(*m_xCbbPath->getWidget());
    }
}

@@ -226,8 +203,7 @@ IMPL_LINK_NOARG(SvxHyperlinkDocTp, ClickFileopenHdl_Impl, Button*, void)
|* Click on imagebutton : target
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkDocTp, ClickTargetHdl_Impl, Button*, void)
IMPL_LINK_NOARG(SvxHyperlinkDocTp, ClickTargetHdl_Impl, weld::Button&, void)
{
    ShowMarkWnd();

@@ -238,14 +214,12 @@ IMPL_LINK_NOARG(SvxHyperlinkDocTp, ClickTargetHdl_Impl, Button*, void)
    {
        mxMarkWnd->SetError( LERR_NOERROR );

        EnterWait();
        weld::WaitObject aWait(mpDialog->getDialog());

        if ( maStrURL.equalsIgnoreAsciiCase( sFileScheme ) )
            mxMarkWnd->RefreshTree ( "" );
        else
            mxMarkWnd->RefreshTree ( maStrURL );

        LeaveWait();
    }
    else
        mxMarkWnd->SetError( LERR_DOCNOTOPEN );
@@ -256,15 +230,14 @@ IMPL_LINK_NOARG(SvxHyperlinkDocTp, ClickTargetHdl_Impl, Button*, void)
|* Contents of combobox "Path" modified
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkDocTp, ModifiedPathHdl_Impl, Edit&, void)
IMPL_LINK_NOARG(SvxHyperlinkDocTp, ModifiedPathHdl_Impl, weld::ComboBox&, void)
{
    maStrURL = GetCurrentURL();

    maTimer.SetTimeout( 2500 );
    maTimer.Start();

    m_pFtFullURL->SetText( maStrURL );
    m_xFtFullURL->set_label( maStrURL );
}

/*************************************************************************
@@ -272,21 +245,18 @@ IMPL_LINK_NOARG(SvxHyperlinkDocTp, ModifiedPathHdl_Impl, Edit&, void)
|* If path-field was modify, to browse the new doc after timeout
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkDocTp, TimeoutHdl_Impl, Timer *, void)
{
    if ( IsMarkWndVisible() && ( GetPathType( maStrURL )== EPathType::ExistsFile ||
                                  maStrURL.isEmpty() ||
                                  maStrURL.equalsIgnoreAsciiCase( sFileScheme ) ) )
    {
        EnterWait();
        weld::WaitObject aWait(mpDialog->getDialog());

        if ( maStrURL.equalsIgnoreAsciiCase( sFileScheme ) )
            mxMarkWnd->RefreshTree ( "" );
        else
            mxMarkWnd->RefreshTree ( maStrURL );

        LeaveWait();
    }
}

@@ -295,15 +265,14 @@ IMPL_LINK_NOARG(SvxHyperlinkDocTp, TimeoutHdl_Impl, Timer *, void)
|* Contents of editfield "Target" modified
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkDocTp, ModifiedTargetHdl_Impl, Edit&, void)
IMPL_LINK_NOARG(SvxHyperlinkDocTp, ModifiedTargetHdl_Impl, weld::Entry&, void)
{
    maStrURL = GetCurrentURL();

    if ( IsMarkWndVisible() )
        mxMarkWnd->SelectEntry ( m_pEdTarget->GetText() );
    if (IsMarkWndVisible())
        mxMarkWnd->SelectEntry(m_xEdTarget->get_text());

    m_pFtFullURL->SetText( maStrURL );
    m_xFtFullURL->set_label( maStrURL );
}

/*************************************************************************
@@ -311,12 +280,11 @@ IMPL_LINK_NOARG(SvxHyperlinkDocTp, ModifiedTargetHdl_Impl, Edit&, void)
|* editfield "Target" lost focus
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkDocTp, LostFocusPathHdl_Impl, Control&, void)
IMPL_LINK_NOARG(SvxHyperlinkDocTp, LostFocusPathHdl_Impl, weld::Widget&, void)
{
    maStrURL = GetCurrentURL();

    m_pFtFullURL->SetText( maStrURL );
    m_xFtFullURL->set_label( maStrURL );
}

/*************************************************************************
@@ -324,12 +292,11 @@ IMPL_LINK_NOARG(SvxHyperlinkDocTp, LostFocusPathHdl_Impl, Control&, void)
|* Get String from Bookmark-Wnd
|*
|************************************************************************/

void SvxHyperlinkDocTp::SetMarkStr ( const OUString& aStrMark )
{
    m_pEdTarget->SetText ( aStrMark );
    m_xEdTarget->set_text(aStrMark);

    ModifiedTargetHdl_Impl ( *m_pEdTarget );
    ModifiedTargetHdl_Impl ( *m_xEdTarget );
}

/*************************************************************************
@@ -337,7 +304,6 @@ void SvxHyperlinkDocTp::SetMarkStr ( const OUString& aStrMark )
|* retrieve kind of pathstr
|*
|************************************************************************/

SvxHyperlinkDocTp::EPathType SvxHyperlinkDocTp::GetPathType ( const OUString& rStrPath )
{
    INetURLObject aURL( rStrPath, INetProtocol::File );
diff --git a/cui/source/dialogs/hlinettp.cxx b/cui/source/dialogs/hlinettp.cxx
index d5d404d..864c9be 100644
--- a/cui/source/dialogs/hlinettp.cxx
+++ b/cui/source/dialogs/hlinettp.cxx
@@ -32,62 +32,45 @@ sal_Char const sFTPScheme[]    = INET_FTP_SCHEME;
|* Constructor / Destructor
|*
|************************************************************************/

SvxHyperlinkInternetTp::SvxHyperlinkInternetTp ( vcl::Window *pParent,
                                                 SvxHpLinkDlg* pDlg,
                                                 const SfxItemSet* pItemSet)
:   SvxHyperlinkTabPageBase ( pParent, pDlg, "HyperlinkInternetPage", "cui/ui/hyperlinkinternetpage.ui",
                              pItemSet ) ,
    mbMarkWndOpen           ( false )
SvxHyperlinkInternetTp::SvxHyperlinkInternetTp(weld::Container* pParent,
                                               SvxHpLinkDlg* pDlg,
                                               const SfxItemSet* pItemSet)
    : SvxHyperlinkTabPageBase(pParent, pDlg, "cui/ui/hyperlinkinternetpage.ui", "HyperlinkInternetPage",
                              pItemSet)
    , m_bMarkWndOpen(false)
    , m_xRbtLinktypInternet(xBuilder->weld_radio_button("linktyp_internet"))
    , m_xRbtLinktypFTP(xBuilder->weld_radio_button("linktyp_ftp"))
    , m_xCbbTarget(new SvxHyperURLBox(xBuilder->weld_combo_box("target")))
    , m_xFtLogin(xBuilder->weld_label("login_label"))
    , m_xEdLogin(xBuilder->weld_entry("login"))
    , m_xFtPassword(xBuilder->weld_label("password_label"))
    , m_xEdPassword(xBuilder->weld_entry("password"))
    , m_xCbAnonymous(xBuilder->weld_check_button("anonymous"))
{
    get(m_pRbtLinktypInternet, "linktyp_internet");
    get(m_pRbtLinktypFTP, "linktyp_ftp");
    get(m_pCbbTarget, "target");
    m_pCbbTarget->SetSmartProtocol(INetProtocol::Http);
    get(m_pFtLogin, "login_label");
    get(m_pEdLogin, "login");
    get(m_pFtPassword, "password_label");
    get(m_pEdPassword, "password");
    get(m_pCbAnonymous, "anonymous");
    m_xCbbTarget->SetSmartProtocol(INetProtocol::Http);

    InitStdControls();

    m_pCbbTarget->Show();
    m_xCbbTarget->show();

    SetExchangeSupport ();


    // set defaults
    m_pRbtLinktypInternet->Check ();

    m_xRbtLinktypInternet->set_active(true);

    // set handlers
    Link<Button*, void> aLink( LINK ( this, SvxHyperlinkInternetTp, Click_SmartProtocol_Impl ) );
    m_pRbtLinktypInternet->SetClickHdl( aLink );
    m_pRbtLinktypFTP->SetClickHdl     ( aLink );
    m_pCbAnonymous->SetClickHdl       ( LINK ( this, SvxHyperlinkInternetTp, ClickAnonymousHdl_Impl ) );
    m_pEdLogin->SetModifyHdl          ( LINK ( this, SvxHyperlinkInternetTp, ModifiedLoginHdl_Impl ) );
    m_pCbbTarget->SetLoseFocusHdl     ( LINK ( this, SvxHyperlinkInternetTp, LostFocusTargetHdl_Impl ) );
    m_pCbbTarget->SetModifyHdl        ( LINK ( this, SvxHyperlinkInternetTp, ModifiedTargetHdl_Impl ) );
    maTimer.SetInvokeHandler          ( LINK ( this, SvxHyperlinkInternetTp, TimeoutHdl_Impl ) );
    Link<weld::Button&, void> aLink( LINK ( this, SvxHyperlinkInternetTp, Click_SmartProtocol_Impl ) );
    m_xRbtLinktypInternet->connect_clicked( aLink );
    m_xRbtLinktypFTP->connect_clicked( aLink );
    m_xCbAnonymous->connect_clicked( LINK ( this, SvxHyperlinkInternetTp, ClickAnonymousHdl_Impl ) );
    m_xEdLogin->connect_changed( LINK ( this, SvxHyperlinkInternetTp, ModifiedLoginHdl_Impl ) );
    m_xCbbTarget->connect_focus_out( LINK ( this, SvxHyperlinkInternetTp, LostFocusTargetHdl_Impl ) );
    m_xCbbTarget->connect_changed( LINK ( this, SvxHyperlinkInternetTp, ModifiedTargetHdl_Impl ) );
    maTimer.SetInvokeHandler ( LINK ( this, SvxHyperlinkInternetTp, TimeoutHdl_Impl ) );
}

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

void SvxHyperlinkInternetTp::dispose()
{
    m_pRbtLinktypInternet.clear();
    m_pRbtLinktypFTP.clear();
    m_pCbbTarget.clear();
    m_pFtLogin.clear();
    m_pEdLogin.clear();
    m_pFtPassword.clear();
    m_pEdPassword.clear();
    m_pCbAnonymous.clear();
    SvxHyperlinkTabPageBase::dispose();
}

/*************************************************************************
@@ -95,7 +78,6 @@ void SvxHyperlinkInternetTp::dispose()
|* Fill the all dialog-controls except controls in groupbox "more..."
|*
|************************************************************************/

void SvxHyperlinkInternetTp::FillDlgFields(const OUString& rStrURL)
{
    INetURLObject aURL(rStrURL);
@@ -117,36 +99,36 @@ void SvxHyperlinkInternetTp::FillDlgFields(const OUString& rStrURL)
    // set URL-field
    // Show the scheme, #72740
    if ( aURL.GetProtocol() != INetProtocol::NotValid )
        m_pCbbTarget->SetText( aURL.GetMainURL( INetURLObject::DecodeMechanism::Unambiguous ) );
        m_xCbbTarget->set_entry_text( aURL.GetMainURL( INetURLObject::DecodeMechanism::Unambiguous ) );
    else
        m_pCbbTarget->SetText(rStrURL);
        m_xCbbTarget->set_entry_text(rStrURL);

    SetScheme(aStrScheme);
}

void SvxHyperlinkInternetTp::setAnonymousFTPUser()
{
    m_pEdLogin->SetText(sAnonymous);
    SvAddressParser aAddress( SvtUserOptions().GetEmail() );
    m_pEdPassword->SetText( aAddress.Count() ? aAddress.GetEmailAddress(0) : OUString() );
    m_xEdLogin->set_text(sAnonymous);
    SvAddressParser aAddress(SvtUserOptions().GetEmail());
    m_xEdPassword->set_text(aAddress.Count() ? aAddress.GetEmailAddress(0) : OUString());

    m_pFtLogin->Disable ();
    m_pFtPassword->Disable ();
    m_pEdLogin->Disable ();
    m_pEdPassword->Disable ();
    m_pCbAnonymous->Check();
    m_xFtLogin->set_sensitive(false);
    m_xFtPassword->set_sensitive(false);
    m_xEdLogin->set_sensitive(false);
    m_xEdPassword->set_sensitive(false);
    m_xCbAnonymous->set_active(true);
}

void SvxHyperlinkInternetTp::setFTPUser(const OUString& rUser, const OUString& rPassword)
{
    m_pEdLogin->SetText ( rUser );
    m_pEdPassword->SetText ( rPassword );
    m_xEdLogin->set_text(rUser);
    m_xEdPassword->set_text(rPassword);

    m_pFtLogin->Enable ();
    m_pFtPassword->Enable ();
    m_pEdLogin->Enable ();
    m_pEdPassword->Enable ();
    m_pCbAnonymous->Check(false);
    m_xFtLogin->set_sensitive(true);
    m_xFtPassword->set_sensitive(true);
    m_xEdLogin->set_sensitive(true);
    m_xEdPassword->set_sensitive(true);
    m_xCbAnonymous->set_active(false);
}

/*************************************************************************
@@ -166,7 +148,7 @@ void SvxHyperlinkInternetTp::GetCurentItemData ( OUString& rStrURL, OUString& aS
OUString SvxHyperlinkInternetTp::CreateAbsoluteURL() const
{
    // erase leading and trailing whitespaces
    OUString aStrURL( m_pCbbTarget->GetText().trim() );
    OUString aStrURL(m_xCbbTarget->get_active_text().trim());

    INetURLObject aURL(aStrURL);

@@ -177,8 +159,8 @@ OUString SvxHyperlinkInternetTp::CreateAbsoluteURL() const
    }

    // username and password for ftp-url
    if( aURL.GetProtocol() == INetProtocol::Ftp && !m_pEdLogin->GetText().isEmpty() )
        aURL.SetUserAndPass ( m_pEdLogin->GetText(), m_pEdPassword->GetText() );
    if( aURL.GetProtocol() == INetProtocol::Ftp && !m_xEdLogin->get_text().isEmpty() )
        aURL.SetUserAndPass ( m_xEdLogin->get_text(), m_xEdPassword->get_text() );

    if ( aURL.GetProtocol() != INetProtocol::NotValid )
        return aURL.GetMainURL( INetURLObject::DecodeMechanism::ToIUri );
@@ -192,9 +174,9 @@ OUString SvxHyperlinkInternetTp::CreateAbsoluteURL() const
|*
|************************************************************************/

VclPtr<IconChoicePage> SvxHyperlinkInternetTp::Create( vcl::Window* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet )
std::unique_ptr<IconChoicePage> SvxHyperlinkInternetTp::Create(weld::Container* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet)
{
    return VclPtr<SvxHyperlinkInternetTp>::Create( pWindow, pDlg, pItemSet );
    return std::make_unique<SvxHyperlinkInternetTp>(pWindow, pDlg, pItemSet);
}

/*************************************************************************
@@ -202,10 +184,9 @@ VclPtr<IconChoicePage> SvxHyperlinkInternetTp::Create( vcl::Window* pWindow, Svx
|* Set initial focus
|*
|************************************************************************/

void SvxHyperlinkInternetTp::SetInitFocus()
{
    m_pCbbTarget->GrabFocus();
    m_xCbbTarget->grab_focus();
}

/*************************************************************************
@@ -213,10 +194,9 @@ void SvxHyperlinkInternetTp::SetInitFocus()
|* Contents of editfield "Target" modified
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ModifiedTargetHdl_Impl, Edit&, void)
IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ModifiedTargetHdl_Impl, weld::ComboBox&, void)
{
    OUString aScheme = GetSchemeFromURL( m_pCbbTarget->GetText() );
    OUString aScheme = GetSchemeFromURL( m_xCbbTarget->get_active_text() );
    if( !aScheme.isEmpty() )
        SetScheme( aScheme );

@@ -230,7 +210,6 @@ IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ModifiedTargetHdl_Impl, Edit&, void)
|* If target-field was modify, to browse the new doc after timeout
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkInternetTp, TimeoutHdl_Impl, Timer *, void)
{
    RefreshMarkWindow();
@@ -241,14 +220,13 @@ IMPL_LINK_NOARG(SvxHyperlinkInternetTp, TimeoutHdl_Impl, Timer *, void)
|* Contents of editfield "Login" modified
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ModifiedLoginHdl_Impl, Edit&, void)
IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ModifiedLoginHdl_Impl, weld::Entry&, void)
{
    OUString aStrLogin ( m_pEdLogin->GetText() );
    OUString aStrLogin ( m_xEdLogin->get_text() );
    if ( aStrLogin.equalsIgnoreAsciiCase( sAnonymous ) )
    {
        m_pCbAnonymous->Check();
        ClickAnonymousHdl_Impl(nullptr);
        m_xCbAnonymous->set_active(true);
        ClickAnonymousHdl_Impl(*m_xCbAnonymous);
    }
}

@@ -259,30 +237,30 @@ void SvxHyperlinkInternetTp::SetScheme(const OUString& rScheme)
    bool bInternet = !bFTP;

    //update protocol button selection:
    m_pRbtLinktypFTP->Check(bFTP);
    m_pRbtLinktypInternet->Check(bInternet);
    m_xRbtLinktypFTP->set_active(bFTP);
    m_xRbtLinktypInternet->set_active(bInternet);

    //update target:
    RemoveImproperProtocol(rScheme);
    m_pCbbTarget->SetSmartProtocol( GetSmartProtocolFromButtons() );
    m_xCbbTarget->SetSmartProtocol( GetSmartProtocolFromButtons() );

    //show/hide  special fields for FTP:
    m_pFtLogin->Show( bFTP );
    m_pFtPassword->Show( bFTP );
    m_pEdLogin->Show( bFTP );
    m_pEdPassword->Show( bFTP );
    m_pCbAnonymous->Show( bFTP );
    m_xFtLogin->set_visible( bFTP );
    m_xFtPassword->set_visible( bFTP );
    m_xEdLogin->set_visible( bFTP );
    m_xEdPassword->set_visible( bFTP );
    m_xCbAnonymous->set_visible( bFTP );

    //update 'link target in document'-window and opening-button
    if (rScheme.startsWith(INET_HTTP_SCHEME) || rScheme.isEmpty())
    {
        if ( mbMarkWndOpen )
        if ( m_bMarkWndOpen )
            ShowMarkWnd ();
    }
    else
    {
        //disable for https and ftp
        if ( mbMarkWndOpen )
        if ( m_bMarkWndOpen )
            HideMarkWnd ();
    }
}
@@ -295,28 +273,28 @@ void SvxHyperlinkInternetTp::SetScheme(const OUString& rScheme)

void SvxHyperlinkInternetTp::RemoveImproperProtocol(const OUString& aProperScheme)
{
    OUString aStrURL ( m_pCbbTarget->GetText() );
    OUString aStrURL ( m_xCbbTarget->get_active_text() );
    if ( !aStrURL.isEmpty() )
    {
        OUString aStrScheme(GetSchemeFromURL(aStrURL));
        if ( !aStrScheme.isEmpty() && aStrScheme != aProperScheme )
        {
            aStrURL = aStrURL.copy( aStrScheme.getLength() );
            m_pCbbTarget->SetText ( aStrURL );
            m_xCbbTarget->set_entry_text( aStrURL );
        }
    }
}

OUString SvxHyperlinkInternetTp::GetSchemeFromButtons() const
{
    if( m_pRbtLinktypFTP->IsChecked() )
    if( m_xRbtLinktypFTP->get_active() )
        return OUString(INET_FTP_SCHEME);
    return OUString(INET_HTTP_SCHEME);
}

INetProtocol SvxHyperlinkInternetTp::GetSmartProtocolFromButtons() const
{
    if( m_pRbtLinktypFTP->IsChecked() )
    if( m_xRbtLinktypFTP->get_active() )
    {
        return INetProtocol::Ftp;
    }
@@ -328,8 +306,7 @@ INetProtocol SvxHyperlinkInternetTp::GetSmartProtocolFromButtons() const
|* Click on Radiobutton : Internet or FTP
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkInternetTp, Click_SmartProtocol_Impl, Button*, void)
IMPL_LINK_NOARG(SvxHyperlinkInternetTp, Click_SmartProtocol_Impl, weld::Button&, void)
{
    OUString aScheme = GetSchemeFromButtons();
    SetScheme(aScheme);
@@ -340,21 +317,20 @@ IMPL_LINK_NOARG(SvxHyperlinkInternetTp, Click_SmartProtocol_Impl, Button*, void)
|* Click on Checkbox : Anonymous user
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ClickAnonymousHdl_Impl, Button*, void)
IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ClickAnonymousHdl_Impl, weld::Button&, void)
{
    // disable login-editfields if checked
    if ( m_pCbAnonymous->IsChecked() )
    if ( m_xCbAnonymous->get_active() )
    {
        if ( m_pEdLogin->GetText().toAsciiLowerCase().startsWith( sAnonymous ) )
        if ( m_xEdLogin->get_text().toAsciiLowerCase().startsWith( sAnonymous ) )
        {
            maStrOldUser.clear();
            maStrOldPassword.clear();
        }
        else
        {
            maStrOldUser = m_pEdLogin->GetText();
            maStrOldPassword = m_pEdPassword->GetText();
            maStrOldUser = m_xEdLogin->get_text();
            maStrOldPassword = m_xEdPassword->get_text();
        }

        setAnonymousFTPUser();
@@ -368,25 +344,22 @@ IMPL_LINK_NOARG(SvxHyperlinkInternetTp, ClickAnonymousHdl_Impl, Button*, void)
|* Combobox Target lost the focus
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkInternetTp, LostFocusTargetHdl_Impl, Control&, void)
IMPL_LINK_NOARG(SvxHyperlinkInternetTp, LostFocusTargetHdl_Impl, weld::Widget&, void)
{
    RefreshMarkWindow();
}

void SvxHyperlinkInternetTp::RefreshMarkWindow()
{
    if ( m_pRbtLinktypInternet->IsChecked() && IsMarkWndVisible() )
    if (m_xRbtLinktypInternet->get_active() && IsMarkWndVisible())
    {
        EnterWait();
        weld::WaitObject aWait(mpDialog->getDialog());
        OUString aStrURL( CreateAbsoluteURL() );
        if ( !aStrURL.isEmpty() )
            mxMarkWnd->RefreshTree ( aStrURL );
        else
            mxMarkWnd->SetError( LERR_DOCNOTOPEN );
        LeaveWait();
    }

}

/*************************************************************************
@@ -394,10 +367,9 @@ void SvxHyperlinkInternetTp::RefreshMarkWindow()
|* Get String from Bookmark-Wnd
|*
|************************************************************************/

void SvxHyperlinkInternetTp::SetMarkStr ( const OUString& aStrMark )
{
    OUString aStrURL ( m_pCbbTarget->GetText() );
    OUString aStrURL(m_xCbbTarget->get_active_text());

    const sal_Unicode sUHash = '#';
    sal_Int32 nPos = aStrURL.lastIndexOf( sUHash );
@@ -407,7 +379,7 @@ void SvxHyperlinkInternetTp::SetMarkStr ( const OUString& aStrMark )

    aStrURL += OUStringLiteral1(sUHash) + aStrMark;

    m_pCbbTarget->SetText ( aStrURL );
    m_xCbbTarget->set_entry_text(aStrURL);
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cui/source/dialogs/hlmailtp.cxx b/cui/source/dialogs/hlmailtp.cxx
index 93e1bc0..ea2eaa8 100644
--- a/cui/source/dialogs/hlmailtp.cxx
+++ b/cui/source/dialogs/hlmailtp.cxx
@@ -36,48 +36,32 @@ using namespace ::com::sun::star;
|* Constructor / Destructor
|*
|************************************************************************/

SvxHyperlinkMailTp::SvxHyperlinkMailTp ( vcl::Window *pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet)
:   SvxHyperlinkTabPageBase ( pParent, pDlg, "HyperlinkMailPage", "cui/ui/hyperlinkmailpage.ui",
                              pItemSet )
SvxHyperlinkMailTp::SvxHyperlinkMailTp(weld::Container* pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet)
    : SvxHyperlinkTabPageBase(pParent, pDlg, "cui/ui/hyperlinkmailpage.ui", "HyperlinkMailPage", pItemSet)
    , m_xCbbReceiver(new SvxHyperURLBox(xBuilder->weld_combo_box("receiver")))
    , m_xBtAdrBook(xBuilder->weld_button("adressbook"))
    , m_xFtSubject(xBuilder->weld_label("subject_label"))
    , m_xEdSubject(xBuilder->weld_entry("subject"))
{
    get(m_pCbbReceiver, "receiver");
    m_pCbbReceiver->SetSmartProtocol(INetProtocol::Mailto);
    get(m_pBtAdrBook, "adressbook");
    m_pBtAdrBook->SetModeImage(Image(StockImage::Yes, RID_SVXBMP_ADRESSBOOK));
    get(m_pFtSubject, "subject_label");
    get(m_pEdSubject, "subject");

    // Disable display of bitmap names.
    m_pBtAdrBook->EnableTextDisplay (false);
    m_xCbbReceiver->SetSmartProtocol(INetProtocol::Mailto);

    InitStdControls();

    m_pCbbReceiver->Show();
    m_xCbbReceiver->show();

    SetExchangeSupport ();

    // set handlers
    m_pBtAdrBook->SetClickHdl      ( LINK ( this, SvxHyperlinkMailTp, ClickAdrBookHdl_Impl ) );
    m_pCbbReceiver->SetModifyHdl   ( LINK ( this, SvxHyperlinkMailTp, ModifiedReceiverHdl_Impl) );
    m_xBtAdrBook->connect_clicked( LINK ( this, SvxHyperlinkMailTp, ClickAdrBookHdl_Impl ) );
    m_xCbbReceiver->connect_changed( LINK ( this, SvxHyperlinkMailTp, ModifiedReceiverHdl_Impl) );

    if ( !SvtModuleOptions().IsModuleInstalled( SvtModuleOptions::EModule::DATABASE ) ||
         comphelper::LibreOfficeKit::isActive() )
        m_pBtAdrBook->Hide();
        m_xBtAdrBook->hide();
}

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

void SvxHyperlinkMailTp::dispose()
{
    m_pCbbReceiver.clear();
    m_pBtAdrBook.clear();
    m_pFtSubject.clear();
    m_pEdSubject.clear();
    SvxHyperlinkTabPageBase::dispose();
}

/*************************************************************************
@@ -111,14 +95,14 @@ void SvxHyperlinkMailTp::FillDlgFields(const OUString& rStrURL)
        if ( nPos != -1 )
            aStrURLc = aStrURLc.copy( 0, nPos );

        m_pEdSubject->SetText ( aStrSubject );
        m_xEdSubject->set_text( aStrSubject );
    }
    else
    {
        m_pEdSubject->SetText ("");
        m_xEdSubject->set_text("");
    }

    m_pCbbReceiver->SetText ( aStrURLc );
    m_xCbbReceiver->set_entry_text(aStrURLc);

    SetScheme( aStrScheme );
}
@@ -128,7 +112,6 @@ void SvxHyperlinkMailTp::FillDlgFields(const OUString& rStrURL)
|* retrieve and prepare data from dialog-fields
|*
|************************************************************************/

void SvxHyperlinkMailTp::GetCurentItemData ( OUString& rStrURL, OUString& aStrName,
                                             OUString& aStrIntName, OUString& aStrFrame,
                                             SvxLinkInsertMode& eMode )
@@ -139,7 +122,7 @@ void SvxHyperlinkMailTp::GetCurentItemData ( OUString& rStrURL, OUString& aStrNa

OUString SvxHyperlinkMailTp::CreateAbsoluteURL() const
{
    OUString aStrURL = m_pCbbReceiver->GetText();
    OUString aStrURL = m_xCbbReceiver->get_active_text();
    INetURLObject aURL(aStrURL);

    if( aURL.GetProtocol() == INetProtocol::NotValid )
@@ -151,9 +134,9 @@ OUString SvxHyperlinkMailTp::CreateAbsoluteURL() const
    // subject for EMail-url
    if( aURL.GetProtocol() == INetProtocol::Mailto )
    {
        if ( !m_pEdSubject->GetText().isEmpty() )
        if (!m_xEdSubject->get_text().isEmpty())
        {
            OUString aQuery = "subject=" + m_pEdSubject->GetText();
            OUString aQuery = "subject=" + m_xEdSubject->get_text();
            aURL.SetParam(aQuery);
        }
    }
@@ -170,9 +153,9 @@ OUString SvxHyperlinkMailTp::CreateAbsoluteURL() const
|*
|************************************************************************/

VclPtr<IconChoicePage> SvxHyperlinkMailTp::Create( vcl::Window* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet )
std::unique_ptr<IconChoicePage> SvxHyperlinkMailTp::Create(weld::Container* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet)
{
    return VclPtr<SvxHyperlinkMailTp>::Create( pWindow, pDlg, pItemSet );
    return std::make_unique<SvxHyperlinkMailTp>(pWindow, pDlg, pItemSet);
}

/*************************************************************************
@@ -180,24 +163,22 @@ VclPtr<IconChoicePage> SvxHyperlinkMailTp::Create( vcl::Window* pWindow, SvxHpLi
|* Set initial focus
|*
|************************************************************************/

void SvxHyperlinkMailTp::SetInitFocus()
{
    m_pCbbReceiver->GrabFocus();
    m_xCbbReceiver->grab_focus();
}

/*************************************************************************
|************************************************************************/

void SvxHyperlinkMailTp::SetScheme(const OUString& rScheme)
{
    //update target:
    RemoveImproperProtocol(rScheme);
    m_pCbbReceiver->SetSmartProtocol( INetProtocol::Mailto );
    m_xCbbReceiver->SetSmartProtocol( INetProtocol::Mailto );

    //show/hide  special fields for MAIL:
    m_pBtAdrBook->Enable();
    m_pEdSubject->Enable();
    m_xBtAdrBook->set_sensitive(true);
    m_xEdSubject->set_sensitive(true);
}

/*************************************************************************
@@ -205,17 +186,16 @@ void SvxHyperlinkMailTp::SetScheme(const OUString& rScheme)
|* Remove protocol if it does not fit to the current button selection
|*
|************************************************************************/

void SvxHyperlinkMailTp::RemoveImproperProtocol(const OUString& aProperScheme)
{
    OUString aStrURL ( m_pCbbReceiver->GetText() );
    OUString aStrURL(m_xCbbReceiver->get_active_text());
    if ( !aStrURL.isEmpty() )
    {
        OUString aStrScheme = GetSchemeFromURL( aStrURL );
        if ( !aStrScheme.isEmpty() && aStrScheme != aProperScheme )
        {
            aStrURL = aStrURL.copy( aStrScheme.getLength() );
            m_pCbbReceiver->SetText ( aStrURL );
            m_xCbbReceiver->set_entry_text(aStrURL);
        }
    }
}
@@ -225,10 +205,9 @@ void SvxHyperlinkMailTp::RemoveImproperProtocol(const OUString& aProperScheme)
|* Contents of editfield "receiver" modified
|*
|************************************************************************/

IMPL_LINK_NOARG(SvxHyperlinkMailTp, ModifiedReceiverHdl_Impl, Edit&, void)
IMPL_LINK_NOARG(SvxHyperlinkMailTp, ModifiedReceiverHdl_Impl, weld::ComboBox&, void)
{
    OUString aScheme = GetSchemeFromURL( m_pCbbReceiver->GetText() );
    OUString aScheme = GetSchemeFromURL( m_xCbbReceiver->get_active_text() );
    if(!aScheme.isEmpty())
        SetScheme( aScheme );
}
@@ -238,8 +217,7 @@ IMPL_LINK_NOARG(SvxHyperlinkMailTp, ModifiedReceiverHdl_Impl, Edit&, void)
|* Click on imagebutton : addressbook
|*
|************************************************************************/

IMPL_STATIC_LINK_NOARG(SvxHyperlinkMailTp, ClickAdrBookHdl_Impl, Button*, void)
IMPL_STATIC_LINK_NOARG(SvxHyperlinkMailTp, ClickAdrBookHdl_Impl, weld::Button&, void)
{
    SfxViewFrame* pViewFrame = SfxViewFrame::Current();
    if( pViewFrame )
@@ -250,5 +228,4 @@ IMPL_STATIC_LINK_NOARG(SvxHyperlinkMailTp, ClickAdrBookHdl_Impl, Button*, void)
    }
}


/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cui/source/dialogs/hltpbase.cxx b/cui/source/dialogs/hltpbase.cxx
index f7f48e0..16816d7 100644
--- a/cui/source/dialogs/hltpbase.cxx
+++ b/cui/source/dialogs/hltpbase.cxx
@@ -72,16 +72,14 @@ OUString CreateUiNameFromURL( const OUString& aStrURL )

}

//# ComboBox-Control for URL's with History and Autocompletion           #

SvxHyperURLBox::SvxHyperURLBox( vcl::Window* pParent, INetProtocol eSmart )
: SvtURLBox         ( pParent, eSmart ),
  DropTargetHelper  ( this )
// ComboBox-Control for URL's with History and Autocompletion
SvxHyperURLBox::SvxHyperURLBox(std::unique_ptr<weld::ComboBox> xControl)
    : URLBox(std::move(xControl))
    , DropTargetHelper(getWidget()->get_drop_target())
{
    SetSmartProtocol(INetProtocol::Http);
}

VCL_BUILDER_FACTORY_ARGS(SvxHyperURLBox, INetProtocol::Http)

sal_Int8 SvxHyperURLBox::AcceptDrop( const AcceptDropEvent& /* rEvt */ )
{
    return IsDropFormatSupported( SotClipboardFormatId::STRING ) ? DND_ACTION_COPY : DND_ACTION_NONE;
@@ -95,7 +93,7 @@ sal_Int8 SvxHyperURLBox::ExecuteDrop( const ExecuteDropEvent& rEvt )

    if( aDataHelper.GetString( SotClipboardFormatId::STRING, aString ) )
    {
        SetText( aString );
        set_entry_text(aString);
        nRet = DND_ACTION_COPY;
    }

@@ -104,17 +102,19 @@ sal_Int8 SvxHyperURLBox::ExecuteDrop( const ExecuteDropEvent& rEvt )

//# Hyperlink-Dialog: Tabpages-Baseclass                                 #

SvxHyperlinkTabPageBase::SvxHyperlinkTabPageBase ( vcl::Window *pParent,
                                                   SvxHpLinkDlg* pDlg,
                                                   const OString& rID,
                                                   const OUString& rUIXMLDescription,
                                                   const SfxItemSet* pItemSet )
  : IconChoicePage( pParent, rID, rUIXMLDescription, pItemSet )
  , mpCbbFrame( nullptr )
  , mpLbForm( nullptr )
  , mpEdIndication( nullptr )
  , mpEdText( nullptr )
  , mpBtScript( nullptr )
SvxHyperlinkTabPageBase::SvxHyperlinkTabPageBase(weld::Container* pParent,
                                                 SvxHpLinkDlg* pDlg,
                                                 const OUString& rUIXMLDescription,
                                                 const OString& rID,
                                                 const SfxItemSet* pItemSet)
  : IconChoicePage(pParent, rUIXMLDescription, rID, pItemSet)
  , mxCbbFrame(xBuilder->weld_combo_box("frame"))
  , mxLbForm(xBuilder->weld_combo_box("form"))
  , mxEdIndication(xBuilder->weld_entry("indication"))
  , mxEdText(xBuilder->weld_entry("name"))
  , mxBtScript(xBuilder->weld_button("script"))
  , mxFormLabel(xBuilder->weld_label("form_label"))
  , mxFrameLabel(xBuilder->weld_label("frame_label"))
  , mbIsCloseDisabled( false )
  , mpDialog( pDlg )
  , mbStdControlsInit( false )
@@ -124,23 +124,9 @@ SvxHyperlinkTabPageBase::SvxHyperlinkTabPageBase ( vcl::Window *pParent,

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

void SvxHyperlinkTabPageBase::dispose()
{
    maTimer.Stop();

    HideMarkWnd();

    mpCbbFrame.clear();
    mpLbForm.clear();
    mpEdIndication.clear();
    mpEdText.clear();
    mpBtScript.clear();
    mpDialog.clear();

    IconChoicePage::dispose();
}

bool SvxHyperlinkTabPageBase::QueryClose()
@@ -152,8 +138,6 @@ void SvxHyperlinkTabPageBase::InitStdControls ()
{
    if ( !mbStdControlsInit )
    {
        get(mpCbbFrame, "frame");

        SfxDispatcher* pDispatch = GetDispatcher();
        SfxViewFrame* pViewFrame = pDispatch ? pDispatch->GetFrame() : nullptr;
        SfxFrame* pFrame = pViewFrame ? &pViewFrame->GetFrame() : nullptr;
@@ -167,19 +151,14 @@ void SvxHyperlinkTabPageBase::InitStdControls ()
                size_t i;
                for ( i = 0; i < nCount; i++ )
                {
                    mpCbbFrame->InsertEntry( pList->at( i ) );
                    mxCbbFrame->append_text( pList->at( i ) );
                }
            }
        }

        get(mpLbForm, "form");
        get(mpEdIndication, "indication");
        get(mpEdText, "name");
        get(mpBtScript, "script");
        mpBtScript->SetModeImage(Image(StockImage::Yes, RID_SVXBMP_SCRIPT));
        mxBtScript->set_from_icon_name(RID_SVXBMP_SCRIPT);

        mpBtScript->SetClickHdl ( LINK ( this, SvxHyperlinkTabPageBase, ClickScriptHdl_Impl ) );
        mpBtScript->EnableTextDisplay (false);
        mxBtScript->connect_clicked ( LINK ( this, SvxHyperlinkTabPageBase, ClickScriptHdl_Impl ) );
    }

    mbStdControlsInit = true;
@@ -200,15 +179,16 @@ void SvxHyperlinkTabPageBase::ShowMarkWnd()
        return;
    }

    mxMarkWnd = std::make_unique<SvxHlinkDlgMarkWnd>(GetFrameWeld(), this);
    weld::Dialog* pDialog = mpDialog->getDialog();

    mxMarkWnd = std::make_unique<SvxHlinkDlgMarkWnd>(pDialog, this);

    // Size of dialog-window in screen pixels
    ::tools::Rectangle aDlgRect( mpDialog->GetWindowExtentsRelative( nullptr ) );
    Point aDlgPos ( aDlgRect.TopLeft() );
    Size aDlgSize ( mpDialog->GetSizePixel () );
    Point aDlgPos(pDialog->get_position());
    Size aDlgSize(pDialog->get_size());

    // Absolute size of the screen
    ::tools::Rectangle aScreen( mpDialog->GetDesktopRectPixel() );
    ::tools::Rectangle aScreen(pDialog->get_monitor_workarea());

    // Size of Extrawindow
    Size aExtraWndSize(mxMarkWnd->getDialog()->get_preferred_size());
@@ -254,9 +234,9 @@ void SvxHyperlinkTabPageBase::FillStandardDlgFields ( const SvxHyperlinkItem* pH
    if (!comphelper::LibreOfficeKit::isActive())
    {
        // Frame
        sal_Int32 nPos = mpCbbFrame->GetEntryPos ( pHyperlinkItem->GetTargetFrame() );
        if ( nPos != COMBOBOX_ENTRY_NOTFOUND)
            mpCbbFrame->SetText ( pHyperlinkItem->GetTargetFrame() );
        sal_Int32 nPos = mxCbbFrame->find_text(pHyperlinkItem->GetTargetFrame());
        if (nPos != -1)
            mxCbbFrame->set_active(nPos);

        // Form
        OUString aStrFormText = CuiResId( RID_SVXSTR_HYPERDLG_FROM_TEXT );
@@ -265,41 +245,37 @@ void SvxHyperlinkTabPageBase::FillStandardDlgFields ( const SvxHyperlinkItem* pH

        if( pHyperlinkItem->GetInsertMode() & HLINK_HTMLMODE )
        {
            mpLbForm->Clear();
            mpLbForm->InsertEntry( aStrFormText );
            mpLbForm->SelectEntryPos ( 0 );
            mxLbForm->clear();
            mxLbForm->append_text( aStrFormText );
            mxLbForm->set_active( 0 );
        }
        else
        {
            mpLbForm->Clear();
            mpLbForm->InsertEntry( aStrFormText );
            mpLbForm->InsertEntry( aStrFormButton );
            mpLbForm->SelectEntryPos ( pHyperlinkItem->GetInsertMode() == HLINK_BUTTON ? 1 : 0 );
            mxLbForm->clear();
            mxLbForm->append_text( aStrFormText );
            mxLbForm->append_text( aStrFormButton );
            mxLbForm->set_active( pHyperlinkItem->GetInsertMode() == HLINK_BUTTON ? 1 : 0 );
        }
    }
    else
    {
        mpCbbFrame->Hide();
        mpLbForm->Hide();

        VclPtr<FixedText> pLabel;
        get(pLabel, "form_label");
        pLabel->Hide();
        get(pLabel, "frame_label");
        pLabel->Hide();
        mxCbbFrame->hide();
        mxLbForm->hide();
        mxFormLabel->hide();
        mxFrameLabel->hide();
    }

    // URL
    mpEdIndication->SetText ( pHyperlinkItem->GetName() );
    mxEdIndication->set_text( pHyperlinkItem->GetName() );

    // Name
    mpEdText->SetText ( pHyperlinkItem->GetIntName() );
    mxEdText->set_text( pHyperlinkItem->GetIntName() );

    // Script-button
    if ( pHyperlinkItem->GetMacroEvents() == HyperDialogEvent::NONE )
        mpBtScript->Disable();
        mxBtScript->set_sensitive(false);
    else
        mpBtScript->Enable();
        mxBtScript->set_sensitive(true);
}

// Any action to do after apply-button is pressed
@@ -324,17 +300,26 @@ void SvxHyperlinkTabPageBase::SetMarkStr ( const OUString& /*aStrMark*/ )
// Set initial focus
void SvxHyperlinkTabPageBase::SetInitFocus()
{
    GrabFocus();
    xContainer->grab_focus();
}

// retrieve dispatcher
SfxDispatcher* SvxHyperlinkTabPageBase::GetDispatcher() const
{
    return static_cast<SvxHpLinkDlg*>(mpDialog.get())->GetDispatcher();
    return mpDialog->GetDispatcher();
}

void SvxHyperlinkTabPageBase::DisableClose(bool _bDisable)
{
    mbIsCloseDisabled = _bDisable;
    if (mbIsCloseDisabled)
        maBusy.incBusy(mpDialog->getDialog());
    else
        maBusy.decBusy();
}

// Click on imagebutton : Script
IMPL_LINK_NOARG(SvxHyperlinkTabPageBase, ClickScriptHdl_Impl, Button*, void)
IMPL_LINK_NOARG(SvxHyperlinkTabPageBase, ClickScriptHdl_Impl, weld::Button&, void)
{
    SvxHyperlinkItem *pHyperlinkItem = const_cast<SvxHyperlinkItem*>(static_cast<const SvxHyperlinkItem *>(
                                       GetItemSet().GetItem (SID_HYPERLINK_GETLINK)));
@@ -353,14 +338,9 @@ IMPL_LINK_NOARG(SvxHyperlinkTabPageBase, ClickScriptHdl_Impl, Button*, void)
                                              SID_ATTR_MACROITEM>{} ) );
        pItemSet->Put ( aItem );

        /*  disable HyperLinkDlg for input while the MacroAssignDlg is working
            because if no JAVA is installed an error box occurs and then it is possible
            to close the HyperLinkDlg before its child (MacroAssignDlg) -> GPF
         */
        bool bIsInputEnabled = GetParent()->IsInputEnabled();
        if ( bIsInputEnabled )
            GetParent()->EnableInput( false );
        SfxMacroAssignDlg aDlg(GetFrameWeld(), mxDocumentFrame, *pItemSet);
        DisableClose( true );

        SfxMacroAssignDlg aDlg(mpDialog->getDialog(), mxDocumentFrame, *pItemSet);

        // add events
        SfxMacroTabPage *pMacroPage = aDlg.GetTabPage();
@@ -374,11 +354,7 @@ IMPL_LINK_NOARG(SvxHyperlinkTabPageBase, ClickScriptHdl_Impl, Button*, void)
        if ( pHyperlinkItem->GetMacroEvents() & HyperDialogEvent::MouseOutObject )
            pMacroPage->AddEvent( CuiResId(RID_SVXSTR_HYPDLG_MACROACT3),
                                  SvMacroItemId::OnMouseOut);

        if ( bIsInputEnabled )
            GetParent()->EnableInput();
        // execute dlg
        DisableClose( true );
        short nRet = aDlg.run();
        DisableClose( false );
        if ( RET_OK == nRet )
@@ -444,23 +420,22 @@ OUString SvxHyperlinkTabPageBase::GetSchemeFromURL( const OUString& rStrURL )
    return aStrScheme;
}


void SvxHyperlinkTabPageBase::GetDataFromCommonFields( OUString& aStrName,
                                             OUString& aStrIntName, OUString& aStrFrame,
                                             SvxLinkInsertMode& eMode )
{
    aStrIntName = mpEdText->GetText();
    aStrName    = mpEdIndication->GetText();
    aStrFrame   = mpCbbFrame->GetText();
    aStrIntName = mxEdText->get_text();
    aStrName    = mxEdIndication->get_text();
    aStrFrame   = mxCbbFrame->get_active_text();

    sal_Int32 nPos = mpLbForm->GetSelectedEntryPos();
    if (nPos == LISTBOX_ENTRY_NOTFOUND)
    sal_Int32 nPos = mxLbForm->get_active();
    if (nPos == -1)
        // This happens when FillStandardDlgFields() hides mpLbForm.
        nPos = 0;
    eMode = static_cast<SvxLinkInsertMode>(nPos + 1);

    // Ask dialog whether the current doc is a HTML-doc
    if (static_cast<SvxHpLinkDlg*>(mpDialog.get())->IsHTMLDoc())
    if (mpDialog->IsHTMLDoc())
        eMode = static_cast<SvxLinkInsertMode>( sal_uInt16(eMode) | HLINK_HTMLMODE );
}

diff --git a/cui/source/dialogs/iconcdlg.cxx b/cui/source/dialogs/iconcdlg.cxx
index 3f5e393..0abb498 100644
--- a/cui/source/dialogs/iconcdlg.cxx
+++ b/cui/source/dialogs/iconcdlg.cxx
@@ -36,20 +36,18 @@
|
\**********************************************************************/

IconChoicePage::IconChoicePage( vcl::Window *pParent, const OString& rID,
                                const OUString& rUIXMLDescription,
                                const SfxItemSet* pItemSet )
:   TabPage                   ( pParent, rID, rUIXMLDescription ),
    pSet                      ( pItemSet ),
    bHasExchangeSupport       ( false )
IconChoicePage::IconChoicePage(weld::Container* pParent,
                               const OUString& rUIXMLDescription, const OString& rID,
                               const SfxItemSet* pItemSet)
    : xBuilder(Application::CreateBuilder(pParent, rUIXMLDescription))
    , xContainer(xBuilder->weld_container(rID))
    , pSet(pItemSet)
    , bHasExchangeSupport(false)
{
    SetStyle ( GetStyle()  | WB_DIALOGCONTROL | WB_HIDE );
}


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

/**********************************************************************
@@ -75,95 +73,15 @@ bool IconChoicePage::QueryClose()

/**********************************************************************
|
| window-methods
|
\**********************************************************************/

void IconChoicePage::ImplInitSettings()
{
    vcl::Window* pParent = GetParent();
    if ( pParent->IsChildTransparentModeEnabled() && !IsControlBackground() )
    {
        EnableChildTransparentMode();
        SetParentClipMode( ParentClipMode::NoClip );
        SetPaintTransparent( true );
        SetBackground();
    }
    else
    {
        EnableChildTransparentMode( false );
        SetParentClipMode();
        SetPaintTransparent( false );

        if ( IsControlBackground() )
            SetBackground( GetControlBackground() );
        else
            SetBackground( pParent->GetBackground() );
    }
}


void IconChoicePage::StateChanged( StateChangedType nType )
{
    Window::StateChanged( nType );

    if ( nType == StateChangedType::ControlBackground )
    {
        ImplInitSettings();
        Invalidate();
    }
}


void IconChoicePage::DataChanged( const DataChangedEvent& rDCEvt )
{
    Window::DataChanged( rDCEvt );

    if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
         (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
    {
        ImplInitSettings();
        Invalidate();
    }
}


/**********************************************************************
|
| Ctor / Dtor
|
\**********************************************************************/

VCL_BUILDER_FACTORY_ARGS(SvtIconChoiceCtrl,
                         WB_3DLOOK | WB_ICON | WB_BORDER |
                         WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME |
                         WB_NODRAGSELECTION | WB_TABSTOP);

/**********************************************************************
|
| add new page
|
\**********************************************************************/

SvxIconChoiceCtrlEntry* SvxHpLinkDlg::AddTabPage(
    HyperLinkPageType nId,
    const OUString&   rIconText,
    const Image&    rChoiceIcon,
    CreatePage      pCreateFunc /* != 0 */
)
void SvxHpLinkDlg::AddTabPage(const OString& rId, CreatePage pCreateFunc /* != 0 */)
{
    maPageList.emplace_back( new IconChoicePageData ( nId, pCreateFunc ) );

    SvxIconChoiceCtrlEntry* pEntry = m_pIconCtrl->InsertEntry( rIconText, rChoiceIcon );
    pEntry->SetUserData ( reinterpret_cast<void*>(nId) );
    return pEntry;
}

void SvxHpLinkDlg::SetCtrlStyle()
{
    WinBits const aWinBits = WB_3DLOOK | WB_ICON | WB_BORDER | WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME | WB_NODRAGSELECTION | WB_TABSTOP | WB_CLIPCHILDREN | WB_ALIGN_LEFT | WB_NOHSCROLL;
    m_pIconCtrl->SetStyle(aWinBits);
    m_pIconCtrl->ArrangeIcons();
    weld::Container* pPage = m_xIconCtrl->get_page(rId);
    maPageList.emplace_back(new IconChoicePageData(rId, pCreateFunc(pPage, this, pSet)));
    maPageList.back()->xPage->Reset(*pSet);
    PageCreated(rId, *maPageList.back()->xPage);
}

/**********************************************************************
@@ -171,40 +89,20 @@ void SvxHpLinkDlg::SetCtrlStyle()
| Show / Hide page or button
|
\**********************************************************************/

void SvxHpLinkDlg::ShowPageImpl ( IconChoicePageData const * pData )
void SvxHpLinkDlg::ShowPage(const OString& rId)
{
    if ( pData->pPage )
        pData->pPage->Show();
}


void SvxHpLinkDlg::HidePageImpl ( IconChoicePageData const * pData )
{
    if ( pData->pPage )
        pData->pPage->Hide();
}

void SvxHpLinkDlg::ShowPage(HyperLinkPageType nId)
{
    HyperLinkPageType nOldPageId = GetCurPageId();
    bool bInvalidate = nOldPageId != nId;
    OString sOldPageId = GetCurPageId();
    bool bInvalidate = sOldPageId != rId;
    if (bInvalidate)
    {
        IconChoicePageData* pOldData = GetPageData(nOldPageId);
        if (pOldData && pOldData->pPage)
        IconChoicePageData* pOldData = GetPageData(sOldPageId);
        if (pOldData && pOldData->xPage)
        {
            DeActivatePageImpl();
            HidePageImpl(pOldData);
        }

        Invalidate();
    }
    SetCurPageId(nId);
    SetCurPageId(rId);
    ActivatePageImpl();
    IconChoicePageData* pNewData = GetPageData(nId);
    if (pNewData && pNewData->pPage)
        ShowPageImpl(pNewData);
}

/**********************************************************************
@@ -212,17 +110,11 @@ void SvxHpLinkDlg::ShowPage(HyperLinkPageType nId)
| select a page
|
\**********************************************************************/
IMPL_LINK_NOARG(SvxHpLinkDlg, ChosePageHdl_Impl, SvtIconChoiceCtrl*, void)
IMPL_LINK(SvxHpLinkDlg, ChosePageHdl_Impl, const OString&, rId, void)
{
    SvxIconChoiceCtrlEntry *pEntry = m_pIconCtrl->GetSelectedEntry();
    if ( !pEntry )
        pEntry = m_pIconCtrl->GetCursor( );

    HyperLinkPageType nId = static_cast<HyperLinkPageType>(reinterpret_cast<sal_uIntPtr>(pEntry->GetUserData()));

    if( nId != mnCurrentPageId )
    if (rId != msCurrentPageId)
    {
        ShowPage(nId);
        ShowPage(rId);
    }
}

@@ -231,40 +123,14 @@ IMPL_LINK_NOARG(SvxHpLinkDlg, ChosePageHdl_Impl, SvtIconChoiceCtrl*, void)
| Button-handler
|
\**********************************************************************/

IMPL_LINK_NOARG(SvxHpLinkDlg, OkHdl, Button*, void)
{
    if ( OK_Impl() )
    {
        Ok();
        Close();
    }
}


IMPL_LINK_NOARG(SvxHpLinkDlg, ApplyHdl, Button*, void)
{
    if ( OK_Impl() )
    {
        Ok();
        Close();
    }
}

IMPL_LINK_NOARG(SvxHpLinkDlg, ResetHdl, Button*, void)
IMPL_LINK_NOARG(SvxHpLinkDlg, ResetHdl, weld::Button&, void)
{
    ResetPageImpl ();

    IconChoicePageData* pData = GetPageData ( mnCurrentPageId );
    IconChoicePageData* pData = GetPageData ( msCurrentPageId );
    DBG_ASSERT( pData, "ID not known" );

    pData->pPage->Reset( *pSet );
}


IMPL_LINK_NOARG(SvxHpLinkDlg, CancelHdl, Button*, void)
{
    Close();
    pData->xPage->Reset( *pSet );
}

/**********************************************************************
@@ -272,45 +138,36 @@ IMPL_LINK_NOARG(SvxHpLinkDlg, CancelHdl, Button*, void)
| call page
|
\**********************************************************************/

void SvxHpLinkDlg::ActivatePageImpl ()
void SvxHpLinkDlg::ActivatePageImpl()
{
    DBG_ASSERT( !maPageList.empty(), "no Pages registered" );
    IconChoicePageData* pData = GetPageData ( mnCurrentPageId );
    IconChoicePageData* pData = GetPageData ( msCurrentPageId );
    DBG_ASSERT( pData, "ID not known" );
    if ( pData )
    {
        if ( !pData->pPage )
        if ( pData->bRefresh )
        {
            pData->pPage = (pData->fnCreatePage)( m_pTabContainer, this, pSet );
            pData->pPage->Reset( *pSet );
            PageCreated( mnCurrentPageId, *pData->pPage );
            pData->xPage->Reset( *pSet );
            pData->bRefresh = false;
        }
        else if ( pData->bRefresh )
        {
            pData->pPage->Reset( *pSet );
        }

        pData->bRefresh = false;

        if ( pExampleSet )
            pData->pPage->ActivatePage( *pExampleSet );
        SetHelpId( pData->pPage->GetHelpId() );
            pData->xPage->ActivatePage( *pExampleSet );
        m_xDialog->set_help_id(pData->xPage->GetHelpId());
    }

    m_pResetBtn->Show();
    m_xResetBtn->show();
}


void SvxHpLinkDlg::DeActivatePageImpl ()
{
    IconChoicePageData *pData = GetPageData ( mnCurrentPageId );
    IconChoicePageData *pData = GetPageData ( msCurrentPageId );

    DeactivateRC nRet = DeactivateRC::LeavePage;

    if ( pData )
    {
        IconChoicePage * pPage = pData->pPage;
        IconChoicePage * pPage = pData->xPage.get();

        if ( !pExampleSet && pPage->HasExchangeSupport() && pSet )
            pExampleSet = new SfxItemSet( *pSet->GetPool(), pSet->GetRanges() );
@@ -352,7 +209,7 @@ void SvxHpLinkDlg::DeActivatePageImpl ()
            // flag all pages to be newly initialized
            for (auto & pObj : maPageList)
            {
                if ( pObj->pPage.get() != pPage )
                if ( pObj->xPage.get() != pPage )
                    pObj->bRefresh = true;
                else
                    pObj->bRefresh = false;
@@ -364,11 +221,11 @@ void SvxHpLinkDlg::DeActivatePageImpl ()

void SvxHpLinkDlg::ResetPageImpl ()
{
    IconChoicePageData *pData = GetPageData ( mnCurrentPageId );
    IconChoicePageData *pData = GetPageData ( msCurrentPageId );

    DBG_ASSERT( pData, "ID not known" );

    pData->pPage->Reset( *pSet );
    pData->xPage->Reset( *pSet );
}

/**********************************************************************
@@ -408,38 +265,17 @@ void SvxHpLinkDlg::SetInputSet( const SfxItemSet* pInSet )
    }
}


/**********************************************************************
|
| start dialog
|
\**********************************************************************/

short SvxHpLinkDlg::Execute()
{
    if ( maPageList.empty() )
        return RET_CANCEL;

    Start_Impl();

    return Dialog::Execute();
}


void SvxHpLinkDlg::Start()
{
    m_pCancelBtn->SetClickHdl( LINK( this, SvxHpLinkDlg, CancelHdl ) );

    Start_Impl();
}


bool SvxHpLinkDlg::QueryClose()
{
    bool bRet = true;
    for (auto & pData : maPageList)
    {
        if ( pData->pPage && !pData->pPage->QueryClose() )
        if ( pData->xPage && !pData->xPage->QueryClose() )
        {
            bRet = false;
            break;
@@ -450,7 +286,7 @@ bool SvxHpLinkDlg::QueryClose()

void SvxHpLinkDlg::Start_Impl()
{
    FocusOnIcon( mnCurrentPageId );
    SwitchPage(msCurrentPageId);
    ActivatePageImpl();
}

@@ -460,12 +296,12 @@ void SvxHpLinkDlg::Start_Impl()
|
\**********************************************************************/

IconChoicePageData* SvxHpLinkDlg::GetPageData ( HyperLinkPageType nId )
IconChoicePageData* SvxHpLinkDlg::GetPageData ( const OString& rId )
{
    IconChoicePageData *pRet = nullptr;
    for (auto & pData : maPageList)
    {
        if ( pData->nId == nId )
        if ( pData->sId == rId )
        {
            pRet = pData.get();
            break;
@@ -482,7 +318,7 @@ IconChoicePageData* SvxHpLinkDlg::GetPageData ( HyperLinkPageType nId )

bool SvxHpLinkDlg::OK_Impl()
{
    IconChoicePage* pPage = GetPageData ( mnCurrentPageId )->pPage;
    IconChoicePage* pPage = GetPageData ( msCurrentPageId )->xPage.get();

    bool bEnd = !pPage;
    if ( pPage )
@@ -523,9 +359,9 @@ void SvxHpLinkDlg::Ok()

    for ( size_t i = 0, nCount = maPageList.size(); i < nCount; ++i )
    {
        IconChoicePageData* pData = GetPageData ( maPageList[i]->nId );
        IconChoicePageData* pData = GetPageData ( maPageList[i]->sId );

        IconChoicePage* pPage = pData->pPage;
        IconChoicePage* pPage = pData->xPage.get();

        if ( pPage )
        {
@@ -544,21 +380,9 @@ void SvxHpLinkDlg::Ok()
    }
}

void SvxHpLinkDlg::FocusOnIcon( HyperLinkPageType nId )
void SvxHpLinkDlg::SwitchPage( const OString& rId )
{
    // set focus to icon for the current visible page
    for ( sal_Int32 i=0; i<m_pIconCtrl->GetEntryCount(); i++)
    {
        SvxIconChoiceCtrlEntry* pEntry = m_pIconCtrl->GetEntry ( i );
        HyperLinkPageType nUserData = static_cast<HyperLinkPageType>(reinterpret_cast<sal_uIntPtr>(pEntry->GetUserData()));

        if ( nUserData == nId )
        {
            m_pIconCtrl->SetCursor( pEntry );
            break;
        }
    }
    m_xIconCtrl->set_current_page(rId);
}


/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cui/source/factory/dlgfact.cxx b/cui/source/factory/dlgfact.cxx
index 4ad9e490..e27ce68 100644
--- a/cui/source/factory/dlgfact.cxx
+++ b/cui/source/factory/dlgfact.cxx
@@ -234,7 +234,10 @@ short AbstractSvxPathSelectDialog_Impl::Execute()
    return m_xDlg->run();
}

IMPL_ABSTDLG_BASE(AbstractSvxHpLinkDlg_Impl);
short AbstractSvxHpLinkDlg_Impl::Execute()
{
    return m_xDlg->run();
}

short AbstractFmSearchDialog_Impl::Execute()
{
@@ -783,14 +786,14 @@ void AbstractSvxPathSelectDialog_Impl::SetTitle( const OUString& rNewTitle )
    m_xDlg->SetTitle(rNewTitle);
}

vcl::Window * AbstractSvxHpLinkDlg_Impl::GetWindow()
std::shared_ptr<SfxDialogController> AbstractSvxHpLinkDlg_Impl::GetController()
{
    return static_cast<vcl::Window *>(pDlg);
    return m_xDlg;
}

bool AbstractSvxHpLinkDlg_Impl::QueryClose()
{
    return pDlg->QueryClose();
    return m_xDlg->QueryClose();
}

void AbstractFmSearchDialog_Impl::SetFoundHandler(const Link<FmFoundRecordInformation&,void>& lnk)
@@ -1231,11 +1234,9 @@ VclPtr<AbstractSvxMultiPathDialog> AbstractDialogFactory_Impl::CreateSvxPathSele
    return VclPtr<AbstractSvxPathSelectDialog_Impl>::Create(std::make_unique<SvxPathSelectDialog>(pParent));
}

VclPtr<AbstractSvxHpLinkDlg> AbstractDialogFactory_Impl::CreateSvxHpLinkDlg (vcl::Window* pParent,
                                            SfxBindings* pBindings)
VclPtr<AbstractSvxHpLinkDlg> AbstractDialogFactory_Impl::CreateSvxHpLinkDlg(SfxChildWindow* pChild, SfxBindings* pBindings, weld::Window* pParent)
{
    VclPtrInstance<SvxHpLinkDlg> pDlg( pParent, pBindings );
    return VclPtr<AbstractSvxHpLinkDlg_Impl>::Create(pDlg);
    return VclPtr<AbstractSvxHpLinkDlg_Impl>::Create(std::make_unique<SvxHpLinkDlg>(pBindings, pChild, pParent));
}

VclPtr<AbstractFmSearchDialog> AbstractDialogFactory_Impl::CreateFmSearchDialog(weld::Window* pParent,
diff --git a/cui/source/factory/dlgfact.hxx b/cui/source/factory/dlgfact.hxx
index 2f83409..94bb772 100644
--- a/cui/source/factory/dlgfact.hxx
+++ b/cui/source/factory/dlgfact.hxx
@@ -26,9 +26,7 @@
#include <tools/link.hxx>
#include <com/sun/star/frame/XFrame.hpp>

class SfxModalDialog;
class SfxSingleTabDialogController;
class Dialog;
class SfxItemPool;
class FmShowColsDialog;
class SvxZoomDialog;
@@ -487,10 +485,17 @@ public:
};

class SvxHpLinkDlg;
class AbstractSvxHpLinkDlg_Impl :public AbstractSvxHpLinkDlg
class AbstractSvxHpLinkDlg_Impl : public AbstractSvxHpLinkDlg
{
    DECL_ABSTDLG_BASE(AbstractSvxHpLinkDlg_Impl,SvxHpLinkDlg)
    virtual vcl::Window*     GetWindow() override;
protected:
    std::shared_ptr<SvxHpLinkDlg> m_xDlg;
public:
    explicit AbstractSvxHpLinkDlg_Impl(std::unique_ptr<SvxHpLinkDlg> p)
        : m_xDlg(std::move(p))
    {
    }
    virtual short Execute() override;
    virtual std::shared_ptr<SfxDialogController> GetController() override;
    virtual bool        QueryClose() override;
};

@@ -793,8 +798,8 @@ public:
    virtual VclPtr<AbstractSvxObjectTitleDescDialog> CreateSvxObjectTitleDescDialog(weld::Window* pParent, const OUString& rTitle, const OUString& rDescription) override;
    virtual VclPtr<AbstractSvxMultiPathDialog>    CreateSvxMultiPathDialog(weld::Window* pParent) override;
    virtual VclPtr<AbstractSvxMultiPathDialog>    CreateSvxPathSelectDialog(weld::Window* pParent) override;
    virtual VclPtr<AbstractSvxHpLinkDlg>          CreateSvxHpLinkDlg(vcl::Window* pParent, SfxBindings* pBindings) override;
    virtual VclPtr<AbstractFmSearchDialog>         CreateFmSearchDialog(weld::Window* pParent,
    virtual VclPtr<AbstractSvxHpLinkDlg>          CreateSvxHpLinkDlg(SfxChildWindow* pChild, SfxBindings* pBindings, weld::Window* pParent) override;
    virtual VclPtr<AbstractFmSearchDialog>        CreateFmSearchDialog(weld::Window* pParent,
                                                        const OUString& strInitialText,
                                                        const std::vector< OUString >& _rContexts,
                                                        sal_Int16 nInitialContext,
diff --git a/cui/source/inc/cuihyperdlg.hxx b/cui/source/inc/cuihyperdlg.hxx
index ce799fc..4f8d4c1 100644
--- a/cui/source/inc/cuihyperdlg.hxx
+++ b/cui/source/inc/cuihyperdlg.hxx
@@ -52,7 +52,7 @@ class SvxHpLinkDlg;
class SvxHlinkCtrl : public SfxControllerItem
{
private:
    VclPtr<SvxHpLinkDlg> pParent;
    SvxHpLinkDlg* pParent;

    SfxStatusForwarder aRdOnlyForwarder;

@@ -71,59 +71,47 @@ public:
|*
\************************************************************************/

class SvxHpLinkDlg : public SfxModalDialog
class SvxHpLinkDlg : public SfxModelessDialogController
{
private:
    friend class IconChoicePage;

    std::vector< std::unique_ptr<IconChoicePageData> > maPageList;

    VclPtr<SvtIconChoiceCtrl>       m_pIconCtrl;
    OString msCurrentPageId;

    HyperLinkPageType               mnCurrentPageId;

    // Buttons
    VclPtr<OKButton>                m_pOKBtn;
    VclPtr<PushButton>              m_pApplyBtn;
    VclPtr<CancelButton>            m_pCancelBtn;
    VclPtr<HelpButton>              m_pHelpBtn;
    VclPtr<PushButton>              m_pResetBtn;

    VclPtr<VclVBox>                 m_pTabContainer;
    const SfxItemSet*       pSet;
    std::unique_ptr<SfxItemSet>     pOutSet;
    SfxItemSet*             pExampleSet;
    std::unique_ptr<sal_uInt16[]>   pRanges;

    DECL_LINK( ChosePageHdl_Impl, SvtIconChoiceCtrl*, void );
    DECL_LINK( OkHdl, Button*, void );
    DECL_LINK( ApplyHdl, Button*, void) ;
    DECL_LINK( ResetHdl, Button*, void) ;
    DECL_LINK( CancelHdl, Button*, void );

    IconChoicePageData*     GetPageData ( HyperLinkPageType nId );
    void                    Start_Impl();
    bool                    OK_Impl();

    void                    FocusOnIcon ( HyperLinkPageType nId );


    SvxHlinkCtrl        maCtrl;         ///< Controller
    SfxBindings*        mpBindings;
    std::unique_ptr<SfxItemSet> mpItemSet;

    bool            mbGrabFocus : 1;
    bool            mbIsHTMLDoc : 1;

    DECL_LINK (ClickOkHdl_Impl, Button *, void );
    DECL_LINK (ClickApplyHdl_Impl, Button *, void );
    DECL_LINK (ClickCloseHdl_Impl, Button *, void );
    std::unique_ptr<weld::Notebook> m_xIconCtrl;
    std::unique_ptr<weld::Button> m_xOKBtn;
    std::unique_ptr<weld::Button> m_xApplyBtn;
    std::unique_ptr<weld::Button> m_xCancelBtn;
    std::unique_ptr<weld::Button> m_xHelpBtn;
    std::unique_ptr<weld::Button> m_xResetBtn;

    static void             ShowPageImpl ( IconChoicePageData const * pData );
    static void             HidePageImpl ( IconChoicePageData const * pData );
    DECL_LINK( ChosePageHdl_Impl, const OString&, void );

    IconChoicePage*         GetTabPage( HyperLinkPageType nPageId )
                                { return ( GetPageData (nPageId)->pPage ? GetPageData (nPageId)->pPage.get() : nullptr); }
    IconChoicePageData*     GetPageData ( const OString& rId );
    void                    Start_Impl();
    bool                    OK_Impl();

    void                    SwitchPage( const OString& rId );

    DECL_LINK( ResetHdl, weld::Button&, void) ;
    DECL_LINK (ClickOkHdl_Impl, weld::Button&, void );
    DECL_LINK (ClickApplyHdl_Impl, weld::Button&, void );

    IconChoicePage*         GetTabPage( const OString& rPageId )
                                { return GetPageData(rPageId)->xPage.get(); }

    void                    ActivatePageImpl ();
    void                    DeActivatePageImpl ();
@@ -131,45 +119,38 @@ private:

    void                    Ok();

    virtual bool            Close() override;
    virtual void            Move() override;
    virtual void Close() override;
    void Apply();

public:
    SvxHpLinkDlg (vcl::Window* pParent, SfxBindings* pBindings );
    SvxHpLinkDlg(SfxBindings* pBindings, SfxChildWindow* pChild, weld::Window* pParent);
    virtual ~SvxHpLinkDlg () override;
    virtual void dispose() override;

    // interface
    SvxIconChoiceCtrlEntry* AddTabPage(
        HyperLinkPageType nId, const OUString& rIconText, const Image& rChoiceIcon,
        CreatePage pCreateFunc /* != NULL */ );
    void AddTabPage(const OString &rId, CreatePage pCreateFunc /* != NULL */);

    void                SetCurPageId( HyperLinkPageType nId ) { mnCurrentPageId = nId; FocusOnIcon( nId ); }
    HyperLinkPageType   GetCurPageId() const       { return mnCurrentPageId; }
    void                ShowPage( HyperLinkPageType nId );
    void                SetCurPageId( const OString& rId ) { msCurrentPageId = rId; SwitchPage(rId ); }
    OString             GetCurPageId() const       { return msCurrentPageId; }
    void                ShowPage( const OString& rId );

    /// gives via map converted local slots if applicable
    const sal_uInt16*   GetInputRanges( const SfxItemPool& );
    void                SetInputSet( const SfxItemSet* pInSet );

    OKButton&           GetOKButton() { return *m_pOKBtn; }
    PushButton&         GetApplyButton() { return *m_pApplyBtn; }
    CancelButton&       GetCancelButton() { return *m_pCancelBtn; }
    weld::Button&       GetOKButton() { return *m_xOKBtn; }
    weld::Button&       GetApplyButton() { return *m_xApplyBtn; }
    weld::Button&       GetCancelButton() { return *m_xCancelBtn; }

    short               Execute() override;
    void                Start();
    bool                QueryClose();

    void                SetCtrlStyle();

    void                PageCreated( HyperLinkPageType nId, IconChoicePage& rPage );
    void                PageCreated(const OString& rId, IconChoicePage& rPage);

    void                SetPage( SvxHyperlinkItem const * pItem );
    void                SetReadOnlyMode( bool bReadOnly );
    bool             IsHTMLDoc() const { return mbIsHTMLDoc; }
    bool                IsHTMLDoc() const { return mbIsHTMLDoc; }

    SfxDispatcher*   GetDispatcher() const { return mpBindings->GetDispatcher(); }
    SfxDispatcher*   GetDispatcher() const { return GetBindings().GetDispatcher(); }
};


diff --git a/cui/source/inc/hldocntp.hxx b/cui/source/inc/hldocntp.hxx
index 9336770..7199688 100644
--- a/cui/source/inc/hldocntp.hxx
+++ b/cui/source/inc/hldocntp.hxx
@@ -26,20 +26,19 @@
|* Tabpage : Hyperlink - New Document
|*
\************************************************************************/

class SvxHyperlinkNewDocTp : public SvxHyperlinkTabPageBase
{
private:
    VclPtr<RadioButton>         m_pRbtEditNow;
    VclPtr<RadioButton>         m_pRbtEditLater;
    VclPtr<SvxHyperURLBox>      m_pCbbPath;
    VclPtr<PushButton>          m_pBtCreate;
    VclPtr<ListBox>             m_pLbDocTypes;
    std::unique_ptr<weld::RadioButton> m_xRbtEditNow;
    std::unique_ptr<weld::RadioButton> m_xRbtEditLater;
    std::unique_ptr<SvxHyperURLBox> m_xCbbPath;
    std::unique_ptr<weld::Button> m_xBtCreate;
    std::unique_ptr<weld::TreeView> m_xLbDocTypes;

    bool                ImplGetURLObject( const OUString& rPath, const OUString& rBase, INetURLObject& aURLObject ) const;
    void                FillDocumentList ();

    DECL_LINK (ClickNewHdl_Impl, Button*, void );
    DECL_LINK (ClickNewHdl_Impl, weld::Button&, void );
    DECL_STATIC_LINK(SvxHyperlinkNewDocTp, DispatchDocument, void*, void);

protected:
@@ -49,11 +48,10 @@ protected:
                             SvxLinkInsertMode& eMode ) override;

public:
    SvxHyperlinkNewDocTp ( vcl::Window *pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet);
    SvxHyperlinkNewDocTp(weld::Container* pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet);
    virtual ~SvxHyperlinkNewDocTp () override;
    virtual void dispose() override;

    static  VclPtr<IconChoicePage> Create( vcl::Window* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet );
    static std::unique_ptr<IconChoicePage> Create(weld::Container* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet);

    virtual bool        AskApply () override;
    virtual void        DoApply () override;
@@ -61,7 +59,6 @@ public:
    virtual void        SetInitFocus() override;
};


#endif // INCLUDED_CUI_SOURCE_INC_HLDOCNTP_HXX

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cui/source/inc/hldoctp.hxx b/cui/source/inc/hldoctp.hxx
index 25a6e0d..53f3022 100644
--- a/cui/source/inc/hldoctp.hxx
+++ b/cui/source/inc/hldoctp.hxx
@@ -26,28 +26,26 @@
|* Tabpage : Hyperlink - Document
|*
\************************************************************************/

class SvxHyperlinkDocTp final : public SvxHyperlinkTabPageBase
{
private:
    VclPtr<SvxHyperURLBox>      m_pCbbPath;
    VclPtr<PushButton>          m_pBtFileopen;

    VclPtr<Edit>                m_pEdTarget;
    VclPtr<FixedText>           m_pFtFullURL;
    VclPtr<PushButton>          m_pBtBrowse;
    std::unique_ptr<SvxHyperURLBox> m_xCbbPath;
    std::unique_ptr<weld::Button> m_xBtFileopen;
    std::unique_ptr<weld::Entry> m_xEdTarget;
    std::unique_ptr<weld::Label> m_xFtFullURL;
    std::unique_ptr<weld::Button> m_xBtBrowse;

    OUString            maStrURL;

    bool                mbMarkWndOpen;
    bool                m_bMarkWndOpen;

    DECL_LINK (ClickFileopenHdl_Impl, Button*, void );
    DECL_LINK (ClickTargetHdl_Impl  , Button*, void );
    DECL_LINK (ClickFileopenHdl_Impl, weld::Button&, void );
    DECL_LINK (ClickTargetHdl_Impl, weld::Button&, void );

    DECL_LINK (ModifiedPathHdl_Impl  , Edit&, void ); ///< Contents of combobox "Path" modified
    DECL_LINK (ModifiedTargetHdl_Impl, Edit&, void ); ///< Contents of editfield "Target" modified
    DECL_LINK (ModifiedPathHdl_Impl, weld::ComboBox&, void ); ///< Contents of combobox "Path" modified
    DECL_LINK (ModifiedTargetHdl_Impl, weld::Entry&, void ); ///< Contents of editfield "Target" modified

    DECL_LINK( LostFocusPathHdl_Impl, Control&, void ); ///< Combobox "path" lost its focus
    DECL_LINK( LostFocusPathHdl_Impl, weld::Widget&, void ); ///< Combobox "path" lost its focus

    DECL_LINK( TimeoutHdl_Impl, Timer *, void ); ///< Handler for timer -timeout

@@ -58,23 +56,21 @@ private:
    void GetCurentItemData ( OUString& rStrURL, OUString& aStrName,
                             OUString& aStrIntName, OUString& aStrFrame,
                             SvxLinkInsertMode& eMode ) override;
    virtual bool   ShouldOpenMarkWnd () override {return mbMarkWndOpen;}
    virtual void   SetMarkWndShouldOpen (bool bOpen) override {mbMarkWndOpen=bOpen;}
    virtual bool   ShouldOpenMarkWnd () override {return m_bMarkWndOpen;}
    virtual void   SetMarkWndShouldOpen (bool bOpen) override {m_bMarkWndOpen=bOpen;}
    OUString GetCurrentURL    ();

public:
    SvxHyperlinkDocTp ( vcl::Window *pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet);
    SvxHyperlinkDocTp(weld::Container* pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet);
    virtual ~SvxHyperlinkDocTp() override;
    virtual void dispose() override;

    static VclPtr<IconChoicePage> Create( vcl::Window* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet );
    static std::unique_ptr<IconChoicePage> Create(weld::Container* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet);

    virtual void        SetMarkStr ( const OUString& aStrMark ) override;

    virtual void        SetInitFocus() override;
};


#endif // INCLUDED_CUI_SOURCE_INC_HLDOCTP_HXX

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cui/source/inc/hlinettp.hxx b/cui/source/inc/hlinettp.hxx
index eabd11b..30fb8f8 100644
--- a/cui/source/inc/hlinettp.hxx
+++ b/cui/source/inc/hlinettp.hxx
@@ -32,25 +32,25 @@
class SvxHyperlinkInternetTp : public SvxHyperlinkTabPageBase
{
private:
    VclPtr<RadioButton >        m_pRbtLinktypInternet;
    VclPtr<RadioButton>         m_pRbtLinktypFTP;
    VclPtr<SvxHyperURLBox>      m_pCbbTarget;
    VclPtr<FixedText>           m_pFtLogin;
    VclPtr<Edit>                m_pEdLogin;
    VclPtr<FixedText>           m_pFtPassword;
    VclPtr<Edit>                m_pEdPassword;
    VclPtr<CheckBox>            m_pCbAnonymous;

    OUString            maStrOldUser;
    OUString            maStrOldPassword;

    bool                mbMarkWndOpen;
    bool                m_bMarkWndOpen;

    DECL_LINK( Click_SmartProtocol_Impl  , Button*, void ); ///< Radiobutton clicked: Type HTTP or FTP
    DECL_LINK( ClickAnonymousHdl_Impl    , Button*, void ); ///< Checkbox : Anonymous User
    DECL_LINK( ModifiedLoginHdl_Impl     , Edit&,   void ); ///< Contents of editfield "Login" modified
    DECL_LINK( LostFocusTargetHdl_Impl,    Control&, void ); ///< Combobox "Target" lost its focus
    DECL_LINK( ModifiedTargetHdl_Impl    , Edit&, void );    ///< Contents of editfield "Target" modified
    std::unique_ptr<weld::RadioButton> m_xRbtLinktypInternet;
    std::unique_ptr<weld::RadioButton> m_xRbtLinktypFTP;
    std::unique_ptr<SvxHyperURLBox> m_xCbbTarget;
    std::unique_ptr<weld::Label> m_xFtLogin;
    std::unique_ptr<weld::Entry> m_xEdLogin;
    std::unique_ptr<weld::Label> m_xFtPassword;
    std::unique_ptr<weld::Entry> m_xEdPassword;
    std::unique_ptr<weld::CheckButton> m_xCbAnonymous;

    DECL_LINK( Click_SmartProtocol_Impl, weld::Button&, void ); ///< Radiobutton clicked: Type HTTP or FTP
    DECL_LINK( ClickAnonymousHdl_Impl, weld::Button&, void ); ///< Checkbox : Anonymous User
    DECL_LINK( ModifiedLoginHdl_Impl, weld::Entry&,   void ); ///< Contents of editfield "Login" modified
    DECL_LINK( LostFocusTargetHdl_Impl, weld::Widget&, void ); ///< Combobox "Target" lost its focus
    DECL_LINK( ModifiedTargetHdl_Impl, weld::ComboBox&, void );    ///< Contents of editfield "Target" modified

    DECL_LINK( TimeoutHdl_Impl,             Timer *, void); ///< Handler for timer -timeout

@@ -71,15 +71,14 @@ protected:
    virtual void GetCurentItemData ( OUString& rStrURL, OUString& aStrName,
                                     OUString& aStrIntName, OUString& aStrFrame,
                                     SvxLinkInsertMode& eMode ) override;
    virtual bool ShouldOpenMarkWnd () override {return ( mbMarkWndOpen && m_pRbtLinktypInternet->IsChecked() );}
    virtual void SetMarkWndShouldOpen (bool bOpen) override {mbMarkWndOpen=bOpen;}
    virtual bool ShouldOpenMarkWnd () override {return ( m_bMarkWndOpen && m_xRbtLinktypInternet->get_active() );}
    virtual void SetMarkWndShouldOpen (bool bOpen) override {m_bMarkWndOpen=bOpen;}

public:
    SvxHyperlinkInternetTp ( vcl::Window *pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet);
    SvxHyperlinkInternetTp(weld::Container* pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet);
    virtual ~SvxHyperlinkInternetTp() override;
    virtual void dispose() override;

    static  VclPtr<IconChoicePage> Create( vcl::Window* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet );
    static std::unique_ptr<IconChoicePage> Create(weld::Container* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet);

    virtual void        SetMarkStr ( const OUString& aStrMark ) override;

diff --git a/cui/source/inc/hlmailtp.hxx b/cui/source/inc/hlmailtp.hxx
index ebadf85..c137a3cf 100644
--- a/cui/source/inc/hlmailtp.hxx
+++ b/cui/source/inc/hlmailtp.hxx
@@ -30,14 +30,14 @@
class SvxHyperlinkMailTp : public SvxHyperlinkTabPageBase
{
private:
    VclPtr<SvxHyperURLBox>      m_pCbbReceiver;
    VclPtr<PushButton>          m_pBtAdrBook;
    VclPtr<FixedText>           m_pFtSubject;
    VclPtr<Edit>                m_pEdSubject;
    std::unique_ptr<SvxHyperURLBox> m_xCbbReceiver;
    std::unique_ptr<weld::Button> m_xBtAdrBook;
    std::unique_ptr<weld::Label> m_xFtSubject;
    std::unique_ptr<weld::Entry> m_xEdSubject;

    DECL_STATIC_LINK(SvxHyperlinkMailTp, ClickAdrBookHdl_Impl, Button*, void);
    DECL_STATIC_LINK(SvxHyperlinkMailTp, ClickAdrBookHdl_Impl, weld::Button&, void);
        ///< Button : Address book
    DECL_LINK (ModifiedReceiverHdl_Impl, Edit&, void ); ///< Combobox "receiver" modified
    DECL_LINK (ModifiedReceiverHdl_Impl, weld::ComboBox&, void ); ///< Combobox "receiver" modified

    void    SetScheme(const OUString& rScheme);
    void    RemoveImproperProtocol(const OUString& aProperScheme);
@@ -51,11 +51,10 @@ protected:
                                     SvxLinkInsertMode& eMode ) override;

public:
    SvxHyperlinkMailTp ( vcl::Window *pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet);
    SvxHyperlinkMailTp(weld::Container* pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet);
    virtual ~SvxHyperlinkMailTp() override;
    virtual void dispose() override;

    static VclPtr<IconChoicePage> Create( vcl::Window* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet );
    static std::unique_ptr<IconChoicePage> Create(weld::Container* pWindow, SvxHpLinkDlg* pDlg, const SfxItemSet* pItemSet);

    virtual void        SetInitFocus() override;
};
diff --git a/cui/source/inc/hlmarkwn.hxx b/cui/source/inc/hlmarkwn.hxx
index c24c093..3932e05 100644
--- a/cui/source/inc/hlmarkwn.hxx
+++ b/cui/source/inc/hlmarkwn.hxx
@@ -34,7 +34,7 @@ class SvxHlinkDlgMarkWnd : public weld::GenericDialogController
private:
    friend class SvxHlmarkTreeLBox;

    VclPtr<SvxHyperlinkTabPageBase> mpParent;
    SvxHyperlinkTabPageBase* mpParent;

    sal_uInt16          mnError;

diff --git a/cui/source/inc/hltpbase.hxx b/cui/source/inc/hltpbase.hxx
index 1bc51f7..fae49a5 100644
--- a/cui/source/inc/hltpbase.hxx
+++ b/cui/source/inc/hltpbase.hxx
@@ -21,11 +21,6 @@

#include <sfx2/app.hxx>
#include <sfx2/tabdlg.hxx>
#include <vcl/button.hxx>
#include <vcl/fixed.hxx>
#include <vcl/combobox.hxx>
#include <vcl/edit.hxx>
#include <vcl/lstbox.hxx>
#include <svl/stritem.hxx>
#include <svl/eitem.hxx>
#include <vcl/transfer.hxx>
@@ -33,6 +28,7 @@
#include <sfx2/fcontnr.hxx>
#include <svtools/inettbc.hxx>
#include <vcl/timer.hxx>
#include <vcl/waitobj.hxx>

#include <sfx2/docfile.hxx>
#include <com/sun/star/frame/XFrame.hpp>
@@ -42,26 +38,27 @@
#include "iconcdlg.hxx"

/// ComboBox-Control for URL's with History and Autocompletion
class SvxHyperURLBox : public SvtURLBox, public DropTargetHelper
class SvxHyperURLBox : public URLBox, public DropTargetHelper
{
protected:
    virtual sal_Int8    AcceptDrop( const AcceptDropEvent& rEvt ) override;
    virtual sal_Int8    ExecuteDrop( const ExecuteDropEvent& rEvt ) override;

public:
    SvxHyperURLBox( vcl::Window* pParent, INetProtocol eSmart );

    SvxHyperURLBox(std::unique_ptr<weld::ComboBox> xWidget);
};

/// Tabpage : Basisclass
class SvxHyperlinkTabPageBase : public IconChoicePage
{
private:
    VclPtr<ComboBox>            mpCbbFrame;
    VclPtr<ListBox>             mpLbForm;
    VclPtr<Edit>                mpEdIndication;
    VclPtr<Edit>                mpEdText;
    VclPtr<PushButton>          mpBtScript;
    std::unique_ptr<weld::ComboBox> mxCbbFrame;
    std::unique_ptr<weld::ComboBox> mxLbForm;
    std::unique_ptr<weld::Entry> mxEdIndication;
    std::unique_ptr<weld::Entry> mxEdText;
    std::unique_ptr<weld::Button> mxBtScript;
    std::unique_ptr<weld::Label> mxFormLabel;
    std::unique_ptr<weld::Label> mxFrameLabel;

    bool                        mbIsCloseDisabled;

@@ -69,7 +66,7 @@ private:
                                mxDocumentFrame;

protected:
    VclPtr<vcl::Window> mpDialog;
    SvxHpLinkDlg* mpDialog;

    bool                mbStdControlsInit;

@@ -77,6 +74,8 @@ protected:

    Timer               maTimer;

    TopLevelWindowLocker maBusy;

    std::shared_ptr<SvxHlinkDlgMarkWnd> mxMarkWnd;

    void InitStdControls ();
@@ -90,22 +89,21 @@ protected:
                                          OUString& aStrIntName, OUString& aStrFrame,
                                          SvxLinkInsertMode& eMode );

    DECL_LINK (ClickScriptHdl_Impl, Button*, void ); ///< Button : Script
    DECL_LINK (ClickScriptHdl_Impl, weld::Button&, void ); ///< Button : Script

    static OUString GetSchemeFromURL( const OUString& rStrURL );

    void     DisableClose( bool _bDisable ) { mbIsCloseDisabled = _bDisable; }
    void     DisableClose( bool _bDisable );

public:
    SvxHyperlinkTabPageBase (
        vcl::Window *pParent,
        weld::Container* pParent,
        SvxHpLinkDlg* pDlg,
        const OString& rID,
        const OUString& rUIXMLDescription,
        const OString& rID,
        const SfxItemSet* pItemSet
    );
    virtual ~SvxHyperlinkTabPageBase () override;
    virtual void dispose() override;

    void    SetDocumentFrame(
        const css::uno::Reference< css::frame::XFrame >& rxDocumentFrame )
@@ -126,8 +124,6 @@ public:
    Size GetSizeExtraWnd()       { return mxMarkWnd->getDialog()->get_size(); }
    void MoveToExtraWnd ( Point aNewPos );

    using TabPage::ActivatePage;
    using TabPage::DeactivatePage;
    virtual bool        QueryClose() override;

protected:
diff --git a/cui/source/inc/iconcdlg.hxx b/cui/source/inc/iconcdlg.hxx
index c403bb1..a5db970 100644
--- a/cui/source/inc/iconcdlg.hxx
+++ b/cui/source/inc/iconcdlg.hxx
@@ -39,27 +39,29 @@ class SfxItemSet;
enum class HyperLinkPageType;

// Create-Function
typedef VclPtr<IconChoicePage> (*CreatePage)(vcl::Window *pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pAttrSet);
typedef std::unique_ptr<IconChoicePage> (*CreatePage)(weld::Container* pParent, SvxHpLinkDlg* pDlg, const SfxItemSet* pAttrSet);

/// Data-structure for pages in dialog
struct IconChoicePageData
{
    HyperLinkPageType nId;
    CreatePage fnCreatePage;    ///< pointer to the factory
    VclPtr<IconChoicePage> pPage;      ///< the TabPage itself
    OString sId;
    std::unique_ptr<IconChoicePage> xPage;      ///< the TabPage itself
    bool bRefresh;          ///< Flag: page has to be newly initialized

    // constructor
    IconChoicePageData( HyperLinkPageType Id, CreatePage fnPage )
        : nId           ( Id ),
          fnCreatePage  ( fnPage ),
          pPage         ( nullptr ),
          bRefresh      ( false )
    IconChoicePageData(const OString& rId, std::unique_ptr<IconChoicePage> xInPage)
        : sId(rId)
        , xPage(std::move(xInPage))
        , bRefresh(false)
    {}
};

class IconChoicePage : public TabPage
class IconChoicePage
{
protected:
    std::unique_ptr<weld::Builder> xBuilder;
    std::unique_ptr<weld::Container> xContainer;

private:
    const SfxItemSet*   pSet;
    bool                bHasExchangeSupport;
@@ -67,13 +69,13 @@ private:
    void                ImplInitSettings();

protected:
    using TabPage::ActivatePage;
    using TabPage::DeactivatePage;

    IconChoicePage( vcl::Window *pParent, const OString& rID, const OUString& rUIXMLDescription, const SfxItemSet* pItemSet );
    IconChoicePage(weld::Container* pParent, const OUString& rUIXMLDescription, const OString& rID, const SfxItemSet* pItemSet);

public:
    virtual ~IconChoicePage() override;
    virtual ~IconChoicePage();

    OString GetHelpId() const { return xContainer->get_help_id(); }

    const SfxItemSet&   GetItemSet() const { return *pSet; }

@@ -86,9 +88,6 @@ public:
    virtual void        ActivatePage( const SfxItemSet& );
    virtual DeactivateRC DeactivatePage( SfxItemSet* pSet );
    virtual bool        QueryClose();

    void                StateChanged( StateChangedType nType ) override;
    void                DataChanged( const DataChangedEvent& rDCEvt ) override;
};

#endif // INCLUDED_CUI_SOURCE_INC_ICONCDLG_HXX
diff --git a/cui/source/tabpages/autocdlg.cxx b/cui/source/tabpages/autocdlg.cxx
index 20028e1..c47a0bc 100644
--- a/cui/source/tabpages/autocdlg.cxx
+++ b/cui/source/tabpages/autocdlg.cxx
@@ -19,7 +19,6 @@

#include <i18nutil/unicode.hxx>
#include <vcl/event.hxx>
#include <vcl/field.hxx>
#include <vcl/keycodes.hxx>
#include <vcl/settings.hxx>
#include <sot/exchange.hxx>
diff --git a/cui/uiconfig/ui/hyperlinkdialog.ui b/cui/uiconfig/ui/hyperlinkdialog.ui
index de96c8d..59c1afa 100644
--- a/cui/uiconfig/ui/hyperlinkdialog.ui
+++ b/cui/uiconfig/ui/hyperlinkdialog.ui
@@ -1,15 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<!-- Generated with glade 3.22.1 -->
<interface domain="cui">
  <requires lib="gtk+" version="3.18"/>
  <requires lib="LibreOffice" version="1.0"/>
  <object class="GtkDialog" id="HyperlinkDialog">
    <property name="can_focus">False</property>
    <property name="hexpand">True</property>
    <property name="vexpand">True</property>
    <property name="border_width">6</property>
    <property name="title" translatable="yes" context="hyperlinkdialog|HyperlinkDialog">Hyperlink</property>
    <property name="default_width">0</property>
    <property name="default_height">0</property>
    <property name="type_hint">dialog</property>
    <child>
      <placeholder/>
    </child>
    <child internal-child="vbox">
      <object class="GtkBox" id="dialog-vbox1">
        <property name="can_focus">False</property>
@@ -22,14 +26,11 @@
            <property name="can_focus">False</property>
            <property name="layout_style">end</property>
            <child>
              <object class="GtkButton" id="ok">
                <property name="label">gtk-ok</property>
              <object class="GtkButton" id="reset">
                <property name="label" translatable="yes" context="hyperlinkdialog|reset">Reset</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="can_default">True</property>
                <property name="has_default">True</property>
                <property name="receives_default">True</property>
                <property name="use_stock">True</property>
              </object>
              <packing>
                <property name="expand">False</property>
@@ -51,6 +52,22 @@
              </packing>
            </child>
            <child>
              <object class="GtkButton" id="ok">
                <property name="label">gtk-ok</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="can_default">True</property>
                <property name="has_default">True</property>
                <property name="receives_default">True</property>
                <property name="use_stock">True</property>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">2</property>
              </packing>
            </child>
            <child>
              <object class="GtkButton" id="cancel">
                <property name="label">gtk-cancel</property>
                <property name="visible">True</property>
@@ -61,7 +78,7 @@
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">2</property>
                <property name="position">3</property>
              </packing>
            </child>
            <child>
@@ -75,21 +92,8 @@
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">3</property>
                <property name="secondary">True</property>
              </packing>
            </child>
            <child>
              <object class="GtkButton" id="reset">
                <property name="label" translatable="yes" context="hyperlinkdialog|reset">Reset</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">4</property>
                <property name="secondary">True</property>
              </packing>
            </child>
          </object>
@@ -101,43 +105,300 @@
          </packing>
        </child>
        <child>
          <object class="GtkBox" id="box1">
          <object class="GtkNotebook" id="icon_control">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="can_focus">True</property>
            <property name="hexpand">True</property>
            <property name="vexpand">True</property>
            <property name="spacing">6</property>
            <property name="tab_pos">left</property>
            <child>
              <object class="cuilo-SvtIconChoiceCtrl" id="icon_control">
                <property name="width_request">110</property>
                <property name="height_request">400</property>
              <object class="GtkGrid">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="vexpand">True</property>
                <property name="can_focus">False</property>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
              </object>
            </child>
            <child type="tab">
              <object class="GtkBox" id="internet">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="orientation">vertical</property>
                <child>
                  <object class="GtkImage">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="tooltip_text" translatable="yes" context="hyperlinkdialog|RID_SVXSTR_HYPERDLG_HLINETTP_HELP">This is where you create a hyperlink to a Web page or FTP server connection.</property>
                    <property name="icon_name">res/hlinettp.png</property>
                    <property name="icon_size">6</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">0</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkLabel" id="RID_SVXSTR_HYPERDLG_HLINETTP">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="label" translatable="yes" context="hyperlinkdialog|RID_SVXSTR_HYPERDLG_HLINETTP">Internet</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">1</property>
                  </packing>
                </child>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">0</property>
                <property name="tab_fill">False</property>
              </packing>
            </child>
            <child>
              <object class="GtkBox" id="tab">
              <object class="GtkGrid">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="hexpand">True</property>
                <property name="vexpand">True</property>
                <property name="orientation">vertical</property>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
              </object>
              <packing>
                <property name="expand">False</property>
                <property name="fill">True</property>
                <property name="position">1</property>
              </packing>
            </child>
            <child type="tab">
              <object class="GtkBox" id="mail">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="orientation">vertical</property>
                <child>
                  <object class="GtkImage">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="tooltip_text" translatable="yes" context="hyperlinkdialog|RID_SVXSTR_HYPERDLG_HLMAILTP_HELP">This is where you create a hyperlink to an email address.</property>
                    <property name="icon_name">res/hlmailtp.png</property>
                    <property name="icon_size">6</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">0</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkLabel" id="RID_SVXSTR_HYPERDLG_HLMAILTP">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="label" translatable="yes" context="hyperlinkdialog|RID_SVXSTR_HYPERDLG_HLMAILTP">Mail</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">1</property>
                  </packing>
                </child>
              </object>
              <packing>
                <property name="position">1</property>
                <property name="tab_fill">False</property>
              </packing>
            </child>
            <child>
              <object class="GtkGrid">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
              </object>
              <packing>
                <property name="position">2</property>
              </packing>
            </child>
            <child type="tab">
              <object class="GtkBox" id="document">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="orientation">vertical</property>
                <child>
                  <object class="GtkImage">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="tooltip_text" translatable="yes" context="hyperlinkdialog|RID_SVXSTR_HYPERDLG_HLDOCTP_HELP">This is where you create a hyperlink to an existing document or a target within a document.</property>
                    <property name="icon_name">res/hldoctp.png</property>
                    <property name="icon_size">6</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">0</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkLabel" id="RID_SVXSTR_HYPERDLG_HLDOCTP">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="label" translatable="yes" context="hyperlinkdialog|RID_SVXSTR_HYPERDLG_HLDOCTP">Document</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">1</property>
                  </packing>
                </child>
              </object>
              <packing>
                <property name="position">2</property>
                <property name="tab_fill">False</property>
              </packing>
            </child>
            <child>
              <object class="GtkGrid">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
              </object>
              <packing>
                <property name="position">3</property>
              </packing>
            </child>
            <child type="tab">
              <object class="GtkBox" id="newdocument">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <property name="orientation">vertical</property>
                <child>
                  <object class="GtkImage">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="tooltip_text" translatable="yes" context="hyperlinkdialog|RID_SVXSTR_HYPERDLG_HLDOCNTP_HELP">This is where you create a new document to which the new link points.</property>
                    <property name="icon_name">res/hldocntp.png</property>
                    <property name="icon_size">6</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">0</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkLabel" id="RID_SVXSTR_HYPERDLG_HLDOCNTP">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="label" translatable="yes" context="hyperlinkdialog|RID_SVXSTR_HYPERDLG_HLDOCNTP">New Document</property>
                  </object>
                  <packing>
                    <property name="expand">False</property>
                    <property name="fill">True</property>
                    <property name="position">1</property>
                  </packing>
                </child>
              </object>
              <packing>
                <property name="position">3</property>
                <property name="tab_fill">False</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">True</property>
@@ -148,11 +409,11 @@
      </object>
    </child>
    <action-widgets>
      <action-widget response="-5">ok</action-widget>
      <action-widget response="101">reset</action-widget>
      <action-widget response="102">apply</action-widget>
      <action-widget response="-5">ok</action-widget>
      <action-widget response="-6">cancel</action-widget>
      <action-widget response="-11">help</action-widget>
      <action-widget response="101">reset</action-widget>
    </action-widgets>
  </object>
</interface>
diff --git a/cui/uiconfig/ui/hyperlinkdocpage.ui b/cui/uiconfig/ui/hyperlinkdocpage.ui
index 894e9e2..45d8af5 100644
--- a/cui/uiconfig/ui/hyperlinkdocpage.ui
+++ b/cui/uiconfig/ui/hyperlinkdocpage.ui
@@ -1,13 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<!-- Generated with glade 3.22.1 -->
<interface domain="cui">
  <requires lib="gtk+" version="3.18"/>
  <requires lib="LibreOffice" version="1.0"/>
  <object class="GtkImage" id="image1">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="icon_name">res/target.png</property>
  </object>
  <object class="GtkImage" id="image2">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="icon_name">res/fileopen.png</property>
  </object>
  <object class="GtkBox" id="HyperlinkDocPage">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="hexpand">True</property>
    <property name="vexpand">True</property>
    <property name="border_width">6</property>
    <property name="orientation">vertical</property>
    <property name="spacing">24</property>
    <child>
@@ -35,10 +45,10 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinkdocpage|path_label">_Path:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">path</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -46,29 +56,36 @@
                  </packing>
                </child>
                <child>
                  <object class="cuilo-SvxHyperURLBox" id="path">
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="hexpand">True</property>
                  </object>
                  <packing>
                    <property name="left_attach">1</property>
                    <property name="top_attach">0</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkButton" id="fileopen">
                    <property name="label" translatable="yes" context="hyperlinkdocpage|fileopen">Open File</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">True</property>
                    <property name="tooltip_text" translatable="yes" context="hyperlinkdocpage|fileopen|tooltip_text">Open File</property>
                    <property name="image">image2</property>
                    <property name="always_show_image">True</property>
                  </object>
                  <packing>
                    <property name="left_attach">2</property>
                    <property name="top_attach">0</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkComboBoxText" id="path">
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="hexpand">True</property>
                    <property name="has_entry">True</property>
                    <child internal-child="entry">
                      <object class="GtkEntry">
                        <property name="can_focus">False</property>
                      </object>
                    </child>
                  </object>
                  <packing>
                    <property name="left_attach">1</property>
                    <property name="top_attach">0</property>
                  </packing>
                </child>
              </object>
            </child>
          </object>
@@ -113,10 +130,10 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinkdocpage|target_label">Targ_et:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">target</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -128,9 +145,9 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinkdocpage|url_label">URL:</property>
                    <property name="use_underline">True</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -139,11 +156,12 @@
                </child>
                <child>
                  <object class="GtkButton" id="browse">
                    <property name="label" translatable="yes" context="hyperlinkdocpage|browse">Target in Document</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">True</property>
                    <property name="tooltip_text" translatable="yes" context="hyperlinkdocpage|browse|tooltip_text">Target in Document</property>
                    <property name="image">image1</property>
                    <property name="always_show_image">True</property>
                  </object>
                  <packing>
                    <property name="left_attach">2</property>
@@ -222,10 +240,10 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinkdocpage|frame_label">F_rame:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">frame</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -237,10 +255,10 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinkdocpage|indication_label">Te_xt:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">indication</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -252,10 +270,10 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinkdocpage|name_label">N_ame:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">name</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -293,10 +311,10 @@
                      <object class="GtkLabel" id="form_label">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="xalign">0</property>
                        <property name="label" translatable="yes" context="hyperlinkdocpage|form_label">F_orm:</property>
                        <property name="use_underline">True</property>
                        <property name="mnemonic_widget">form</property>
                        <property name="xalign">0</property>
                      </object>
                      <packing>
                        <property name="left_attach">1</property>
@@ -304,7 +322,7 @@
                      </packing>
                    </child>
                    <child>
                      <object class="GtkComboBox" id="form">
                      <object class="GtkComboBoxText" id="form">
                        <property name="visible">True</property>
                        <property name="can_focus">True</property>
                        <property name="hexpand">True</property>
@@ -320,6 +338,7 @@
                        <property name="can_focus">True</property>
                        <property name="receives_default">True</property>
                        <property name="tooltip_text" translatable="yes" context="hyperlinkdocpage|script|tooltip_text">Events</property>
                        <property name="always_show_image">True</property>
                      </object>
                      <packing>
                        <property name="left_attach">3</property>
@@ -327,7 +346,7 @@
                      </packing>
                    </child>
                    <child>
                      <object class="GtkComboBox" id="frame">
                      <object class="GtkComboBoxText" id="frame">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="hexpand">True</property>
diff --git a/cui/uiconfig/ui/hyperlinkinternetpage.ui b/cui/uiconfig/ui/hyperlinkinternetpage.ui
index ae413e3..efebeed 100644
--- a/cui/uiconfig/ui/hyperlinkinternetpage.ui
+++ b/cui/uiconfig/ui/hyperlinkinternetpage.ui
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<!-- Generated with glade 3.22.1 -->
<interface domain="cui">
  <requires lib="gtk+" version="3.18"/>
  <requires lib="LibreOffice" version="1.0"/>
  <object class="GtkBox" id="HyperlinkInternetPage">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="hexpand">True</property>
    <property name="vexpand">True</property>
    <property name="border_width">6</property>
    <property name="orientation">vertical</property>
    <property name="spacing">24</property>
    <child>
@@ -92,17 +92,6 @@
                  </packing>
                </child>
                <child>
                  <object class="cuilo-SvxHyperURLBox" id="target">
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="hexpand">True</property>
                  </object>
                  <packing>
                    <property name="left_attach">1</property>
                    <property name="top_attach">1</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkLabel" id="login_label">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
@@ -170,6 +159,23 @@
                  </packing>
                </child>
                <child>
                  <object class="GtkComboBoxText" id="target">
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="hexpand">True</property>
                    <property name="has_entry">True</property>
                    <child internal-child="entry">
                      <object class="GtkEntry">
                        <property name="can_focus">False</property>
                      </object>
                    </child>
                  </object>
                  <packing>
                    <property name="left_attach">1</property>
                    <property name="top_attach">1</property>
                  </packing>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
@@ -303,7 +309,7 @@
                      </packing>
                    </child>
                    <child>
                      <object class="GtkComboBox" id="form">
                      <object class="GtkComboBoxText" id="form">
                        <property name="visible">True</property>
                        <property name="can_focus">True</property>
                        <property name="hexpand">True</property>
@@ -319,6 +325,7 @@
                        <property name="can_focus">True</property>
                        <property name="receives_default">True</property>
                        <property name="tooltip_text" translatable="yes" context="hyperlinkinternetpage|script|tooltip_text">Events</property>
                        <property name="always_show_image">True</property>
                      </object>
                      <packing>
                        <property name="left_attach">3</property>
@@ -326,7 +333,7 @@
                      </packing>
                    </child>
                    <child>
                      <object class="GtkComboBox" id="frame">
                      <object class="GtkComboBoxText" id="frame">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="hexpand">True</property>
diff --git a/cui/uiconfig/ui/hyperlinkmailpage.ui b/cui/uiconfig/ui/hyperlinkmailpage.ui
index 4e2ed86..89c2c84 100644
--- a/cui/uiconfig/ui/hyperlinkmailpage.ui
+++ b/cui/uiconfig/ui/hyperlinkmailpage.ui
@@ -1,13 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<!-- Generated with glade 3.22.1 -->
<interface domain="cui">
  <requires lib="gtk+" version="3.18"/>
  <requires lib="LibreOffice" version="1.0"/>
  <object class="GtkImage" id="image1">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="icon_name">res/adrbook.png</property>
  </object>
  <object class="GtkBox" id="HyperlinkMailPage">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="hexpand">True</property>
    <property name="vexpand">True</property>
    <property name="border_width">6</property>
    <property name="orientation">vertical</property>
    <property name="spacing">24</property>
    <child>
@@ -35,10 +40,10 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinkmailpage|receiver_label">Re_cipient:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">receiver</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -46,23 +51,13 @@
                  </packing>
                </child>
                <child>
                  <object class="cuilo-SvxHyperURLBox" id="receiver">
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="hexpand">True</property>
                  </object>
                  <packing>
                    <property name="left_attach">1</property>
                    <property name="top_attach">1</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkButton" id="adressbook">
                    <property name="label" translatable="yes" context="hyperlinkmailpage|adressbook">Data Sources…</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">True</property>
                    <property name="tooltip_text" translatable="yes" context="hyperlinkmailpage|adressbook|tooltip_text">Data Sources...</property>
                    <property name="image">image1</property>
                    <property name="always_show_image">True</property>
                  </object>
                  <packing>
                    <property name="left_attach">2</property>
@@ -74,11 +69,11 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="ypad">1</property>
                    <property name="label" translatable="yes" context="hyperlinkmailpage|subject_label">_Subject:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">subject</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -97,6 +92,26 @@
                  </packing>
                </child>
                <child>
                  <object class="GtkComboBoxText" id="receiver">
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="hexpand">True</property>
                    <property name="has_entry">True</property>
                    <child internal-child="entry">
                      <object class="GtkEntry">
                        <property name="can_focus">False</property>
                      </object>
                    </child>
                  </object>
                  <packing>
                    <property name="left_attach">1</property>
                    <property name="top_attach">1</property>
                  </packing>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
                  <placeholder/>
                </child>
                <child>
@@ -151,10 +166,10 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinkmailpage|frame_label">F_rame:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">frame</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -166,10 +181,10 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinkmailpage|indication_label">Te_xt:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">indication</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -181,10 +196,10 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinkmailpage|name_label">N_ame:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">name</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -222,10 +237,10 @@
                      <object class="GtkLabel" id="form_label">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="xalign">0</property>
                        <property name="label" translatable="yes" context="hyperlinkmailpage|form_label">F_orm:</property>
                        <property name="use_underline">True</property>
                        <property name="mnemonic_widget">form</property>
                        <property name="xalign">0</property>
                      </object>
                      <packing>
                        <property name="left_attach">1</property>
@@ -233,7 +248,7 @@
                      </packing>
                    </child>
                    <child>
                      <object class="GtkComboBox" id="form">
                      <object class="GtkComboBoxText" id="form">
                        <property name="visible">True</property>
                        <property name="can_focus">True</property>
                        <property name="hexpand">True</property>
@@ -249,6 +264,7 @@
                        <property name="can_focus">True</property>
                        <property name="receives_default">True</property>
                        <property name="tooltip_text" translatable="yes" context="hyperlinkmailpage|script|tooltip_text">Events</property>
                        <property name="always_show_image">True</property>
                      </object>
                      <packing>
                        <property name="left_attach">3</property>
@@ -256,7 +272,7 @@
                      </packing>
                    </child>
                    <child>
                      <object class="GtkComboBox" id="frame">
                      <object class="GtkComboBoxText" id="frame">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="hexpand">True</property>
diff --git a/cui/uiconfig/ui/hyperlinknewdocpage.ui b/cui/uiconfig/ui/hyperlinknewdocpage.ui
index 980c967..d31411d 100644
--- a/cui/uiconfig/ui/hyperlinknewdocpage.ui
+++ b/cui/uiconfig/ui/hyperlinknewdocpage.ui
@@ -1,13 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.18.3 -->
<!-- Generated with glade 3.22.1 -->
<interface domain="cui">
  <requires lib="gtk+" version="3.18"/>
  <requires lib="LibreOffice" version="1.0"/>
  <object class="GtkImage" id="image1">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="icon_name">res/newdoc.png</property>
  </object>
  <object class="GtkTreeStore" id="liststore1">
    <columns>
      <!-- column-name text -->
      <column type="gchararray"/>
      <!-- column-name id -->
      <column type="gchararray"/>
    </columns>
  </object>
  <object class="GtkBox" id="HyperlinkNewDocPage">
    <property name="visible">True</property>
    <property name="can_focus">False</property>
    <property name="hexpand">True</property>
    <property name="vexpand">True</property>
    <property name="border_width">6</property>
    <property name="orientation">vertical</property>
    <property name="spacing">24</property>
    <child>
@@ -83,10 +96,10 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinknewdocpage|file_label">_File:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">path</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -94,23 +107,13 @@
                  </packing>
                </child>
                <child>
                  <object class="cuilo-SvxHyperURLBox" id="path">
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="hexpand">True</property>
                  </object>
                  <packing>
                    <property name="left_attach">1</property>
                    <property name="top_attach">1</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkButton" id="create">
                    <property name="label" translatable="yes" context="hyperlinknewdocpage|create">Select Path</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">True</property>
                    <property name="tooltip_text" translatable="yes" context="hyperlinknewdocpage|create|tooltip_text">Select Path</property>
                    <property name="image">image1</property>
                    <property name="always_show_image">True</property>
                  </object>
                  <packing>
                    <property name="left_attach">2</property>
@@ -122,12 +125,12 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="yalign">0</property>
                    <property name="ypad">1</property>
                    <property name="label" translatable="yes" context="hyperlinknewdocpage|types_label">File _type:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">types:border</property>
                    <property name="mnemonic_widget">types</property>
                    <property name="xalign">0</property>
                    <property name="yalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -135,13 +138,52 @@
                  </packing>
                </child>
                <child>
                  <object class="GtkTreeView" id="types:border">
                  <object class="GtkComboBoxText" id="path">
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="vexpand">True</property>
                    <property name="show_expanders">False</property>
                    <child internal-child="selection">
                      <object class="GtkTreeSelection" id="treeview-selection1"/>
                    <property name="hexpand">True</property>
                    <property name="has_entry">True</property>
                    <child internal-child="entry">
                      <object class="GtkEntry">
                        <property name="can_focus">False</property>
                      </object>
                    </child>
                  </object>
                  <packing>
                    <property name="left_attach">1</property>
                    <property name="top_attach">1</property>
                  </packing>
                </child>
                <child>
                  <object class="GtkScrolledWindow">
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="vexpand">False</property>
                    <property name="shadow_type">in</property>
                    <child>
                      <object class="GtkTreeView" id="types">
                        <property name="visible">True</property>
                        <property name="can_focus">True</property>
                        <property name="vexpand">True</property>
                        <property name="model">liststore1</property>
                        <property name="headers_visible">False</property>
                        <property name="headers_clickable">False</property>
                        <property name="search_column">0</property>
                        <property name="show_expanders">False</property>
                        <child internal-child="selection">
                          <object class="GtkTreeSelection" id="treeview-selection1"/>
                        </child>
                        <child>
                          <object class="GtkTreeViewColumn" id="treeviewcolumn1">
                            <child>
                              <object class="GtkCellRendererText" id="cellrenderertext1"/>
                              <attributes>
                                <attribute name="text">0</attribute>
                              </attributes>
                            </child>
                          </object>
                        </child>
                      </object>
                    </child>
                  </object>
                  <packing>
@@ -204,10 +246,10 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinknewdocpage|frame_label">F_rame:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">frame</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -219,10 +261,10 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinknewdocpage|indication_label">Te_xt:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">indication</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -234,10 +276,10 @@
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <property name="halign">start</property>
                    <property name="xalign">0</property>
                    <property name="label" translatable="yes" context="hyperlinknewdocpage|name_label">N_ame:</property>
                    <property name="use_underline">True</property>
                    <property name="mnemonic_widget">name</property>
                    <property name="xalign">0</property>
                  </object>
                  <packing>
                    <property name="left_attach">0</property>
@@ -285,7 +327,7 @@
                      </packing>
                    </child>
                    <child>
                      <object class="GtkComboBox" id="form">
                      <object class="GtkComboBoxText" id="form">
                        <property name="visible">True</property>
                        <property name="can_focus">True</property>
                        <property name="hexpand">True</property>
@@ -301,6 +343,7 @@
                        <property name="can_focus">True</property>
                        <property name="receives_default">True</property>
                        <property name="tooltip_text" translatable="yes" context="hyperlinknewdocpage|script|tooltip_text">Events</property>
                        <property name="always_show_image">True</property>
                      </object>
                      <packing>
                        <property name="left_attach">3</property>
@@ -308,7 +351,7 @@
                      </packing>
                    </child>
                    <child>
                      <object class="GtkComboBox" id="frame">
                      <object class="GtkComboBoxText" id="frame">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="hexpand">True</property>
diff --git a/extras/source/glade/libreoffice-catalog.xml.in b/extras/source/glade/libreoffice-catalog.xml.in
index ed9f543..d96db17 100644
--- a/extras/source/glade/libreoffice-catalog.xml.in
+++ b/extras/source/glade/libreoffice-catalog.xml.in
@@ -244,10 +244,6 @@
                        generic-name="LanguageBox" parent="VclComboBoxText"
                        icon-name="widget-gtk-combobox"/>

    <glade-widget-class title="URL Entry" name="cuilo-SvxHyperURLBox"
                        generic-name="URL Entry" parent="GtkEntry"
                        icon-name="widget-gtk-textentry"/>

    <glade-widget-class title="Another NoSpace Edit" name="cuilo-SvxNoSpaceEdit"
                        generic-name="Another NoSpace Edit" parent="GtkEntry"
                        icon-name="widget-gtk-textentry">
@@ -330,10 +326,6 @@
                        generic-name="TypeSelectList" parent="GtkTreeView"
                        icon-name="widget-gtk-treeview"/>

    <glade-widget-class title="Icon Choice Control" name="cuilo-SvtIconChoiceCtrl"
                        generic-name="Icon Choice Control" parent="GtkIconView"
                        icon-name="widget-gtk-iconview"/>

    <glade-widget-class title="Recent Documents View" name="sfxlo-RecentDocsView"
                        generic-name="Icon View" parent="GtkIconView"
                        icon-name="widget-gtk-iconview"/>
diff --git a/include/sfx2/basedlgs.hxx b/include/sfx2/basedlgs.hxx
index 5a1b1ce..948b52f 100644
--- a/include/sfx2/basedlgs.hxx
+++ b/include/sfx2/basedlgs.hxx
@@ -107,7 +107,7 @@ public:
    virtual void            Deactivate() override;
    virtual void            ChildWinDispose() override;
    virtual void            FillInfo(SfxChildWinInfo&) const;
    SfxBindings&            GetBindings() { return *m_pBindings; }
    SfxBindings&            GetBindings() const { return *m_pBindings; }
};

// class SfxFloatingWindow --------------------------------------------------
diff --git a/include/svtools/inettbc.hxx b/include/svtools/inettbc.hxx
index 0c19a98..3f00d75 100644
--- a/include/svtools/inettbc.hxx
+++ b/include/svtools/inettbc.hxx
@@ -116,11 +116,12 @@ class SVT_DLLPUBLIC URLBox
    SVT_DLLPRIVATE void             Init();

public:
    URLBox(std::unique_ptr<weld::ComboBox> pWidget);
    URLBox(std::unique_ptr<weld::ComboBox> xWidget);
    ~URLBox();

    void                set_entry_text(const OUString& rStr) { m_xWidget->set_entry_text(rStr); }
    void                Clear() { m_xWidget->clear(); }
    void                show() { m_xWidget->show(); }
    void                clear() { m_xWidget->clear(); }
    void                connect_entry_activate(const Link<weld::ComboBox&, bool>& rLink) { m_xWidget->connect_entry_activate(rLink); }
    void                connect_changed(const Link<weld::ComboBox&, void>& rLink) { aChangeHdl = rLink; }
    void                connect_focus_out(const Link<weld::Widget&, void>& rLink) { aFocusOutHdl = rLink; }
@@ -132,12 +133,13 @@ public:
    void                EnableAutocomplete() { m_xWidget->set_entry_completion(true); }

    void                SetBaseURL( const OUString& rURL );
    const OUString&     GetBaseURL() const { return aBaseURL; }
    void                SetSmartProtocol( INetProtocol eProt );
    INetProtocol        GetSmartProtocol() const { return eSmartProtocol; }
    OUString            GetURL();
    void                DisableHistory();

    weld::Widget*       getWidget() { return m_xWidget.get(); }
    weld::ComboBox*     getWidget() { return m_xWidget.get(); }

    static OUString     ParseSmart( const OUString& aText, const OUString& aBaseURL );

diff --git a/include/svx/svxdlg.hxx b/include/svx/svxdlg.hxx
index 781eafd..b3aab07 100644
--- a/include/svx/svxdlg.hxx
+++ b/include/svx/svxdlg.hxx
@@ -237,7 +237,7 @@ class AbstractSvxHpLinkDlg : public VclAbstractDialog
protected:
    virtual ~AbstractSvxHpLinkDlg() override = default;
public:
    virtual vcl::Window*     GetWindow()  = 0;
    virtual std::shared_ptr<SfxDialogController> GetController()  = 0;
    virtual bool       QueryClose() = 0;
};

@@ -407,7 +407,7 @@ public:
    virtual VclPtr<AbstractSvxObjectTitleDescDialog> CreateSvxObjectTitleDescDialog(weld::Window* pParent, const OUString& rTitle, const OUString& rDescription) = 0;
    virtual VclPtr<AbstractSvxMultiPathDialog>    CreateSvxMultiPathDialog(weld::Window* pParent) = 0 ;
    virtual VclPtr<AbstractSvxMultiPathDialog>    CreateSvxPathSelectDialog(weld::Window* pParent) = 0 ;
    virtual VclPtr<AbstractSvxHpLinkDlg>  CreateSvxHpLinkDlg(vcl::Window* pParent, SfxBindings* pBindings)=0;
    virtual VclPtr<AbstractSvxHpLinkDlg>  CreateSvxHpLinkDlg(SfxChildWindow* pChild, SfxBindings* pBindings, weld::Window* pParent) = 0;
    virtual VclPtr<AbstractFmSearchDialog> CreateFmSearchDialog(weld::Window* pParent,
                                                        const OUString& strInitialText,
                                                        const ::std::vector< OUString >& _rContexts,
diff --git a/include/tools/wintypes.hxx b/include/tools/wintypes.hxx
index f3ac395..4fa4eab 100644
--- a/include/tools/wintypes.hxx
+++ b/include/tools/wintypes.hxx
@@ -100,7 +100,8 @@ enum class WindowType : sal_uInt16
    RULER                , // 70 (374)
    CALCINPUTLINE        ,
    HEADERBAR            ,
    LAST                 = HEADERBAR,
    VERTICALTABCONTROL   ,
    LAST                 = VERTICALTABCONTROL,
    // only used in vclxtoolkit.cxx
    TOOLKIT_FRAMEWINDOW        = 0x1000,
    TOOLKIT_SYSTEMCHILDWINDOW  = 0x1001,
diff --git a/include/vcl/ivctrl.hxx b/include/vcl/ivctrl.hxx
index cffbe03..e3c630a 100644
--- a/include/vcl/ivctrl.hxx
+++ b/include/vcl/ivctrl.hxx
@@ -23,6 +23,7 @@
#include <memory>
#include <vcl/dllapi.h>
#include <vcl/ctrl.hxx>
#include <vcl/layout.hxx>
#include <tools/link.hxx>
#include <vcl/image.hxx>
#include <o3tl/deleter.hxx>
@@ -232,6 +233,8 @@ public:
    SvxIconChoiceCtrlEntry* InsertEntry( const OUString& rText,
                                         const Image& rImage);

    void RemoveEntry(sal_Int32 nEntryListPos);

    /** creates automatic mnemonics for all icon texts in the control

    @param _rUsedMnemonics
@@ -276,6 +279,52 @@ public:
    virtual css::uno::Reference< css::accessibility::XAccessible > CreateAccessible() override;
};

struct VerticalTabPageData;

class VerticalTabControl : public VclHBox
{
    VclPtr<SvtIconChoiceCtrl> m_xChooser;
    VclPtr<VclVBox> m_xBox;

    std::vector<std::unique_ptr<VerticalTabPageData>> maPageList;
    OString m_sCurrentPageId;

    Link<VerticalTabControl*,void> m_aActivateHdl;
    Link<VerticalTabControl*,bool> m_aDeactivateHdl;

    DECL_LINK(ChosePageHdl_Impl, SvtIconChoiceCtrl*, void);

    void ActivatePage();
    bool DeactivatePage();

    VerticalTabPageData* GetPageData(const OString& rId) const;
    VerticalTabPageData* GetPageData(const SvxIconChoiceCtrlEntry* pEntry) const;

public:
    VerticalTabControl(vcl::Window* pParent);
    virtual ~VerticalTabControl() override;
    virtual void dispose() override;

    sal_uInt16 GetPageCount() const { return m_xChooser->GetEntryCount(); }

    OString GetCurPageId() const { return m_sCurrentPageId; }
    void SetCurPageId(const OString& rId);

    sal_uInt16 GetPagePos(const OString& rPageId) const;
    OString GetPageId(sal_uInt16 nIndex) const;
    VclPtr<vcl::Window> GetPage(const OString& rPageId);

    void RemovePage(const OString& rPageId);
    void InsertPage(const OString& rPageId, const OUString& rLabel, const Image& rImage, const OUString& rTooltip, VclPtr<vcl::Window> xPage);

    void SetActivatePageHdl( const Link<VerticalTabControl*,void>& rLink ) { m_aActivateHdl = rLink; }
    void SetDeactivatePageHdl( const Link<VerticalTabControl*, bool>& rLink ) { m_aDeactivateHdl = rLink; }

    OUString GetPageText(const OString& rPageId) const;

    vcl::Window* GetPageParent() { return m_xBox.get(); }
};

#endif // INCLUDED_VCL_IVCTRL_HXX

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 35e645a..d422c84 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -351,6 +351,7 @@ public:
    virtual bool get_resizable() const = 0;
    virtual Size get_size() const = 0;
    virtual Point get_position() const = 0;
    virtual tools::Rectangle get_monitor_workarea() const = 0;
    // center window on is parent
    //
    // bTrackGeometryRequests set to true tries to ensure the window will end
diff --git a/solenv/bin/native-code.py b/solenv/bin/native-code.py
index d8b940d..ae75844 100755
--- a/solenv/bin/native-code.py
+++ b/solenv/bin/native-code.py
@@ -493,7 +493,6 @@ custom_widgets = [
    'SvSimpleTableContainer',
    'SvTreeListBox',
    'SvtFileView',
    'SvtIconChoiceCtrl',
    'SvtURLBox',
    'Svx3DPreviewControl',
    'SvxCharViewControl',
@@ -503,7 +502,6 @@ custom_widgets = [
    'SvxFillAttrBox',
    'SvxFillTypeBox',
    'SvxFontPrevWindow',
    'SvxHyperURLBox',
    'SvxLanguageBox',
    'SvxLanguageComboBox',
    'SvxLightCtl3D',
diff --git a/svtools/source/control/inettbc.cxx b/svtools/source/control/inettbc.cxx
index eff7b67..e0358e0 100644
--- a/svtools/source/control/inettbc.cxx
+++ b/svtools/source/control/inettbc.cxx
@@ -579,7 +579,7 @@ IMPL_LINK_NOARG( MatchContext_Impl, Select_Impl, void*, void )
    }

    // insert all completed strings into the listbox
    pBox->Clear();
    pBox->clear();

    for (auto const& completion : aCompletions)
    {
diff --git a/svx/source/dialog/hyperdlg.cxx b/svx/source/dialog/hyperdlg.cxx
index 20cb0dc..d08a17d 100644
--- a/svx/source/dialog/hyperdlg.cxx
+++ b/svx/source/dialog/hyperdlg.cxx
@@ -41,16 +41,18 @@ SvxHlinkDlgWrapper::SvxHlinkDlgWrapper( vcl::Window* _pParent, sal_uInt16 nId,

{
    SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
    mpDlg = pFact->CreateSvxHpLinkDlg(_pParent, pBindings);
    SetWindow( mpDlg->GetWindow() );
    mpDlg = pFact->CreateSvxHpLinkDlg(this, pBindings, _pParent->GetFrameWeld());
    SetController( mpDlg->GetController() );
    SetVisible_Impl(false);

    vcl::Window* pTopWindow = nullptr;
    if ( pInfo->aSize.Width() != 0 && pInfo->aSize.Height() != 0 &&
            (nullptr != (pTopWindow = SfxGetpApp()->GetTopWindow())))
    {
        weld::Dialog* pDialog = GetController()->getDialog();

        Size aParentSize( pTopWindow->GetSizePixel() );
        Size aDlgSize ( GetSizePixel () );
        Size aDlgSize(pDialog->get_size());

        if( aParentSize.Width() < pInfo->aPos.X() )
            pInfo->aPos.setX( aParentSize.Width()-aDlgSize.Width() < long(0.1*aParentSize.Width()) ?
@@ -59,7 +61,7 @@ SvxHlinkDlgWrapper::SvxHlinkDlgWrapper( vcl::Window* _pParent, sal_uInt16 nId,
            pInfo->aPos.setY( aParentSize.Height()-aDlgSize.Height() < long(0.1*aParentSize.Height()) ?
                              long(0.1*aParentSize.Height()) : aParentSize.Height()-aDlgSize.Height() );

        GetWindow()->SetPosPixel( pInfo->aPos );
        pDialog->window_move(pInfo->aPos.X(), pInfo->aPos.Y());
    }

    SetHideNotDelete( true );
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index fc62bb6..c1ec3fc2 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -46,6 +46,7 @@
#include <vcl/fixedhyper.hxx>
#include <vcl/fmtfield.hxx>
#include <vcl/headbar.hxx>
#include <vcl/ivctrl.hxx>
#include <vcl/layout.hxx>
#include <vcl/menubtn.hxx>
#include <vcl/prgsbar.hxx>
@@ -1094,6 +1095,11 @@ public:
        return m_xWindow->GetPosPixel();
    }

    virtual tools::Rectangle get_monitor_workarea() const override
    {
        return m_xWindow->GetDesktopRectPixel();
    }

    virtual void set_centered_on_parent(bool /*bTrackGeometryRequests*/) override
    {
        if (vcl::Window* pParent = m_xWidget->GetParent())
@@ -1813,6 +1819,97 @@ IMPL_LINK_NOARG(SalInstanceNotebook, ActivatePageHdl, TabControl*, void)
    m_aEnterPageHdl.Call(get_current_page_ident());
}

class SalInstanceVerticalNotebook : public SalInstanceContainer, public virtual weld::Notebook
{
private:
    VclPtr<VerticalTabControl> m_xNotebook;
    mutable std::vector<std::unique_ptr<SalInstanceContainer>> m_aPages;

    DECL_LINK(DeactivatePageHdl, VerticalTabControl*, bool);
    DECL_LINK(ActivatePageHdl, VerticalTabControl*, void);

public:
    SalInstanceVerticalNotebook(VerticalTabControl* pNotebook, SalInstanceBuilder* pBuilder, bool bTakeOwnership)
        : SalInstanceContainer(pNotebook, pBuilder, bTakeOwnership)
        , m_xNotebook(pNotebook)
    {
        m_xNotebook->SetActivatePageHdl(LINK(this, SalInstanceVerticalNotebook, ActivatePageHdl));
        m_xNotebook->SetDeactivatePageHdl(LINK(this, SalInstanceVerticalNotebook, DeactivatePageHdl));
    }

    virtual int get_current_page() const override
    {
        return m_xNotebook->GetPagePos(m_xNotebook->GetCurPageId());
    }

    virtual OString get_current_page_ident() const override
    {
        return m_xNotebook->GetCurPageId();
    }

    virtual weld::Container* get_page(const OString& rIdent) const override
    {
        sal_uInt16 nPageIndex = m_xNotebook->GetPagePos(rIdent);
        if (nPageIndex == TAB_PAGE_NOTFOUND)
            return nullptr;
        auto pChild = m_xNotebook->GetPage(rIdent);
        if (m_aPages.size() < nPageIndex + 1U)
            m_aPages.resize(nPageIndex + 1U);
        if (!m_aPages[nPageIndex])
            m_aPages[nPageIndex].reset(new SalInstanceContainer(pChild, m_pBuilder, false));
        return m_aPages[nPageIndex].get();
    }

    virtual void set_current_page(int nPage) override
    {
        m_xNotebook->SetCurPageId(m_xNotebook->GetPageId(nPage));
    }

    virtual void set_current_page(const OString& rIdent) override
    {
        m_xNotebook->SetCurPageId(rIdent);
    }

    virtual void remove_page(const OString& rIdent) override
    {
        m_xNotebook->RemovePage(rIdent);
    }

    virtual void append_page(const OString& rIdent, const OUString& rLabel) override
    {
        VclPtrInstance<VclGrid> xGrid(m_xNotebook->GetPageParent());
        xGrid->set_hexpand(true);
        xGrid->set_vexpand(true);
        m_xNotebook->InsertPage(rIdent, rLabel, Image(), "", xGrid);
    }

    virtual int get_n_pages() const override
    {
        return m_xNotebook->GetPageCount();
    }

    virtual OUString get_tab_label_text(const OString& rIdent) const override
    {
        return m_xNotebook->GetPageText(rIdent);
    }

    virtual ~SalInstanceVerticalNotebook() override
    {
        m_xNotebook->SetActivatePageHdl(Link<VerticalTabControl*,void>());
        m_xNotebook->SetDeactivatePageHdl(Link<VerticalTabControl*,bool>());
    }
};

IMPL_LINK_NOARG(SalInstanceVerticalNotebook, DeactivatePageHdl, VerticalTabControl*, bool)
{
    return !m_aLeavePageHdl.IsSet() || m_aLeavePageHdl.Call(get_current_page_ident());
}

IMPL_LINK_NOARG(SalInstanceVerticalNotebook, ActivatePageHdl, VerticalTabControl*, void)
{
    m_aEnterPageHdl.Call(get_current_page_ident());
}

class SalInstanceButton : public SalInstanceContainer, public virtual weld::Button
{
private:
@@ -5228,8 +5325,12 @@ public:

    virtual std::unique_ptr<weld::Notebook> weld_notebook(const OString &id, bool bTakeOwnership) override
    {
        TabControl* pNotebook = m_xBuilder->get<TabControl>(id);
        return pNotebook ? std::make_unique<SalInstanceNotebook>(pNotebook, this, bTakeOwnership) : nullptr;
        vcl::Window* pNotebook = m_xBuilder->get<vcl::Window>(id);
        if (pNotebook->GetType() == WindowType::TABCONTROL)
            return std::make_unique<SalInstanceNotebook>(static_cast<TabControl*>(pNotebook), this, bTakeOwnership);
        if (pNotebook->GetType() == WindowType::VERTICALTABCONTROL)
            return std::make_unique<SalInstanceVerticalNotebook>(static_cast<VerticalTabControl*>(pNotebook), this, bTakeOwnership);
        return nullptr;
    }

    virtual std::unique_ptr<weld::Button> weld_button(const OString &id, bool bTakeOwnership) override
diff --git a/vcl/source/control/imivctl.hxx b/vcl/source/control/imivctl.hxx
index 0875991..0295ff9 100644
--- a/vcl/source/control/imivctl.hxx
+++ b/vcl/source/control/imivctl.hxx
@@ -263,6 +263,7 @@ public:
    void                SetStyle( WinBits nWinStyle );
    WinBits             GetStyle() const { return nWinBits; }
    void                InsertEntry( std::unique_ptr<SvxIconChoiceCtrlEntry>, size_t nPos );
    void                RemoveEntry( size_t nPos );
    void                CreateAutoMnemonics( MnemonicGenerator* _pGenerator );
    void                FontModified();
    void                SelectAll();
diff --git a/vcl/source/control/imivctl1.cxx b/vcl/source/control/imivctl1.cxx
index 5a3f88f..333402bde 100644
--- a/vcl/source/control/imivctl1.cxx
+++ b/vcl/source/control/imivctl1.cxx
@@ -246,6 +246,13 @@ void SvxIconChoiceCtrl_Impl::InsertEntry( std::unique_ptr<SvxIconChoiceCtrlEntry
        InvalidateBoundingRect( pEntry->aRect );
}

void SvxIconChoiceCtrl_Impl::RemoveEntry(size_t nPos)
{
    pImpCursor->Clear();
    maEntries.erase(maEntries.begin() + nPos);
    RecalcAllBoundingRectsSmart();
}

void SvxIconChoiceCtrl_Impl::CreateAutoMnemonics( MnemonicGenerator* _pGenerator )
{
    std::unique_ptr< MnemonicGenerator > pAutoDeleteOwnGenerator;
diff --git a/vcl/source/control/ivctrl.cxx b/vcl/source/control/ivctrl.cxx
index 802cde2..482993e 100644
--- a/vcl/source/control/ivctrl.cxx
+++ b/vcl/source/control/ivctrl.cxx
@@ -22,10 +22,11 @@
#include "imivctl.hxx"
#include <vcl/accessiblefactory.hxx>
#include <vcl/bitmapex.hxx>
#include <vcl/commandevent.hxx>
#include <vcl/controllayout.hxx>
#include <vcl/mnemonic.hxx>
#include <vcl/settings.hxx>
#include <vcl/commandevent.hxx>
#include <vcl/tabctrl.hxx>
#include <vcl/vclevent.hxx>

using namespace ::com::sun::star::accessibility;
@@ -104,6 +105,11 @@ SvxIconChoiceCtrlEntry* SvtIconChoiceCtrl::InsertEntry( const OUString& rText, c
    return pEntry;
}

void SvtIconChoiceCtrl::RemoveEntry(sal_Int32 nIndex)
{
    _pImpl->RemoveEntry(nIndex);
}

void SvtIconChoiceCtrl::DrawEntryImage( SvxIconChoiceCtrlEntry const * pEntry, const Point& rPos, OutputDevice& rDev )
{
    rDev.DrawImage( rPos, pEntry->GetImage() );
@@ -432,4 +438,183 @@ css::uno::Reference< XAccessible > SvtIconChoiceCtrl::CreateAccessible()
    return xAccessible;
}

struct VerticalTabPageData
{
    OString sId;
    SvxIconChoiceCtrlEntry* pEntry;
    VclPtr<vcl::Window> xPage;      ///< the TabPage itself
};

VerticalTabControl::VerticalTabControl(vcl::Window* pParent)
    : VclHBox(pParent)
    , m_xChooser(VclPtr<SvtIconChoiceCtrl>::Create(this, WB_3DLOOK | WB_ICON | WB_BORDER |
                                                         WB_NOCOLUMNHEADER | WB_HIGHLIGHTFRAME |
                                                         WB_NODRAGSELECTION | WB_TABSTOP | WB_CLIPCHILDREN |
                                                         WB_ALIGN_LEFT | WB_NOHSCROLL))
    , m_xBox(VclPtr<VclVBox>::Create(this))
{
    SetType(WindowType::VERTICALTABCONTROL);
    m_xChooser->SetClickHdl(LINK(this, VerticalTabControl, ChosePageHdl_Impl));
    m_xChooser->set_width_request(110);
    m_xChooser->set_height_request(400);
    m_xChooser->SetSizePixel(Size(110, 400));
    m_xBox->set_vexpand(true);
    m_xBox->set_hexpand(true);
    m_xBox->set_expand(true);
    m_xBox->Show();
    m_xChooser->Show();
}

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

void VerticalTabControl::dispose()
{
    m_xChooser.disposeAndClear();
    m_xBox.disposeAndClear();
    VclHBox::dispose();
}

IMPL_LINK_NOARG(VerticalTabControl, ChosePageHdl_Impl, SvtIconChoiceCtrl*, void)
{
    SvxIconChoiceCtrlEntry *pEntry = m_xChooser->GetSelectedEntry();
    if (!pEntry)
        pEntry = m_xChooser->GetCursor();

    VerticalTabPageData* pData = GetPageData(pEntry);

    if (pData->sId != m_sCurrentPageId)
        SetCurPageId(pData->sId);
}

void VerticalTabControl::ActivatePage()
{
    m_aActivateHdl.Call( this );
}

bool VerticalTabControl::DeactivatePage()
{
    return !m_aDeactivateHdl.IsSet() || m_aDeactivateHdl.Call(this);
}

VerticalTabPageData* VerticalTabControl::GetPageData(const SvxIconChoiceCtrlEntry* pEntry) const
{
    VerticalTabPageData* pRet = nullptr;
    for (auto & pData : maPageList)
    {
        if (pData->pEntry == pEntry)
        {
            pRet = pData.get();
            break;
        }
    }
    return pRet;
}

VerticalTabPageData* VerticalTabControl::GetPageData(const OString& rId) const
{
    VerticalTabPageData* pRet = nullptr;
    for (auto & pData : maPageList)
    {
        if (pData->sId == rId)
        {
            pRet = pData.get();
            break;
        }
    }
    return pRet;
}

void VerticalTabControl::SetCurPageId(const OString& rId)
{
    OString sOldPageId = GetCurPageId();
    if (sOldPageId == rId)
        return;

    VerticalTabPageData* pOldData = GetPageData(sOldPageId);
    if (pOldData && pOldData->xPage)
    {
        if (!DeactivatePage())
            return;
        pOldData->xPage->Hide();
    }

    m_sCurrentPageId = "";

    VerticalTabPageData* pNewData = GetPageData(rId);
    if (pNewData && pNewData->xPage)
    {
        m_sCurrentPageId = rId;
        m_xChooser->SetCursor(pNewData->pEntry);

        ActivatePage();
        pNewData->xPage->Show();
    }
}

OString VerticalTabControl::GetPageId(sal_uInt16 nIndex) const
{
    return maPageList[nIndex]->sId;
}

void VerticalTabControl::InsertPage(const rtl::OString &rIdent, const rtl::OUString& rLabel, const Image& rImage,
                                    const rtl::OUString& rTooltip, VclPtr<vcl::Window> xPage)
{
    SvxIconChoiceCtrlEntry* pEntry = m_xChooser->InsertEntry(rLabel, rImage);
    pEntry->SetQuickHelpText(rTooltip);
    m_xChooser->ArrangeIcons();
    maPageList.emplace_back(new VerticalTabPageData);
    VerticalTabPageData* pNew = maPageList.back().get();
    pNew->sId = rIdent;
    pNew->pEntry = pEntry;
    pNew->xPage = xPage;
    Size aOrigPrefSize(m_xBox->get_preferred_size());
    Size aPagePrefSize(xPage->get_preferred_size());
    m_xBox->set_width_request(std::max(aOrigPrefSize.Width(), aPagePrefSize.Width()));
    m_xBox->set_height_request(std::max(aOrigPrefSize.Height(), aPagePrefSize.Height()));
    pNew->xPage->Hide();
}

void VerticalTabControl::RemovePage(const rtl::OString &rPageId)
{
    for (auto it = maPageList.begin(), end = maPageList.end(); it != end; ++it)
    {
        VerticalTabPageData* pData = it->get();
        if (pData->sId == rPageId)
        {
            sal_Int32 nEntryListPos = m_xChooser->GetEntryListPos(pData->pEntry);
            m_xChooser->RemoveEntry(nEntryListPos);
            m_xChooser->ArrangeIcons();
            maPageList.erase(it);
            break;
        }
    }
}

sal_uInt16 VerticalTabControl::GetPagePos(const OString& rPageId) const
{
    VerticalTabPageData* pData = GetPageData(rPageId);
    if (!pData)
        return TAB_PAGE_NOTFOUND;
    return m_xChooser->GetEntryListPos(pData->pEntry);
}

VclPtr<vcl::Window> VerticalTabControl::GetPage(const OString& rPageId)
{
    VerticalTabPageData* pData = GetPageData(rPageId);
    if (!pData)
        return nullptr;
    return pData->xPage;
}

OUString VerticalTabControl::GetPageText(const OString& rPageId) const
{
    VerticalTabPageData* pData = GetPageData(rPageId);
    if (!pData)
        return OUString();
    return pData->pEntry->GetText();
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx
index 8e64c3a..344a224 100644
--- a/vcl/source/window/builder.cxx
+++ b/vcl/source/window/builder.cxx
@@ -33,6 +33,7 @@
#include <vcl/fixedhyper.hxx>
#include <vcl/headbar.hxx>
#include <vcl/IPrioritable.hxx>
#include <vcl/ivctrl.hxx>
#include <vcl/layout.hxx>
#include <vcl/lstbox.hxx>
#include <vcl/menubtn.hxx>
@@ -928,6 +929,19 @@ namespace
        return bVertical;
    }

    bool extractVerticalTabPos(VclBuilder::stringmap &rMap)
    {
        bool bVertical = false;
        VclBuilder::stringmap::iterator aFind = rMap.find("tab-pos");
        if (aFind != rMap.end())
        {
            bVertical = aFind->second.equalsIgnoreAsciiCase("left") ||
                        aFind->second.equalsIgnoreAsciiCase("right");
            rMap.erase(aFind);
        }
        return bVertical;
    }

    bool extractInconsistent(VclBuilder::stringmap &rMap)
    {
        bool bInconsistent = false;
@@ -1611,35 +1625,46 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString &
    bool bIsPlaceHolder = name.isEmpty();
    bool bVertical = false;

    if (pParent && pParent->GetType() == WindowType::TABCONTROL)
    if (pParent && (pParent->GetType() == WindowType::TABCONTROL ||
                    pParent->GetType() == WindowType::VERTICALTABCONTROL))
    {
        bool bTopLevel(name == "GtkDialog" || name == "GtkMessageDialog" ||
                       name == "GtkWindow" || name == "GtkPopover");
        if (!bTopLevel)
        {
            //We have to add a page
            //make default pageid == position
            TabControl *pTabControl = static_cast<TabControl*>(pParent);
            sal_uInt16 nNewPageCount = pTabControl->GetPageCount()+1;
            sal_uInt16 nNewPageId = nNewPageCount;
            pTabControl->InsertPage(nNewPageId, OUString());
            pTabControl->SetCurPageId(nNewPageId);
            SAL_WARN_IF(bIsPlaceHolder, "vcl.layout", "we should have no placeholders for tabpages");
            if (!bIsPlaceHolder)
            if (pParent->GetType() == WindowType::TABCONTROL)
            {
                VclPtrInstance<TabPage> pPage(pTabControl);
                pPage->Show();
                //We have to add a page
                //make default pageid == position
                TabControl *pTabControl = static_cast<TabControl*>(pParent);
                sal_uInt16 nNewPageCount = pTabControl->GetPageCount()+1;
                sal_uInt16 nNewPageId = nNewPageCount;
                pTabControl->InsertPage(nNewPageId, OUString());
                pTabControl->SetCurPageId(nNewPageId);
                SAL_WARN_IF(bIsPlaceHolder, "vcl.layout", "we should have no placeholders for tabpages");
                if (!bIsPlaceHolder)
                {
                    VclPtrInstance<TabPage> pPage(pTabControl);
                    pPage->Show();

                //Make up a name for it
                OString sTabPageId = get_by_window(pParent) +
                    OString("-page") +
                    OString::number(nNewPageCount);
                m_aChildren.emplace_back(sTabPageId, pPage, false);
                pPage->SetHelpId(m_sHelpRoot + sTabPageId);
                    //Make up a name for it
                    OString sTabPageId = get_by_window(pParent) +
                        OString("-page") +
                        OString::number(nNewPageCount);
                    m_aChildren.emplace_back(sTabPageId, pPage, false);
                    pPage->SetHelpId(m_sHelpRoot + sTabPageId);

                pParent = pPage;
                    pParent = pPage;

                pTabControl->SetTabPage(nNewPageId, pPage);
                    pTabControl->SetTabPage(nNewPageId, pPage);
                }
            }
            else
            {
                VerticalTabControl *pTabControl = static_cast<VerticalTabControl*>(pParent);
                SAL_WARN_IF(bIsPlaceHolder, "vcl.layout", "we should have no placeholders for tabpages");
                if (!bIsPlaceHolder)
                    pParent = pTabControl->GetPageParent();
            }
        }
    }
@@ -2091,7 +2116,10 @@ VclPtr<vcl::Window> VclBuilder::makeObject(vcl::Window *pParent, const OString &
    }
    else if (name == "GtkNotebook")
    {
        xWindow = VclPtr<TabControl>::Create(pParent, WB_STDTABCONTROL|WB_3DLOOK);
        if (!extractVerticalTabPos(rMap))
            xWindow = VclPtr<TabControl>::Create(pParent, WB_STDTABCONTROL|WB_3DLOOK);
        else
            xWindow = VclPtr<VerticalTabControl>::Create(pParent);
    }
    else if (name == "GtkDrawingArea")
    {
@@ -2627,7 +2655,7 @@ VclPtr<vcl::Window> VclBuilder::insertObject(vcl::Window *pParent, const OString

void VclBuilder::handleTabChild(vcl::Window *pParent, xmlreader::XmlReader &reader)
{
    OString sID;
    std::vector<OString> sIDs;

    int nLevel = 1;
    stringmap aProperties;
@@ -2651,7 +2679,7 @@ void VclBuilder::handleTabChild(vcl::Window *pParent, xmlreader::XmlReader &read
                    if (name.equals("id"))
                    {
                        name = reader.getAttributeValue(false);
                        sID = OString(name.begin, name.length);
                        OString sID = OString(name.begin, name.length);
                        sal_Int32 nDelim = sID.indexOf(':');
                        if (nDelim != -1)
                        {
@@ -2659,6 +2687,7 @@ void VclBuilder::handleTabChild(vcl::Window *pParent, xmlreader::XmlReader &read
                            aProperties[OString("customproperty")] = OUString::fromUtf8(sPattern);
                            sID = sID.copy(0, nDelim);
                        }
                        sIDs.push_back(sID);
                    }
                }
            }
@@ -2685,21 +2714,39 @@ void VclBuilder::handleTabChild(vcl::Window *pParent, xmlreader::XmlReader &read
    if (!pParent)
        return;

    TabControl *pTabControl = static_cast<TabControl*>(pParent);
    TabControl *pTabControl = pParent->GetType() == WindowType::TABCONTROL ?
        static_cast<TabControl*>(pParent) : nullptr;
    VerticalTabControl *pVerticalTabControl = pParent->GetType() == WindowType::VERTICALTABCONTROL ?
        static_cast<VerticalTabControl*>(pParent) : nullptr;
    assert(pTabControl || pVerticalTabControl);
    VclBuilder::stringmap::iterator aFind = aProperties.find(OString("label"));
    if (aFind != aProperties.end())
    {
        sal_uInt16 nPageId = pTabControl->GetCurPageId();
        pTabControl->SetPageText(nPageId, aFind->second);
        pTabControl->SetPageName(nPageId, sID);
        if (!context.empty())
        if (pTabControl)
        {
            TabPage* pPage = pTabControl->GetTabPage(nPageId);
            pPage->SetContext(context);
            sal_uInt16 nPageId = pTabControl->GetCurPageId();
            pTabControl->SetPageText(nPageId, aFind->second);
            pTabControl->SetPageName(nPageId, sIDs.back());
            if (!context.empty())
            {
                TabPage* pPage = pTabControl->GetTabPage(nPageId);
                pPage->SetContext(context);
            }
        }
        else
        {
            OUString sLabel(aFind->second);
            OUString sIconName(extractIconName(aProperties));
            OUString sTooltip(extractTooltipText(aProperties));
            pVerticalTabControl->InsertPage(sIDs.front(), sLabel, FixedImage::loadThemeImage(sIconName), sTooltip,
                                            pVerticalTabControl->GetPageParent()->GetWindow(GetWindowType::LastChild));
        }
    }
    else
        pTabControl->RemovePage(pTabControl->GetCurPageId());
    {
        if (pTabControl)
            pTabControl->RemovePage(pTabControl->GetCurPageId());
    }
}

//so that tabbing between controls goes in a visually sensible sequence
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 712dd51..50ebb17 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -2731,6 +2731,15 @@ public:
        return Point(current_x, current_y);
    }

    virtual tools::Rectangle get_monitor_workarea() const override
    {
        GdkScreen* pScreen = gtk_widget_get_screen(GTK_WIDGET(m_pWindow));
        gint nMonitor = gdk_screen_get_monitor_at_window(pScreen, gtk_widget_get_window(GTK_WIDGET(m_pWindow)));
        GdkRectangle aRect;
        gdk_screen_get_monitor_workarea(pScreen, nMonitor, &aRect);
        return tools::Rectangle(aRect.x, aRect.y, aRect.x + aRect.width, aRect.y + aRect.height);
    }

    virtual void set_centered_on_parent(bool bTrackGeometryRequests) override
    {
        if (bTrackGeometryRequests)