#############################################################################
## Name:        ext/propgrid/XS/PGEditor.xsp
## Purpose:     XS++ for Wx::PGEditor
## Author:      Mark Dootson
## Modified by:
## Created:     04/03/2012
## RCS-ID:      $Id: $
## Copyright:   (c) 2012 Mattia Barbon
## Licence:     This program is free software; you can redistribute it and/or
##              modify it under the same terms as Perl itself
#############################################################################

%module{Wx};

#if WXPERL_W_VERSION_GE( 2, 9, 3 ) && wxUSE_PROPGRID

%loadplugin{build::Wx::XSP::Overload};

%name{Wx::PGWindowList} class wxPGWindowList
{


%{
static void
wxPGWindowList::CLONE()
  CODE:
    wxPli_thread_sv_clone( aTHX_ CLASS, (wxPliCloneSV)wxPli_detach_object );
%}

public:
    %name{newDefault} wxPGWindowList() %Overload;
    %name{newOneWindow} wxPGWindowList( wxWindow* a ) %Overload;
    %name{newTwoWindows} wxPGWindowList(  wxWindow* a, wxWindow* b ) %Overload;

    ~wxPGWindowList()
        %code%{  wxPli_thread_sv_unregister( aTHX_ "Wx::PGWindowList", THIS, ST(0) );
                 delete THIS;
               %};

    void SetSecondary( wxWindow* secondary );
};


%name{Wx::PGMultiButton} class wxPGMultiButton : public %name{Wx::Window} wxWindow
{
public:
    
    wxPGMultiButton( wxPropertyGrid* pg, const wxSize& sz )
        %postcall{% wxPli_create_evthandler( aTHX_ RETVAL, CLASS ); %};

    %name{AddString} void Add( const wxString& label, int id = -2 ) %Overload;

    %name{AddBitmap} void Add( const wxBitmap& bitmap, int id = -2 ) %Overload;

    void Finalize( wxPropertyGrid* propGrid, const wxPoint& pos );

    wxWindow* GetButton( unsigned int i );

    int GetButtonId( unsigned int i ) const;

    unsigned int GetCount();

    wxSize GetPrimarySize() const;
};

%name{Wx::PGEditor} class wxPGEditor : public %name{Wx::Object} wxObject
{

%{
static void
wxPGEditor::CLONE()
  CODE:
    wxPli_thread_sv_clone( aTHX_ CLASS, (wxPliCloneSV)wxPli_detach_object );
%}   

public:

    ~wxPGEditor()
        %code%{  wxPli_thread_sv_unregister( aTHX_ wxPli_get_class( aTHX_ ST(0) ), THIS, ST(0) );
                 if( wxPli_object_is_deleteable( aTHX_ ST(0) ) )
                    delete THIS;
               %};

    virtual wxString GetName() const; /* %Virtual; */

    virtual wxPGWindowList CreateControls( wxPropertyGrid* propgrid,
                                           wxPGProperty* property,
                                           const wxPoint& pos,
                                           const wxSize& size ) const; /* = 0;  %Virtual{pure}; */

    /** Loads value from property to the control. */
    virtual void UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const; /*  = 0 %Virtual{pure}; */
    
    virtual void DrawValue( wxDC& dc, const wxRect& rect,
                            wxPGProperty* property, const wxString& text ) const; /* %Virtual; */

    virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property, wxWindow* wnd_primary, wxEvent& event ) const; /*  = 0 %Virtual{pure}; */

    virtual bool GetValueFromControl( wxVariant& variant, wxPGProperty* property,
                                      wxWindow* ctrl ) const; /* %Virtual; */

    virtual void SetValueToUnspecified( wxPGProperty* property,
                                        wxWindow* ctrl ) const; /*  = 0 %Virtual{pure}; */

    virtual void SetControlAppearance( wxPropertyGrid* pg,
                                       wxPGProperty* property,
                                       wxWindow* ctrl,
                                       const wxPGCell& appearance,
                                       const wxPGCell& oldAppearance,
                                       bool unspecified ) const; /* %Virtual; */

    /** Sets control's value specifically from string. */
    virtual void SetControlStringValue( wxPGProperty* property,
                                        wxWindow* ctrl, const wxString& txt ) const; /* %Virtual; */

    /** Sets control's value specifically from int (applies to choice etc.). */
    virtual void SetControlIntValue( wxPGProperty* property,
                                     wxWindow* ctrl, int value ) const; /* %Virtual; */

    virtual int InsertItem( wxWindow* ctrl, const wxString& label, int index ) const; /* %Virtual; */

    virtual void DeleteItem( wxWindow* ctrl, int index ) const; /* %Virtual; */

    virtual void OnFocus( wxPGProperty* property, wxWindow* wnd ) const; /* %Virtual; */

    virtual bool CanContainCustomImage() const; /* %Virtual; */
};

%name{Wx::PGEditorDialogAdapter} class wxPGEditorDialogAdapter : public %name{Wx::Object} wxObject

{

%{
static void
wxPGEditorDialogAdapter::CLONE()
  CODE:
    wxPli_thread_sv_clone( aTHX_ CLASS, (wxPliCloneSV)wxPli_detach_object );
%}      

public:
    
    ~wxPGEditorDialogAdapter()
        %code%{  wxPli_thread_sv_unregister( aTHX_ "Wx::PGEditorDialogAdapter", THIS, ST(0) );
                 delete THIS;
               %};

    bool ShowDialog( wxPropertyGrid* propGrid, wxPGProperty* property );

    virtual bool DoShowDialog( wxPropertyGrid* propGrid, wxPGProperty* property ); /*  = 0 %Virtual{pure}; */

    void SetValue( wxVariant value );

    wxVariant& GetValue();

};

%name{Wx::PGTextCtrlEditor} class wxPGTextCtrlEditor : public %name{Wx::PGEditor} wxPGEditor

{

public:
    wxPGTextCtrlEditor();

    virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid,
                                          wxPGProperty* property,
                                          const wxPoint& pos,
                                          const wxSize& size) const; /* %Virtual; */
    
    virtual void UpdateControl( wxPGProperty* property,
                                wxWindow* ctrl ); /* %Virtual; */
    
    virtual bool OnEvent( wxPropertyGrid* propgrid,
                          wxPGProperty* property,
                          wxWindow* primaryCtrl,
                          wxEvent& event ) const; /* %Virtual; */
    
    virtual bool GetValueFromControl( wxVariant& variant,
                                      wxPGProperty* property,
                                      wxWindow* ctrl ); /* %Virtual; */

    virtual wxString GetName(); /* %Virtual; */

    //virtual wxPGCellRenderer* GetCellRenderer() const;
    virtual void SetControlStringValue( wxPGProperty* property,
                                        wxWindow* ctrl,
                                        const wxString& txt ); /* %Virtual; */
    
    virtual void OnFocus( wxPGProperty* property, wxWindow* wnd ); /* %Virtual; */

    // Provided so that, for example, ComboBox editor can use the same code
    // (multiple inheritance would get way too messy).
    
    static bool OnTextCtrlEvent( wxPropertyGrid* propgrid,
                                 wxPGProperty* property,
                                 wxWindow* ctrl,
                                 wxEvent& event );

    static bool GetTextCtrlValueFromControl( wxVariant& variant,
                                             wxPGProperty* property,
                                             wxWindow* ctrl );

};

%name{Wx::PGChoiceEditor} class wxPGChoiceEditor : public %name{Wx::PGEditor} wxPGEditor

{

public:
    wxPGChoiceEditor();

    virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid,
                                          wxPGProperty* property,
                                          const wxPoint& pos,
                                          const wxSize& size) const; /* %Virtual; */
    
    virtual void UpdateControl( wxPGProperty* property,
                                wxWindow* ctrl ) const; /* %Virtual; */
    
    virtual bool OnEvent( wxPropertyGrid* propgrid,
                          wxPGProperty* property,
                          wxWindow* primaryCtrl,
                          wxEvent& event ) const; /* %Virtual; */
    
    virtual bool GetValueFromControl( wxVariant& variant,
                                      wxPGProperty* property,
                                      wxWindow* ctrl ) const; /* %Virtual; */
    
    virtual void SetValueToUnspecified( wxPGProperty* property,
                                        wxWindow* ctrl ) const; /* %Virtual; */
    
    virtual wxString GetName() const; /* %Virtual; */

    virtual void SetControlIntValue( wxPGProperty* property,
                                     wxWindow* ctrl,
                                     int value ) const; /* %Virtual; */
    
    virtual void SetControlStringValue( wxPGProperty* property,
                                        wxWindow* ctrl,
                                        const wxString& txt ) const; /* %Virtual; */

    virtual int InsertItem( wxWindow* ctrl,
                            const wxString& label,
                            int index ) const; /* %Virtual; */
    
    virtual void DeleteItem( wxWindow* ctrl, int index ) const; /* %Virtual; */
    
    virtual bool CanContainCustomImage() const; /* %Virtual; */

    // CreateControls calls this with CB_READONLY in extraStyle
    wxWindow* CreateControlsBase( wxPropertyGrid* propgrid,
                                  wxPGProperty* property,
                                  const wxPoint& pos,
                                  const wxSize& sz,
                                  long extraStyle ) const;

};

%name{Wx::PGComboBoxEditor} class wxPGComboBoxEditor : public %name{Wx::PGChoiceEditor} wxPGChoiceEditor

{

public:
    wxPGComboBoxEditor();

    virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid,
                                          wxPGProperty* property,
                                          const wxPoint& pos,
                                          const wxSize& size) const; /* %Virtual; */

    virtual wxString GetName() const; /* %Virtual; */

    virtual void UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const; /* %Virtual; */

    virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property,
        wxWindow* ctrl, wxEvent& event ) const; /* %Virtual; */

    virtual bool GetValueFromControl( wxVariant& variant,
                                      wxPGProperty* property,
                                      wxWindow* ctrl ) const; /* %Virtual; */

    virtual void OnFocus( wxPGProperty* property, wxWindow* wnd ) const; /* %Virtual; */

};

%name{Wx::PGChoiceAndButtonEditor} class wxPGChoiceAndButtonEditor : public %name{Wx::PGChoiceEditor} wxPGChoiceEditor

{

public:
    wxPGChoiceAndButtonEditor();
        
    virtual wxString GetName() const; /* %Virtual; */

    virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid,
                                          wxPGProperty* property,
                                          const wxPoint& pos,
                                          const wxSize& size) const; /* %Virtual; */

};

%name{Wx::PGTextCtrlAndButtonEditor} class wxPGTextCtrlAndButtonEditor : public %name{Wx::PGTextCtrlEditor} wxPGTextCtrlEditor

{

public:
    wxPGTextCtrlAndButtonEditor();
    
    virtual wxString GetName() const; /* %Virtual; */

    virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid,
                                          wxPGProperty* property,
                                          const wxPoint& pos,
                                          const wxSize& size) const; /* %Virtual; */

};


#if wxPG_INCLUDE_CHECKBOX

//
// Use custom check box code instead of native control
// for cleaner (ie. more integrated) look.
//

%name{Wx::PGCheckBoxEditor} class wxPGCheckBoxEditor : public %name{Wx::PGEditor} wxPGEditor

{

public:
    wxPGCheckBoxEditor();

    virtual wxString GetName() const; /* %Virtual; */
    
    virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid,
                                          wxPGProperty* property,
                                          const wxPoint& pos,
                                          const wxSize& size) const; /* %Virtual; */
    
    virtual void UpdateControl( wxPGProperty* property,
                                wxWindow* ctrl ) const; /* %Virtual; */
    
    virtual bool OnEvent( wxPropertyGrid* propgrid,
                          wxPGProperty* property,
                          wxWindow* primaryCtrl,
                          wxEvent& event ) const; /* %Virtual; */
    
    virtual bool GetValueFromControl( wxVariant& variant,
                                      wxPGProperty* property,
                                      wxWindow* ctrl ) const; /* %Virtual; */
    
    virtual void SetValueToUnspecified( wxPGProperty* property,
                                        wxWindow* ctrl ) const; /* %Virtual; */

    virtual void DrawValue( wxDC& dc,
                            const wxRect& rect,
                            wxPGProperty* property,
                            const wxString& text ) const; /* %Virtual; */
    
    //virtual wxPGCellRenderer* GetCellRenderer() const;

    virtual void SetControlIntValue( wxPGProperty* property,
                                     wxWindow* ctrl,
                                     int value ) const; /* %Virtual; */
};

#endif

#if wxUSE_SPINBTN

#include "wx/spinbutt.h"
#include "wx/propgrid/editors.h"


%name{Wx::PGSpinCtrlEditor} class wxPGSpinCtrlEditor : public %name{Wx::PGTextCtrlEditor} wxPGTextCtrlEditor
{

public:
    
    wxPGSpinCtrlEditor();
    
    wxString GetName() const;
    
    virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid,
                                          wxPGProperty* property,
                                          const wxPoint& pos,
                                          const wxSize& size) const;
    
    virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property,
        wxWindow* wnd, wxEvent& event ) const;

};

#endif // wxUSE_SPINBTN

#if wxUSE_DATEPICKCTRL

%name{Wx::PGDatePickerCtrlEditor} class wxPGDatePickerCtrlEditor : public %name{Wx::PGEditor} wxPGEditor
{

public:
    
    wxString GetName() const;
    virtual wxPGWindowList CreateControls(wxPropertyGrid* propgrid,
                                          wxPGProperty* property,
                                          const wxPoint& pos,
                                          const wxSize& size) const;
    
    virtual void UpdateControl( wxPGProperty* property, wxWindow* wnd ) const;
    virtual bool OnEvent( wxPropertyGrid* propgrid, wxPGProperty* property,
        wxWindow* wnd, wxEvent& event ) const;
    
    virtual bool GetValueFromControl( wxVariant& variant, wxPGProperty* property, wxWindow* wnd ) const;
    
    virtual void SetValueToUnspecified( wxPGProperty* property, wxWindow* wnd ) const;
};

#endif // wxUSE_DATEPICKCTRL

#endif


