weld OTableBorderWindow

Change-Id: I8008d9ea1e1c5418c960ec9c80b55602a11f15f6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101552
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/dbaccess/UIConfig_dbaccess.mk b/dbaccess/UIConfig_dbaccess.mk
index 3dc9eeb..1e655af 100644
--- a/dbaccess/UIConfig_dbaccess.mk
+++ b/dbaccess/UIConfig_dbaccess.mk
@@ -74,6 +74,7 @@ $(eval $(call gb_UIConfig_add_uifiles,dbaccess, \
    dbaccess/uiconfig/ui/specialsettingspage \
    dbaccess/uiconfig/ui/sortdialog \
    dbaccess/uiconfig/ui/sqlexception \
    dbaccess/uiconfig/ui/tableborderwindow \
    dbaccess/uiconfig/ui/tabledesignrowmenu \
    dbaccess/uiconfig/ui/tabledesignsavemodifieddialog \
    dbaccess/uiconfig/ui/tablelistbox \
diff --git a/dbaccess/source/ui/app/AppDetailPageHelper.hxx b/dbaccess/source/ui/app/AppDetailPageHelper.hxx
index f5cd662..ecc5048 100644
--- a/dbaccess/source/ui/app/AppDetailPageHelper.hxx
+++ b/dbaccess/source/ui/app/AppDetailPageHelper.hxx
@@ -26,13 +26,13 @@
#include <com/sun/star/sdbc/XConnection.hpp>
#include <com/sun/star/ucb/XContent.hpp>
#include <com/sun/star/container/XNameAccess.hpp>
#include <AppElementType.hxx>
#include <sfx2/weldutils.hxx>
#include <vcl/graph.hxx>
#include <vcl/GraphicObject.hxx>
#include <vcl/customweld.hxx>
#include <vcl/weld.hxx>
#include "ChildWindow.hxx"
#include <AppElementType.hxx>
#include <ChildWindow.hxx>
#include "DocumentInfoPreview.hxx"

namespace com::sun::star::awt   { class XWindow; }
diff --git a/dbaccess/source/ui/app/AppSwapWindow.hxx b/dbaccess/source/ui/app/AppSwapWindow.hxx
index fadfb6f..9fcd3ba 100644
--- a/dbaccess/source/ui/app/AppSwapWindow.hxx
+++ b/dbaccess/source/ui/app/AppSwapWindow.hxx
@@ -22,7 +22,7 @@
#include <IClipBoardTest.hxx>
#include "AppIconControl.hxx"
#include <AppElementType.hxx>
#include "ChildWindow.hxx"
#include <ChildWindow.hxx>

class MnemonicGenerator;

diff --git a/dbaccess/source/ui/app/AppTitleWindow.hxx b/dbaccess/source/ui/app/AppTitleWindow.hxx
index 2c536bf..e83a2ec 100644
--- a/dbaccess/source/ui/app/AppTitleWindow.hxx
+++ b/dbaccess/source/ui/app/AppTitleWindow.hxx
@@ -19,7 +19,7 @@
#ifndef INCLUDED_DBACCESS_SOURCE_UI_APP_APPTITLEWINDOW_HXX
#define INCLUDED_DBACCESS_SOURCE_UI_APP_APPTITLEWINDOW_HXX

#include "ChildWindow.hxx"
#include <ChildWindow.hxx>

namespace dbaui
{
diff --git a/dbaccess/source/ui/app/ChildWindow.cxx b/dbaccess/source/ui/app/ChildWindow.cxx
index 879b5f8..a8091c8 100644
--- a/dbaccess/source/ui/app/ChildWindow.cxx
+++ b/dbaccess/source/ui/app/ChildWindow.cxx
@@ -8,7 +8,7 @@
 */

#include <vcl/svapp.hxx>
#include "ChildWindow.hxx"
#include <ChildWindow.hxx>

namespace dbaui
{
diff --git a/dbaccess/source/ui/control/ColumnControlWindow.cxx b/dbaccess/source/ui/control/ColumnControlWindow.cxx
index 8f9186b..9b2fa25 100644
--- a/dbaccess/source/ui/control/ColumnControlWindow.cxx
+++ b/dbaccess/source/ui/control/ColumnControlWindow.cxx
@@ -49,12 +49,7 @@ void OColumnControlTopLevel::dispose()

void OColumnControlTopLevel::GetFocus()
{
    m_xControl->GetFocus();
}

void OColumnControlTopLevel::LoseFocus()
{
    m_xControl->LoseFocus();
    m_xControl->GrabFocus();
}

// OColumnControlWindow
diff --git a/dbaccess/source/ui/control/FieldDescControl.cxx b/dbaccess/source/ui/control/FieldDescControl.cxx
index bb10fb7..28f3c96 100644
--- a/dbaccess/source/ui/control/FieldDescControl.cxx
+++ b/dbaccess/source/ui/control/FieldDescControl.cxx
@@ -78,6 +78,7 @@ OFieldDescControl::OFieldDescControl(weld::Container* pPage, OTableDesignHelpBar
    , m_nEditWidth(50)
    , pActFieldDescr(nullptr)
{
    m_pHelp->connect_focus_out(LINK(this, OFieldDescControl, HelpFocusOut));
}

OFieldDescControl::~OFieldDescControl()
@@ -170,7 +171,7 @@ void OFieldDescControl::SetReadOnly( bool bReadOnly )
                                        , m_xScale.get(), m_xColumnName.get()
                                        , m_xType.get(), m_xAutoIncrementValue.get()
    };
    weld::Widget* ppAggregatesText[] = {   m_xRequiredText.get(), m_xNumTypeText.get()
    weld::Widget* ppAggregatesText[] = {  m_xRequiredText.get(), m_xNumTypeText.get()
                                        , m_xAutoIncrementText.get(), m_xDefaultText.get()
                                        , m_xTextLenText.get(), m_xLengthText.get()
                                        , m_xScaleText.get(), m_xColumnNameText.get()
@@ -1145,8 +1146,10 @@ void OFieldDescControl::UpdateFormatSample(OFieldDescription const * pFieldDescr
        m_xFormatSample->set_text(getControlDefault(pFieldDescr,false));
}

void OFieldDescControl::GetFocus()
void OFieldDescControl::GrabFocus()
{
    m_xContainer->grab_focus();

    // Set the Focus to the Control that has been active last
    if (m_pLastFocusWindow)
    {
@@ -1166,9 +1169,9 @@ void OFieldDescControl::implFocusLost(weld::Widget* _pWhich)
        m_pHelp->SetHelpText( OUString() );
}

void OFieldDescControl::LoseFocus()
IMPL_LINK_NOARG(OFieldDescControl, HelpFocusOut, weld::Widget&, void)
{
    implFocusLost(nullptr);
    m_pHelp->SetHelpText(OUString());
}

bool OFieldDescControl::IsFocusInEditableWidget() const
@@ -1190,6 +1193,11 @@ bool OFieldDescControl::IsFocusInEditableWidget() const
    return false;
}

bool OFieldDescControl::HasChildPathFocus() const
{
    return m_pActFocusWindow && m_pActFocusWindow->has_focus();
}

bool OFieldDescControl::isCopyAllowed()
{
    int nStartPos, nEndPos;
diff --git a/dbaccess/source/ui/app/ChildWindow.hxx b/dbaccess/source/ui/inc/ChildWindow.hxx
similarity index 87%
rename from dbaccess/source/ui/app/ChildWindow.hxx
rename to dbaccess/source/ui/inc/ChildWindow.hxx
index 5b99061..8da6c85 100644
--- a/dbaccess/source/ui/app/ChildWindow.hxx
+++ b/dbaccess/source/ui/inc/ChildWindow.hxx
@@ -28,6 +28,10 @@ public:
    virtual bool HasChildPathFocus() const = 0;

    void Enable(bool bEnable) { m_xContainer->set_sensitive(bEnable); }

    void SetHelpId(const OString& rHelpId) { m_xContainer->set_help_id(rHelpId); }

    void Show() { m_xContainer->show(); }
};
}

diff --git a/dbaccess/source/ui/inc/ColumnControlWindow.hxx b/dbaccess/source/ui/inc/ColumnControlWindow.hxx
index 1a5abac..587c4756 100644
--- a/dbaccess/source/ui/inc/ColumnControlWindow.hxx
+++ b/dbaccess/source/ui/inc/ColumnControlWindow.hxx
@@ -76,7 +76,6 @@ namespace dbaui
        OColumnControlWindow& GetControl() { return *m_xControl; }

        virtual void GetFocus() override;
        virtual void LoseFocus() override;
    };

}   // namespace dbaui
diff --git a/dbaccess/source/ui/inc/FieldDescControl.hxx b/dbaccess/source/ui/inc/FieldDescControl.hxx
index 3948c11..8114e41 100644
--- a/dbaccess/source/ui/inc/FieldDescControl.hxx
+++ b/dbaccess/source/ui/inc/FieldDescControl.hxx
@@ -119,6 +119,8 @@ namespace dbaui
        DECL_LINK( OnControlFocusLost, weld::Widget&, void );
        DECL_LINK( OnControlFocusGot, weld::Widget&, void );

        DECL_LINK( HelpFocusOut, weld::Widget&, void );

        void                UpdateFormatSample(OFieldDescription const * pFieldDescr);

        bool                isTextFormat(const OFieldDescription* _pFieldDescr,sal_uInt32& _nFormatKey) const;
@@ -187,8 +189,9 @@ namespace dbaui

        void Init();

        void GetFocus();
        void LoseFocus();
        void GrabFocus();

        bool HasChildPathFocus() const;

        virtual css::uno::Reference< css::sdbc::XDatabaseMetaData> getMetaData() = 0;
        virtual css::uno::Reference< css::sdbc::XConnection> getConnection() = 0;
diff --git a/dbaccess/source/ui/inc/TableDesignHelpBar.hxx b/dbaccess/source/ui/inc/TableDesignHelpBar.hxx
index b34f039..c69b3ed 100644
--- a/dbaccess/source/ui/inc/TableDesignHelpBar.hxx
+++ b/dbaccess/source/ui/inc/TableDesignHelpBar.hxx
@@ -41,6 +41,11 @@ namespace dbaui
            m_xTextWin->connect_focus_in(rLink);
        }

        void connect_focus_out(const Link<weld::Widget&, void>& rLink)
        {
            m_xTextWin->connect_focus_out(rLink);
        }

        // IClipboardTest
        virtual bool isCutAllowed() override;
        virtual bool isCopyAllowed() override;
diff --git a/dbaccess/source/ui/inc/TableDesignView.hxx b/dbaccess/source/ui/inc/TableDesignView.hxx
index e6e7abe..aa1c88e 100644
--- a/dbaccess/source/ui/inc/TableDesignView.hxx
+++ b/dbaccess/source/ui/inc/TableDesignView.hxx
@@ -21,14 +21,10 @@

#include <dbaccess/dataview.hxx>
#include <com/sun/star/lang/Locale.hpp>
#include <vcl/split.hxx>
#include <vcl/InterimItemWindow.hxx>
#include <vcl/weld.hxx>
#include "IClipBoardTest.hxx"

namespace weld
{
    class Widget;
}

namespace dbaui
{
    class OTableController;
@@ -36,30 +32,30 @@ namespace dbaui
    class OTableFieldDescWin;
    class OTableEditorCtrl;

    class OTableBorderWindow : public vcl::Window
    class OTableBorderWindow final : public InterimItemWindow
    {
        VclPtr<Splitter>                    m_aHorzSplitter;
        VclPtr<OTableFieldDescWin>          m_pFieldDescWin;
        VclPtr<OTableEditorCtrl>            m_pEditorCtrl;
        std::unique_ptr<weld::Paned> m_xHorzSplitter;
        std::unique_ptr<weld::Container> m_xEditorParent;
        css::uno::Reference<css::awt::XWindow> m_xEditorParentWin;
        VclPtr<OTableEditorCtrl> m_xEditorCtrl;
        std::unique_ptr<weld::Container> m_xFieldDescParent;
        std::unique_ptr<OTableFieldDescWin> m_xFieldDescWin;

        void ImplInitSettings();
        DECL_LINK( SplitHdl, Splitter*, void );
    protected:
        virtual void DataChanged(const DataChangedEvent& rDCEvt) override;
    public:
        OTableBorderWindow(OTableDesignView* pParent);
        virtual ~OTableBorderWindow() override;
        // Window overrides
        virtual void dispose() override;
        virtual void Resize() override;
        virtual void GetFocus() override;

        OTableEditorCtrl*       GetEditorCtrl() const { return m_pEditorCtrl; }
        OTableFieldDescWin*     GetDescWin()    const { return m_pFieldDescWin; }
        virtual void GetFocus() override;
        virtual void IdleResize() override;

        OTableEditorCtrl*       GetEditorCtrl() const { return m_xEditorCtrl.get(); }
        OTableFieldDescWin*     GetDescWin()    const { return m_xFieldDescWin.get(); }
    };

    class OTableDesignView : public ODataView
                            ,public IClipboardTest
                           , public IClipboardTest
    {
        enum ChildFocusState
        {
diff --git a/dbaccess/source/ui/tabledesign/TEditControl.cxx b/dbaccess/source/ui/tabledesign/TEditControl.cxx
index 6dbb932..4d42125 100644
--- a/dbaccess/source/ui/tabledesign/TEditControl.cxx
+++ b/dbaccess/source/ui/tabledesign/TEditControl.cxx
@@ -125,8 +125,9 @@ void OTableEditorCtrl::Init()
    RowInserted(0, m_pRowList->size());
}

OTableEditorCtrl::OTableEditorCtrl(vcl::Window* pWindow)
OTableEditorCtrl::OTableEditorCtrl(vcl::Window* pWindow, OTableDesignView* pView)
    :OTableRowView(pWindow)
    ,m_pView(pView)
    ,pNameCell(nullptr)
    ,pTypeCell(nullptr)
    ,pHelpTextCell(nullptr)
@@ -142,7 +143,6 @@ OTableEditorCtrl::OTableEditorCtrl(vcl::Window* pWindow)
    ,bReadOnly(true)
    ,m_aInvalidate(this)
{

    SetHelpId(HID_TABDESIGN_BACKGROUND);
    GetDataWindow().SetHelpId(HID_CTL_TABLEEDIT);

@@ -273,7 +273,8 @@ void OTableEditorCtrl::dispose()
    pTypeCell.disposeAndClear();
    pDescrCell.disposeAndClear();
    pHelpTextCell.disposeAndClear();
    pDescrWin.clear();
    pDescrWin = nullptr;
    m_pView.clear();
    OTableRowView::dispose();
}

@@ -1640,7 +1641,7 @@ void OTableEditorCtrl::SwitchType( const TOTypeInfoSP& _pType )

OTableDesignView* OTableEditorCtrl::GetView() const
{
    return static_cast<OTableDesignView*>(GetParent()->GetParent());
    return m_pView;
}

void OTableEditorCtrl::DeactivateCell(bool bUpdate)
diff --git a/dbaccess/source/ui/tabledesign/TEditControl.hxx b/dbaccess/source/ui/tabledesign/TEditControl.hxx
index b216cb5..d858555 100644
--- a/dbaccess/source/ui/tabledesign/TEditControl.hxx
+++ b/dbaccess/source/ui/tabledesign/TEditControl.hxx
@@ -44,11 +44,12 @@ namespace dbaui

        std::vector< std::shared_ptr<OTableRow> >*    m_pRowList;

        VclPtr<OTableDesignView>           m_pView;
        VclPtr<OSQLNameEditControl>        pNameCell;
        VclPtr<::svt::ListBoxControl>      pTypeCell;
        VclPtr<::svt::EditControl>         pHelpTextCell;
        VclPtr<::svt::EditControl>         pDescrCell;
        VclPtr<OTableFieldDescWin>         pDescrWin;          // properties of one column
        OTableFieldDescWin*                pDescrWin;          // properties of one column

         std::shared_ptr<OTableRow> pActRow;

@@ -116,7 +117,7 @@ namespace dbaui
        bool IsPrimaryKey();

    public:
        explicit OTableEditorCtrl(vcl::Window* pParentWin);
        explicit OTableEditorCtrl(vcl::Window* pParentWin, OTableDesignView* pView);
        virtual ~OTableEditorCtrl() override;
        virtual void dispose() override;
        virtual bool CursorMoving(long nNewRow, sal_uInt16 nNewCol) override;
diff --git a/dbaccess/source/ui/tabledesign/TableDesignView.cxx b/dbaccess/source/ui/tabledesign/TableDesignView.cxx
index 3f15dfb..ae32e97 100644
--- a/dbaccess/source/ui/tabledesign/TableDesignView.cxx
+++ b/dbaccess/source/ui/tabledesign/TableDesignView.cxx
@@ -25,6 +25,7 @@
#include "TableFieldDescWin.hxx"
#include <TableRow.hxx>
#include <i18nlangtag/languagetag.hxx>
#include <toolkit/helper/vclunohelper.hxx>
#include <unotools/syslocale.hxx>
#include <vcl/settings.hxx>
#include <memory>
@@ -36,23 +37,21 @@ using namespace ::com::sun::star::datatransfer::clipboard;
using namespace ::com::sun::star::lang;
using namespace ::com::sun::star::beans;

OTableBorderWindow::OTableBorderWindow(OTableDesignView* pParent) : Window(pParent,WB_BORDER)
    ,m_aHorzSplitter( VclPtr<Splitter>::Create(this) )
OTableBorderWindow::OTableBorderWindow(OTableDesignView* pParent)
    : InterimItemWindow(pParent, "dbaccess/ui/tableborderwindow.ui", "TableBorderWindow", false)
    , m_xHorzSplitter(m_xBuilder->weld_paned("splitter"))
    , m_xEditorParent(m_xBuilder->weld_container("editor"))
    , m_xEditorParentWin(m_xEditorParent->CreateChildFrame())
    , m_xEditorCtrl(VclPtr<OTableEditorCtrl>::Create(VCLUnoHelper::GetWindow(m_xEditorParentWin), pParent))
    , m_xFieldDescParent(m_xBuilder->weld_container("fielddesc"))
    , m_xFieldDescWin(new OTableFieldDescWin(m_xFieldDescParent.get(), pParent))
{
    SetStyle(GetStyle() | WB_DIALOGCONTROL);

    ImplInitSettings();
    // create children
    m_pEditorCtrl   = VclPtr<OTableEditorCtrl>::Create( this);
    m_pFieldDescWin = VclPtr<OTableFieldDescWin>::Create(this, pParent);

    m_pFieldDescWin->SetHelpId(HID_TAB_DESIGN_DESCWIN);
    m_xFieldDescWin->SetHelpId(HID_TAB_DESIGN_DESCWIN);

    // set depending windows and controls
    m_pEditorCtrl->SetDescrWin(m_pFieldDescWin);

    // set up splitter
    m_aHorzSplitter->SetSplitHdl( LINK(this, OTableBorderWindow, SplitHdl) );
    m_aHorzSplitter->Show();
    m_xEditorCtrl->SetDescrWin(m_xFieldDescWin.get());
}

OTableBorderWindow::~OTableBorderWindow()
@@ -63,93 +62,45 @@ OTableBorderWindow::~OTableBorderWindow()
void OTableBorderWindow::dispose()
{
    // destroy children
    //  ::dbaui::notifySystemWindow(this,m_pFieldDescWin,::comphelper::mem_fun(&TaskPaneList::RemoveWindow));
    m_pEditorCtrl->Hide();
    m_pFieldDescWin->Hide();
    m_pEditorCtrl.disposeAndClear();
    m_pFieldDescWin.disposeAndClear();
    m_aHorzSplitter.disposeAndClear();
    vcl::Window::dispose();
    m_xEditorCtrl.disposeAndClear();
    m_xEditorParentWin->dispose();
    m_xEditorParentWin.clear();
    m_xEditorParent.reset();
    m_xFieldDescWin.reset();
    m_xFieldDescParent.reset();
    m_xHorzSplitter.reset();
    InterimItemWindow::dispose();
}

void OTableBorderWindow::Resize()
void OTableBorderWindow::IdleResize()
{
    const long nSplitterHeight(3);

    // dimensions of parent window
    Size aOutputSize( GetOutputSize() );
    long nOutputWidth   = aOutputSize.Width();
    long nOutputHeight  = aOutputSize.Height();
    long nSplitPos      = m_aHorzSplitter->GetSplitPosPixel();
    auto nOutputHeight = GetSizePixel().Height();
    auto nOldSplitPos = m_xHorzSplitter->get_position();
    auto nSplitPos = nOldSplitPos;

    // shift range of the splitter is the middle third of the output
    long nDragPosY = nOutputHeight/3;
    long nDragSizeHeight = nOutputHeight/3;
    m_aHorzSplitter->SetDragRectPixel( tools::Rectangle(Point(0,nDragPosY), Size(nOutputWidth,nDragSizeHeight) ), this );
    if( (nSplitPos < nDragPosY) || (nSplitPos > (nDragPosY+nDragSizeHeight)) )
        nSplitPos = nDragPosY+nDragSizeHeight-5;
    auto nDragPosY = nOutputHeight/3;
    auto nDragSizeHeight = nOutputHeight/3;
    if (nSplitPos < nDragPosY || nSplitPos > nDragPosY + nDragSizeHeight)
        nSplitPos = nDragPosY + nDragSizeHeight;

    // set splitter
    m_aHorzSplitter->SetPosSizePixel( Point( 0, nSplitPos ), Size(nOutputWidth, nSplitterHeight));
    m_aHorzSplitter->SetSplitPosPixel( nSplitPos );
    m_xHorzSplitter->set_position(nSplitPos);

    // set window
    m_pEditorCtrl->SetPosSizePixel( Point(0, 0), Size(nOutputWidth , nSplitPos) );
    InterimItemWindow::IdleResize();

    m_pFieldDescWin->SetPosSizePixel(   Point(0, nSplitPos+nSplitterHeight),
                        Size(nOutputWidth, nOutputHeight-nSplitPos-nSplitterHeight) );
}

IMPL_LINK( OTableBorderWindow, SplitHdl, Splitter*, pSplit, void )
{
    if(pSplit == m_aHorzSplitter.get())
    {
        m_aHorzSplitter->SetPosPixel( Point( m_aHorzSplitter->GetPosPixel().X(),m_aHorzSplitter->GetSplitPosPixel() ) );
        Resize();
    }
}

void OTableBorderWindow::ImplInitSettings()
{
    const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();

    // FIXME RenderContext

    vcl::Font aFont = rStyleSettings.GetAppFont();
    if ( IsControlFont() )
        aFont.Merge( GetControlFont() );
    SetPointFont(*this,  aFont);

    Color aTextColor = rStyleSettings.GetButtonTextColor();
    if ( IsControlForeground() )
        aTextColor = GetControlForeground();
    SetTextColor( aTextColor );

    if( IsControlBackground() )
        SetBackground( GetControlBackground() );
    else
        SetBackground( rStyleSettings.GetFaceColor() );
}

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

    if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
         (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
    {
        ImplInitSettings();
        Invalidate();
    }
    if (nOldSplitPos != nSplitPos)
        m_xHorzSplitter->set_position(nSplitPos);
}

void OTableBorderWindow::GetFocus()
{
    Window::GetFocus();
    InterimItemWindow::GetFocus();

    // forward the focus to the current cell of the editor control
    if (m_pEditorCtrl)
        m_pEditorCtrl->GrabFocus();
    if (m_xEditorCtrl)
        m_xEditorCtrl->GrabFocus();
}

OTableDesignView::OTableDesignView( vcl::Window* pParent,
diff --git a/dbaccess/source/ui/tabledesign/TableFieldDescWin.cxx b/dbaccess/source/ui/tabledesign/TableFieldDescWin.cxx
index b85bc2e..af7dfd6 100644
--- a/dbaccess/source/ui/tabledesign/TableFieldDescWin.cxx
+++ b/dbaccess/source/ui/tabledesign/TableFieldDescWin.cxx
@@ -29,8 +29,8 @@

using namespace dbaui;

OTableFieldDescWin::OTableFieldDescWin(vcl::Window* pParent, OTableDesignView* pView)
    : InterimItemWindow(pParent, "dbaccess/ui/fielddescpanel.ui", "FieldDescPanel")
OTableFieldDescWin::OTableFieldDescWin(weld::Container* pParent, OTableDesignView* pView)
    : OChildWindow(pParent, "dbaccess/ui/fielddescpanel.ui", "FieldDescPanel")
    , m_xHelpBar(new OTableDesignHelpBar(m_xBuilder->weld_text_view("textview")))
    , m_xBox(m_xBuilder->weld_container("box"))
    , m_xFieldControl(new OTableFieldControl(m_xBox.get(), m_xHelpBar.get(), pView))
@@ -46,19 +46,13 @@ OTableFieldDescWin::OTableFieldDescWin(vcl::Window* pParent, OTableDesignView* p
    m_xFieldControl->connect_focus_in(LINK(this, OTableFieldDescWin, FieldFocusIn));
}

OTableFieldDescWin::~OTableFieldDescWin()
bool OTableFieldDescWin::HasChildPathFocus() const
{
    disposeOnce();
    return m_xFieldControl->HasChildPathFocus() || m_xHelpBar->HasFocus();
}

void OTableFieldDescWin::dispose()
OTableFieldDescWin::~OTableFieldDescWin()
{
    // destroy children
    m_xFieldControl.reset();
    m_xBox.reset();
    m_xHeader.reset();
    m_xHelpBar.reset();
    InterimItemWindow::dispose();
}

void OTableFieldDescWin::Init()
@@ -129,16 +123,9 @@ void OTableFieldDescWin::paste()
        getActiveChild()->paste();
}

void OTableFieldDescWin::GetFocus()
void OTableFieldDescWin::GrabFocus()
{
    if ( getGenPage() )
        getGenPage()->GetFocus();
}

void OTableFieldDescWin::LoseFocus()
{
    if ( getGenPage() )
        getGenPage()->LoseFocus();
    m_xFieldControl->GrabFocus();
}

IMPL_LINK(OTableFieldDescWin, HelpFocusIn, weld::Widget&, rWidget, void)
diff --git a/dbaccess/source/ui/tabledesign/TableFieldDescWin.hxx b/dbaccess/source/ui/tabledesign/TableFieldDescWin.hxx
index d25c5c6..7d7fbbe 100644
--- a/dbaccess/source/ui/tabledesign/TableFieldDescWin.hxx
+++ b/dbaccess/source/ui/tabledesign/TableFieldDescWin.hxx
@@ -21,6 +21,7 @@

#include <vcl/InterimItemWindow.hxx>
#include <IClipBoardTest.hxx>
#include <ChildWindow.hxx>
#include "TableFieldControl.hxx"

namespace dbaui
@@ -29,7 +30,7 @@ namespace dbaui
    class OTableDesignView;
    class OFieldDescription;

    class OTableFieldDescWin final : public InterimItemWindow
    class OTableFieldDescWin final : public OChildWindow
                                   , public IClipboardTest
    {
        enum ChildFocusState
@@ -53,9 +54,8 @@ namespace dbaui
        DECL_LINK(FieldFocusIn, weld::Widget&, void);

    public:
        explicit OTableFieldDescWin(vcl::Window* pParent, OTableDesignView* pView);
        explicit OTableFieldDescWin(weld::Container* pParent, OTableDesignView* pView);
        virtual ~OTableFieldDescWin() override;
        virtual void dispose() override;

        void Init();

@@ -69,8 +69,8 @@ namespace dbaui
        OUString  BoolStringPersistent(const OUString& rUIString) const { return m_xFieldControl->BoolStringPersistent(rUIString); }
        OUString  BoolStringUI(const OUString& rPersistentString) const { return m_xFieldControl->BoolStringUI(rPersistentString); }

        virtual void GetFocus() override;
        virtual void LoseFocus() override;
        virtual bool HasChildPathFocus() const override;
        virtual void GrabFocus() override;

        // IClipboardTest
        virtual bool isCutAllowed() override;
diff --git a/dbaccess/uiconfig/ui/appdetailwindow.ui b/dbaccess/uiconfig/ui/appdetailwindow.ui
index 3c6a3fe..b3fcc70 100644
--- a/dbaccess/uiconfig/ui/appdetailwindow.ui
+++ b/dbaccess/uiconfig/ui/appdetailwindow.ui
@@ -15,11 +15,11 @@
        <property name="hexpand">True</property>
        <property name="vexpand">True</property>
        <property name="orientation">vertical</property>
        <property name="wide_handle">True</property>
        <child>
          <object class="GtkBox" id="tasks">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="margin_bottom">3</property>
            <property name="orientation">vertical</property>
            <child>
              <placeholder/>
@@ -34,7 +34,6 @@
          <object class="GtkBox" id="container">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="margin_top">3</property>
            <property name="orientation">vertical</property>
            <child>
              <placeholder/>
diff --git a/dbaccess/uiconfig/ui/tableborderwindow.ui b/dbaccess/uiconfig/ui/tableborderwindow.ui
new file mode 100644
index 0000000..f376212
--- /dev/null
+++ b/dbaccess/uiconfig/ui/tableborderwindow.ui
@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.36.0 -->
<interface domain="dba">
  <requires lib="gtk+" version="3.18"/>
  <object class="GtkBox" id="TableBorderWindow">
    <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>
      <object class="GtkSeparator">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="margin_top">3</property>
        <property name="margin_bottom">3</property>
      </object>
      <packing>
        <property name="expand">False</property>
        <property name="fill">True</property>
        <property name="position">0</property>
      </packing>
    </child>
    <child>
      <object class="GtkPaned" id="splitter">
        <property name="visible">True</property>
        <property name="can_focus">True</property>
        <property name="hexpand">True</property>
        <property name="vexpand">True</property>
        <property name="orientation">vertical</property>
        <property name="wide_handle">True</property>
        <child>
          <object class="GtkBox" id="editor">
            <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>
          </object>
          <packing>
            <property name="resize">True</property>
            <property name="shrink">True</property>
          </packing>
        </child>
        <child>
          <object class="GtkBox" id="fielddesc">
            <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>
          </object>
          <packing>
            <property name="resize">True</property>
            <property name="shrink">True</property>
          </packing>
        </child>
      </object>
      <packing>
        <property name="expand">True</property>
        <property name="fill">True</property>
        <property name="position">1</property>
      </packing>
    </child>
  </object>
</interface>