vcl: manage SubEdit with references - and fix leak / cleanup.

Change-Id: Icbfe237a55cfbd83739b055350d5a6a54a2fa36d

Conflicts:
	vcl/source/control/edit.cxx
diff --git a/dbaccess/source/ui/control/curledit.cxx b/dbaccess/source/ui/control/curledit.cxx
index 4dc9d7f..0c967bd 100644
--- a/dbaccess/source/ui/control/curledit.cxx
+++ b/dbaccess/source/ui/control/curledit.cxx
@@ -40,10 +40,7 @@ extern "C" SAL_DLLPUBLIC_EXPORT vcl::Window* SAL_CALL makeConnectionURLEdit(vcl:

OConnectionURLEdit::~OConnectionURLEdit()
{
    // delete my sub controls
    Edit* pSubEdit = GetSubEdit();
    SetSubEdit(NULL);
    delete pSubEdit;
    delete m_pForcedPrefix;
}

@@ -86,7 +83,7 @@ void OConnectionURLEdit::SetText(const OUString& _rStr, const Selection& /*_rNew
{
    // create new sub controls, if necessary
    if (!GetSubEdit())
        SetSubEdit(new Edit(this, 0));
        SetSubEdit(EditRef(new Edit(this, 0)));
    if ( !m_pForcedPrefix )
    {
        m_pForcedPrefix = new FixedText(this, WB_VCENTER);
diff --git a/extensions/source/propctrlr/standardcontrol.cxx b/extensions/source/propctrlr/standardcontrol.cxx
index af4d001..0592b06 100644
--- a/extensions/source/propctrlr/standardcontrol.cxx
+++ b/extensions/source/propctrlr/standardcontrol.cxx
@@ -1023,15 +1023,14 @@ namespace pcr
    DropDownEditControl::DropDownEditControl( vcl::Window* _pParent, WinBits _nStyle )
        :DropDownEditControl_Base( _pParent, _nStyle )
        ,m_pFloatingEdit( NULL )
        ,m_pImplEdit( NULL )
        ,m_pDropdownButton( NULL )
        ,m_nOperationMode( eStringList )
        ,m_bDropdown( false )
    {
        SetCompoundControl( true );

        m_pImplEdit = new MultiLineEdit( this, WB_TABSTOP | WB_IGNORETAB | WB_NOBORDER | (_nStyle & WB_READONLY) );
        SetSubEdit( m_pImplEdit );
        m_pImplEdit = MultiLineEditRef( new MultiLineEdit( this, WB_TABSTOP | WB_IGNORETAB | WB_NOBORDER | (_nStyle & WB_READONLY) ) );
        SetSubEdit( m_pImplEdit.get() );
        m_pImplEdit->Show();

        if ( _nStyle & WB_DROPDOWN )
@@ -1065,11 +1064,7 @@ namespace pcr
            boost::scoped_ptr<vcl::Window> aTemp(m_pFloatingEdit);
            m_pFloatingEdit = NULL;
        }
        {
            boost::scoped_ptr<vcl::Window> aTemp(m_pImplEdit);
            SetSubEdit( NULL );
            m_pImplEdit = NULL;
        }
        SetSubEdit(EditRef());
        {
            boost::scoped_ptr<vcl::Window> aTemp(m_pDropdownButton);
            m_pDropdownButton = NULL;
@@ -1106,7 +1101,7 @@ namespace pcr
            {
                if ( m_pHelper )
                {
                    m_pHelper->LoseFocusHdl( m_pImplEdit );
                    m_pHelper->LoseFocusHdl( m_pImplEdit.get() );
                    m_pHelper->activateNextControl();
                }
            }
diff --git a/extensions/source/propctrlr/standardcontrol.hxx b/extensions/source/propctrlr/standardcontrol.hxx
index 8c80714..8b12563 100644
--- a/extensions/source/propctrlr/standardcontrol.hxx
+++ b/extensions/source/propctrlr/standardcontrol.hxx
@@ -375,7 +375,7 @@ namespace pcr
    {
    private:
        OMultilineFloatingEdit*             m_pFloatingEdit;
        MultiLineEdit*                      m_pImplEdit;
        VclReference<MultiLineEdit>         m_pImplEdit;
        PushButton*                         m_pDropdownButton;
        MultiLineOperationMode              m_nOperationMode;
        bool                                m_bDropdown : 1;
diff --git a/include/svtools/svmedit.hxx b/include/svtools/svmedit.hxx
index 33c2b90..726980f 100644
--- a/include/svtools/svmedit.hxx
+++ b/include/svtools/svmedit.hxx
@@ -27,7 +27,6 @@
#include <svtools/colorcfg.hxx>



class SVT_DLLPUBLIC MultiLineEdit : public VclMultiLineEdit
{
public:
@@ -36,6 +35,7 @@ public:
    virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer >
    GetComponentInterface(bool bCreate = true) SAL_OVERRIDE;
};
typedef VclReference<MultiLineEdit> MultiLineEditRef;


#endif // INCLUDED_SVTOOLS_SVMEDIT_HXX
diff --git a/include/vcl/combobox.hxx b/include/vcl/combobox.hxx
index c7a8cef..cde4846 100644
--- a/include/vcl/combobox.hxx
+++ b/include/vcl/combobox.hxx
@@ -39,7 +39,7 @@ class ImplBtn;
class VCL_DLLPUBLIC ComboBox : public Edit
{
private:
    Edit*                       mpSubEdit;
    VclReference<Edit>          mpSubEdit;
    ImplListBox*                mpImplLB;
    ImplBtn*                    mpBtn;
    ImplListBoxFloatingWindow*  mpFloatWin;
@@ -48,7 +48,7 @@ private:
    bool                        mbDDAutoSize        : 1;
    bool                        mbSyntheticModify   : 1;
    bool                        mbMatchCase         : 1;
    sal_Int32 m_nMaxWidthChars;
    sal_Int32                   m_nMaxWidthChars;
    Link                        maSelectHdl;
    Link                        maDoubleClickHdl;
    boost::signals2::scoped_connection mAutocompleteConnection;
@@ -73,7 +73,7 @@ private:
    DECL_DLLPRIVATE_LINK(   ImplDoubleClickHdl, void* );
    DECL_DLLPRIVATE_LINK(   ImplPopupModeEndHdl, void* );
    DECL_DLLPRIVATE_LINK(   ImplSelectionChangedHdl, void* );
    DECL_DLLPRIVATE_LINK( ImplListItemSelectHdl , void* );
    DECL_DLLPRIVATE_LINK(   ImplListItemSelectHdl , void* );

    SAL_DLLPRIVATE void ImplClickButtonHandler( ImplBtn* );
    SAL_DLLPRIVATE void ImplUserDrawHandler( UserDrawEvent* );
@@ -90,7 +90,7 @@ protected:
protected:
    bool            IsDropDownBox() const { return mpFloatWin ? true : false; }

    virtual void  FillLayoutData() const SAL_OVERRIDE;
    virtual void    FillLayoutData() const SAL_OVERRIDE;
public:
    explicit        ComboBox( vcl::Window* pParent, WinBits nStyle = 0 );
    explicit        ComboBox( vcl::Window* pParent, const ResId& );
@@ -119,12 +119,12 @@ public:

    Rectangle       GetDropDownPosSizePixel() const;

    void AdaptDropDownLineCountToMaximum();
    void            AdaptDropDownLineCountToMaximum();
    void            SetDropDownLineCount( sal_uInt16 nLines );
    sal_uInt16      GetDropDownLineCount() const;

    void            EnableAutoSize( bool bAuto );
    bool        IsAutoSizeEnabled() const               { return mbDDAutoSize; }
    bool            IsAutoSizeEnabled() const               { return mbDDAutoSize; }

    void            EnableDDAutoWidth( bool b );

@@ -225,6 +225,7 @@ public:

    virtual bool set_property(const OString &rKey, const OString &rValue) SAL_OVERRIDE;
};
typedef VclReference<ComboBox> ComboBoxPtr;

#endif  // _COMBOBOX_HXX

diff --git a/include/vcl/edit.hxx b/include/vcl/edit.hxx
index ec05923..5a28ecb 100644
--- a/include/vcl/edit.hxx
+++ b/include/vcl/edit.hxx
@@ -28,6 +28,7 @@
#include <vcl/ctrl.hxx>
#include <vcl/menu.hxx>
#include <vcl/dndhelp.hxx>
#include <vcl/vclref.hxx>
#include <com/sun/star/uno/Reference.h>

namespace com {
@@ -68,7 +69,7 @@ enum AutocompleteAction{ AUTOCOMPLETE_KEYINPUT, AUTOCOMPLETE_TABFORWARD, AUTOCOM
class VCL_DLLPUBLIC Edit : public Control, public vcl::unohelper::DragAndDropClient
{
private:
    Edit*               mpSubEdit;
    VclReference<Edit>  mpSubEdit;
    Timer*              mpUpdateDataTimer;
    TextFilter*         mpFilterText;
    DDInfo*             mpDDInfo;
@@ -85,7 +86,7 @@ private:
    sal_Int32           mnMaxWidthChars;
    AutocompleteAction  meAutocompleteAction;
    sal_Unicode         mcEchoChar;
    bool            mbModified:1,
    bool                mbModified:1,
                        mbInternModified:1,
                        mbReadOnly:1,
                        mbInsertMode:1,
@@ -164,6 +165,7 @@ public:
                        Edit( vcl::Window* pParent, WinBits nStyle = WB_BORDER );
                        Edit( vcl::Window* pParent, const ResId& rResId );
                        virtual ~Edit();
                        virtual void dispose() SAL_OVERRIDE;

    virtual void        MouseButtonDown( const MouseEvent& rMEvt ) SAL_OVERRIDE;
    virtual void        MouseButtonUp( const MouseEvent& rMEvt ) SAL_OVERRIDE;
@@ -186,7 +188,7 @@ public:

    virtual void        SetModifyFlag();
    virtual void        ClearModifyFlag();
    virtual bool        IsModified() const { return mpSubEdit ? mpSubEdit->mbModified : mbModified; }
    virtual bool        IsModified() const { return mpSubEdit.get() ? mpSubEdit->mbModified : mbModified; }

    virtual void        EnableUpdateData( sal_uLong nTimeout = EDIT_UPDATEDATA_TIMEOUT );
    virtual void        DisableUpdateData() { delete mpUpdateDataTimer; mpUpdateDataTimer = NULL; }
@@ -235,8 +237,8 @@ public:
    virtual const Link& GetModifyHdl() const { return maModifyHdl; }
    virtual void        SetUpdateDataHdl( const Link& rLink ) { maUpdateDataHdl = rLink; }

    void                SetSubEdit( Edit* pEdit );
    Edit*               GetSubEdit() const { return mpSubEdit; }
    void                SetSubEdit( VclReference<Edit> pEdit );
    Edit*               GetSubEdit() const { return mpSubEdit.get(); }

    boost::signals2::signal< void ( Edit* ) > autocompleteSignal;
    AutocompleteAction  GetAutocompleteAction() const { return meAutocompleteAction; }
@@ -268,6 +270,7 @@ public:
    // global style settings (needed by sc's inputwin.cxx)
    static Size GetMinimumEditSize();
};
typedef VclReference<Edit> EditRef;

#endif // INCLUDED_VCL_EDIT_HXX

diff --git a/include/vcl/vclmedit.hxx b/include/vcl/vclmedit.hxx
index 649725b..382059b 100644
--- a/include/vcl/vclmedit.hxx
+++ b/include/vcl/vclmedit.hxx
@@ -25,7 +25,6 @@
#include <vcl/edit.hxx>
#include <vcl/dllapi.h>


class ImpVclMEdit;
class Timer;
class ExtTextEngine;
@@ -131,6 +130,7 @@ public:

    virtual bool set_property(const OString &rKey, const OString &rValue) SAL_OVERRIDE;
};
typedef VclReference<VclMultiLineEdit> VclMultiLineEditRef;

#endif // INCLUDED_VCL_VCLMEDIT_HXX

diff --git a/include/vcl/vclref.hxx b/include/vcl/vclref.hxx
index b9b7b53..ba3fdaa 100644
--- a/include/vcl/vclref.hxx
+++ b/include/vcl/vclref.hxx
@@ -75,7 +75,6 @@ public:
        // 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();
    }
diff --git a/sd/source/ui/animations/CustomAnimationDialog.cxx b/sd/source/ui/animations/CustomAnimationDialog.cxx
index 7ad5e3f..6497b0e 100644
--- a/sd/source/ui/animations/CustomAnimationDialog.cxx
+++ b/sd/source/ui/animations/CustomAnimationDialog.cxx
@@ -320,7 +320,7 @@ Control* FontPropertyBox::getControl()
class DropdownMenuBox : public Edit
{
public:
    DropdownMenuBox( vcl::Window* pParent, Edit* pSubControl, PopupMenu* pMenu );
    DropdownMenuBox( vcl::Window* pParent, const EditRef &pSubControl, PopupMenu* pMenu );
    virtual ~DropdownMenuBox();

    void Resize() SAL_OVERRIDE;
@@ -329,12 +329,12 @@ public:
    void SetMenuSelectHdl( const Link& rLink ) { mpDropdownButton->SetSelectHdl( rLink ); }

private:
    Edit* mpSubControl;
    EditRef     mpSubControl;
    MenuButton* mpDropdownButton;
    PopupMenu* mpMenu;
    PopupMenu*  mpMenu;
};

DropdownMenuBox::DropdownMenuBox( vcl::Window* pParent, Edit* pSubControl, PopupMenu* pMenu )
DropdownMenuBox::DropdownMenuBox( vcl::Window* pParent, const EditRef &pSubControl, PopupMenu* pMenu )
:   Edit( pParent, WB_BORDER|WB_TABSTOP| WB_DIALOGCONTROL ),
    mpSubControl(pSubControl),mpDropdownButton(0),mpMenu(pMenu)
{
@@ -350,8 +350,7 @@ DropdownMenuBox::DropdownMenuBox( vcl::Window* pParent, Edit* pSubControl, Popup

DropdownMenuBox::~DropdownMenuBox()
{
    SetSubEdit( 0 );
    delete mpSubControl;
    SetSubEdit(EditRef());
    delete mpDropdownButton;
    delete mpMenu;
}
@@ -407,7 +406,7 @@ public:
private:
    DropdownMenuBox* mpControl;
    PopupMenu* mpMenu;
    MetricField* mpMetric;
    VclReference<MetricField> mpMetric;
};

CharHeightPropertyBox::CharHeightPropertyBox( sal_Int32 nControlType, vcl::Window* pParent, const Any& rValue, const Link& rModifyHdl )
@@ -419,7 +418,7 @@ CharHeightPropertyBox::CharHeightPropertyBox( sal_Int32 nControlType, vcl::Windo
    mpMetric->SetMax( 1000 );

    mpMenu = new PopupMenu(SdResId( RID_CUSTOMANIMATION_FONTSIZE_POPUP ) );
    mpControl = new DropdownMenuBox( pParent, mpMetric, mpMenu );
    mpControl = new DropdownMenuBox( pParent, mpMetric.get(), mpMenu );
    mpControl->SetMenuSelectHdl( LINK( this, CharHeightPropertyBox, implMenuSelectHdl ));
    mpControl->SetModifyHdl( rModifyHdl );
    mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_CHARHEIGHTPROPERTYBOX );
@@ -450,7 +449,7 @@ IMPL_LINK( CharHeightPropertyBox, implMenuSelectHdl, MenuButton*, pPb )

void CharHeightPropertyBox::setValue( const Any& rValue, const OUString& )
{
    if( mpMetric )
    if( mpMetric.get() )
    {
        double fValue = 0.0;
        rValue >>= fValue;
@@ -487,7 +486,7 @@ public:
private:
    DropdownMenuBox* mpControl;
    PopupMenu* mpMenu;
    MetricField* mpMetric;
    VclReference<MetricField> mpMetric;
    Link maModifyHdl;
};

@@ -508,7 +507,7 @@ TransparencyPropertyBox::TransparencyPropertyBox( sal_Int32 nControlType, vcl::W
        mpMenu->InsertItem( i, aStr );
    }

    mpControl = new DropdownMenuBox( pParent, mpMetric, mpMenu );
    mpControl = new DropdownMenuBox( pParent, mpMetric.get(), mpMenu );
    mpControl->SetMenuSelectHdl( LINK( this, TransparencyPropertyBox, implMenuSelectHdl ));
    mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_TRANSPARENCYPROPERTYBOX );

@@ -534,7 +533,7 @@ void TransparencyPropertyBox::updateMenu()
IMPL_LINK_NOARG(TransparencyPropertyBox, implModifyHdl)
{
    updateMenu();
    maModifyHdl.Call(mpMetric);
    maModifyHdl.Call(mpMetric.get());

    return 0;
}
@@ -552,7 +551,7 @@ IMPL_LINK( TransparencyPropertyBox, implMenuSelectHdl, MenuButton*, pPb )

void TransparencyPropertyBox::setValue( const Any& rValue, const OUString& )
{
    if( mpMetric )
    if( mpMetric.get() )
    {
        double fValue = 0.0;
        rValue >>= fValue;
@@ -591,7 +590,7 @@ public:
private:
    DropdownMenuBox* mpControl;
    PopupMenu* mpMenu;
    MetricField* mpMetric;
    VclReference<MetricField> mpMetric;
    Link maModifyHdl;
};

@@ -606,7 +605,7 @@ RotationPropertyBox::RotationPropertyBox( sal_Int32 nControlType, vcl::Window* p
    mpMetric->SetMax( 10000 );

    mpMenu = new PopupMenu(SdResId( RID_CUSTOMANIMATION_ROTATION_POPUP ) );
    mpControl = new DropdownMenuBox( pParent, mpMetric, mpMenu );
    mpControl = new DropdownMenuBox( pParent, mpMetric.get(), mpMenu );
    mpControl->SetMenuSelectHdl( LINK( this, RotationPropertyBox, implMenuSelectHdl ));
    mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_ROTATIONPROPERTYBOX );

@@ -640,7 +639,7 @@ void RotationPropertyBox::updateMenu()
IMPL_LINK_NOARG(RotationPropertyBox, implModifyHdl)
{
    updateMenu();
    maModifyHdl.Call(mpMetric);
    maModifyHdl.Call(mpMetric.get());

    return 0;
}
@@ -677,7 +676,7 @@ IMPL_LINK( RotationPropertyBox, implMenuSelectHdl, MenuButton*, pPb )

void RotationPropertyBox::setValue( const Any& rValue, const OUString& )
{
    if( mpMetric )
    if( mpMetric.get() )
    {
        double fValue = 0.0;
        rValue >>= fValue;
@@ -716,7 +715,7 @@ public:
private:
    DropdownMenuBox* mpControl;
    PopupMenu* mpMenu;
    MetricField* mpMetric;
    VclReference<MetricField> mpMetric;
    Link maModifyHdl;
    int mnDirection;
};
@@ -731,7 +730,7 @@ ScalePropertyBox::ScalePropertyBox( sal_Int32 nControlType, vcl::Window* pParent
    mpMetric->SetMax( 10000 );

    mpMenu = new PopupMenu(SdResId( RID_CUSTOMANIMATION_SCALE_POPUP ) );
    mpControl = new DropdownMenuBox( pParent, mpMetric, mpMenu );
    mpControl = new DropdownMenuBox( pParent, mpMetric.get(), mpMenu );
    mpControl->SetMenuSelectHdl( LINK( this, ScalePropertyBox, implMenuSelectHdl ));
    mpControl->SetHelpId( HID_SD_CUSTOMANIMATIONPANE_SCALEPROPERTYBOX );

@@ -764,7 +763,7 @@ void ScalePropertyBox::updateMenu()
IMPL_LINK_NOARG(ScalePropertyBox, implModifyHdl)
{
    updateMenu();
    maModifyHdl.Call(mpMetric);
    maModifyHdl.Call(mpMetric.get());

    return 0;
}
@@ -810,7 +809,7 @@ IMPL_LINK( ScalePropertyBox, implMenuSelectHdl, MenuButton*, pPb )

void ScalePropertyBox::setValue( const Any& rValue, const OUString& )
{
    if( mpMetric )
    if( mpMetric.get() )
    {
        ValuePair aValues;
        rValue >>= aValues;
@@ -878,7 +877,7 @@ public:
private:
    DropdownMenuBox* mpControl;
    PopupMenu* mpMenu;
    Edit* mpEdit;
    EditRef mpEdit;
    Link maModifyHdl;

    float mfFontWeight;
@@ -950,7 +949,7 @@ IMPL_LINK( FontStylePropertyBox, implMenuSelectHdl, MenuButton*, pPb )
    }

    update();
    maModifyHdl.Call(mpEdit);
    maModifyHdl.Call(mpEdit.get());

    return 0;
}
diff --git a/vcl/qa/cppunit/lifecycle.cxx b/vcl/qa/cppunit/lifecycle.cxx
index 1c887b9..e054672 100644
--- a/vcl/qa/cppunit/lifecycle.cxx
+++ b/vcl/qa/cppunit/lifecycle.cxx
@@ -12,6 +12,9 @@

#include <vcl/wrkwin.hxx>
#include <vcl/button.hxx>
#include <vcl/edit.hxx>
#include <vcl/combobox.hxx>
#include <vcl/field.hxx>

class LifecycleTest : public test::BootstrapFixture
{
@@ -20,6 +23,7 @@ class LifecycleTest : public test::BootstrapFixture
public:
    LifecycleTest() : BootstrapFixture(true, false) {}

    void testCast();
    void testMultiDispose();
    void testIsolatedWidgets();
    void testParentedWidgets();
@@ -31,6 +35,17 @@ public:
    CPPUNIT_TEST_SUITE_END();
};

// A compile time sanity check
void LifecycleTest::testCast()
{
//    VclReference<PushButton> xButton(new PushButton(NULL, 0));
//    VclReference<vcl::Window> xWindow(xButton);

//    VclReference<MetricField> xField(new MetricField(NULL, 0));
//    VclReference<SpinField> xSpin(xField);
//    VclReference<Edit> xEdit(xField);
}

void LifecycleTest::testMultiDispose()
{
    VclReference<WorkWindow> xWin(new WorkWindow((vcl::Window *)NULL,
@@ -54,7 +69,9 @@ void LifecycleTest::testWidgets(vcl::Window *pParent)
    // Some widgets really insist on adoption.
    if (pParent)
    {
        { CheckBoxPtr     aPtr(new CheckBox(pParent));  }
        { CheckBoxPtr     aPtr(new CheckBox(pParent));    }
//        { EditRef         aPtr(new Edit(pParent));        }
//        { ComboBoxPtr     aPtr(new ComboBox(pParent)); }
    }
//    { RadioButtonPtr  aPtr(new RadioButton(pParent));  }
}
diff --git a/vcl/source/control/combobox.cxx b/vcl/source/control/combobox.cxx
index 8a2e3c2..d7e2341 100644
--- a/vcl/source/control/combobox.cxx
+++ b/vcl/source/control/combobox.cxx
@@ -68,8 +68,7 @@ ComboBox::ComboBox( vcl::Window* pParent, const ResId& rResId ) :

ComboBox::~ComboBox()
{
    SetSubEdit( NULL );
    delete mpSubEdit;
    SetSubEdit(VclReference<Edit>());

    ImplListBox *pImplLB = mpImplLB;
    mpImplLB = NULL;
@@ -579,7 +578,7 @@ void ComboBox::Resize()
void ComboBox::FillLayoutData() const
{
    mpControlData->mpLayoutData = new vcl::ControlLayoutData();
    AppendLayoutData( *mpSubEdit );
    AppendLayoutData( *mpSubEdit.get() );
    mpSubEdit->SetLayoutDataParent( this );
    ImplListBoxWindowPtr rMainWindow = mpImplLB->GetMainWindow();
    if( mpFloatWin )
@@ -693,7 +692,7 @@ bool ComboBox::PreNotify( NotifyEvent& rNEvt )
bool ComboBox::Notify( NotifyEvent& rNEvt )
{
    bool nDone = false;
    if( ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT ) && ( rNEvt.GetWindow() == mpSubEdit )
    if( ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT ) && ( rNEvt.GetWindow() == mpSubEdit.get() )
            && !IsReadOnly() )
    {
        KeyEvent aKeyEvt = *rNEvt.GetKeyEvent();
@@ -731,7 +730,7 @@ bool ComboBox::Notify( NotifyEvent& rNEvt )

            case KEY_RETURN:
            {
                if( ( rNEvt.GetWindow() == mpSubEdit ) && IsInDropDown() )
                if( ( rNEvt.GetWindow() == mpSubEdit.get() ) && IsInDropDown() )
                {
                    mpImplLB->ProcessKeyInput( aKeyEvt );
                    nDone = true;
@@ -749,7 +748,7 @@ bool ComboBox::Notify( NotifyEvent& rNEvt )
    }
    else if( (rNEvt.GetType() == MouseNotifyEvent::COMMAND) &&
             (rNEvt.GetCommandEvent()->GetCommand() == COMMAND_WHEEL) &&
             (rNEvt.GetWindow() == mpSubEdit) )
             (rNEvt.GetWindow() == mpSubEdit.get()) )
    {
        sal_uInt16 nWheelBehavior( GetSettings().GetMouseSettings().GetWheelBehavior() );
        if  (   ( nWheelBehavior == MOUSE_WHEEL_ALWAYS )
diff --git a/vcl/source/control/edit.cxx b/vcl/source/control/edit.cxx
index a35327a..fa2f7b00 100644
--- a/vcl/source/control/edit.cxx
+++ b/vcl/source/control/edit.cxx
@@ -239,7 +239,14 @@ bool Edit::set_property(const OString &rKey, const OString &rValue)

Edit::~Edit()
{
    dispose();
}

void Edit::dispose()
{
    delete mpDDInfo;
    mpDDInfo = NULL;

    vcl::Cursor* pCursor = GetCursor();
    if ( pCursor )
    {
@@ -248,8 +255,10 @@ Edit::~Edit()
    }

    delete mpIMEInfos;
    mpIMEInfos = NULL;

    delete mpUpdateDataTimer;
    mpUpdateDataTimer = NULL;

    if ( mxDnDListener.is() )
    {
@@ -266,6 +275,7 @@ Edit::~Edit()

        uno::Reference< lang::XEventListener> xEL( mxDnDListener, uno::UNO_QUERY );
        xEL->disposing( lang::EventObject() );  // #95154# #96585# Empty Source means it's the Client
        mxDnDListener.clear();
    }

    SetType(WINDOW_WINDOW);
@@ -273,7 +283,7 @@ Edit::~Edit()

void Edit::ImplInitEditData()
{
    mpSubEdit               = NULL;
    mpSubEdit               = EditRef();
    mpUpdateDataTimer       = NULL;
    mpFilterText            = NULL;
    mnXOffset               = 0;
@@ -1316,7 +1326,7 @@ void Edit::ImplPaste( uno::Reference< datatransfer::clipboard::XClipboard >& rxC

void Edit::MouseButtonDown( const MouseEvent& rMEvt )
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
    {
        Control::MouseButtonDown( rMEvt );
        return;
@@ -1738,7 +1748,7 @@ void Edit::KeyInput( const KeyEvent& rKEvt )
    if ( mpUpdateDataTimer && !mbIsSubEdit && mpUpdateDataTimer->IsActive() )
        mpUpdateDataTimer->Start();//do not update while the user is still travelling in the control

    if ( mpSubEdit || !ImplHandleKeyEvent( rKEvt ) )
    if ( mpSubEdit.get() || !ImplHandleKeyEvent( rKEvt ) )
        Control::KeyInput( rKEvt );
}

@@ -1750,13 +1760,13 @@ void Edit::FillLayoutData() const

void Edit::Paint( const Rectangle& )
{
    if ( !mpSubEdit )
    if ( !mpSubEdit.get() )
        ImplRepaint();
}

void Edit::Resize()
{
    if ( !mpSubEdit && IsReallyVisible() )
    if ( !mpSubEdit.get() && IsReallyVisible() )
    {
        Control::Resize();
        // Wegen vertikaler Zentrierung...
@@ -1869,7 +1879,7 @@ void Edit::ImplInvalidateOutermostBorder( vcl::Window* pWin )

void Edit::GetFocus()
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        mpSubEdit->ImplGrabFocus( GetGetFocusFlags() );
    else if ( !mbActivePopup )
    {
@@ -1922,7 +1932,7 @@ void Edit::GetFocus()

vcl::Window* Edit::GetPreferredKeyInputWindow()
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        return mpSubEdit->GetPreferredKeyInputWindow();
    else
        return this;
@@ -1937,7 +1947,7 @@ void Edit::LoseFocus()
        mpUpdateDataTimer->Timeout();
    }

    if ( !mpSubEdit )
    if ( !mpSubEdit.get() )
    {
        // FIXME: this is currently only on OS X
        // check for other platforms that need similar handling
@@ -2196,11 +2206,11 @@ void Edit::StateChanged( StateChangedType nType )
{
    if ( nType == StateChangedType::INITSHOW )
    {
        if ( !mpSubEdit )
        if ( !mpSubEdit.get() )
        {
            mnXOffset = 0;  // if GrabFocus before while size was still wrong
            ImplAlign();
            if ( !mpSubEdit )
            if ( !mpSubEdit.get() )
                ImplShowCursor( false );
        }
        // update background (eventual SetPaintTransparent)
@@ -2208,7 +2218,7 @@ void Edit::StateChanged( StateChangedType nType )
    }
    else if ( nType == StateChangedType::ENABLE )
    {
        if ( !mpSubEdit )
        if ( !mpSubEdit.get() )
        {
            // change text color only
            ImplInvalidateOrRepaint();
@@ -2255,7 +2265,7 @@ void Edit::StateChanged( StateChangedType nType )
    }
    else if ( nType == StateChangedType::ZOOM )
    {
        if ( !mpSubEdit )
        if ( !mpSubEdit.get() )
        {
            ImplInitSettings( true, false, false );
            ImplShowCursor( true );
@@ -2264,7 +2274,7 @@ void Edit::StateChanged( StateChangedType nType )
    }
    else if ( nType == StateChangedType::CONTROLFONT )
    {
        if ( !mpSubEdit )
        if ( !mpSubEdit.get() )
        {
            ImplInitSettings( true, false, false );
            ImplShowCursor();
@@ -2273,7 +2283,7 @@ void Edit::StateChanged( StateChangedType nType )
    }
    else if ( nType == StateChangedType::CONTROLFOREGROUND )
    {
        if ( !mpSubEdit )
        if ( !mpSubEdit.get() )
        {
            ImplInitSettings( false, true, false );
            Invalidate();
@@ -2281,7 +2291,7 @@ void Edit::StateChanged( StateChangedType nType )
    }
    else if ( nType == StateChangedType::CONTROLBACKGROUND )
    {
        if ( !mpSubEdit )
        if ( !mpSubEdit.get() )
        {
            ImplInitSettings( false, false, true );
            Invalidate();
@@ -2298,7 +2308,7 @@ void Edit::DataChanged( const DataChangedEvent& rDCEvt )
         ((rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
          (rDCEvt.GetFlags() & AllSettingsFlags::STYLE)) )
    {
        if ( !mpSubEdit )
        if ( !mpSubEdit.get() )
        {
            ImplInitSettings( true, true, true );
            ImplShowCursor( true );
@@ -2431,7 +2441,7 @@ void Edit::EnableUpdateData( sal_uLong nTimeout )
void Edit::SetEchoChar( sal_Unicode c )
{
    mcEchoChar = c;
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        mpSubEdit->SetEchoChar( c );
}

@@ -2440,7 +2450,7 @@ void Edit::SetReadOnly( bool bReadOnly )
    if ( mbReadOnly != bool(bReadOnly) )
    {
        mbReadOnly = bReadOnly;
        if ( mpSubEdit )
        if ( mpSubEdit.get() )
            mpSubEdit->SetReadOnly( bReadOnly );

        StateChanged( StateChangedType::READONLY );
@@ -2452,7 +2462,7 @@ void Edit::SetInsertMode( bool bInsert )
    if ( bInsert != mbInsertMode )
    {
        mbInsertMode = bInsert;
        if ( mpSubEdit )
        if ( mpSubEdit.get() )
            mpSubEdit->SetInsertMode( bInsert );
        else
            ImplShowCursor();
@@ -2461,7 +2471,7 @@ void Edit::SetInsertMode( bool bInsert )

bool Edit::IsInsertMode() const
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        return mpSubEdit->IsInsertMode();
    else
        return mbInsertMode;
@@ -2471,7 +2481,7 @@ void Edit::SetMaxTextLen(sal_Int32 nMaxLen)
{
    mnMaxTextLen = nMaxLen > 0 ? nMaxLen : EDIT_NOLIMIT;

    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        mpSubEdit->SetMaxTextLen( mnMaxTextLen );
    else
    {
@@ -2486,7 +2496,7 @@ void Edit::SetSelection( const Selection& rSelection )
    // directly afterwards which would change the selection again
    if ( IsTracking() )
        EndTracking();
    else if ( mpSubEdit && mpSubEdit->IsTracking() )
    else if ( mpSubEdit.get() && mpSubEdit->IsTracking() )
        mpSubEdit->EndTracking();

    ImplSetSelection( rSelection );
@@ -2494,7 +2504,7 @@ void Edit::SetSelection( const Selection& rSelection )

void Edit::ImplSetSelection( const Selection& rSelection, bool bPaint )
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        mpSubEdit->ImplSetSelection( rSelection );
    else
    {
@@ -2556,7 +2566,7 @@ void Edit::ImplSetSelection( const Selection& rSelection, bool bPaint )

const Selection& Edit::GetSelection() const
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        return mpSubEdit->GetSelection();
    else
        return maSelection;
@@ -2564,7 +2574,7 @@ const Selection& Edit::GetSelection() const

void Edit::ReplaceSelected( const OUString& rStr )
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        mpSubEdit->ReplaceSelected( rStr );
    else
        ImplInsertText( rStr );
@@ -2572,7 +2582,7 @@ void Edit::ReplaceSelected( const OUString& rStr )

void Edit::DeleteSelected()
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        mpSubEdit->DeleteSelected();
    else
    {
@@ -2583,7 +2593,7 @@ void Edit::DeleteSelected()

OUString Edit::GetSelected() const
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        return mpSubEdit->GetSelected();
    else
    {
@@ -2619,7 +2629,7 @@ void Edit::Paste()

void Edit::Undo()
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        mpSubEdit->Undo();
    else
    {
@@ -2644,7 +2654,7 @@ void Edit::SetText( const OUString& rStr )

void Edit::SetText( const OUString& rStr, const Selection& rSelection )
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        mpSubEdit->SetText( rStr, rSelection );
    else
        ImplSetText( rStr, &rSelection );
@@ -2652,7 +2662,7 @@ void Edit::SetText( const OUString& rStr, const Selection& rSelection )

OUString Edit::GetText() const
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        return mpSubEdit->GetText();
    else
        return maText.toString();
@@ -2660,7 +2670,7 @@ OUString Edit::GetText() const

void Edit::SetPlaceholderText( const OUString& rStr )
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        mpSubEdit->SetPlaceholderText( rStr );
    else if ( maPlaceholderText != rStr )
    {
@@ -2672,7 +2682,7 @@ void Edit::SetPlaceholderText( const OUString& rStr )

OUString Edit::GetPlaceholderText() const
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        return mpSubEdit->GetPlaceholderText();

    return maPlaceholderText;
@@ -2680,7 +2690,7 @@ OUString Edit::GetPlaceholderText() const

void Edit::SetModifyFlag()
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        mpSubEdit->mbModified = true;
    else
        mbModified = true;
@@ -2688,16 +2698,17 @@ void Edit::SetModifyFlag()

void Edit::ClearModifyFlag()
{
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
        mpSubEdit->mbModified = false;
    else
        mbModified = false;
}

void Edit::SetSubEdit( Edit* pEdit )
void Edit::SetSubEdit( VclReference<Edit> pEdit )
{
    mpSubEdit.disposeAndClear();
    mpSubEdit = pEdit;
    if ( mpSubEdit )
    if ( mpSubEdit.get() )
    {
        SetPointer( POINTER_ARROW );    // Nur das SubEdit hat den BEAM...
        mpSubEdit->mbIsSubEdit = true;
@@ -2793,7 +2804,7 @@ Size Edit::CalcSize(sal_Int32 nChars) const

sal_Int32 Edit::GetMaxVisChars() const
{
    const vcl::Window* pW = mpSubEdit ? mpSubEdit : this;
    const vcl::Window* pW = mpSubEdit.get() ? mpSubEdit.get() : this;
    sal_Int32 nOutWidth = pW->GetOutputSizePixel().Width();
    sal_Int32 nCharWidth = GetTextWidth( OUString('x') );
    return nCharWidth ? nOutWidth/nCharWidth : 0;
@@ -3025,7 +3036,7 @@ void Edit::dragOver( const ::com::sun::star::datatransfer::dnd::DropTargetDragEv

OUString Edit::GetSurroundingText() const
{
    if (mpSubEdit)
    if (mpSubEdit.get())
        return mpSubEdit->GetSurroundingText();
    return maText.toString();
}
diff --git a/vcl/source/window/mouse.cxx b/vcl/source/window/mouse.cxx
index 25de8d3..bc16a6e 100644
--- a/vcl/source/window/mouse.cxx
+++ b/vcl/source/window/mouse.cxx
@@ -657,6 +657,8 @@ void Window::ImplStartDnd()

Reference< css::datatransfer::dnd::XDropTarget > Window::GetDropTarget()
{
    if( !mpWindowImpl )
        return Reference< css::datatransfer::dnd::XDropTarget >();

    if( ! mpWindowImpl->mxDNDListenerContainer.is() )
    {
diff --git a/vcl/source/window/window2.cxx b/vcl/source/window/window2.cxx
index e667287..bc02ec1 100644
--- a/vcl/source/window/window2.cxx
+++ b/vcl/source/window/window2.cxx
@@ -1317,6 +1317,8 @@ bool Window::IsWait() const

vcl::Cursor* Window::GetCursor() const
{
    if (!mpWindowImpl)
        return NULL;
    return mpWindowImpl->mpCursor;
}