////////////////////////////////////////////////////////////////////////////
// Name:        wx/stc/stc.h
// Purpose:     A wxWidgets implementation of Scintilla.  This class is the
//              one meant to be used directly by wx applications.  It does not
//              derive directly from the Scintilla classes, and in fact there
//              is no mention of Scintilla classes at all in this header.
//              This class delegates all method calls and events to the
//              Scintilla objects and so forth.  This allows the use of
//              Scintilla without polluting the namespace with all the
//              classes and identifiers from Scintilla.
//
// Author:      Robin Dunn
//
// Created:     13-Jan-2000
// Copyright:   (c) 2000 by Total Control Software
// Licence:     wxWindows licence
/////////////////////////////////////////////////////////////////////////////

/*
    IMPORTANT: include/wx/stc/stc.h is generated by src/stc/gen_iface.py from
               src/stc/stc.h.in, don't edit stc.h file as your changes will be
               lost after the next regeneration, edit stc.h.in and rerun the
               gen_iface.py script instead!

               Parts of this file generated by the script are found in between
               the special "{{{" and "}}}" markers, the rest of it is copied
               verbatim from src.h.in.
 */

#ifndef _WX_STC_STC_H_
#define _WX_STC_STC_H_

#include "wx/defs.h"

#if wxUSE_STC

#include "wx/control.h"
#include "wx/dnd.h"
#include "wx/stopwatch.h"
#include "wx/versioninfo.h"

#include "wx/textentry.h"
#if wxUSE_TEXTCTRL
    #include "wx/textctrl.h"
#endif // wxUSE_TEXTCTRL

class WXDLLIMPEXP_FWD_CORE wxScrollBar;

// SWIG can't handle "#if" type of conditionals, only "#ifdef"
#ifdef SWIG
#define STC_USE_DND 1
#else
#if wxUSE_DRAG_AND_DROP
#define STC_USE_DND 1
#endif
#endif

//----------------------------------------------------------------------
// STC constants generated section {{{

%(VALUES)s

//}}}
//----------------------------------------------------------------------


#if defined(__clang__) || wxCHECK_GCC_VERSION(4, 5)
    #define wxSTC_STRINGIFY(X) #X
    #define wxSTC_DEPRECATED_MACRO_VALUE(value,msg) \
        _Pragma(wxSTC_STRINGIFY(GCC warning msg)) value
#else
    #define wxSTC_DEPRECATED_MACRO_VALUE(value,msg) value
#endif

#if WXWIN_COMPATIBILITY_3_0

// The wxSTC_INDIC{0,1,2,S}_MASK values are no longer used in Scintilla

#if wxCHECK_VISUALC_VERSION(10)
    #pragma deprecated(wxSTC_INDIC0_MASK, wxSTC_INDIC1_MASK, \
                       wxSTC_INDIC2_MASK, wxSTC_INDICS_MASK)
#endif

#define wxSTC_INDIC0_MASK wxSTC_DEPRECATED_MACRO_VALUE(0x20,\
    "wxSTC_INDIC0_MASK is deprecated. Style byte indicators are no longer used.")
#define wxSTC_INDIC1_MASK wxSTC_DEPRECATED_MACRO_VALUE(0x40,\
    "wxSTC_INDIC1_MASK is deprecated. Style byte indicators are no longer used.")
#define wxSTC_INDIC2_MASK wxSTC_DEPRECATED_MACRO_VALUE(0x80,\
    "wxSTC_INDIC2_MASK is deprecated. Style byte indicators are no longer used.")
#define wxSTC_INDICS_MASK wxSTC_DEPRECATED_MACRO_VALUE(0xE0,\
    "wxSTC_INDICS_MASK is deprecated. Style byte indicators are no longer used.")


// The following entries have non-conformant prefixes.

#if wxCHECK_VISUALC_VERSION(10)
    #pragma deprecated(wxSTC_SCMOD_NORM, wxSTC_SCMOD_SHIFT, wxSTC_SCMOD_CTRL, \
                       wxSTC_SCMOD_ALT, wxSTC_SCMOD_SUPER, wxSTC_SCMOD_META, \
                       wxSTC_SCVS_NONE, wxSTC_SCVS_RECTANGULARSELECTION, \
                       wxSTC_SCVS_USERACCESSIBLE, wxSTC_SCVS_NOWRAPLINESTART)
#endif

#define wxSTC_SCMOD_NORM wxSTC_DEPRECATED_MACRO_VALUE(0,\
    "wxSTC_SCMOD_NORM is deprecated. Use wxSTC_KEYMOD_NORM instead.")
#define wxSTC_SCMOD_SHIFT wxSTC_DEPRECATED_MACRO_VALUE(1,\
    "wxSTC_SCMOD_SHIFT is deprecated. Use wxSTC_KEYMOD_SHIFT instead.")
#define wxSTC_SCMOD_CTRL wxSTC_DEPRECATED_MACRO_VALUE(2,\
    "wxSTC_SCMOD_CTRL is deprecated. Use wxSTC_KEYMOD_CTRL instead.")
#define wxSTC_SCMOD_ALT wxSTC_DEPRECATED_MACRO_VALUE(4,\
    "wxSTC_SCMOD_ALT is deprecated. Use wxSTC_KEYMOD_ALT instead.")
#define wxSTC_SCMOD_SUPER wxSTC_DEPRECATED_MACRO_VALUE(8,\
    "wxSTC_SCMOD_SUPER is deprecated. Use wxSTC_KEYMOD_SUPER instead.")
#define wxSTC_SCMOD_META wxSTC_DEPRECATED_MACRO_VALUE(16,\
    "wxSTC_SCMOD_META is deprecated. Use wxSTC_KEYMOD_META instead.")

#define wxSTC_SCVS_NONE wxSTC_DEPRECATED_MACRO_VALUE(0, \
    "wxSTC_SCVS_NONE is deprecated. Use wxSTC_VS_NONE instead.")
#define wxSTC_SCVS_RECTANGULARSELECTION wxSTC_DEPRECATED_MACRO_VALUE(1, \
    "wxSTC_SCVS_RECTANGULARSELECTION is deprecated. Use wxSTC_VS_RECTANGULARSELECTION instead.")
#define wxSTC_SCVS_USERACCESSIBLE wxSTC_DEPRECATED_MACRO_VALUE(2, \
    "wxSTC_SCVS_USERACCESSIBLE is deprecated. Use wxSTC_VS_USERACCESSIBLE instead.")
#define wxSTC_SCVS_NOWRAPLINESTART wxSTC_DEPRECATED_MACRO_VALUE(4, \
    "wxSTC_SCVS_NOWRAPLINESTART is deprecated. Use wxSTC_VS_NOWRAPLINESTART instead.")

#endif // WXWIN_COMPATIBILITY_3_0

//----------------------------------------------------------------------
// Commands that can be bound to keystrokes section {{{

%(CMDS)s

//}}}
//----------------------------------------------------------------------

class  ScintillaWX;                      // forward declare
class  WordList;
struct SCNotification;

#ifndef SWIG
extern WXDLLIMPEXP_DATA_STC(const char) wxSTCNameStr[];
class  WXDLLIMPEXP_FWD_STC wxStyledTextCtrl;
class  WXDLLIMPEXP_FWD_STC wxStyledTextEvent;
#endif

//----------------------------------------------------------------------

class WXDLLIMPEXP_STC wxStyledTextCtrl : public wxControl,
#if wxUSE_TEXTCTRL
                                         public wxTextCtrlIface
#else // !wxUSE_TEXTCTRL
                                         public wxTextEntryBase
#endif // wxUSE_TEXTCTRL/!wxUSE_TEXTCTRL
{
public:

#ifdef SWIG
    %%pythonAppend wxStyledTextCtrl   "self._setOORInfo(self)"
    %%pythonAppend wxStyledTextCtrl() ""

    wxStyledTextCtrl(wxWindow *parent, wxWindowID id=wxID_ANY,
                     const wxPoint& pos = wxDefaultPosition,
                     const wxSize& size = wxDefaultSize, long style = 0,
                     const wxString& name = wxPySTCNameStr);
    %%RenameCtor(PreStyledTextCtrl,  wxStyledTextCtrl());

#else
    wxStyledTextCtrl(wxWindow *parent, wxWindowID id=wxID_ANY,
                     const wxPoint& pos = wxDefaultPosition,
                     const wxSize& size = wxDefaultSize, long style = 0,
                     const wxString& name = wxSTCNameStr);
    wxStyledTextCtrl() { m_swx = NULL; }
    ~wxStyledTextCtrl();

#endif

    bool Create(wxWindow *parent, wxWindowID id=wxID_ANY,
                const wxPoint& pos = wxDefaultPosition,
                const wxSize& size = wxDefaultSize, long style = 0,
                const wxString& name = wxSTCNameStr);


    //----------------------------------------------------------------------
    // Generated method declaration section {{{

%(METHOD_DEFS)s

    //}}}
    //----------------------------------------------------------------------

    // Manually declared methods

    // Returns the line number of the line with the caret.
    int GetCurrentLine();

    // Extract style settings from a spec-string which is composed of one or
    // more of the following comma separated elements:
    //
    //      bold                    turns on bold
    //      italic                  turns on italics
    //      fore:[name or #RRGGBB]  sets the foreground colour
    //      back:[name or #RRGGBB]  sets the background colour
    //      face:[facename]         sets the font face name to use
    //      size:[num]              sets the font size in points
    //      eol                     turns on eol filling
    //      underline               turns on underlining
    //
    void StyleSetSpec(int styleNum, const wxString& spec);


    // Get the font of a style.
    wxFont StyleGetFont(int style);


    // Set style size, face, bold, italic, and underline attributes from
    // a wxFont's attributes.
    void StyleSetFont(int styleNum, const wxFont& font);



    // Set all font style attributes at once.
    void StyleSetFontAttr(int styleNum, int size,
                          const wxString& faceName,
                          bool bold, bool italic,
                          bool underline,
                          wxFontEncoding encoding=wxFONTENCODING_DEFAULT);


    // Set the font encoding to be used by a style.
    void StyleSetFontEncoding(int style, wxFontEncoding encoding);


    // Perform one of the operations defined by the wxSTC_CMD_* constants.
    void CmdKeyExecute(int cmd);


    // Set the left and right margin in the edit area, measured in pixels.
    void SetMargins(int left, int right);


    // Scroll enough to make the given line visible
    void ScrollToLine(int line);


    // Scroll enough to make the given column visible
    void ScrollToColumn(int column);


    // Send a message to Scintilla
    //
    // NB: this method is not really const as it can modify the control but it
    //     has to be declared as such as it's called from both const and
    //     non-const methods and we can't distinguish between the two
    wxIntPtr SendMsg(int msg, wxUIntPtr wp=0, wxIntPtr lp=0) const;


    // Set the vertical scrollbar to use instead of the one that's built-in.
    void SetVScrollBar(wxScrollBar* bar);


    // Set the horizontal scrollbar to use instead of the one that's built-in.
    void SetHScrollBar(wxScrollBar* bar);

    // Can be used to prevent the EVT_CHAR handler from adding the char
    bool GetLastKeydownProcessed() { return m_lastKeyDownConsumed; }
    void SetLastKeydownProcessed(bool val) { m_lastKeyDownConsumed = val; }

    // if we derive from wxTextAreaBase it already provides these methods
#if !wxUSE_TEXTCTRL
    // Write the contents of the editor to filename
    bool SaveFile(const wxString& filename);

    // Load the contents of filename into the editor
    bool LoadFile(const wxString& filename);
#endif // !wxUSE_TEXTCTRL

#ifdef STC_USE_DND
    // Allow for simulating a DnD DragEnter
    wxDragResult DoDragEnter(wxCoord x, wxCoord y, wxDragResult def);

    // Allow for simulating a DnD DragOver
    wxDragResult DoDragOver(wxCoord x, wxCoord y, wxDragResult def);

    // Allow for simulating a DnD DragLeave
    void DoDragLeave();

    // Allow for simulating a DnD DropText
    bool DoDropText(long x, long y, const wxString& data);
#endif

    // Specify whether anti-aliased fonts should be used.  Will have no effect
    // on some platforms, but on some (wxMac for example) can greatly improve
    // performance.
    void SetUseAntiAliasing(bool useAA);

    // Returns the current UseAntiAliasing setting.
    bool GetUseAntiAliasing();

    // Clear annotations from the given line.
    void AnnotationClearLine(int line);



    // The following methods are nearly equivalent to their similarly named
    // cousins above.  The difference is that these methods bypass wxString
    // and always use a char* even if used in a unicode build of wxWidgets.
    // In that case the character data will be utf-8 encoded since that is
    // what is used internally by Scintilla in unicode builds.

    // Add text to the document at current position.
    void AddTextRaw(const char* text, int length=-1);

    // Insert string at a position.
    void InsertTextRaw(int pos, const char* text);

    // Retrieve the text of the line containing the caret.
    // Returns the index of the caret on the line.
#ifdef SWIG
    wxCharBuffer GetCurLineRaw(int* OUTPUT);
#else
    wxCharBuffer GetCurLineRaw(int* linePos=NULL);
#endif

    // Retrieve the contents of a line.
    wxCharBuffer GetLineRaw(int line);

    // Retrieve the selected text.
    wxCharBuffer GetSelectedTextRaw();

    // Retrieve the target text.
    wxCharBuffer GetTargetTextRaw();

    // Retrieve a range of text.
    wxCharBuffer GetTextRangeRaw(int startPos, int endPos);

    // Replace the contents of the document with the argument text.
    void SetTextRaw(const char* text);

    // Retrieve all the text in the document.
    wxCharBuffer GetTextRaw();

    // Append a string to the end of the document without changing the selection.
    void AppendTextRaw(const char* text, int length=-1);

#ifdef SWIG
    %%pythoncode "_stc_utf8_methods.py"
#endif


    // implement wxTextEntryBase pure virtual methods
    // ----------------------------------------------

    virtual void WriteText(const wxString& text) wxOVERRIDE
    {
        ReplaceSelection(text);
    }

    virtual void Remove(long from, long to) wxOVERRIDE
    {
        Replace(from, to, "");
    }
    virtual void Replace(long from, long to, const wxString& text) wxOVERRIDE
    {
        SetTargetStart((int)from);
        SetTargetEnd((int)to);
        ReplaceTarget(text);
    }

    /*
        These functions are already declared in the generated section.

    virtual void Copy();
    virtual void Cut();
    virtual void Paste();

    virtual void Undo();
    virtual void Redo();

    virtual bool CanUndo() const;
    virtual bool CanRedo() const;

    */

    virtual void SetInsertionPoint(long pos) wxOVERRIDE
    {
        SetCurrentPos(int(pos == -1 ? GetLastPosition() : pos));
    }
    virtual long GetInsertionPoint() const wxOVERRIDE { return GetCurrentPos(); }
    virtual long GetLastPosition() const wxOVERRIDE { return GetTextLength(); }

    virtual void SetSelection(long from, long to) wxOVERRIDE
    {
        if ( from == -1 && to == -1 )
        {
            SelectAll();
        }
        else
        {
            SetSelectionStart((int)from);
            SetSelectionEnd((int)to);
        }
    }

    virtual void SelectNone() wxOVERRIDE
    {
        ClearSelections();
    }

#ifdef SWIG
    void GetSelection(long* OUTPUT, long* OUTPUT) const;
#else
    virtual void GetSelection(long *from, long *to) const wxOVERRIDE
    {
        if ( from )
            *from = GetSelectionStart();
        if ( to )
            *to = GetSelectionEnd();
    }

    // kept for compatibility only
    void GetSelection(int *from, int *to)
    {
        long f, t;
        GetSelection(&f, &t);
        if ( from )
            *from = (int)f;
        if ( to )
            *to = (int)t;
    }
#endif

    virtual bool IsEditable() const wxOVERRIDE { return !GetReadOnly(); }
    virtual void SetEditable(bool editable) wxOVERRIDE { SetReadOnly(!editable); }

    // implement wxTextAreaBase pure virtual methods
    // ---------------------------------------------

    virtual int GetLineLength(long lineNo) const wxOVERRIDE { return static_cast<int>(GetLineText(lineNo).length()); }
    virtual wxString GetLineText(long lineNo) const wxOVERRIDE
    {
        wxString text = GetLine(static_cast<int>(lineNo));
        size_t lastNewLine = text.find_last_not_of(wxS("\r\n"));

        if ( lastNewLine != wxString::npos )
            text.erase(lastNewLine + 1); // remove trailing cr+lf
        else
            text.clear();
        return text;
    }
    virtual int GetNumberOfLines() const wxOVERRIDE { return GetLineCount(); }

    virtual bool IsModified() const wxOVERRIDE { return GetModify(); }
    virtual void MarkDirty() wxOVERRIDE { wxFAIL_MSG("not implemented"); }
    virtual void DiscardEdits() wxOVERRIDE { SetSavePoint(); }

    virtual bool SetStyle(long WXUNUSED(start), long WXUNUSED(end),
                          const wxTextAttr& WXUNUSED(style)) wxOVERRIDE
    {
        wxFAIL_MSG("not implemented");

        return false;
    }

    virtual bool GetStyle(long WXUNUSED(position), wxTextAttr& WXUNUSED(style)) wxOVERRIDE
    {
        wxFAIL_MSG("not implemented");

        return false;
    }

    virtual bool SetDefaultStyle(const wxTextAttr& WXUNUSED(style)) wxOVERRIDE
    {
        wxFAIL_MSG("not implemented");

        return false;
    }

    virtual long XYToPosition(long x, long y) const wxOVERRIDE
    {
        long pos = PositionFromLine((int)y);
        pos += x;
        return pos;
    }

    virtual bool PositionToXY(long pos, long *x, long *y) const wxOVERRIDE
    {
        int l = LineFromPosition((int)pos);
        if ( l == -1 )
            return false;

        if ( x )
            *x = pos - PositionFromLine(l);

        if ( y )
            *y = l;

        return true;
    }

    virtual void ShowPosition(long pos) wxOVERRIDE { GotoPos((int)pos); }

    using wxWindow::HitTest;

    virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, long *pos) const wxOVERRIDE
    {
        const long l = PositionFromPoint(pt);
        if ( l == -1 )
            return wxTE_HT_BELOW; // we don't really know where it was

        if ( pos )
            *pos = l;

        return wxTE_HT_ON_TEXT;
    }

    // just unhide it
    virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt,
                                            wxTextCoord *col,
                                            wxTextCoord *row) const wxOVERRIDE
    {
        return wxTextAreaBase::HitTest(pt, col, row);
    }

    // methods deprecated due to changes in the scintilla library
    // ---------------------------------------------
#if WXWIN_COMPATIBILITY_3_0
    wxDEPRECATED_MSG("use UsePopUp(int) instead.")
    void UsePopUp(bool allowPopUp);

    wxDEPRECATED_MSG("use StartStyling(int start) instead.")
    void StartStyling(int start, int unused);
#endif // WXWIN_COMPATIBILITY_3_0

    static wxVersionInfo GetLibraryVersionInfo();

protected:
    virtual void DoSetValue(const wxString& value, int flags) wxOVERRIDE;
    virtual wxString DoGetValue() const wxOVERRIDE { return GetText(); }
    virtual wxWindow *GetEditableWindow() wxOVERRIDE { return this; }

#ifndef SWIG
    virtual bool DoLoadFile(const wxString& file, int fileType) wxOVERRIDE;
    virtual bool DoSaveFile(const wxString& file, int fileType) wxOVERRIDE;

    // Event handlers
    void OnPaint(wxPaintEvent& evt);
    void OnScrollWin(wxScrollWinEvent& evt);
    void OnScroll(wxScrollEvent& evt);
    void OnSize(wxSizeEvent& evt);
    void OnMouseLeftDown(wxMouseEvent& evt);
    void OnMouseRightDown(wxMouseEvent& evt);
    void OnMouseMove(wxMouseEvent& evt);
    void OnMouseLeftUp(wxMouseEvent& evt);
    void OnMouseRightUp(wxMouseEvent& evt);
    void OnMouseMiddleUp(wxMouseEvent& evt);
    void OnContextMenu(wxContextMenuEvent& evt);
    void OnMouseWheel(wxMouseEvent& evt);
    void OnChar(wxKeyEvent& evt);
    void OnKeyDown(wxKeyEvent& evt);
    void OnLoseFocus(wxFocusEvent& evt);
    void OnGainFocus(wxFocusEvent& evt);
    void OnSysColourChanged(wxSysColourChangedEvent& evt);
    void OnEraseBackground(wxEraseEvent& evt);
    void OnMenu(wxCommandEvent& evt);
    void OnListBox(wxCommandEvent& evt);
    void OnIdle(wxIdleEvent& evt);

    virtual wxSize DoGetBestSize() const wxOVERRIDE;

    // Turn notifications from Scintilla into events
    void NotifyChange();
    void NotifyParent(SCNotification* scn);

private:
    wxDECLARE_EVENT_TABLE();
    wxDECLARE_DYNAMIC_CLASS(wxStyledTextCtrl);

protected:

    ScintillaWX*        m_swx;
    wxStopWatch         m_stopWatch;
    wxScrollBar*        m_vScrollBar;
    wxScrollBar*        m_hScrollBar;

    bool                m_lastKeyDownConsumed;

    friend class ScintillaWX;
    friend class Platform;
#endif // !SWIG
};

//----------------------------------------------------------------------

class WXDLLIMPEXP_STC wxStyledTextEvent : public wxCommandEvent {
public:
    wxStyledTextEvent(wxEventType commandType=0, int id=0);
#ifndef SWIG
    wxStyledTextEvent(const wxStyledTextEvent& event);
#endif
    ~wxStyledTextEvent() {}

    void SetPosition(int pos)             { m_position = pos; }
    void SetKey(int k)                    { m_key = k; }
    void SetModifiers(int m)              { m_modifiers = m; }
    void SetModificationType(int t)       { m_modificationType = t; }
    // Kept for backwards compatibility, use SetString().
    void SetText(const wxString& t)       { SetString(t); }
    void SetLength(int len)               { m_length = len; }
    void SetLinesAdded(int num)           { m_linesAdded = num; }
    void SetLine(int val)                 { m_line = val; }
    void SetFoldLevelNow(int val)         { m_foldLevelNow = val; }
    void SetFoldLevelPrev(int val)        { m_foldLevelPrev = val; }
    void SetMargin(int val)               { m_margin = val; }
    void SetMessage(int val)              { m_message = val; }
    void SetWParam(int val)               { m_wParam = val; }
    void SetLParam(int val)               { m_lParam = val; }
    void SetListType(int val)             { m_listType = val; }
    void SetX(int val)                    { m_x = val; }
    void SetY(int val)                    { m_y = val; }
    void SetToken(int val)                { m_token = val; }
    void SetAnnotationLinesAdded(int val) { m_annotationLinesAdded = val; }
    void SetUpdated(int val)              { m_updated = val; }
    void SetListCompletionMethod(int val) { m_listCompletionMethod = val; }
#ifdef  STC_USE_DND
    // Kept for backwards compatibility, use SetString().
    void SetDragText(const wxString& val) { SetString(val); }
    void SetDragFlags(int flags)          { m_dragFlags = flags; }
    void SetDragResult(wxDragResult val)  { m_dragResult = val; }

    // This method is kept mainly for backwards compatibility, use
    // SetDragFlags() in the new code.
    void SetDragAllowMove(bool allow)
    {
        if ( allow )
            m_dragFlags |= wxDrag_AllowMove;
        else
            m_dragFlags &= ~(wxDrag_AllowMove | wxDrag_DefaultMove);
    }
#endif

    int  GetPosition() const         { return m_position; }
    int  GetKey()  const             { return m_key; }
    int  GetModifiers() const        { return m_modifiers; }
    int  GetModificationType() const { return m_modificationType; }
    // Kept for backwards compatibility, use GetString().
    wxString GetText() const         { return GetString(); }
    int  GetLength() const           { return m_length; }
    int  GetLinesAdded() const       { return m_linesAdded; }
    int  GetLine() const             { return m_line; }
    int  GetFoldLevelNow() const     { return m_foldLevelNow; }
    int  GetFoldLevelPrev() const    { return m_foldLevelPrev; }
    int  GetMargin() const           { return m_margin; }
    int  GetMessage() const          { return m_message; }
    int  GetWParam() const           { return m_wParam; }
    int  GetLParam() const           { return m_lParam; }
    int  GetListType() const         { return m_listType; }
    int  GetX() const                { return m_x; }
    int  GetY() const                { return m_y; }
    int  GetToken() const                 { return m_token; }
    int  GetAnnotationsLinesAdded() const { return m_annotationLinesAdded; }
    int  GetUpdated() const               { return m_updated; }
    int  GetListCompletionMethod() const  { return m_listCompletionMethod; }
    
#ifdef STC_USE_DND
    // Kept for backwards compatibility, use GetString().
    wxString GetDragText()           { return GetString(); }
    int GetDragFlags()               { return m_dragFlags; }
    wxDragResult GetDragResult()     { return m_dragResult; }

    bool GetDragAllowMove() { return (GetDragFlags() & wxDrag_AllowMove) != 0; }
#endif

    bool GetShift() const;
    bool GetControl() const;
    bool GetAlt() const;

    virtual wxEvent* Clone() const wxOVERRIDE { return new wxStyledTextEvent(*this); }

#ifndef SWIG
private:
    wxDECLARE_DYNAMIC_CLASS(wxStyledTextEvent);

    int  m_position;
    int  m_key;
    int  m_modifiers;

    int  m_modificationType;    // wxEVT_STC_MODIFIED
    int  m_length;
    int  m_linesAdded;
    int  m_line;
    int  m_foldLevelNow;
    int  m_foldLevelPrev;

    int  m_margin;              // wxEVT_STC_MARGINCLICK

    int  m_message;             // wxEVT_STC_MACRORECORD
    int  m_wParam;
    int  m_lParam;

    int m_listType;
    int m_x;
    int m_y;

    int m_token;                // wxEVT_STC__MODIFIED with SC_MOD_CONTAINER 
    int m_annotationLinesAdded; // wxEVT_STC_MODIFIED with SC_MOD_CHANGEANNOTATION 
    int m_updated;              // wxEVT_STC_UPDATEUI
    int m_listCompletionMethod;

#if wxUSE_DRAG_AND_DROP
    int      m_dragFlags;       // wxEVT_STC_START_DRAG
    wxDragResult m_dragResult;  // wxEVT_STC_DRAG_OVER,wxEVT_STC_DO_DROP
#endif
#endif
};



#ifndef SWIG
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_CHANGE, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_STYLENEEDED, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_CHARADDED, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_SAVEPOINTREACHED, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_SAVEPOINTLEFT, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_ROMODIFYATTEMPT, wxStyledTextEvent );
#if WXWIN_COMPATIBILITY_3_0
wxDEPRECATED_MSG( "Don't handle wxEVT_STC_KEY. It's never generated." ) \
    wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_KEY, wxStyledTextEvent );
#endif // WXWIN_COMPATIBILITY_3_0
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_DOUBLECLICK, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_UPDATEUI, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_MODIFIED, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_MACRORECORD, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_MARGINCLICK, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_NEEDSHOWN, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_PAINTED, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_USERLISTSELECTION, wxStyledTextEvent );
#if WXWIN_COMPATIBILITY_3_0
wxDEPRECATED_MSG( "Don't handle wxEVT_STC_URIDROPPED. It's never generated." ) \
    wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_URIDROPPED, wxStyledTextEvent );
#endif // WXWIN_COMPATIBILITY_3_0
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_DWELLSTART, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_DWELLEND, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_START_DRAG, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_DRAG_OVER, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_DO_DROP, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_ZOOM, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_HOTSPOT_CLICK, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_HOTSPOT_DCLICK, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_CALLTIP_CLICK, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_AUTOCOMP_SELECTION, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_INDICATOR_CLICK, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_INDICATOR_RELEASE, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_AUTOCOMP_CANCELLED, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_AUTOCOMP_CHAR_DELETED, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_HOTSPOT_RELEASE_CLICK, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_CLIPBOARD_COPY, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_CLIPBOARD_PASTE, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_AUTOCOMP_COMPLETED, wxStyledTextEvent );
wxDECLARE_EXPORTED_EVENT( WXDLLIMPEXP_STC, wxEVT_STC_MARGIN_RIGHT_CLICK, wxStyledTextEvent );

#else
    enum {
        wxEVT_STC_CHANGE,
        wxEVT_STC_STYLENEEDED,
        wxEVT_STC_CHARADDED,
        wxEVT_STC_SAVEPOINTREACHED,
        wxEVT_STC_SAVEPOINTLEFT,
        wxEVT_STC_ROMODIFYATTEMPT,
#if WXWIN_COMPATIBILITY_3_0
        wxEVT_STC_KEY, // deprecated
#endif // WXWIN_COMPATIBILITY_3_0
        wxEVT_STC_DOUBLECLICK,
        wxEVT_STC_UPDATEUI,
        wxEVT_STC_MODIFIED,
        wxEVT_STC_MACRORECORD,
        wxEVT_STC_MARGINCLICK,
        wxEVT_STC_NEEDSHOWN,
        wxEVT_STC_PAINTED,
        wxEVT_STC_USERLISTSELECTION,
#if WXWIN_COMPATIBILITY_3_0
        wxEVT_STC_URIDROPPED, // deprecated
#endif // WXWIN_COMPATIBILITY_3_0
        wxEVT_STC_DWELLSTART,
        wxEVT_STC_DWELLEND,
        wxEVT_STC_START_DRAG,
        wxEVT_STC_DRAG_OVER,
        wxEVT_STC_DO_DROP,
        wxEVT_STC_ZOOM,
        wxEVT_STC_HOTSPOT_CLICK,
        wxEVT_STC_HOTSPOT_DCLICK,
        wxEVT_STC_CALLTIP_CLICK,
        wxEVT_STC_AUTOCOMP_SELECTION,
        wxEVT_STC_INDICATOR_CLICK,
        wxEVT_STC_INDICATOR_RELEASE,
        wxEVT_STC_AUTOCOMP_CANCELLED,
        wxEVT_STC_AUTOCOMP_CHAR_DELETED,
        wxEVT_STC_HOTSPOT_RELEASE_CLICK,
        wxEVT_STC_CLIPBOARD_COPY,
        wxEVT_STC_CLIPBOARD_PASTE,
        wxEVT_STC_AUTOCOMP_COMPLETED,
        wxEVT_STC_MARGIN_RIGHT_CLICK
    };
#endif



#ifndef SWIG
typedef void (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&);

#define wxStyledTextEventHandler( func ) \
    wxEVENT_HANDLER_CAST( wxStyledTextEventFunction, func )

#define EVT_STC_CHANGE(id, fn)             wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHANGE,                id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_STYLENEEDED(id, fn)        wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_STYLENEEDED,           id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_CHARADDED(id, fn)          wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CHARADDED,             id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_SAVEPOINTREACHED(id, fn)   wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTREACHED,      id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_SAVEPOINTLEFT(id, fn)      wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_SAVEPOINTLEFT,         id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_ROMODIFYATTEMPT(id, fn)    wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_ROMODIFYATTEMPT,       id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_KEY(id, fn)                wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_KEY,                   id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_DOUBLECLICK(id, fn)        wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DOUBLECLICK,           id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_UPDATEUI(id, fn)           wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_UPDATEUI,              id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_MODIFIED(id, fn)           wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MODIFIED,              id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_MACRORECORD(id, fn)        wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MACRORECORD,           id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_MARGINCLICK(id, fn)        wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MARGINCLICK,           id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_NEEDSHOWN(id, fn)          wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_NEEDSHOWN,             id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_PAINTED(id, fn)            wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_PAINTED,               id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_USERLISTSELECTION(id, fn)  wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_USERLISTSELECTION,     id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_URIDROPPED(id, fn)         wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_URIDROPPED,            id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_DWELLSTART(id, fn)         wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLSTART,            id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_DWELLEND(id, fn)           wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DWELLEND,              id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_START_DRAG(id, fn)         wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_START_DRAG,            id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_DRAG_OVER(id, fn)          wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DRAG_OVER,             id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_DO_DROP(id, fn)            wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_DO_DROP,               id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_ZOOM(id, fn)               wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_ZOOM,                  id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_HOTSPOT_CLICK(id, fn)      wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_HOTSPOT_CLICK,         id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_HOTSPOT_DCLICK(id, fn)     wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_HOTSPOT_DCLICK,        id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_CALLTIP_CLICK(id, fn)      wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CALLTIP_CLICK,         id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_AUTOCOMP_SELECTION(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_AUTOCOMP_SELECTION,    id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_INDICATOR_CLICK(id, fn)    wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_INDICATOR_CLICK,       id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_INDICATOR_RELEASE(id, fn)  wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_INDICATOR_RELEASE,     id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_AUTOCOMP_CANCELLED(id, fn)    wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_AUTOCOMP_CANCELLED,    id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_AUTOCOMP_CHAR_DELETED(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_AUTOCOMP_CHAR_DELETED, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_HOTSPOT_RELEASE_CLICK(id, fn) wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_HOTSPOT_RELEASE_CLICK, id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_CLIPBOARD_COPY(id, fn)        wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CLIPBOARD_COPY,        id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_CLIPBOARD_PASTE(id, fn)       wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_CLIPBOARD_PASTE,       id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_AUTOCOMP_COMPLETED(id, fn)    wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_AUTOCOMP_COMPLETED,    id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),
#define EVT_STC_MARGIN_RIGHT_CLICK(id, fn)    wxDECLARE_EVENT_TABLE_ENTRY( wxEVT_STC_MARGIN_RIGHT_CLICK,    id, wxID_ANY, wxStyledTextEventHandler( fn ), (wxObject *) NULL ),

#endif

#endif // wxUSE_STC

#endif // _WX_STC_STC_H_
