manage VCL widgets using rtl::Reference

Change-Id: Ie95790cbaa5d459c8e849d7333098d857d31ed0a
diff --git a/include/vcl/button.hxx b/include/vcl/button.hxx
index 1a100c0..8cc6fe2 100644
--- a/include/vcl/button.hxx
+++ b/include/vcl/button.hxx
@@ -28,7 +28,7 @@
#include <vcl/bitmap.hxx>
#include <vcl/salnativewidgets.hxx>
#include <rsc/rsc-vcl-shared-types.hxx>

#include <vcl/vclref.hxx>
#include <vector>

class UserDrawEvent;
@@ -200,6 +200,8 @@ public:
    virtual bool set_property(const OString &rKey, const OString &rValue) SAL_OVERRIDE;
};

typedef VclReference<PushButton> PushButtonPtr;

inline void PushButton::Check( bool bCheck )
{
    SetState( (bCheck) ? TRISTATE_TRUE : TRISTATE_FALSE );
@@ -226,6 +228,7 @@ public:
    virtual void    Click() SAL_OVERRIDE;
};

typedef VclReference<OKButton> OKButtonPtr;

class VCL_DLLPUBLIC CancelButton : public PushButton
{
@@ -243,6 +246,8 @@ public:
    virtual void    Click() SAL_OVERRIDE;
};

typedef VclReference<CancelButton> CancelButtonPtr;

class VCL_DLLPUBLIC CloseButton : public CancelButton
{
public:
@@ -270,6 +275,7 @@ public:
    virtual void    Click() SAL_OVERRIDE;
};

typedef VclReference<HelpButton> HelpButtonPtr;

// - RadioButton -
class VCL_DLLPUBLIC RadioButton : public Button
@@ -493,6 +499,8 @@ public:
    virtual bool set_property(const OString &rKey, const OString &rValue) SAL_OVERRIDE;
};

typedef VclReference<CheckBox> CheckBoxPtr;

inline void CheckBox::Check( bool bCheck )
{
    SetState( (bCheck) ? TRISTATE_TRUE : TRISTATE_FALSE );
@@ -553,7 +561,7 @@ public:
    virtual void    KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
};

typedef rtl::Reference<DisclosureButton> DisclosureButtonPtr;
typedef VclReference<DisclosureButton> DisclosureButtonPtr;

#endif // INCLUDED_VCL_BUTTON_HXX

diff --git a/include/vcl/fixed.hxx b/include/vcl/fixed.hxx
index 109cecf..30bbd95 100644
--- a/include/vcl/fixed.hxx
+++ b/include/vcl/fixed.hxx
@@ -82,6 +82,8 @@ public:
    vcl::Window* get_mnemonic_widget() const { return m_pMnemonicWindow; }
};

typedef VclReference<FixedText> FixedTextPtr;

class VCL_DLLPUBLIC SelectableFixedText : public Edit
{
public:
@@ -124,6 +126,8 @@ public:
    virtual Size    GetOptimalSize() const SAL_OVERRIDE;
};

typedef VclReference<FixedLine> FixedLinePtr;

// - FixedBitmap -
class VCL_DLLPUBLIC FixedBitmap : public Control
{
diff --git a/include/vcl/group.hxx b/include/vcl/group.hxx
index 9e7b933fe..3d6c2a4 100644
--- a/include/vcl/group.hxx
+++ b/include/vcl/group.hxx
@@ -55,6 +55,8 @@ public:
    virtual void    DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
};

typedef VclReference<GroupBox> GroupBoxPtr;

#endif // INCLUDED_VCL_GROUP_HXX

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/vcl/imgctrl.hxx b/include/vcl/imgctrl.hxx
index 753ad9f..8ec454a 100644
--- a/include/vcl/imgctrl.hxx
+++ b/include/vcl/imgctrl.hxx
@@ -51,6 +51,8 @@ protected:
    void    ImplDraw( OutputDevice& rDev, sal_uLong nDrawFlags, const Point& rPos, const Size& rSize ) const;
};

typedef VclReference<ImageControl> ImageControlPtr;

#endif // INCLUDED_VCL_IMGCTRL_HXX

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/vcl/layout.hxx b/include/vcl/layout.hxx
index 24ad217..e2893de 100644
--- a/include/vcl/layout.hxx
+++ b/include/vcl/layout.hxx
@@ -544,7 +544,7 @@ public:
protected:
    virtual Size calculateRequisition() const SAL_OVERRIDE;
    virtual void setAllocation(const Size &rAllocation) SAL_OVERRIDE;
    void dispose() SAL_OVERRIDE { m_pDisclosureButton.clear(); VclBin::dispose(); }
    void dispose() SAL_OVERRIDE { m_pDisclosureButton.disposeAndClear(); VclBin::dispose(); }
private:
    bool m_bResizeTopLevel;
    DisclosureButtonPtr m_pDisclosureButton;
@@ -571,7 +571,7 @@ protected:
    DECL_LINK(ScrollBarHdl, void *);
    void InitScrollBars(const Size &rRequest);
    virtual bool Notify(NotifyEvent& rNEvt) SAL_OVERRIDE;
    void dispose() SAL_OVERRIDE { m_pVScroll.clear(); m_pHScroll.clear(); VclBin::dispose(); }
    void dispose() SAL_OVERRIDE { m_pVScroll.disposeAndClear(); m_pHScroll.disposeAndClear(); VclBin::dispose(); }
private:
    bool m_bUserManagedScrolling;
    ScrollBarPtr m_pVScroll;
diff --git a/include/vcl/lstbox.hxx b/include/vcl/lstbox.hxx
index 29d2199..3e53ab9 100644
--- a/include/vcl/lstbox.hxx
+++ b/include/vcl/lstbox.hxx
@@ -239,6 +239,7 @@ public:
    void EnableQuickSelection( const bool& b );
};

typedef VclReference<ListBox> ListBoxPtr;

// - MultiListBox -

diff --git a/include/vcl/menubtn.hxx b/include/vcl/menubtn.hxx
index 41e03c6..9159a6d 100644
--- a/include/vcl/menubtn.hxx
+++ b/include/vcl/menubtn.hxx
@@ -82,6 +82,8 @@ public:
    const Link&     GetSelectHdl() const                { return maSelectHdl; }
};

typedef VclReference<MenuButton> MenuButtonPtr;

#endif // INCLUDED_VCL_MENUBTN_HXX

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/vcl/scrbar.hxx b/include/vcl/scrbar.hxx
index da949dfd..6255db3 100644
--- a/include/vcl/scrbar.hxx
+++ b/include/vcl/scrbar.hxx
@@ -141,7 +141,7 @@ public:
    virtual Size    GetOptimalSize() const SAL_OVERRIDE;
};

typedef rtl::Reference<ScrollBar> ScrollBarPtr;
typedef VclReference<ScrollBar> ScrollBarPtr;


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

#ifndef INCLUDED_VCL_REFERENCE_HXX
#define INCLUDED_VCL_REFERENCE_HXX

#include <rtl/ref.hxx>

/**
 * A thin wrapper around rtl::Reference to implement the acquire and dispose semantics we want for references to vcl::Window subclasses.
 * @param reference_type must be a subclass of vcl::Window
 */
template <class reference_type>
class VclReference
{

    ::rtl::Reference<reference_type> m_rInnerRef;

public:
    /** Constructor...
     */
    inline VclReference()
        : m_rInnerRef()
    {}


    /** Constructor...
     */
    inline VclReference (reference_type * pBody)
        : m_rInnerRef(pBody)
    {}


    /** Copy constructor...
     */
    inline VclReference (const VclReference<reference_type> & handle)
        : m_rInnerRef (handle)
    {}


    /** Get the body. Can be used instead of operator->().
         I.e. handle->someBodyOp() and handle.get()->someBodyOp()
         are the same.
     */
    inline reference_type * SAL_CALL get() const
    {
        return m_rInnerRef.get();
    }

    /** Probably most common used: handle->someBodyOp().
     */
    inline reference_type * SAL_CALL operator->() const
    {
        return m_rInnerRef.get();
    }

    inline void disposeAndClear()
    {
        // hold it alive for the lifetime of this method
        ::rtl::Reference<reference_type> aTmp(m_rInnerRef);
        m_rInnerRef.clear(); // we should use some 'swap' method ideally ;-)
        assert(aTmp.get());
        if (aTmp.get())
            aTmp->dispose();
    }

}; // class VclReference

#endif // INCLUDED_VCL_REFERENCE_HXX

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index bc20cbe..189f15b 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -119,6 +119,8 @@ namespace vcl {

namespace svt { class PopupWindowControllerImpl; }

template<class T> class VclReference;


// - WindowTypes -

@@ -497,6 +499,7 @@ public:

private:
    template<typename T> friend class ::rtl::Reference;
    template<typename T> friend class ::VclReference;

    inline void acquire() const
    {
@@ -512,7 +515,7 @@ private:
protected:

    /** This is intended to be used to clear any locally held references to other Window-subclass objects */
    virtual void dispose() {}
    virtual void                        dispose();

    SAL_DLLPRIVATE void                 ImplInit( vcl::Window* pParent, WinBits nStyle, SystemParentData* pSystemParentData );

diff --git a/vcl/inc/ilstbox.hxx b/vcl/inc/ilstbox.hxx
index 2fec055..82d33c00f 100644
--- a/vcl/inc/ilstbox.hxx
+++ b/vcl/inc/ilstbox.hxx
@@ -377,13 +377,15 @@ protected:
    virtual void                            SelectEntry( ::vcl::StringEntryIdentifier _entry ) SAL_OVERRIDE;
};

typedef rtl::Reference<ImplListBoxWindow> ImplListBoxWindowPtr;

class ImplListBox : public Control
{
private:
    ImplListBoxWindow   maLBWindow;
    ScrollBar*          mpHScrollBar;
    ScrollBar*          mpVScrollBar;
    ScrollBarBox*       mpScrollBarBox;
    ImplListBoxWindowPtr maLBWindow;
    ScrollBar*           mpHScrollBar;
    ScrollBar*           mpVScrollBar;
    ScrollBarBox*        mpScrollBarBox;

    /// bitfield
    bool mbVScroll : 1;     // VScroll an oder aus
@@ -400,6 +402,7 @@ protected:
    virtual void        DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;

    virtual bool        Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
    virtual void        dispose() SAL_OVERRIDE;

    void                ImplResizeControls();
    void                ImplCheckScrollBars();
@@ -413,8 +416,8 @@ public:
                    ImplListBox( vcl::Window* pParent, WinBits nWinStyle );
                    virtual ~ImplListBox();

    const ImplEntryList*    GetEntryList() const            { return maLBWindow.GetEntryList(); }
    ImplListBoxWindow&      GetMainWindow()                 { return maLBWindow; }
    const ImplEntryList*    GetEntryList() const            { return maLBWindow->GetEntryList(); }
    ImplListBoxWindowPtr    GetMainWindow()                 { return maLBWindow; }

    virtual void    Resize() SAL_OVERRIDE;
    virtual const Wallpaper& GetDisplayBackground() const SAL_OVERRIDE;
@@ -423,84 +426,84 @@ public:
    sal_Int32       InsertEntry( sal_Int32  nPos, const OUString& rStr );
    sal_Int32       InsertEntry( sal_Int32  nPos, const OUString& rStr, const Image& rImage );
    void            RemoveEntry( sal_Int32  nPos );
    void            SetEntryData( sal_Int32  nPos, void* pNewData ) { maLBWindow.GetEntryList()->SetEntryData( nPos, pNewData ); }
    void            SetEntryData( sal_Int32  nPos, void* pNewData ) { maLBWindow->GetEntryList()->SetEntryData( nPos, pNewData ); }
    void            Clear();

    void            SetEntryFlags( sal_Int32  nPos, long nFlags );

    void            SelectEntry( sal_Int32  nPos, bool bSelect );
    void            SetNoSelection();
    void            ResetCurrentPos()               { maLBWindow.ResetCurrentPos(); }
    sal_Int32       GetCurrentPos() const           { return maLBWindow.GetCurrentPos(); }
    void            ResetCurrentPos()               { maLBWindow->ResetCurrentPos(); }
    sal_Int32       GetCurrentPos() const           { return maLBWindow->GetCurrentPos(); }

    bool            ProcessKeyInput( const KeyEvent& rKEvt )    { return maLBWindow.ProcessKeyInput( rKEvt ); }
    bool            ProcessKeyInput( const KeyEvent& rKEvt )    { return maLBWindow->ProcessKeyInput( rKEvt ); }
    bool            HandleWheelAsCursorTravel( const CommandEvent& rCEvt );

    void            SetSeparatorPos( sal_Int32  n )     { maLBWindow.SetSeparatorPos( n ); }
    sal_Int32       GetSeparatorPos() const         { return maLBWindow.GetSeparatorPos(); }
    void            SetSeparatorPos( sal_Int32  n )     { maLBWindow->SetSeparatorPos( n ); }
    sal_Int32       GetSeparatorPos() const         { return maLBWindow->GetSeparatorPos(); }

    void            SetTopEntry( sal_Int32  nTop )      { maLBWindow.SetTopEntry( nTop ); }
    sal_Int32       GetTopEntry() const             { return maLBWindow.GetTopEntry(); }
    void            ShowProminentEntry( sal_Int32  nPos ) { maLBWindow.ShowProminentEntry( nPos ); }
    void            SetTopEntry( sal_Int32  nTop )      { maLBWindow->SetTopEntry( nTop ); }
    sal_Int32       GetTopEntry() const             { return maLBWindow->GetTopEntry(); }
    void            ShowProminentEntry( sal_Int32  nPos ) { maLBWindow->ShowProminentEntry( nPos ); }
    using Window::IsVisible;
    bool            IsVisible( sal_Int32  nEntry ) const { return maLBWindow.IsVisible( nEntry ); }
    bool            IsVisible( sal_Int32  nEntry ) const { return maLBWindow->IsVisible( nEntry ); }

    void            SetProminentEntryType( ProminentEntry eType ) { maLBWindow.SetProminentEntryType( eType ); }
    ProminentEntry  GetProminentEntryType() const { return maLBWindow.GetProminentEntryType(); }
    void            SetProminentEntryType( ProminentEntry eType ) { maLBWindow->SetProminentEntryType( eType ); }
    ProminentEntry  GetProminentEntryType() const { return maLBWindow->GetProminentEntryType(); }

    long            GetLeftIndent() const           { return maLBWindow.GetLeftIndent(); }
    void            SetLeftIndent( sal_uInt16 n )       { maLBWindow.SetLeftIndent( n ); }
    void            ScrollHorz( short nDiff )       { maLBWindow.ScrollHorz( nDiff ); }
    long            GetLeftIndent() const           { return maLBWindow->GetLeftIndent(); }
    void            SetLeftIndent( sal_uInt16 n )       { maLBWindow->SetLeftIndent( n ); }
    void            ScrollHorz( short nDiff )       { maLBWindow->ScrollHorz( nDiff ); }

    void            SetTravelSelect( bool bTravelSelect ) { maLBWindow.SetTravelSelect( bTravelSelect ); }
    bool            IsTravelSelect() const          { return maLBWindow.IsTravelSelect(); }
    bool            IsTrackingSelect() const            { return maLBWindow.IsTrackingSelect(); }
    void            SetTravelSelect( bool bTravelSelect ) { maLBWindow->SetTravelSelect( bTravelSelect ); }
    bool            IsTravelSelect() const          { return maLBWindow->IsTravelSelect(); }
    bool            IsTrackingSelect() const            { return maLBWindow->IsTrackingSelect(); }

    void            EnableMultiSelection( bool bMulti, bool bStackMode ) { maLBWindow.EnableMultiSelection( bMulti, bStackMode ); }
    bool            IsMultiSelectionEnabled() const     { return maLBWindow.IsMultiSelectionEnabled(); }
    void            EnableMultiSelection( bool bMulti, bool bStackMode ) { maLBWindow->EnableMultiSelection( bMulti, bStackMode ); }
    bool            IsMultiSelectionEnabled() const     { return maLBWindow->IsMultiSelectionEnabled(); }

    void            SetMultiSelectionSimpleMode( bool bSimple ) { maLBWindow.SetMultiSelectionSimpleMode( bSimple ); }
    bool            IsMultiSelectionSimpleMode() const  { return maLBWindow.IsMultiSelectionSimpleMode(); }
    void            SetMultiSelectionSimpleMode( bool bSimple ) { maLBWindow->SetMultiSelectionSimpleMode( bSimple ); }
    bool            IsMultiSelectionSimpleMode() const  { return maLBWindow->IsMultiSelectionSimpleMode(); }

    void            SetReadOnly( bool b )           { maLBWindow.SetReadOnly( b ); }
    bool            IsReadOnly() const              { return maLBWindow.IsReadOnly(); }
    void            SetReadOnly( bool b )           { maLBWindow->SetReadOnly( b ); }
    bool            IsReadOnly() const              { return maLBWindow->IsReadOnly(); }

    Size            CalcSize( sal_Int32  nMaxLines ) const              { return maLBWindow.CalcSize( nMaxLines ); }
    long            GetEntryHeight() const          { return maLBWindow.GetEntryHeight(); }
    long            GetMaxEntryWidth() const        { return maLBWindow.GetMaxEntryWidth(); }
    Size            CalcSize( sal_Int32  nMaxLines ) const              { return maLBWindow->CalcSize( nMaxLines ); }
    long            GetEntryHeight() const          { return maLBWindow->GetEntryHeight(); }
    long            GetMaxEntryWidth() const        { return maLBWindow->GetMaxEntryWidth(); }

    void            SetScrollHdl( const Link& rLink )   { maScrollHdl = rLink; }
    const Link&     GetScrollHdl() const                { return maScrollHdl; }
    void            SetSelectHdl( const Link& rLink )   { maLBWindow.SetSelectHdl( rLink ); }
    const Link&     GetSelectHdl() const                { return maLBWindow.GetSelectHdl(); }
    void            SetCancelHdl( const Link& rLink )   { maLBWindow.SetCancelHdl( rLink ); }
    const Link&     GetCancelHdl() const                { return maLBWindow.GetCancelHdl(); }
    void            SetDoubleClickHdl( const Link& rLink )  { maLBWindow.SetDoubleClickHdl( rLink ); }
    const Link&     GetDoubleClickHdl() const               { return maLBWindow.GetDoubleClickHdl(); }
    void            SetSelectHdl( const Link& rLink )   { maLBWindow->SetSelectHdl( rLink ); }
    const Link&     GetSelectHdl() const                { return maLBWindow->GetSelectHdl(); }
    void            SetCancelHdl( const Link& rLink )   { maLBWindow->SetCancelHdl( rLink ); }
    const Link&     GetCancelHdl() const                { return maLBWindow->GetCancelHdl(); }
    void            SetDoubleClickHdl( const Link& rLink )  { maLBWindow->SetDoubleClickHdl( rLink ); }
    const Link&     GetDoubleClickHdl() const               { return maLBWindow->GetDoubleClickHdl(); }

    boost::signals2::signal< void ( UserDrawEvent* ) > userDrawSignal;

    void            SetFocusHdl( const Link& rLink )    { maLBWindow.SetFocusHdl( rLink ); }
    const Link&     GetFocusHdl() const             { return maLBWindow.GetFocusHdl(); }
    void            SetListItemSelectHdl( const Link& rLink )   { maLBWindow.SetListItemSelectHdl( rLink ); }
    const Link&     GetListItemSelectHdl() const    { return maLBWindow.GetListItemSelectHdl(); }
    void            SetSelectionChangedHdl( const Link& rLnk )  { maLBWindow.GetEntryList()->SetSelectionChangedHdl( rLnk ); }
    void            SetCallSelectionChangedHdl( bool bCall )    { maLBWindow.GetEntryList()->SetCallSelectionChangedHdl( bCall ); }
    bool            IsSelectionChanged() const                  { return maLBWindow.IsSelectionChanged(); }
    sal_uInt16      GetSelectModifier() const                   { return maLBWindow.GetSelectModifier(); }
    void            SetFocusHdl( const Link& rLink )    { maLBWindow->SetFocusHdl( rLink ); }
    const Link&     GetFocusHdl() const             { return maLBWindow->GetFocusHdl(); }
    void            SetListItemSelectHdl( const Link& rLink )   { maLBWindow->SetListItemSelectHdl( rLink ); }
    const Link&     GetListItemSelectHdl() const    { return maLBWindow->GetListItemSelectHdl(); }
    void            SetSelectionChangedHdl( const Link& rLnk )  { maLBWindow->GetEntryList()->SetSelectionChangedHdl( rLnk ); }
    void            SetCallSelectionChangedHdl( bool bCall )    { maLBWindow->GetEntryList()->SetCallSelectionChangedHdl( bCall ); }
    bool            IsSelectionChanged() const                  { return maLBWindow->IsSelectionChanged(); }
    sal_uInt16      GetSelectModifier() const                   { return maLBWindow->GetSelectModifier(); }

    void            SetMRUEntries( const OUString& rEntries, sal_Unicode cSep );
    OUString   GetMRUEntries( sal_Unicode cSep ) const;
    void            SetMaxMRUCount( sal_Int32  n )                  { maLBWindow.GetEntryList()->SetMaxMRUCount( n ); }
    sal_Int32       GetMaxMRUCount() const                      { return maLBWindow.GetEntryList()->GetMaxMRUCount(); }
    void            SetMaxMRUCount( sal_Int32  n )                  { maLBWindow->GetEntryList()->SetMaxMRUCount( n ); }
    sal_Int32       GetMaxMRUCount() const                      { return maLBWindow->GetEntryList()->GetMaxMRUCount(); }
    sal_uInt16      GetDisplayLineCount() const
    { return maLBWindow.GetDisplayLineCount(); }
    { return maLBWindow->GetDisplayLineCount(); }

    bool GetEdgeBlending() const { return mbEdgeBlending; }
    void SetEdgeBlending(bool bNew);

    /// pb: #106948# explicit mirroring for calc
    inline void     EnableMirroring()   { maLBWindow.EnableMirroring(); }
    inline void     EnableMirroring()   { maLBWindow->EnableMirroring(); }
    inline void     SetDropTraget(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& i_xDNDListenerContainer){ mxDNDListenerContainer= i_xDNDListenerContainer; }
};

diff --git a/vcl/inc/printdlg.hxx b/vcl/inc/printdlg.hxx
index fef1da8..52b1cbf 100644
--- a/vcl/inc/printdlg.hxx
+++ b/vcl/inc/printdlg.hxx
@@ -56,8 +56,8 @@ namespace vcl
            OUString       maReplacementString;
            OUString       maToolTipString;
            bool                mbGreyscale;
            FixedLine           maHorzDim;
            FixedLine           maVertDim;
            FixedLinePtr        maHorzDim;
            FixedLinePtr        maVertDim;

            void preparePreviewBitmap();

@@ -76,6 +76,8 @@ namespace vcl
                             sal_Int32 i_nDPIX, sal_Int32 i_nDPIY,
                             bool i_bGreyscale
                            );
        private:
            virtual void dispose() SAL_OVERRIDE;
        };

        class ShowNupOrderWindow : public vcl::Window
diff --git a/vcl/source/app/dbggui.cxx b/vcl/source/app/dbggui.cxx
index 1c643f2..65c0dc8 100644
--- a/vcl/source/app/dbggui.cxx
+++ b/vcl/source/app/dbggui.cxx
@@ -207,98 +207,102 @@ NULL
class DbgInfoDialog : public ModalDialog
{
private:
    ListBox         maListBox;
    OKButton        maOKButton;
    ListBoxPtr      maListBox;
    OKButtonPtr     maOKButton;
    bool            mbHelpText;

public:
                    DbgInfoDialog( vcl::Window* pParent, bool bHelpText = false );

    void            SetInfoText( const OUString& rStr );
private:
    virtual void    dispose() SAL_OVERRIDE;
};

class DbgDialog : public ModalDialog
{
private:
    CheckBox        maRes;
    CheckBox        maDialog;
    CheckBox        maBoldAppFont;
    GroupBox        maBox3;
    CheckBoxPtr     maRes;
    CheckBoxPtr     maDialog;
    CheckBoxPtr     maBoldAppFont;
    GroupBoxPtr     maBox3;

    OKButton        maOKButton;
    CancelButton    maCancelButton;
    HelpButton      maHelpButton;
    OKButtonPtr     maOKButton;
    CancelButtonPtr maCancelButton;
    HelpButtonPtr   maHelpButton;

public:
                    DbgDialog();

                    DECL_LINK( ClickHdl, Button* );
    void            RequestHelp( const HelpEvent& rHEvt ) SAL_OVERRIDE;
private:
    virtual void    dispose() SAL_OVERRIDE;
};

DbgDialog::DbgDialog() :
    ModalDialog( NULL, WB_STDMODAL | WB_SYSTEMWINDOW ),
    maRes( this ),
    maDialog( this ),
    maBoldAppFont( this ),
    maBox3( this ),
    maOKButton( this, WB_DEFBUTTON ),
    maCancelButton( this ),
    maHelpButton( this )
    maRes(new CheckBox(this)),
    maDialog(new CheckBox(this)),
    maBoldAppFont(new CheckBox(this)),
    maBox3(new GroupBox(this)),
    maOKButton(new OKButton(this, WB_DEFBUTTON)),
    maCancelButton(new CancelButton(this)),
    maHelpButton(new HelpButton(this))
{
    DbgData*    pData = DbgGetData();
    MapMode     aAppMap( MAP_APPFONT );
    Size        aButtonSize = LogicToPixel( Size( 60, 12 ), aAppMap );

    {
    maRes.Show();
    maRes.SetText("~Resourcen");
    maRes->Show();
    maRes->SetText("~Resourcen");
    if ( pData->nTestFlags & DBG_TEST_RESOURCE )
        maRes.Check( true );
    maRes.SetPosSizePixel( LogicToPixel( Point( 75, 95 ), aAppMap ),
        maRes->Check( true );
    maRes->SetPosSizePixel( LogicToPixel( Point( 75, 95 ), aAppMap ),
                           aButtonSize );
    }

    {
    maDialog.Show();
    maDialog.SetText("~Dialog");
    maDialog->Show();
    maDialog->SetText("~Dialog");
    if ( pData->nTestFlags & DBG_TEST_DIALOG )
        maDialog.Check( true );
    maDialog.SetPosSizePixel( LogicToPixel( Point( 140, 95 ), aAppMap ),
        maDialog->Check( true );
    maDialog->SetPosSizePixel( LogicToPixel( Point( 140, 95 ), aAppMap ),
                              aButtonSize );
    }

    {
    maBoldAppFont.Show();
    maBoldAppFont.SetText("~Bold AppFont");
    maBoldAppFont->Show();
    maBoldAppFont->SetText("~Bold AppFont");
    if ( pData->nTestFlags & DBG_TEST_BOLDAPPFONT )
        maBoldAppFont.Check( true );
    maBoldAppFont.SetPosSizePixel( LogicToPixel( Point( 205, 95 ), aAppMap ),
        maBoldAppFont->Check( true );
    maBoldAppFont->SetPosSizePixel( LogicToPixel( Point( 205, 95 ), aAppMap ),
                                   aButtonSize );
    maBoldAppFont.SaveValue();
    maBoldAppFont->SaveValue();
    }

    {
    maBox3.Show();
    maBox3.SetText("Test Options");
    maBox3.SetPosSizePixel( LogicToPixel( Point( 5, 85 ), aAppMap ),
    maBox3->Show();
    maBox3->SetText("Test Options");
    maBox3->SetPosSizePixel( LogicToPixel( Point( 5, 85 ), aAppMap ),
                            LogicToPixel( Size( 330, 30 ), aAppMap ) );
    }

    {
    maOKButton.Show();
    maOKButton.SetClickHdl( LINK( this, DbgDialog, ClickHdl ) );
    maOKButton.SetPosSizePixel( LogicToPixel( Point( 10, 260 ), aAppMap ),
    maOKButton->Show();
    maOKButton->SetClickHdl( LINK( this, DbgDialog, ClickHdl ) );
    maOKButton->SetPosSizePixel( LogicToPixel( Point( 10, 260 ), aAppMap ),
                                LogicToPixel( Size( 50, 15 ), aAppMap ) );
    }
    {
    maCancelButton.Show();
    maCancelButton.SetPosSizePixel( LogicToPixel( Point( 70, 260 ), aAppMap ),
    maCancelButton->Show();
    maCancelButton->SetPosSizePixel( LogicToPixel( Point( 70, 260 ), aAppMap ),
                                    LogicToPixel( Size( 50, 15 ), aAppMap ) );
    }
    {
    maHelpButton.Show();
    maHelpButton.SetPosSizePixel( LogicToPixel( Point( 190, 260 ), aAppMap ),
    maHelpButton->Show();
    maHelpButton->SetPosSizePixel( LogicToPixel( Point( 190, 260 ), aAppMap ),
                                  LogicToPixel( Size( 50, 15 ), aAppMap ) );
    }

@@ -310,20 +314,20 @@ DbgDialog::DbgDialog() :

IMPL_LINK( DbgDialog, ClickHdl, Button*, pButton )
{
    if ( pButton == &maOKButton )
    if ( pButton == maOKButton.get() )
    {
        DbgData aData;

        memcpy( &aData, DbgGetData(), sizeof( DbgData ) );
        aData.nTestFlags = 0;

        if ( maRes.IsChecked() )
        if ( maRes->IsChecked() )
            aData.nTestFlags |= DBG_TEST_RESOURCE;

        if ( maDialog.IsChecked() )
        if ( maDialog->IsChecked() )
            aData.nTestFlags |= DBG_TEST_DIALOG;

        if ( maBoldAppFont.IsChecked() )
        if ( maBoldAppFont->IsChecked() )
            aData.nTestFlags |= DBG_TEST_BOLDAPPFONT;

        // Daten speichern
@@ -333,12 +337,12 @@ IMPL_LINK( DbgDialog, ClickHdl, Button*, pButton )
        #define IMMEDIATE_FLAGS (DBG_TEST_RESOURCE | DBG_TEST_DIALOG | DBG_TEST_BOLDAPPFONT)
        pData->nTestFlags &= ~IMMEDIATE_FLAGS;
        pData->nTestFlags |= aData.nTestFlags & IMMEDIATE_FLAGS;
        if ( maBoldAppFont.IsValueChangedFromSaved() )
        if ( maBoldAppFont->IsValueChangedFromSaved() )
        {
            AllSettings aSettings = Application::GetSettings();
            StyleSettings aStyleSettings = aSettings.GetStyleSettings();
            vcl::Font aFont = aStyleSettings.GetAppFont();
            if ( maBoldAppFont.IsChecked() )
            if ( maBoldAppFont->IsChecked() )
                aFont.SetWeight( WEIGHT_BOLD );
            else
                aFont.SetWeight( WEIGHT_NORMAL );
@@ -377,10 +381,22 @@ void DbgDialog::RequestHelp( const HelpEvent& rHEvt )
    }
}

void DbgDialog::dispose()
{
    maRes.disposeAndClear();
    maDialog.disposeAndClear();
    maBoldAppFont.disposeAndClear();
    maBox3.disposeAndClear();
    maOKButton.disposeAndClear();
    maCancelButton.disposeAndClear();
    maHelpButton.disposeAndClear();
    ModalDialog::dispose();
}

DbgInfoDialog::DbgInfoDialog( vcl::Window* pParent, bool bHelpText ) :
    ModalDialog( pParent, WB_STDMODAL ),
    maListBox( this, WB_BORDER | WB_AUTOHSCROLL ),
    maOKButton( this, WB_DEFBUTTON )
    maListBox(new ListBox( this, WB_BORDER | WB_AUTOHSCROLL )),
    maOKButton(new OKButton(this, WB_DEFBUTTON))
{
    mbHelpText = bHelpText;

@@ -389,21 +405,21 @@ DbgInfoDialog::DbgInfoDialog( vcl::Window* pParent, bool bHelpText ) :
        vcl::Font aFont = GetDefaultFont( DEFAULTFONT_FIXED, LANGUAGE_ENGLISH_US, 0 );
        aFont.SetHeight( 8 );
        aFont.SetPitch( PITCH_FIXED );
        maListBox.SetControlFont( aFont );
        maListBox->SetControlFont( aFont );
    }
    maListBox.SetPosSizePixel( Point( 5, 5 ), Size( 630, 380 ) );
    maListBox.Show();
    maListBox->SetPosSizePixel( Point( 5, 5 ), Size( 630, 380 ) );
    maListBox->Show();

    maOKButton.SetPosSizePixel( Point( 290, 390 ), Size( 60, 25 ) );
    maOKButton.Show();
    maOKButton->SetPosSizePixel( Point( 290, 390 ), Size( 60, 25 ) );
    maOKButton->Show();

    SetOutputSizePixel( Size( 640, 420 ) );
}

void DbgInfoDialog::SetInfoText( const OUString& rStr )
{
    maListBox.SetUpdateMode( false );
    maListBox.Clear();
    maListBox->SetUpdateMode( false );
    maListBox->Clear();
    OUString aStr = convertLineEnd(rStr, LINEEND_LF);
    sal_Int32 nStrIndex = 0;
    sal_Int32 nFoundIndex;
@@ -413,18 +429,18 @@ void DbgInfoDialog::SetInfoText( const OUString& rStr )
        OUString aTextParagraph = aStr.copy( nStrIndex, nFoundIndex-nStrIndex );
        if ( mbHelpText )
        {
            long    nMaxWidth = maListBox.GetOutputSizePixel().Width()-30;
            long    nMaxWidth = maListBox->GetOutputSizePixel().Width()-30;
            sal_Int32  nLastIndex = 0;
            sal_Int32  nIndex = aTextParagraph.indexOf( ' ' );
            while ( nIndex != -1 )
            {
                if ( maListBox.GetTextWidth( aTextParagraph, 0, nIndex ) > nMaxWidth )
                if ( maListBox->GetTextWidth( aTextParagraph, 0, nIndex ) > nMaxWidth )
                {
                    if ( !nLastIndex )
                        nLastIndex = nIndex+1;
                    OUString aTempStr = aTextParagraph.copy( 0, nLastIndex );
                    aTextParagraph = aTextParagraph.replaceAt( 0, nLastIndex, "" );
                    maListBox.InsertEntry( aTempStr );
                    maListBox->InsertEntry( aTempStr );
                    nLastIndex = 0;
                }
                else
@@ -432,20 +448,27 @@ void DbgInfoDialog::SetInfoText( const OUString& rStr )
                nIndex = aTextParagraph.indexOf( ' ', nLastIndex );
            }

            if ( maListBox.GetTextWidth( aTextParagraph, 0, nIndex ) > nMaxWidth )
            if ( maListBox->GetTextWidth( aTextParagraph, 0, nIndex ) > nMaxWidth )
            {
                if ( !nLastIndex )
                    nLastIndex = nIndex+1;
                OUString aTempStr = aTextParagraph.copy( 0, nLastIndex );
                aTextParagraph = aTextParagraph.replaceAt( 0, nLastIndex, "" );
                maListBox.InsertEntry( aTempStr );
                maListBox->InsertEntry( aTempStr );
            }
        }
        maListBox.InsertEntry( aTextParagraph );
        maListBox->InsertEntry( aTextParagraph );
        nStrIndex = nFoundIndex+1;
    }
    while ( nFoundIndex != -1 );
    maListBox.SetUpdateMode( true );
    maListBox->SetUpdateMode( true );
}

void DbgInfoDialog::dispose()
{
    maListBox.disposeAndClear();
    maOKButton.disposeAndClear();
    ModalDialog::dispose();
}

void DbgDialogTest( vcl::Window* pWindow )
diff --git a/vcl/source/control/combobox.cxx b/vcl/source/control/combobox.cxx
index 16d1ccc..8a2e3c2 100644
--- a/vcl/source/control/combobox.cxx
+++ b/vcl/source/control/combobox.cxx
@@ -188,7 +188,7 @@ void ComboBox::ImplInit( vcl::Window* pParent, WinBits nStyle )
    if ( mpFloatWin )
        mpFloatWin->SetImplListBox( mpImplLB );
    else
        mpImplLB->GetMainWindow().AllowGrabFocus( true );
        mpImplLB->GetMainWindow()->AllowGrabFocus( true );

    ImplCalcEditHeight();

@@ -253,7 +253,7 @@ void ComboBox::ImplClickButtonHandler( ImplBtn* )

    ImplClearLayoutData();
    if( mpImplLB )
        mpImplLB->GetMainWindow().ImplClearLayoutData();
        mpImplLB->GetMainWindow()->ImplClearLayoutData();
}

IMPL_LINK_NOARG(ComboBox, ImplPopupModeEndHdl)
@@ -272,7 +272,7 @@ IMPL_LINK_NOARG(ComboBox, ImplPopupModeEndHdl)

    ImplClearLayoutData();
    if( mpImplLB )
        mpImplLB->GetMainWindow().ImplClearLayoutData();
        mpImplLB->GetMainWindow()->ImplClearLayoutData();

    mpBtn->SetPressed( false );
    CallEventListeners( VCLEVENT_DROPDOWN_CLOSE );
@@ -581,20 +581,20 @@ void ComboBox::FillLayoutData() const
    mpControlData->mpLayoutData = new vcl::ControlLayoutData();
    AppendLayoutData( *mpSubEdit );
    mpSubEdit->SetLayoutDataParent( this );
    Control& rMainWindow = mpImplLB->GetMainWindow();
    ImplListBoxWindowPtr rMainWindow = mpImplLB->GetMainWindow();
    if( mpFloatWin )
    {
        // dropdown mode
        if( mpFloatWin->IsReallyVisible() )
        {
            AppendLayoutData( rMainWindow );
            rMainWindow.SetLayoutDataParent( this );
            AppendLayoutData( *(rMainWindow.get()) );
            rMainWindow->SetLayoutDataParent( this );
        }
    }
    else
    {
        AppendLayoutData( rMainWindow );
        rMainWindow.SetLayoutDataParent( this );
        AppendLayoutData( *(rMainWindow.get()) );
        rMainWindow->SetLayoutDataParent( this );
    }
}

@@ -647,7 +647,7 @@ void ComboBox::StateChanged( StateChangedType nType )
    else if ( nType == StateChangedType::STYLE )
    {
        SetStyle( ImplInitStyle( GetStyle() ) );
        mpImplLB->GetMainWindow().EnableSort( ( GetStyle() & WB_SORT ) ? true : false );
        mpImplLB->GetMainWindow()->EnableSort( ( GetStyle() & WB_SORT ) ? true : false );
    }
    else if( nType == StateChangedType::MIRRORING )
    {
@@ -765,7 +765,7 @@ bool ComboBox::Notify( NotifyEvent& rNEvt )
            nDone = false;  // don't eat this event, let the default handling happen (i.e. scroll the context)
        }
    }
    else if( ( rNEvt.GetType() == MouseNotifyEvent::MOUSEBUTTONDOWN ) && ( rNEvt.GetWindow() == &mpImplLB->GetMainWindow() ) )
    else if( ( rNEvt.GetType() == MouseNotifyEvent::MOUSEBUTTONDOWN ) && ( rNEvt.GetWindow() == mpImplLB->GetMainWindow().get() ) )
    {
        mpSubEdit->GrabFocus();
    }
@@ -1106,7 +1106,7 @@ void ComboBox::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines
    long nCharWidth = GetTextWidth(OUString(static_cast<sal_Unicode>('x')));
    if ( !IsDropDownBox() )
    {
        Size aOutSz = mpImplLB->GetMainWindow().GetOutputSizePixel();
        Size aOutSz = mpImplLB->GetMainWindow()->GetOutputSizePixel();
        rnCols = (nCharWidth > 0) ? (sal_uInt16)(aOutSz.Width()/nCharWidth) : 1;
        rnLines = (sal_uInt16)(aOutSz.Height()/mpImplLB->GetEntryHeight());
    }
@@ -1120,11 +1120,11 @@ void ComboBox::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines

void ComboBox::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags )
{
    mpImplLB->GetMainWindow().ImplInitSettings( true, true, true );
    mpImplLB->GetMainWindow()->ImplInitSettings( true, true, true );

    Point aPos = pDev->LogicToPixel( rPos );
    Size aSize = pDev->LogicToPixel( rSize );
    vcl::Font aFont = mpImplLB->GetMainWindow().GetDrawPixelFont( pDev );
    vcl::Font aFont = mpImplLB->GetMainWindow()->GetDrawPixelFont( pDev );
    OutDevType eOutDevType = pDev->GetOutDevType();

    pDev->Push();
@@ -1233,18 +1233,18 @@ void ComboBox::UserDraw( const UserDrawEvent& )

void ComboBox::SetUserItemSize( const Size& rSz )
{
    mpImplLB->GetMainWindow().SetUserItemSize( rSz );
    mpImplLB->GetMainWindow()->SetUserItemSize( rSz );
}

void ComboBox::EnableUserDraw( bool bUserDraw )
{
    mpImplLB->GetMainWindow().EnableUserDraw( bUserDraw );
    mpImplLB->GetMainWindow()->EnableUserDraw( bUserDraw );
}

void ComboBox::DrawEntry( const UserDrawEvent& rEvt, bool bDrawImage, bool bDrawText, bool bDrawTextAtImagePos )
{
    DBG_ASSERT( rEvt.GetDevice() == &mpImplLB->GetMainWindow(), "DrawEntry?!" );
    mpImplLB->GetMainWindow().DrawEntry( rEvt.GetItemId(), bDrawImage, bDrawText, bDrawTextAtImagePos );
    DBG_ASSERT( rEvt.GetDevice() == mpImplLB->GetMainWindow().get(), "DrawEntry?!" );
    mpImplLB->GetMainWindow()->DrawEntry( rEvt.GetItemId(), bDrawImage, bDrawText, bDrawTextAtImagePos );
}

void ComboBox::SetSeparatorPos( sal_Int32 n )
@@ -1355,8 +1355,8 @@ void ComboBox::SetNoSelection()

Rectangle ComboBox::GetBoundingRectangle( sal_Int32 nItem ) const
{
    Rectangle aRect = mpImplLB->GetMainWindow().GetBoundingRectangle( nItem );
    Rectangle aOffset = mpImplLB->GetMainWindow().GetWindowExtentsRelative( (vcl::Window*)this );
    Rectangle aRect = mpImplLB->GetMainWindow()->GetBoundingRectangle( nItem );
    Rectangle aOffset = mpImplLB->GetMainWindow()->GetWindowExtentsRelative( (vcl::Window*)this );
    aRect.Move( aOffset.TopLeft().X(), aOffset.TopLeft().Y() );
    return aRect;
}
@@ -1382,16 +1382,16 @@ long ComboBox::GetIndexForPoint( const Point& rPoint, sal_Int32& rPos ) const
    {
        // point must be either in main list window
        // or in impl window (dropdown case)
        ImplListBoxWindow& rMain = mpImplLB->GetMainWindow();
        ImplListBoxWindowPtr rMain = mpImplLB->GetMainWindow();

        // convert coordinates to ImplListBoxWindow pixel coordinate space
        Point aConvPoint = LogicToPixel( rPoint );
        aConvPoint = OutputToAbsoluteScreenPixel( aConvPoint );
        aConvPoint = rMain.AbsoluteScreenToOutputPixel( aConvPoint );
        aConvPoint = rMain.PixelToLogic( aConvPoint );
        aConvPoint = rMain->AbsoluteScreenToOutputPixel( aConvPoint );
        aConvPoint = rMain->PixelToLogic( aConvPoint );

        // try to find entry
        sal_Int32 nEntry = rMain.GetEntryPosForPoint( aConvPoint );
        sal_Int32 nEntry = rMain->GetEntryPosForPoint( aConvPoint );
        if( nEntry == LISTBOX_ENTRY_NOTFOUND )
            nIndex = -1;
        else
diff --git a/vcl/source/control/ilstbox.cxx b/vcl/source/control/ilstbox.cxx
index e5d29ea..9a18684 100644
--- a/vcl/source/control/ilstbox.cxx
+++ b/vcl/source/control/ilstbox.cxx
@@ -2135,9 +2135,9 @@ sal_uInt16 ImplListBoxWindow::ImplGetTextStyle() const

ImplListBox::ImplListBox( vcl::Window* pParent, WinBits nWinStyle ) :
    Control( pParent, nWinStyle ),
    maLBWindow( this, nWinStyle&(~WB_BORDER) )
    maLBWindow(new ImplListBoxWindow( this, nWinStyle&(~WB_BORDER) ))
{
    maLBWindow.userDrawSignal.connect( userDrawSignal );
    maLBWindow->userDrawSignal.connect( userDrawSignal );

    // for native widget rendering we must be able to detect this window type
    SetType( WINDOW_LISTBOXWINDOW );
@@ -2155,10 +2155,10 @@ ImplListBox::ImplListBox( vcl::Window* pParent, WinBits nWinStyle ) :
    mbAutoHScroll   = ( nWinStyle & WB_AUTOHSCROLL );
    mbEdgeBlending  = false;

    maLBWindow.SetScrollHdl( LINK( this, ImplListBox, LBWindowScrolled ) );
    maLBWindow.SetMRUChangedHdl( LINK( this, ImplListBox, MRUChanged ) );
    maLBWindow.SetEdgeBlending(GetEdgeBlending());
    maLBWindow.Show();
    maLBWindow->SetScrollHdl( LINK( this, ImplListBox, LBWindowScrolled ) );
    maLBWindow->SetMRUChangedHdl( LINK( this, ImplListBox, MRUChanged ) );
    maLBWindow->SetEdgeBlending(GetEdgeBlending());
    maLBWindow->Show();
}

ImplListBox::~ImplListBox()
@@ -2170,11 +2170,11 @@ ImplListBox::~ImplListBox()

void ImplListBox::Clear()
{
    maLBWindow.Clear();
    maLBWindow->Clear();
    if ( GetEntryList()->GetMRUCount() )
    {
        maLBWindow.GetEntryList()->SetMRUCount( 0 );
        maLBWindow.SetSeparatorPos( LISTBOX_ENTRY_NOTFOUND );
        maLBWindow->GetEntryList()->SetMRUCount( 0 );
        maLBWindow->SetSeparatorPos( LISTBOX_ENTRY_NOTFOUND );
    }
    mpVScrollBar->SetThumbPos( 0 );
    mpHScrollBar->SetThumbPos( 0 );
@@ -2184,7 +2184,7 @@ void ImplListBox::Clear()
sal_Int32 ImplListBox::InsertEntry( sal_Int32 nPos, const OUString& rStr )
{
    ImplEntryType* pNewEntry = new ImplEntryType( rStr );
    sal_Int32 nNewPos = maLBWindow.InsertEntry( nPos, pNewEntry );
    sal_Int32 nNewPos = maLBWindow->InsertEntry( nPos, pNewEntry );
    if (nNewPos == LISTBOX_ERROR)
    {
        delete pNewEntry;
@@ -2197,7 +2197,7 @@ sal_Int32 ImplListBox::InsertEntry( sal_Int32 nPos, const OUString& rStr )
sal_Int32 ImplListBox::InsertEntry( sal_Int32 nPos, const OUString& rStr, const Image& rImage )
{
    ImplEntryType* pNewEntry = new ImplEntryType( rStr, rImage );
    sal_Int32 nNewPos = maLBWindow.InsertEntry( nPos, pNewEntry );
    sal_Int32 nNewPos = maLBWindow->InsertEntry( nPos, pNewEntry );
    if (nNewPos == LISTBOX_ERROR)
    {
        delete pNewEntry;
@@ -2209,33 +2209,33 @@ sal_Int32 ImplListBox::InsertEntry( sal_Int32 nPos, const OUString& rStr, const 

void ImplListBox::RemoveEntry( sal_Int32 nPos )
{
    maLBWindow.RemoveEntry( nPos );
    maLBWindow->RemoveEntry( nPos );
    StateChanged( StateChangedType::DATA );
}

void ImplListBox::SetEntryFlags( sal_Int32 nPos, long nFlags )
{
    maLBWindow.SetEntryFlags( nPos, nFlags );
    maLBWindow->SetEntryFlags( nPos, nFlags );
}

void ImplListBox::SelectEntry( sal_Int32 nPos, bool bSelect )
{
    maLBWindow.SelectEntry( nPos, bSelect );
    maLBWindow->SelectEntry( nPos, bSelect );
}

void ImplListBox::SetNoSelection()
{
    maLBWindow.DeselectAll();
    maLBWindow->DeselectAll();
}

void ImplListBox::GetFocus()
{
    maLBWindow.GrabFocus();
    maLBWindow->GrabFocus();
}

vcl::Window* ImplListBox::GetPreferredKeyInputWindow()
{
    return &maLBWindow;
    return maLBWindow.get();
}

void ImplListBox::Resize()
@@ -2359,7 +2359,7 @@ void ImplListBox::ImplCheckScrollBars()

void ImplListBox::ImplInitScrollBars()
{
    Size aOutSz = maLBWindow.GetOutputSizePixel();
    Size aOutSz = maLBWindow->GetOutputSizePixel();

    if ( mbVScroll )
    {
@@ -2396,9 +2396,9 @@ void ImplListBox::ImplResizeControls()

    // pb: #106948# explicit mirroring for calc
    // Scrollbar on left or right side?
    bool bMirroring = maLBWindow.IsMirroring();
    bool bMirroring = maLBWindow->IsMirroring();
    Point aWinPos( bMirroring && mbVScroll ? nSBWidth : 0, 0 );
    maLBWindow.SetPosSizePixel( aWinPos, aInnerSz );
    maLBWindow->SetPosSizePixel( aWinPos, aInnerSz );

    // ScrollBarBox
    if( mbVScroll && mbHScroll )
@@ -2450,7 +2450,7 @@ void ImplListBox::StateChanged( StateChangedType nType )
    else if ( ( nType == StateChangedType::UPDATEMODE ) || ( nType == StateChangedType::DATA ) )
    {
        bool bUpdate = IsUpdateMode();
        maLBWindow.SetUpdateMode( bUpdate );
        maLBWindow->SetUpdateMode( bUpdate );
        if ( bUpdate && IsReallyVisible() )
            ImplCheckScrollBars();
    }
@@ -2459,30 +2459,30 @@ void ImplListBox::StateChanged( StateChangedType nType )
        mpHScrollBar->Enable( IsEnabled() );
        mpVScrollBar->Enable( IsEnabled() );
        mpScrollBarBox->Enable( IsEnabled() );
        maLBWindow.Enable( IsEnabled() );
        maLBWindow->Enable( IsEnabled() );

        Invalidate();
    }
    else if ( nType == StateChangedType::ZOOM )
    {
        maLBWindow.SetZoom( GetZoom() );
        maLBWindow->SetZoom( GetZoom() );
        Resize();
    }
    else if ( nType == StateChangedType::CONTROLFONT )
    {
        maLBWindow.SetControlFont( GetControlFont() );
        maLBWindow->SetControlFont( GetControlFont() );
    }
    else if ( nType == StateChangedType::CONTROLFOREGROUND )
    {
        maLBWindow.SetControlForeground( GetControlForeground() );
        maLBWindow->SetControlForeground( GetControlForeground() );
    }
    else if ( nType == StateChangedType::CONTROLBACKGROUND )
    {
        maLBWindow.SetControlBackground( GetControlBackground() );
        maLBWindow->SetControlBackground( GetControlBackground() );
    }
    else if( nType == StateChangedType::MIRRORING )
    {
        maLBWindow.EnableRTL( IsRTLEnabled() );
        maLBWindow->EnableRTL( IsRTLEnabled() );
        mpHScrollBar->EnableRTL( IsRTLEnabled() );
        mpVScrollBar->EnableRTL( IsRTLEnabled() );
        ImplResizeControls();
@@ -2515,9 +2515,15 @@ bool ImplListBox::Notify( NotifyEvent& rNEvt )
    return nDone || Window::Notify( rNEvt );
}

void ImplListBox::dispose()
{
    maLBWindow.clear();
    Control::dispose();
}

const Wallpaper& ImplListBox::GetDisplayBackground() const
{
    return maLBWindow.GetDisplayBackground();
    return maLBWindow->GetDisplayBackground();
}

bool ImplListBox::HandleWheelAsCursorTravel( const CommandEvent& rCEvt )
@@ -2542,7 +2548,7 @@ void ImplListBox::SetMRUEntries( const OUString& rEntries, sal_Unicode cSep )

    // Remove old MRU entries
    for ( sal_Int32 n = GetEntryList()->GetMRUCount();n; )
        maLBWindow.RemoveEntry( --n );
        maLBWindow->RemoveEntry( --n );

    sal_Int32 nMRUCount = 0;
    sal_Int32 nIndex = 0;
@@ -2553,7 +2559,7 @@ void ImplListBox::SetMRUEntries( const OUString& rEntries, sal_Unicode cSep )
        if ( GetEntryList()->FindEntry( aEntry ) != LISTBOX_ENTRY_NOTFOUND )
        {
            ImplEntryType* pNewEntry = new ImplEntryType( aEntry );
            maLBWindow.GetEntryList()->InsertEntry( nMRUCount++, pNewEntry, false );
            maLBWindow->GetEntryList()->InsertEntry( nMRUCount++, pNewEntry, false );
            bChanges = true;
        }
    }
@@ -2561,7 +2567,7 @@ void ImplListBox::SetMRUEntries( const OUString& rEntries, sal_Unicode cSep )

    if ( bChanges )
    {
        maLBWindow.GetEntryList()->SetMRUCount( nMRUCount );
        maLBWindow->GetEntryList()->SetMRUCount( nMRUCount );
        SetSeparatorPos( nMRUCount ? nMRUCount-1 : 0 );
        StateChanged( StateChangedType::DATA );
    }
@@ -2584,7 +2590,7 @@ void ImplListBox::SetEdgeBlending(bool bNew)
    if(mbEdgeBlending != bNew)
    {
        mbEdgeBlending = bNew;
        maLBWindow.SetEdgeBlending(GetEdgeBlending());
        maLBWindow->SetEdgeBlending(GetEdgeBlending());
    }
}

@@ -2959,13 +2965,13 @@ void ImplListBoxFloatingWindow::setPosSizePixel( long nX, long nY, long nWidth, 
        // this the presence of the vertical Scrollbar has to be known.
        mpImplLB->SetSizePixel( GetOutputSizePixel() );
        ((vcl::Window*)mpImplLB)->Resize();
        ((vcl::Window&)mpImplLB->GetMainWindow()).Resize();
        ((vcl::Window*)mpImplLB->GetMainWindow().get())->Resize();
    }
}

void ImplListBoxFloatingWindow::Resize()
{
    mpImplLB->GetMainWindow().ImplClearLayoutData();
    mpImplLB->GetMainWindow()->ImplClearLayoutData();
    FloatingWindow::Resize();
}

@@ -3085,12 +3091,12 @@ void ImplListBoxFloatingWindow::StartFloat( bool bStartTracking )
            mpImplLB->ShowProminentEntry( nPos );

        if( bStartTracking )
            mpImplLB->GetMainWindow().EnableMouseMoveSelect( true );
            mpImplLB->GetMainWindow()->EnableMouseMoveSelect( true );

        if ( mpImplLB->GetMainWindow().IsGrabFocusAllowed() )
            mpImplLB->GetMainWindow().GrabFocus();
        if ( mpImplLB->GetMainWindow()->IsGrabFocusAllowed() )
            mpImplLB->GetMainWindow()->GrabFocus();

        mpImplLB->GetMainWindow().ImplClearLayoutData();
        mpImplLB->GetMainWindow()->ImplClearLayoutData();
    }
}

diff --git a/vcl/source/control/lstbox.cxx b/vcl/source/control/lstbox.cxx
index 3669e18..ee856fc 100644
--- a/vcl/source/control/lstbox.cxx
+++ b/vcl/source/control/lstbox.cxx
@@ -39,7 +39,7 @@

void ListBox::EnableQuickSelection( const bool& b )
{
    mpImplLB->GetMainWindow().EnableQuickSelection(b);
    mpImplLB->GetMainWindow()->EnableQuickSelection(b);
}

ListBox::ListBox(WindowType nType)
@@ -173,7 +173,7 @@ void ListBox::ImplInit( vcl::Window* pParent, WinBits nStyle )
        mpImplLB->SetSelectionChangedHdl( LINK( this, ListBox, ImplSelectionChangedHdl ) );
    }
    else
        mpImplLB->GetMainWindow().AllowGrabFocus( true );
        mpImplLB->GetMainWindow()->AllowGrabFocus( true );

    SetCompoundControl( true );
}
@@ -311,7 +311,7 @@ void ListBox::ImplClickButtonHandler( Control* )

        ImplClearLayoutData();
        if( mpImplLB )
            mpImplLB->GetMainWindow().ImplClearLayoutData();
            mpImplLB->GetMainWindow()->ImplClearLayoutData();
        if( mpImplWin )
            mpImplWin->ImplClearLayoutData();
    }
@@ -341,7 +341,7 @@ IMPL_LINK_NOARG(ListBox, ImplPopupModeEndHdl)

    ImplClearLayoutData();
    if( mpImplLB )
        mpImplLB->GetMainWindow().ImplClearLayoutData();
        mpImplLB->GetMainWindow()->ImplClearLayoutData();
    if( mpImplWin )
        mpImplWin->ImplClearLayoutData();

@@ -369,11 +369,11 @@ void ListBox::ToggleDropDown()

void ListBox::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong nFlags )
{
    mpImplLB->GetMainWindow().ImplInitSettings( true, true, true );
    mpImplLB->GetMainWindow()->ImplInitSettings( true, true, true );

    Point aPos = pDev->LogicToPixel( rPos );
    Size aSize = pDev->LogicToPixel( rSize );
    vcl::Font aFont = mpImplLB->GetMainWindow().GetDrawPixelFont( pDev );
    vcl::Font aFont = mpImplLB->GetMainWindow()->GetDrawPixelFont( pDev );
    OutDevType eOutDevType = pDev->GetOutDevType();

    pDev->Push();
@@ -691,7 +691,7 @@ void ListBox::Resize()
void ListBox::FillLayoutData() const
{
    mpControlData->mpLayoutData = new vcl::ControlLayoutData();
    const Control& rMainWin = mpImplLB->GetMainWindow();
    const ImplListBoxWindowPtr rMainWin = mpImplLB->GetMainWindow();
    if( mpFloatWin )
    {
        // Dropdown mode
@@ -699,14 +699,14 @@ void ListBox::FillLayoutData() const
        mpImplWin->SetLayoutDataParent( this );
        if( mpFloatWin->IsReallyVisible() )
        {
            AppendLayoutData( rMainWin );
            rMainWin.SetLayoutDataParent( this );
            AppendLayoutData( *(rMainWin.get()) );
            rMainWin->SetLayoutDataParent( this );
        }
    }
    else
    {
        AppendLayoutData( rMainWin );
        rMainWin.SetLayoutDataParent( this );
        AppendLayoutData( *(rMainWin.get()) );
        rMainWin->SetLayoutDataParent( this );
    }
}

@@ -721,16 +721,16 @@ long ListBox::GetIndexForPoint( const Point& rPoint, sal_Int32& rPos ) const
    {
        // Point must be either in main list window
        // or in impl window (dropdown case)
        ImplListBoxWindow& rMain = mpImplLB->GetMainWindow();
        ImplListBoxWindowPtr rMain = mpImplLB->GetMainWindow();

        // Convert coordinates to ImplListBoxWindow pixel coordinate space
        Point aConvPoint = LogicToPixel( rPoint );
        aConvPoint = OutputToAbsoluteScreenPixel( aConvPoint );
        aConvPoint = rMain.AbsoluteScreenToOutputPixel( aConvPoint );
        aConvPoint = rMain.PixelToLogic( aConvPoint );
        aConvPoint = rMain->AbsoluteScreenToOutputPixel( aConvPoint );
        aConvPoint = rMain->PixelToLogic( aConvPoint );

        // Try to find entry
        sal_Int32 nEntry = rMain.GetEntryPosForPoint( aConvPoint );
        sal_Int32 nEntry = rMain->GetEntryPosForPoint( aConvPoint );
        if( nEntry == LISTBOX_ENTRY_NOTFOUND )
        {
            // Not found, maybe dropdown case
@@ -803,7 +803,7 @@ void ListBox::StateChanged( StateChangedType nType )
        if ( mpImplWin )
        {
            mpImplWin->SetZoom( GetZoom() );
            mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() );
            mpImplWin->SetFont( mpImplLB->GetMainWindow()->GetFont() );
            mpImplWin->Invalidate();
        }
        Resize();
@@ -814,7 +814,7 @@ void ListBox::StateChanged( StateChangedType nType )
        if ( mpImplWin )
        {
            mpImplWin->SetControlFont( GetControlFont() );
            mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() );
            mpImplWin->SetFont( mpImplLB->GetMainWindow()->GetFont() );
            mpImplWin->Invalidate();
        }
        Resize();
@@ -826,7 +826,7 @@ void ListBox::StateChanged( StateChangedType nType )
        {
            mpImplWin->SetControlForeground( GetControlForeground() );
            mpImplWin->SetTextColor( GetControlForeground() );
            mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() );
            mpImplWin->SetFont( mpImplLB->GetMainWindow()->GetFont() );
            mpImplWin->Invalidate();
        }
    }
@@ -843,17 +843,17 @@ void ListBox::StateChanged( StateChangedType nType )
            }
            else
            {
                mpImplWin->SetBackground( mpImplLB->GetMainWindow().GetControlBackground() );
                mpImplWin->SetControlBackground( mpImplLB->GetMainWindow().GetControlBackground() );
                mpImplWin->SetBackground( mpImplLB->GetMainWindow()->GetControlBackground() );
                mpImplWin->SetControlBackground( mpImplLB->GetMainWindow()->GetControlBackground() );
            }
            mpImplWin->SetFont( mpImplLB->GetMainWindow().GetFont() );
            mpImplWin->SetFont( mpImplLB->GetMainWindow()->GetFont() );
            mpImplWin->Invalidate();
        }
    }
    else if ( nType == StateChangedType::STYLE )
    {
        SetStyle( ImplInitStyle( GetStyle() ) );
        mpImplLB->GetMainWindow().EnableSort( ( GetStyle() & WB_SORT ) ? true : false );
        mpImplLB->GetMainWindow()->EnableSort( ( GetStyle() & WB_SORT ) ? true : false );
        bool bSimpleMode = ( GetStyle() & WB_SIMPLEMODE ) ? true : false;
        mpImplLB->SetMultiSelectionSimpleMode( bSimpleMode );
    }
@@ -1157,8 +1157,8 @@ bool ListBox::IsInDropDown() const

Rectangle ListBox::GetBoundingRectangle( sal_Int32 nItem ) const
{
    Rectangle aRect = mpImplLB->GetMainWindow().GetBoundingRectangle( nItem );
    Rectangle aOffset = mpImplLB->GetMainWindow().GetWindowExtentsRelative( (vcl::Window*)this );
    Rectangle aRect = mpImplLB->GetMainWindow()->GetBoundingRectangle( nItem );
    Rectangle aOffset = mpImplLB->GetMainWindow()->GetWindowExtentsRelative( (vcl::Window*)this );
    aRect.Move( aOffset.TopLeft().X(), aOffset.TopLeft().Y() );
    return aRect;
}
@@ -1180,7 +1180,7 @@ void ListBox::EnableMultiSelection( bool bMulti, bool bStackSelection )

    // In a MultiSelection, we can't see us travelling without focus
    if ( mpFloatWin )
        mpImplLB->GetMainWindow().AllowGrabFocus( bMulti );
        mpImplLB->GetMainWindow()->AllowGrabFocus( bMulti );
}

bool ListBox::IsMultiSelectionEnabled() const
@@ -1348,7 +1348,7 @@ void ListBox::GetMaxVisColumnsAndLines( sal_uInt16& rnCols, sal_uInt16& rnLines 
    float nCharWidth = approximate_char_width();
    if ( !IsDropDownBox() )
    {
        Size aOutSz = mpImplLB->GetMainWindow().GetOutputSizePixel();
        Size aOutSz = mpImplLB->GetMainWindow()->GetOutputSizePixel();
        rnCols = (sal_uInt16) (aOutSz.Width()/nCharWidth);
        rnLines = (sal_uInt16) (aOutSz.Height()/mpImplLB->GetEntryHeight());
    }
@@ -1371,22 +1371,22 @@ void ListBox::UserDraw( const UserDrawEvent& )

void ListBox::DrawEntry( const UserDrawEvent& rEvt, bool bDrawImage, bool bDrawText, bool bDrawTextAtImagePos )
{
    if ( rEvt.GetDevice() == &mpImplLB->GetMainWindow() )
        mpImplLB->GetMainWindow().DrawEntry( rEvt.GetItemId(), bDrawImage, bDrawText, bDrawTextAtImagePos );
    if ( rEvt.GetDevice() == mpImplLB->GetMainWindow().get() )
        mpImplLB->GetMainWindow()->DrawEntry( rEvt.GetItemId(), bDrawImage, bDrawText, bDrawTextAtImagePos );
    else if ( rEvt.GetDevice() == mpImplWin )
        mpImplWin->DrawEntry( bDrawImage, bDrawText, bDrawTextAtImagePos );
}

void ListBox::SetUserItemSize( const Size& rSz )
{
    mpImplLB->GetMainWindow().SetUserItemSize( rSz );
    mpImplLB->GetMainWindow()->SetUserItemSize( rSz );
    if ( mpImplWin )
        mpImplWin->SetUserItemSize( rSz );
}

void ListBox::EnableUserDraw( bool bUserDraw )
{
    mpImplLB->GetMainWindow().EnableUserDraw( bUserDraw );
    mpImplLB->GetMainWindow()->EnableUserDraw( bUserDraw );
    if ( mpImplWin )
        mpImplWin->EnableUserDraw( bUserDraw );
}
diff --git a/vcl/source/window/menubarwindow.cxx b/vcl/source/window/menubarwindow.cxx
index 553baa4..126e8b9 100644
--- a/vcl/source/window/menubarwindow.cxx
+++ b/vcl/source/window/menubarwindow.cxx
@@ -117,9 +117,9 @@ void DecoToolBox::SetImages( long nMaxHeight, bool bForce )

MenuBarWindow::MenuBarWindow( vcl::Window* pParent ) :
    Window( pParent, 0 ),
    aCloseBtn(this),
    aFloatBtn( this, WB_NOPOINTERFOCUS | WB_SMALLSTYLE | WB_RECTSTYLE ),
    aHideBtn( this, WB_NOPOINTERFOCUS | WB_SMALLSTYLE | WB_RECTSTYLE )
    aCloseBtn(new DecoToolBox(this)),
    aFloatBtn(new PushButton( this, WB_NOPOINTERFOCUS | WB_SMALLSTYLE | WB_RECTSTYLE )),
    aHideBtn(new PushButton(this, WB_NOPOINTERFOCUS | WB_SMALLSTYLE | WB_RECTSTYLE ))
{
    SetType( WINDOW_MENUBARWINDOW );
    pMenu = NULL;
@@ -137,25 +137,25 @@ MenuBarWindow::MenuBarWindow( vcl::Window* pParent ) :
    if( pResMgr )
    {
        BitmapEx aBitmap( ResId( SV_RESID_BITMAP_CLOSEDOC, *pResMgr ) );
        aCloseBtn.maImage = Image(aBitmap);
        aCloseBtn->maImage = Image(aBitmap);

        aCloseBtn.SetOutStyle(TOOLBOX_STYLE_FLAT);
        aCloseBtn.SetBackground();
        aCloseBtn.SetPaintTransparent(true);
        aCloseBtn.SetParentClipMode(PARENTCLIPMODE_NOCLIP);
        aCloseBtn->SetOutStyle(TOOLBOX_STYLE_FLAT);
        aCloseBtn->SetBackground();
        aCloseBtn->SetPaintTransparent(true);
        aCloseBtn->SetParentClipMode(PARENTCLIPMODE_NOCLIP);

        aCloseBtn.InsertItem(IID_DOCUMENTCLOSE, aCloseBtn.maImage, ToolBoxItemBits::NONE);
        aCloseBtn.SetSelectHdl(LINK(this, MenuBarWindow, CloseHdl));
        aCloseBtn.AddEventListener(LINK(this, MenuBarWindow, ToolboxEventHdl));
        aCloseBtn.SetQuickHelpText(IID_DOCUMENTCLOSE, ResId(SV_HELPTEXT_CLOSEDOCUMENT, *pResMgr).toString());
        aCloseBtn->InsertItem(IID_DOCUMENTCLOSE, aCloseBtn->maImage, ToolBoxItemBits::NONE);
        aCloseBtn->SetSelectHdl(LINK(this, MenuBarWindow, CloseHdl));
        aCloseBtn->AddEventListener(LINK(this, MenuBarWindow, ToolboxEventHdl));
        aCloseBtn->SetQuickHelpText(IID_DOCUMENTCLOSE, ResId(SV_HELPTEXT_CLOSEDOCUMENT, *pResMgr).toString());

        aFloatBtn.SetClickHdl( LINK( this, MenuBarWindow, FloatHdl ) );
        aFloatBtn.SetSymbol( SymbolType::FLOAT );
        aFloatBtn.SetQuickHelpText( ResId(SV_HELPTEXT_RESTORE, *pResMgr).toString() );
        aFloatBtn->SetClickHdl( LINK( this, MenuBarWindow, FloatHdl ) );
        aFloatBtn->SetSymbol( SymbolType::FLOAT );
        aFloatBtn->SetQuickHelpText( ResId(SV_HELPTEXT_RESTORE, *pResMgr).toString() );

        aHideBtn.SetClickHdl( LINK( this, MenuBarWindow, HideHdl ) );
        aHideBtn.SetSymbol( SymbolType::HIDE );
        aHideBtn.SetQuickHelpText( ResId(SV_HELPTEXT_MINIMIZE, *pResMgr).toString() );
        aHideBtn->SetClickHdl( LINK( this, MenuBarWindow, HideHdl ) );
        aHideBtn->SetSymbol( SymbolType::HIDE );
        aHideBtn->SetQuickHelpText( ResId(SV_HELPTEXT_MINIMIZE, *pResMgr).toString() );
    }

    ImplInitStyleSettings();
@@ -165,7 +165,7 @@ MenuBarWindow::MenuBarWindow( vcl::Window* pParent ) :

MenuBarWindow::~MenuBarWindow()
{
    aCloseBtn.RemoveEventListener(LINK(this, MenuBarWindow, ToolboxEventHdl));
    aCloseBtn->RemoveEventListener(LINK(this, MenuBarWindow, ToolboxEventHdl));
    RemoveEventListener(LINK(this, MenuBarWindow, ShowHideListener));
}

@@ -177,10 +177,10 @@ void MenuBarWindow::SetMenu( MenuBar* pMen )
    ImplInitMenuWindow( this, true, true );
    if ( pMen )
    {
        aCloseBtn.ShowItem(IID_DOCUMENTCLOSE, pMen->HasCloseButton());
        aCloseBtn.Show(pMen->HasCloseButton() || !m_aAddButtons.empty());
        aFloatBtn.Show(pMen->HasFloatButton());
        aHideBtn.Show(pMen->HasHideButton());
        aCloseBtn->ShowItem(IID_DOCUMENTCLOSE, pMen->HasCloseButton());
        aCloseBtn->Show(pMen->HasCloseButton() || !m_aAddButtons.empty());
        aFloatBtn->Show(pMen->HasFloatButton());
        aHideBtn->Show(pMen->HasHideButton());
    }
    Invalidate();

@@ -201,16 +201,16 @@ void MenuBarWindow::SetHeight(long nHeight)

void MenuBarWindow::ShowButtons( bool bClose, bool bFloat, bool bHide )
{
    aCloseBtn.ShowItem(IID_DOCUMENTCLOSE, bClose);
    aCloseBtn.Show(bClose || !m_aAddButtons.empty());
    aFloatBtn.Show( bFloat );
    aHideBtn.Show( bHide );
    aCloseBtn->ShowItem(IID_DOCUMENTCLOSE, bClose);
    aCloseBtn->Show(bClose || !m_aAddButtons.empty());
    aFloatBtn->Show( bFloat );
    aHideBtn->Show( bHide );
    Resize();
}

Size MenuBarWindow::MinCloseButtonSize()
{
    return aCloseBtn.getMinSize();
    return aCloseBtn->getMinSize();
}

IMPL_LINK_NOARG(MenuBarWindow, CloseHdl)
@@ -218,7 +218,7 @@ IMPL_LINK_NOARG(MenuBarWindow, CloseHdl)
    if( ! pMenu )
        return 0;

    if( aCloseBtn.GetCurItemId() == IID_DOCUMENTCLOSE )
    if( aCloseBtn->GetCurItemId() == IID_DOCUMENTCLOSE )
    {
        // #i106052# call close hdl asynchronously to ease handler implementation
        // this avoids still being in the handler while the DecoToolBox already
@@ -227,12 +227,12 @@ IMPL_LINK_NOARG(MenuBarWindow, CloseHdl)
    }
    else
    {
        std::map<sal_uInt16,AddButtonEntry>::iterator it = m_aAddButtons.find(aCloseBtn.GetCurItemId());
        std::map<sal_uInt16,AddButtonEntry>::iterator it = m_aAddButtons.find(aCloseBtn->GetCurItemId());
        if( it != m_aAddButtons.end() )
        {
            MenuBar::MenuBarButtonCallbackArg aArg;
            aArg.nId = it->first;
            aArg.bHighlight = (aCloseBtn.GetHighlightItemId() == it->first);
            aArg.bHighlight = (aCloseBtn->GetHighlightItemId() == it->first);
            aArg.pMenuBar = dynamic_cast<MenuBar*>(pMenu);
            return it->second.m_aSelectLink.Call( &aArg );
        }
@@ -250,11 +250,11 @@ IMPL_LINK( MenuBarWindow, ToolboxEventHdl, VclWindowEvent*, pEvent )
    aArg.bHighlight = (pEvent->GetId() == VCLEVENT_TOOLBOX_HIGHLIGHT);
    aArg.pMenuBar = dynamic_cast<MenuBar*>(pMenu);
    if( pEvent->GetId() == VCLEVENT_TOOLBOX_HIGHLIGHT )
        aArg.nId = aCloseBtn.GetHighlightItemId();
        aArg.nId = aCloseBtn->GetHighlightItemId();
    else if( pEvent->GetId() == VCLEVENT_TOOLBOX_HIGHLIGHTOFF )
    {
        sal_uInt16 nPos = static_cast< sal_uInt16 >(reinterpret_cast<sal_IntPtr>(pEvent->GetData()));
        aArg.nId = aCloseBtn.GetItemId(nPos);
        aArg.nId = aCloseBtn->GetItemId(nPos);
    }
    std::map< sal_uInt16, AddButtonEntry >::iterator it = m_aAddButtons.find( aArg.nId );
    if( it != m_aAddButtons.end() )
@@ -913,30 +913,30 @@ void MenuBarWindow::Resize()
    long nX     = aOutSz.Width()-3;
    long nY     = 2;

    if ( aCloseBtn.IsVisible() )
    if ( aCloseBtn->IsVisible() )
    {
        aCloseBtn.Hide();
        aCloseBtn.SetImages(n);
        Size aTbxSize( aCloseBtn.CalcWindowSizePixel() );
        aCloseBtn->Hide();
        aCloseBtn->SetImages(n);
        Size aTbxSize( aCloseBtn->CalcWindowSizePixel() );
        nX -= aTbxSize.Width();
        long nTbxY = (aOutSz.Height() - aTbxSize.Height())/2;
        aCloseBtn.setPosSizePixel(nX, nTbxY, aTbxSize.Width(), aTbxSize.Height());
        aCloseBtn->setPosSizePixel(nX, nTbxY, aTbxSize.Width(), aTbxSize.Height());
        nX -= 3;
        aCloseBtn.Show();
        aCloseBtn->Show();
    }
    if ( aFloatBtn.IsVisible() )
    if ( aFloatBtn->IsVisible() )
    {
        nX -= n;
        aFloatBtn.setPosSizePixel( nX, nY, n, n );
        aFloatBtn->setPosSizePixel( nX, nY, n, n );
    }
    if ( aHideBtn.IsVisible() )
    if ( aHideBtn->IsVisible() )
    {
        nX -= n;
        aHideBtn.setPosSizePixel( nX, nY, n, n );
        aHideBtn->setPosSizePixel( nX, nY, n, n );
    }

    aFloatBtn.SetSymbol( SymbolType::FLOAT );
    aHideBtn.SetSymbol( SymbolType::HIDE );
    aFloatBtn->SetSymbol( SymbolType::FLOAT );
    aHideBtn->SetSymbol( SymbolType::HIDE );

    Invalidate();
}
@@ -1057,6 +1057,15 @@ void MenuBarWindow::GetFocus()
    }
}

void MenuBarWindow::dispose()
{
    aCloseBtn.disposeAndClear();
    aFloatBtn.disposeAndClear();
    aHideBtn.disposeAndClear();
    Window::dispose();
}


::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > MenuBarWindow::CreateAccessible()
{
    ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > xAcc;
@@ -1083,9 +1092,9 @@ sal_uInt16 MenuBarWindow::AddMenuBarButton( const Image& i_rImage, const Link& i
    AddButtonEntry& rNewEntry = m_aAddButtons[nId];
    rNewEntry.m_nId = nId;
    rNewEntry.m_aSelectLink = i_rLink;
    aCloseBtn.InsertItem(nId, i_rImage, ToolBoxItemBits::NONE, 0);
    aCloseBtn.calcMinSize();
    ShowButtons(aCloseBtn.IsItemVisible(IID_DOCUMENTCLOSE), aFloatBtn.IsVisible(), aHideBtn.IsVisible());
    aCloseBtn->InsertItem(nId, i_rImage, ToolBoxItemBits::NONE, 0);
    aCloseBtn->calcMinSize();
    ShowButtons(aCloseBtn->IsItemVisible(IID_DOCUMENTCLOSE), aFloatBtn->IsVisible(), aHideBtn->IsVisible());
    LayoutChanged();

    if( pMenu->mpSalMenu )
@@ -1118,8 +1127,8 @@ Rectangle MenuBarWindow::GetMenuBarButtonRectPixel( sal_uInt16 nId )

        if( aRect.IsEmpty() )
        {
            aRect = aCloseBtn.GetItemRect(nId);
            Point aOffset = aCloseBtn.OutputToScreenPixel(Point());
            aRect = aCloseBtn->GetItemRect(nId);
            Point aOffset = aCloseBtn->OutputToScreenPixel(Point());
            aRect.Move( aOffset.X(), aOffset.Y() );
        }
    }
@@ -1128,10 +1137,10 @@ Rectangle MenuBarWindow::GetMenuBarButtonRectPixel( sal_uInt16 nId )

void MenuBarWindow::RemoveMenuBarButton( sal_uInt16 nId )
{
    sal_uInt16 nPos = aCloseBtn.GetItemPos(nId);
    aCloseBtn.RemoveItem(nPos);
    sal_uInt16 nPos = aCloseBtn->GetItemPos(nId);
    aCloseBtn->RemoveItem(nPos);
    m_aAddButtons.erase( nId );
    aCloseBtn.calcMinSize();
    aCloseBtn->calcMinSize();
    LayoutChanged();

    if( pMenu->mpSalMenu )
diff --git a/vcl/source/window/menubarwindow.hxx b/vcl/source/window/menubarwindow.hxx
index 46c79ac..b347847 100644
--- a/vcl/source/window/menubarwindow.hxx
+++ b/vcl/source/window/menubarwindow.hxx
@@ -52,6 +52,9 @@ public:
    Image   maImage;
};

typedef VclReference<DecoToolBox> DecoToolBoxPtr;


/** Class that implements the actual window of the menu bar.
*/
class MenuBarWindow : public vcl::Window, public IMenuBarWindow
@@ -62,32 +65,32 @@ class MenuBarWindow : public vcl::Window, public IMenuBarWindow
private:
    struct AddButtonEntry
    {
        sal_uInt16      m_nId;
        Link        m_aSelectLink;
        Link        m_aHighlightLink;
        sal_uInt16    m_nId;
        Link          m_aSelectLink;
        Link          m_aHighlightLink;

        AddButtonEntry() : m_nId( 0 ) {}
    };

    Menu*           pMenu;
    PopupMenu*      pActivePopup;
    sal_uInt16          nHighlightedItem;
    sal_uInt16          nRolloveredItem;
    sal_uLong           nSaveFocusId;
    sal_uInt16      nHighlightedItem;
    sal_uInt16      nRolloveredItem;
    sal_uLong       nSaveFocusId;
    bool            mbAutoPopup;
    bool            bIgnoreFirstMove;
    bool            bStayActive;

    DecoToolBox     aCloseBtn;
    PushButton      aFloatBtn;
    PushButton      aHideBtn;
    DecoToolBoxPtr  aCloseBtn;
    PushButtonPtr   aFloatBtn;
    PushButtonPtr   aHideBtn;

    std::map< sal_uInt16, AddButtonEntry > m_aAddButtons;

    void            HighlightItem( sal_uInt16 nPos, bool bHighlight );
    virtual void    ChangeHighlightItem(sal_uInt16 n, bool bSelectPopupEntry, bool bAllowRestoreFocus = true, bool bDefaultToDocument = true) SAL_OVERRIDE;

    sal_uInt16          ImplFindEntry( const Point& rMousePos ) const;
    sal_uInt16      ImplFindEntry( const Point& rMousePos ) const;
    void            ImplCreatePopup( bool bPreSelectFirst );
    virtual bool    HandleKeyEvent(const KeyEvent& rKEvent, bool bFromMenu = true) SAL_OVERRIDE;
    Rectangle       ImplGetItemRect( sal_uInt16 nPos );
@@ -104,6 +107,7 @@ private:
    void            DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
    void            LoseFocus() SAL_OVERRIDE;
    void            GetFocus() SAL_OVERRIDE;
    virtual void    dispose() SAL_OVERRIDE;

public:
                    MenuBarWindow( vcl::Window* pParent );
diff --git a/vcl/source/window/printdlg.cxx b/vcl/source/window/printdlg.cxx
index c4ea5c7..0015caf 100644
--- a/vcl/source/window/printdlg.cxx
+++ b/vcl/source/window/printdlg.cxx
@@ -67,17 +67,17 @@ PrintDialog::PrintPreviewWindow::PrintPreviewWindow( vcl::Window* i_pParent )
    , maPageVDev( *this )
    , maToolTipString(VclResId( SV_PRINT_PRINTPREVIEW_TXT).toString())
    , mbGreyscale( false )
    , maHorzDim( this, WB_HORZ | WB_CENTER  )
    , maVertDim( this, WB_VERT | WB_VCENTER )
    , maHorzDim(new FixedLine(this, WB_HORZ | WB_CENTER))
    , maVertDim(new FixedLine(this, WB_VERT | WB_VCENTER))
{
    SetPaintTransparent( true );
    SetBackground();
    maPageVDev.SetBackground( Color( COL_WHITE ) );
    maHorzDim.Show();
    maVertDim.Show();
    maHorzDim->Show();
    maVertDim->Show();

    maHorzDim.SetText( OUString( "2.0in" ) );
    maVertDim.SetText( OUString( "2.0in" ) );
    maHorzDim->SetText( OUString( "2.0in" ) );
    maVertDim->SetText( OUString( "2.0in" ) );
}

PrintDialog::PrintPreviewWindow::~PrintPreviewWindow()
@@ -99,7 +99,7 @@ void PrintDialog::PrintPreviewWindow::DataChanged( const DataChangedEvent& i_rDC
void PrintDialog::PrintPreviewWindow::Resize()
{
    Size aNewSize( GetSizePixel() );
    long nTextHeight = maHorzDim.GetTextHeight();
    long nTextHeight = maHorzDim->GetTextHeight();
    // leave small space for decoration
    aNewSize.Width() -= nTextHeight + 2;
    aNewSize.Height() -= nTextHeight + 2;
@@ -145,16 +145,16 @@ void PrintDialog::PrintPreviewWindow::Resize()
    // position dimension lines
    Point aRef( nTextHeight + (aNewSize.Width() - maPreviewSize.Width())/2,
                nTextHeight + (aNewSize.Height() - maPreviewSize.Height())/2 );
    maHorzDim.SetPosSizePixel( Point( aRef.X(), aRef.Y() - nTextHeight ),
    maHorzDim->SetPosSizePixel( Point( aRef.X(), aRef.Y() - nTextHeight ),
                               Size( maPreviewSize.Width(), nTextHeight ) );
    maVertDim.SetPosSizePixel( Point( aRef.X() - nTextHeight, aRef.Y() ),
    maVertDim->SetPosSizePixel( Point( aRef.X() - nTextHeight, aRef.Y() ),
                               Size( nTextHeight, maPreviewSize.Height() ) );

}

void PrintDialog::PrintPreviewWindow::Paint( const Rectangle& )
{
    long nTextHeight = maHorzDim.GetTextHeight();
    long nTextHeight = maHorzDim->GetTextHeight();
    Size aSize( GetSizePixel() );
    Point aOffset( (aSize.Width()  - maPreviewSize.Width()  + nTextHeight) / 2 ,
                   (aSize.Height() - maPreviewSize.Height() + nTextHeight) / 2 );
@@ -241,19 +241,26 @@ void PrintDialog::PrintPreviewWindow::setPreview( const GDIMetaFile& i_rNewPrevi
        aBuf.append( i_rPaperName );
        aBuf.append( ')' );
    }
    maHorzDim.SetText( aBuf.makeStringAndClear() );
    maHorzDim->SetText( aBuf.makeStringAndClear() );

    aNumText = rLocWrap.getNum( aLogicPaperSize.Height(), nDigits );
    aBuf.append( aNumText )
        .append( sal_Unicode( ' ' ) );
    aBuf.appendAscii( eUnit == MAP_MM ? "mm" : "in" );
    maVertDim.SetText( aBuf.makeStringAndClear() );
    maVertDim->SetText( aBuf.makeStringAndClear() );

    Resize();
    preparePreviewBitmap();
    Invalidate();
}

void PrintDialog::PrintPreviewWindow::dispose()
{
    maHorzDim.disposeAndClear();
    maVertDim.disposeAndClear();
    Window::dispose();
}

void PrintDialog::PrintPreviewWindow::preparePreviewBitmap()
{
    GDIMetaFile aMtf( maMtf );
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 6fdb764..156cc66 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -131,14 +131,8 @@ namespace
}
#endif

Window::~Window()
void Window::dispose()
{
    vcl::LazyDeletor<vcl::Window>::Undelete( this );

    DBG_ASSERT( !mpWindowImpl->mbInDtor, "~Window - already in DTOR!" );

    dispose();

    // remove Key and Mouse events issued by Application::PostKey/MouseEvent
    Application::RemoveMouseAndKeyEvents( this );

@@ -568,6 +562,13 @@ Window::~Window()
    delete mpWindowImpl; mpWindowImpl = NULL;
}

Window::~Window()
{
    vcl::LazyDeletor<vcl::Window>::Undelete( this );

    DBG_ASSERT( !mpWindowImpl->mbInDtor, "~Window - already in DTOR!" );
}

} /* namespace vcl */

WindowImpl::WindowImpl( WindowType nType )
diff --git a/vcl/unx/generic/app/i18n_status.cxx b/vcl/unx/generic/app/i18n_status.cxx
index e957671..85e9e50 100644
--- a/vcl/unx/generic/app/i18n_status.cxx
+++ b/vcl/unx/generic/app/i18n_status.cxx
@@ -77,7 +77,7 @@ namespace vcl {

class XIMStatusWindow : public StatusWindow
{
    FixedText               m_aStatusText;
    FixedTextPtr            m_aStatusText;
    SalFrame*               m_pLastParent;
    Size                    m_aWindowSize;
    bool                    m_bAnchoredAtRight;
@@ -104,6 +104,7 @@ public:
    virtual void setText( const OUString & ) SAL_OVERRIDE;
    virtual void show( bool bShow, I18NStatus::ShowReason eReason ) SAL_OVERRIDE;
    virtual void toggle( bool bOn ) SAL_OVERRIDE;
    virtual void dispose() SAL_OVERRIDE;

    // override WorkWindow::DataChanged
    virtual void DataChanged( const DataChangedEvent& rEvt ) SAL_OVERRIDE;
@@ -113,7 +114,7 @@ public:

XIMStatusWindow::XIMStatusWindow( bool bOn ) :
        StatusWindow( WB_BORDER | WB_SYSTEMFLOATWIN | WB_TOOLTIPWIN ),
        m_aStatusText( this, 0 ),
        m_aStatusText(new FixedText(this, 0)),
        m_pLastParent( NULL ),
        m_bAnchoredAtRight( false ),
        m_bDelayedShow( false ),
@@ -136,10 +137,16 @@ void XIMStatusWindow::toggle( bool bOn )
    show( bOn, I18NStatus::contextmap );
}

void XIMStatusWindow::dispose()
{
    m_aStatusText.disposeAndClear();
    StatusWindow::dispose();
};

void XIMStatusWindow::layout()
{
    m_aWindowSize.Width() = m_aStatusText.GetTextWidth( m_aStatusText.GetText() )+8;
    Font aFont( m_aStatusText.GetFont() );
    m_aWindowSize.Width() = m_aStatusText->GetTextWidth( m_aStatusText->GetText() )+8;
    Font aFont( m_aStatusText->GetFont() );
    m_aWindowSize.Height() = aFont.GetHeight()+10;
    m_aWindowSize = LogicToPixel( m_aWindowSize );

@@ -147,9 +154,9 @@ void XIMStatusWindow::layout()
    aControlSize.Width()  -= 4;
    aControlSize.Height() -= 4;

    m_aStatusText.SetPosSizePixel( Point( 1, 1 ), aControlSize );
    m_aStatusText.SetFont( aFont );
    m_aStatusText.Show( true );
    m_aStatusText->SetPosSizePixel( Point( 1, 1 ), aControlSize );
    m_aStatusText->SetFont( aFont );
    m_aStatusText->Show( true );

    if (m_bAnchoredAtRight && IsVisible())
    {
@@ -181,7 +188,7 @@ bool XIMStatusWindow::checkLastParent() const

void XIMStatusWindow::DataChanged( const DataChangedEvent& )
{
    m_aStatusText.SetSettings( GetSettings() );
    m_aStatusText->SetSettings( GetSettings() );
    layout();
}

@@ -261,7 +268,7 @@ IMPL_LINK_NOARG(XIMStatusWindow, DelayedShowHdl)
    if( m_bDelayedShow )
    {
        Size aControlSize( m_aWindowSize.Width()-4, m_aWindowSize.Height()-4 );
        m_aStatusText.SetPosSizePixel( Point( 1, 1 ), aControlSize );
        m_aStatusText->SetPosSizePixel( Point( 1, 1 ), aControlSize );
        Point aPoint = updatePosition();
        pStatusFrame->SetPosSize( aPoint.X(), aPoint.Y(), m_aWindowSize.Width(), m_aWindowSize.Height(), SAL_FRAME_POSSIZE_X | SAL_FRAME_POSSIZE_Y | SAL_FRAME_POSSIZE_WIDTH | SAL_FRAME_POSSIZE_HEIGHT );
    }
@@ -276,7 +283,7 @@ IMPL_LINK_NOARG(XIMStatusWindow, DelayedShowHdl)

void XIMStatusWindow::show( bool bShow, I18NStatus::ShowReason eReason )
{
    if( bShow && m_aStatusText.GetText().isEmpty() )
    if( bShow && m_aStatusText->GetText().isEmpty() )
        bShow = false;

    m_bDelayedShow = bShow;
@@ -287,15 +294,15 @@ void XIMStatusWindow::show( bool bShow, I18NStatus::ShowReason eReason )

void XIMStatusWindow::setText( const OUString& rText )
{
    m_aStatusText.SetText( rText );
    m_aWindowSize.Width() = m_aStatusText.GetTextWidth( rText )+8;
    m_aStatusText->SetText( rText );
    m_aWindowSize.Width() = m_aStatusText->GetTextWidth( rText )+8;
}

namespace vcl {

class IIIMPStatusWindow : public StatusWindow
{
    MenuButton              m_aStatusBtn;
    MenuButtonPtr           m_aStatusBtn;
    PopupMenu               m_aMenu;
    SalFrame*               m_pResetFocus;
    bool                    m_bShow;
@@ -312,6 +319,7 @@ public:
    virtual void setText( const OUString & ) SAL_OVERRIDE;
    virtual void show( bool bShow, I18NStatus::ShowReason eReason ) SAL_OVERRIDE;
    virtual void toggle( bool bOn ) SAL_OVERRIDE;
    virtual void dispose() SAL_OVERRIDE;
    void layout();

    // override Window focus handler
@@ -324,7 +332,7 @@ public:

IIIMPStatusWindow::IIIMPStatusWindow( SalFrame* pParent, bool bOn ) :
        StatusWindow( WB_MOVEABLE ),
        m_aStatusBtn( this, WB_BORDER ),
        m_aStatusBtn(new MenuButton(this, WB_BORDER)),
        m_pResetFocus( pParent ),
        m_bShow( true ),
        m_bOn( bOn )
@@ -333,9 +341,9 @@ IIIMPStatusWindow::IIIMPStatusWindow( SalFrame* pParent, bool bOn ) :

    layout();

    m_aStatusBtn.SetSelectHdl( LINK( this, IIIMPStatusWindow, SelectHdl ) );
    m_aStatusBtn.SetPopupMenu( &m_aMenu );
    m_aStatusBtn.Show( true );
    m_aStatusBtn->SetSelectHdl( LINK( this, IIIMPStatusWindow, SelectHdl ) );
    m_aStatusBtn->SetPopupMenu( &m_aMenu );
    m_aStatusBtn->Show( true );

    const ::std::vector< I18NStatus::ChoiceData >& rChoices( I18NStatus::get().getChoices() );
    int i = 1;
@@ -369,11 +377,11 @@ IIIMPStatusWindow::~IIIMPStatusWindow()

void IIIMPStatusWindow::layout()
{
    Font aFont( m_aStatusBtn.GetFont() );
    Font aFont( m_aStatusBtn->GetFont() );
    Size aSize( 15*aFont.GetHeight(), aFont.GetHeight()+14 );
    aSize = m_aStatusBtn.LogicToPixel( aSize );
    aSize = m_aStatusBtn->LogicToPixel( aSize );

    m_aStatusBtn.SetPosSizePixel( Point( 0, 0 ), aSize );
    m_aStatusBtn->SetPosSizePixel( Point( 0, 0 ), aSize );
    SetOutputSizePixel( aSize );
    if( IsVisible() )
        Invalidate();
@@ -381,13 +389,13 @@ void IIIMPStatusWindow::layout()

void IIIMPStatusWindow::DataChanged( const DataChangedEvent& )
{
    m_aStatusBtn.SetSettings( GetSettings() );
    m_aStatusBtn->SetSettings( GetSettings() );
    layout();
}

void IIIMPStatusWindow::setText( const OUString& rText )
{
    m_aStatusBtn.SetText( rText );
    m_aStatusBtn->SetText( rText );
}

void IIIMPStatusWindow::show( bool bShow, I18NStatus::ShowReason eReason )
@@ -411,6 +419,12 @@ void IIIMPStatusWindow::toggle( bool bOn )
    }
}

void IIIMPStatusWindow::dispose()
{
    m_aStatusBtn.disposeAndClear();
    StatusWindow::dispose();
}

void IIIMPStatusWindow::show()
{
    if (m_bOn && m_bShow && !IsVisible())
@@ -454,10 +468,10 @@ void IIIMPStatusWindow::GetFocus()

IMPL_LINK( IIIMPStatusWindow, SelectHdl, MenuButton*, pBtn )
{
    if( pBtn == & m_aStatusBtn )
    if( pBtn == m_aStatusBtn.get() )
    {
        const ::std::vector< I18NStatus::ChoiceData >& rChoices( I18NStatus::get().getChoices() );
        unsigned int nIndex = m_aStatusBtn.GetCurItemId()-1;
        unsigned int nIndex = m_aStatusBtn->GetCurItemId()-1;
        if( nIndex < rChoices.size() )
        {
            XSetICValues( static_cast<X11SalFrame*>(I18NStatus::get().getParent())->getInputContext()->GetContext(),
diff --git a/vcl/workben/svpclient.cxx b/vcl/workben/svpclient.cxx
index 2ed9ac3..b3ad5db 100644
--- a/vcl/workben/svpclient.cxx
+++ b/vcl/workben/svpclient.cxx
@@ -92,10 +92,10 @@ SAL_IMPLEMENT_MAIN()

class MyWin : public WorkWindow
{
    PushButton      m_aListButton;
    ListBox         m_aSvpBitmaps;
    ImageControl    m_aImage;
    PushButton      m_aQuitButton;
    PushButtonPtr   m_aListButton;
    ListBoxPtr      m_aSvpBitmaps;
    ImageControlPtr m_aImage;
    PushButtonPtr   m_aQuitButton;
public:
                 MyWin( vcl::Window* pParent, WinBits nWinStyle );

@@ -108,6 +108,7 @@ public:
    virtual void Resize() SAL_OVERRIDE;

    virtual bool Close() SAL_OVERRIDE;
    virtual void dispose() SAL_OVERRIDE;

    void parseList( const OString& rList );
    OString processCommand( const OString& rCommand );
@@ -128,28 +129,28 @@ void Main()

MyWin::MyWin( vcl::Window* pParent, WinBits nWinStyle ) :
    WorkWindow( pParent, nWinStyle ),
    m_aListButton( this, 0 ),
    m_aSvpBitmaps( this, WB_BORDER ),
    m_aImage( this, WB_BORDER ),
    m_aQuitButton( this, 0 )
    m_aListButton(new PushButton(this, 0)),
    m_aSvpBitmaps(new ListBox(this, WB_BORDER)),
    m_aImage(new ImageControl(this, WB_BORDER)),
    m_aQuitButton(new PushButton(this, 0))
{
    m_aListButton.SetPosSizePixel( Point( 10, 10 ), Size( 120, 25 ) );
    m_aListButton.SetText( OUString( "List Elements" ) );
    m_aListButton.SetClickHdl( LINK( this, MyWin, ListHdl ) );
    m_aListButton.Show();
    m_aListButton->SetPosSizePixel( Point( 10, 10 ), Size( 120, 25 ) );
    m_aListButton->SetText( OUString( "List Elements" ) );
    m_aListButton->SetClickHdl( LINK( this, MyWin, ListHdl ) );
    m_aListButton->Show();

    m_aSvpBitmaps.SetPosSizePixel( Point( 10, 40 ), Size( 150, 150 ) );
    m_aSvpBitmaps.SetSelectHdl( LINK( this, MyWin, SelectHdl ) );
    m_aSvpBitmaps.Show();
    m_aSvpBitmaps->SetPosSizePixel( Point( 10, 40 ), Size( 150, 150 ) );
    m_aSvpBitmaps->SetSelectHdl( LINK( this, MyWin, SelectHdl ) );
    m_aSvpBitmaps->Show();

    m_aImage.SetPosSizePixel( Point( 170, 10 ), Size( 400, 400 ) );
    m_aImage.SetScaleMode( com::sun::star::awt::ImageScaleMode::NONE );
    m_aImage.Show();
    m_aImage->SetPosSizePixel( Point( 170, 10 ), Size( 400, 400 ) );
    m_aImage->SetScaleMode( com::sun::star::awt::ImageScaleMode::NONE );
    m_aImage->Show();

    m_aQuitButton.SetPosSizePixel( Point( 10, 300 ), Size( 120,25 ) );
    m_aQuitButton.SetText( OUString( "Quit SVP server" ) );
    m_aQuitButton.SetClickHdl( LINK( this, MyWin, QuitHdl ) );
    m_aQuitButton.Show();
    m_aQuitButton->SetPosSizePixel( Point( 10, 300 ), Size( 120,25 ) );
    m_aQuitButton->SetText( OUString( "Quit SVP server" ) );
    m_aQuitButton->SetClickHdl( LINK( this, MyWin, QuitHdl ) );
    m_aQuitButton->Show();
}

bool MyWin::Close()
@@ -160,11 +161,20 @@ bool MyWin::Close()
    return bRet;
}

void MyWin::dispose()
{
    m_aListButton.disposeAndClear();
    m_aSvpBitmaps.disposeAndClear();
    m_aImage.disposeAndClear();
    m_aQuitButton.disposeAndClear();
    WorkWindow::dispose();
}

void MyWin::parseList( const OString& rList )
{
    sal_Int32 nTokenPos = 0;
    OUString aElementType;
    m_aSvpBitmaps.Clear();
    m_aSvpBitmaps->Clear();
    while( nTokenPos >= 0 )
    {
        OString aLine = rList.getToken( 0, '\n', nTokenPos );
@@ -179,7 +189,7 @@ void MyWin::parseList( const OString& rList )
            aNewElement.append( aElementType );
            aNewElement.appendAscii( ": " );
            aNewElement.append( OStringToOUString( aLine, RTL_TEXTENCODING_ASCII_US ) );
            m_aSvpBitmaps.InsertEntry( aNewElement.makeStringAndClear() );
            m_aSvpBitmaps->InsertEntry( aNewElement.makeStringAndClear() );
        }
    }
}
@@ -235,7 +245,7 @@ IMPL_LINK( MyWin, QuitHdl, Button*, )

IMPL_LINK( MyWin, SelectHdl, ListBox*, )
{
    OUString aEntry = m_aSvpBitmaps.GetSelectEntry();
    OUString aEntry = m_aSvpBitmaps->GetSelectEntry();
    sal_Int32 nPos = aEntry.indexOf( ": " );
    if( nPos != -1 )
    {
@@ -259,8 +269,8 @@ IMPL_LINK( MyWin, SelectHdl, ListBox*, )
        Size aFixedSize( aBitmap.GetSizePixel() );
        aFixedSize.Width() += 10;
        aFixedSize.Height() += 10;
        m_aImage.SetSizePixel( aFixedSize );
        m_aImage.SetImage( Image( BitmapEx( aBitmap ) ) );
        m_aImage->SetSizePixel( aFixedSize );
        m_aImage->SetImage( Image( BitmapEx( aBitmap ) ) );
    }
    return 0;
}