#############################################################################
## Name:        XS/TextCtrl.xsp
## Purpose:     XS for Wx::TextCtrl
## Author:      Mattia Barbon
## Modified by:
## Created:     29/10/2000
## RCS-ID:      $Id: TextCtrl.xsp 3115 2011-11-18 06:38:35Z mdootson $
## Copyright:   (c) 2000-2003, 2005-2007, 2010 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};

#include <wx/textctrl.h>

%typemap{wxMouseEvent&}{reference};
%typemap{wxTextAttr*}{simple};
%typemap{const wxTextAttr&}{reference};
%typemap{wxTextAttrAlignment}{simple};
%typemap{const wxKeyEvent&}{reference};
%typemap{wxTextPos}{parsed}{
    %cpp_type{%wxTextPos%};
};

%name{Wx::TextUrlEvent} class wxTextUrlEvent
{
    wxMouseEvent& GetMouseEvent();
    long GetURLStart();
    long GetURLEnd();
};

%name{Wx::TextCtrlBase} class wxTextCtrlBase
{
    wxString GetValue() const;
#if WXPERL_W_VERSION_GE( 2, 7, 2 )
    bool IsEmpty();
#endif
    void SetValue( const wxString& value );
#if WXPERL_W_VERSION_GE( 2, 7, 1 )
    void ChangeValue( const wxString& value );
#endif
    wxString GetRange( long from, long to ) const;
    int GetLineLength( long lineNo ) const;
    wxString GetLineText( long lineNo ) const;
    int GetNumberOfLines() const;
    bool IsModified() const;
    bool IsEditable() const;
    bool IsSingleLine() const;
    bool IsMultiLine() const;
    wxString GetStringSelection() const;
    void Clear();
    void Replace( long from, long to, const wxString& value );
    void Remove( long from, long to );
#if WXPERL_W_VERSION_GE( 2, 7, 1 )
    bool LoadFile( const wxString& file, int fileType = wxTEXT_TYPE_ANY );
    bool SaveFile( const wxString& file = wxEmptyString,
                   int fileType = wxTEXT_TYPE_ANY );
#else
    bool LoadFile( const wxString& file );
    bool SaveFile( const wxString& file = wxEmptyString );
#endif
    void MarkDirty();
    void DiscardEdits();
#if WXPERL_W_VERSION_GE( 2, 7, 0 )
    void SetModified( bool modified );
#endif
    void SetMaxLength( unsigned long len );
    void WriteText( const wxString& text );
    void AppendText( const wxString& text );
    bool EmulateKeyPress( const wxKeyEvent& event );
    bool SetStyle( long start, long end, const wxTextAttr& style );
##    bool GetStyle( long position, wxTextAttr& style );
    bool SetDefaultStyle( const wxTextAttr& style );
    const wxTextAttr& GetDefaultStyle() const;
    long XYToPosition( long x, long y ) const;
    void ShowPosition(long pos);
    void Copy();
    void Cut();
    void Paste();
    bool CanCopy() const;
    bool CanCut() const;
    bool CanPaste() const;
    void Undo();
    void Redo();
    bool CanUndo() const;
    bool CanRedo() const;
    void SetInsertionPoint( long pos );
    void SetInsertionPointEnd();
    long GetInsertionPoint() const;
    wxTextPos GetLastPosition() const;
    void SetSelection( long from, long to );
    void SelectAll();
    void SetEditable( bool editable );
#if WXPERL_W_VERSION_GE( 2, 9, 0 )
    bool AutoComplete( const wxArrayString& choices );
    bool AutoCompleteFileNames();
#endif
};

%{

void
wxTextCtrlBase::GetSelection()
  PREINIT:
    long from;
    long to;
  PPCODE:
    THIS->GetSelection( &from, &to );
    EXTEND( SP, 2 );
    PUSHs( sv_2mortal( newSViv( from ) ) );
    PUSHs( sv_2mortal( newSViv( to ) ) );

void
wxTextCtrlBase::PositionToXY( pos )
    long pos
  PREINIT:
    long x;
    long y;
  PPCODE:
    THIS->PositionToXY( pos, &x, &y );
    EXTEND( SP, 2 );
    PUSHs( sv_2mortal( newSViv( x ) ) );
    PUSHs( sv_2mortal( newSViv( y ) ) );

void
wxTextCtrlBase::HitTest( pt )
    wxPoint pt
  PPCODE:
    long col, row;
    wxTextCtrlHitTestResult res = THIS->HitTest( pt, &col, &row );

    EXTEND( SP, 3 );
    PUSHs( sv_2mortal( newSViv( res ) ) );
    PUSHs( sv_2mortal( newSViv( col ) ) );
    PUSHs( sv_2mortal( newSViv( row ) ) );

%}

%name{Wx::TextCtrl} class wxTextCtrl
{
#if defined( __WXMAC__ ) && WXPERL_W_VERSION_GE( 2, 8, 0 )
    void MacCheckSpelling( bool check );
#endif
};

%{
void
new( ... )
  PPCODE:
    BEGIN_OVERLOAD()
        MATCH_VOIDM_REDISP( newDefault )
        MATCH_ANY_REDISP( newFull )
    END_OVERLOAD( "Wx::TextCtrl::new" )

wxTextCtrl*
newDefault( CLASS )
    PlClassName CLASS
  CODE:
    RETVAL = new wxTextCtrl();
    wxPli_create_evthandler( aTHX_ RETVAL, CLASS );
  OUTPUT: RETVAL

wxTextCtrl*
newFull( CLASS, parent, id, value, pos = wxDefaultPosition, size = wxDefaultSize, style = 0 , validator = (wxValidator*)&wxDefaultValidator, name = wxTextCtrlNameStr )
    PlClassName CLASS
    wxWindow* parent
    wxWindowID id
    wxString value
    wxPoint pos
    wxSize size
    long style
    wxValidator* validator
    wxString name
  CODE:
    RETVAL = new wxTextCtrl( parent, id, value, pos, size,
                             style, *validator, name );
    wxPli_create_evthandler( aTHX_ RETVAL, CLASS );
  OUTPUT:
    RETVAL

bool
wxTextCtrl::Create( parent, id, value, pos = wxDefaultPosition, size = wxDefaultSize, style = 0 , validator = (wxValidator*)&wxDefaultValidator, name = wxTextCtrlNameStr )
    wxWindow* parent
    wxWindowID id
    wxString value
    wxPoint pos
    wxSize size
    long style
    wxValidator* validator
    wxString name
  C_ARGS: parent, id, value, pos, size, style, *validator, name

void
wxTextCtrl::GetStyle( position )
    long position
  PPCODE:
    wxTextAttr attr;
    bool retval = THIS->GetStyle( position, attr );
    EXTEND( SP, 2 );
    PUSHs( newSViv( retval ) );
    PUSHs( retval ? wxPli_non_object_2_sv( aTHX_ sv_newmortal(),
                                           new wxTextAttr( attr ),
                                           "Wx::TextAttr" ) :
                    &PL_sv_undef );

## to be consistent with RichTextCtrl

void
wxTextCtrl::GetTextAttrStyle( position )
    long position
  PPCODE:
    wxTextAttr attr;
    bool retval = THIS->GetStyle( position, attr );
    EXTEND( SP, 2 );
    PUSHs( newSViv( retval ) );
    PUSHs( retval ? wxPli_non_object_2_sv( aTHX_ sv_newmortal(),
                                           new wxTextAttr( attr ),
                                           "Wx::TextAttr" ) :
                    &PL_sv_undef );

%}
