wxWidgets/include/wx/stc/stc.h
Robin Dunn 9ce192d417 Initial version of wxStyledTextCtrl, a Scintilla wrapper. There is
still LOTS and LOTS to be done, but this is already very functional.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6555 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2000-03-09 19:42:06 +00:00

548 lines
18 KiB
C++

////////////////////////////////////////////////////////////////////////////
// Name: stc.h
// Purpose: A wxWindows 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 itentifiers from Scintilla.
//
// Author: Robin Dunn
//
// Created: 13-Jan-2000
// RCS-ID: $Id$
// Copyright: (c) 2000 by Total Control Software
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#ifndef __stc_h__
#define __stc_h__
#include <wx/wx.h>
//----------------------------------------------------------------------
// constants and stuff
enum wxSTC_UndoType {
wxSTC_UndoCollectNone,
wxSTC_UndoCollectAutoStart
};
enum wxSTC_EOL {
wxSTC_EOL_CRLF,
wxSTC_EOL_CR,
wxSTC_EOL_LF
};
enum wxSTC_EDGE {
wxSTC_EDGE_NONE,
wxSTC_EDGE_LINE,
wxSTC_EDGE_BACKGROUND
};
const int wxSTC_LEX_STYLE_MAX = 31;
const int wxSTC_STYLE_DEFAULT = 32;
const int wxSTC_STYLE_LINENUMBER = 33;
const int wxSTC_STYLE_BRACELIGHT = 34;
const int wxSTC_STYLE_BRACEBAD = 35;
const int wxSTC_STYLE_CONTROLCHAR = 36;
const int wxSTC_STYLE_MAX = 63;
const int wxSTC_STYLE_MASK = 31;
const int wxSTC_MARKER_MAX = 31;
const int wxSTC_MARK_CIRCLE = 0;
const int wxSTC_MARK_ROUNDRECT = 1;
const int wxSTC_MARK_ARROW = 2;
const int wxSTC_MARK_SMALLRECT = 3;
const int wxSTC_MARK_SHORTARROW = 4;
const int wxSTC_MARK_EMPTY = 5;
const int wxSTC_INDIC_PLAIN = 0;
const int wxSTC_INDIC_SQUIGGLE = 1;
const int wxSTC_INDIC_TT = 2;
const int wxSTC_INDIC0_MASK = 32;
const int wxSTC_INDIC1_MASK = 64;
const int wxSTC_INDIC2_MASK = 128;
const int wxSTC_INDICS_MASK = (wxSTC_INDIC0_MASK | wxSTC_INDIC1_MASK | wxSTC_INDIC2_MASK);
// key commands
enum {
wxSTC_CMD_LINEDOWN = 2300,
wxSTC_CMD_LINEDOWNEXTEND,
wxSTC_CMD_LINEUP,
wxSTC_CMD_LINEUPEXTEND,
wxSTC_CMD_CHARLEFT,
wxSTC_CMD_CHARLEFTEXTEND,
wxSTC_CMD_CHARRIGHT,
wxSTC_CMD_CHARRIGHTEXTEND,
wxSTC_CMD_WORDLEFT,
wxSTC_CMD_WORDLEFTEXTEND,
wxSTC_CMD_WORDRIGHT,
wxSTC_CMD_WORDRIGHTEXTEND,
wxSTC_CMD_HOME,
wxSTC_CMD_HOMEEXTEND,
wxSTC_CMD_LINEEND,
wxSTC_CMD_LINEENDEXTEND,
wxSTC_CMD_DOCUMENTSTART,
wxSTC_CMD_DOCUMENTSTARTEXTEND,
wxSTC_CMD_DOCUMENTEND,
wxSTC_CMD_DOCUMENTENDEXTEND,
wxSTC_CMD_PAGEUP,
wxSTC_CMD_PAGEUPEXTEND,
wxSTC_CMD_PAGEDOWN,
wxSTC_CMD_PAGEDOWNEXTEND,
wxSTC_CMD_EDITTOGGLEOVERTYPE,
wxSTC_CMD_CANCEL,
wxSTC_CMD_DELETEBACK,
wxSTC_CMD_TAB,
wxSTC_CMD_BACKTAB,
wxSTC_CMD_NEWLINE,
wxSTC_CMD_FORMFEED,
wxSTC_CMD_VCHOME,
wxSTC_CMD_VCHOMEEXTEND,
wxSTC_CMD_ZOOMIN,
wxSTC_CMD_ZOOMOUT,
wxSTC_CMD_DELWORDLEFT,
wxSTC_CMD_DELWORDRIGHT
};
enum wxSTC_LEX {
wxSTC_LEX_CONTAINER=0,
wxSTC_LEX_NULL,
wxSTC_LEX_PYTHON,
wxSTC_LEX_CPP,
wxSTC_LEX_HTML,
wxSTC_LEX_XML,
wxSTC_LEX_PERL,
wxSTC_LEX_SQL,
wxSTC_LEX_VB,
wxSTC_LEX_PROPERTIES,
wxSTC_LEX_ERRORLIST,
wxSTC_LEX_MAKEFILE,
wxSTC_LEX_BATCH,
};
const int wxSTC_CARET_SLOP = 0x01;
const int WXSTC_CARET_CENTER = 0x02;
const int wxSTC_CARET_STRICT = 0x04;
const int wxSTC_MARGIN_SYMBOL = 0;
const int wxSTC_MARGIN_NUMBER = 1;
class ScintillaWX; // forward declare
class WordList;
struct SCNotification;
extern const wxChar* wxSTCNameStr;
//----------------------------------------------------------------------
class wxStyledTextCtrl : public wxControl {
public:
wxStyledTextCtrl(wxWindow *parent, wxWindowID id,
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize, long style = 0,
const wxString& name = wxSTCNameStr);
~wxStyledTextCtrl();
// Text retrieval and modification
wxString GetText();
bool SetText(const wxString& text);
wxString GetLine(int line);
void ReplaceSelection(const wxString& text);
void SetReadOnly(bool readOnly);
bool GetReadOnly();
wxString GetTextRange(int startPos, int endPos);
wxString GetStyledTextRange(int startPos, int endPos);
void GetTextRange(int startPos, int endPos, char* buff);
void GetStyledTextRange(int startPos, int endPos, char* buff);
void AddText(const wxString& text);
void AddStyledText(const wxString& text);
void InsertText(int pos, const wxString& text);
void ClearAll();
char GetCharAt(int pos);
char GetStyleAt(int pos);
void SetStyleBits(int bits);
int GetStyleBits();
// Clipboard
void Cut();
void Copy();
void Paste();
bool CanPaste();
void ClearClipbrd(); // avoiding name conflict with virtual in wxWindow
// Undo and Redo
void Undo();
bool CanUndo();
void EmptyUndoBuffer();
void Redo();
bool CanRedo();
void SetUndoCollection(wxSTC_UndoType type);
wxSTC_UndoType GetUndoCollection();
void BeginUndoAction();
void EndUndoAction();
// Selection and information
void GetSelection(int* startPos, int* endPos);
void SetSelection(int startPos, int endPos);
wxString GetSelectedText();
void HideSelection(bool hide);
bool GetHideSelection();
int GetTextLength();
int GetFirstVisibleLine();
bool GetModified();
int GetLineCount();
wxRect GetRect();
int GetLineFromPos(int pos);
int GetLineStartPos(int line);
int GetLineLengthAtPos(int pos);
int GetLineLength(int line);
wxString GetCurrentLineText(int* linePos=NULL);
int GetCurrentLine();
int PositionFromPoint(wxPoint pt);
int LineFromPoint(wxPoint pt);
wxPoint PointFromPosition(int pos);
int GetCurrentPos();
int GetAnchor();
void SelectAll();
void SetCurrentPosition(int pos);
void SetAnchor(int pos);
void GotoPos(int pos);
void GotoLine(int line);
void ChangePosition(int delta, bool extendSelection);
void PageMove(int cmdKey, bool extendSelection);
void ScrollBy(int columnDelta, int lineDelta);
void ScrollToLine(int line);
void ScrollToColumn(int column);
void EnsureCaretVisible();
void SetCaretPolicy(int policy, int slop=0);
int GetSelectionType();
// Searching
int FindText(int minPos, int maxPos, const wxString& text,
bool caseSensitive, bool wholeWord);
void SearchAnchor();
int SearchNext(const wxString& text, bool caseSensitive, bool wholeWord);
int SearchPrev(const wxString& text, bool caseSensitive, bool wholeWord);
// Visible whitespace
bool GetViewWhitespace();
void SetViewWhitespace(bool visible);
// Line endings
wxSTC_EOL GetEOLMode();
void SetEOLMode(wxSTC_EOL mode);
bool GetViewEOL();
void SetViewEOL(bool visible);
void ConvertEOL(wxSTC_EOL mode);
// Styling
int GetEndStyled();
void StartStyling(int pos, int mask);
void SetStyleFor(int length, int style);
void SetStyleBytes(int length, char* styleBytes);
// Style Definition
void StyleClearAll();
void StyleResetDefault();
void StyleSetSpec(int styleNum, const wxString& spec);
void StyleSetForeground(int styleNum, const wxColour& colour);
void StyleSetBackground(int styleNum, const wxColour& colour);
void StyleSetFont(int styleNum, wxFont& font);
void StyleSetFontAttr(int styleNum, int size, const wxString& faceName, bool bold, bool italic);
void StyleSetBold(int styleNum, bool bold);
void StyleSetItalic(int styleNum, bool italic);
void StyleSetFaceName(int styleNum, const wxString& faceName);
void StyleSetSize(int styleNum, int pointSize);
void StyleSetEOLFilled(int styleNum, bool fillEOL);
// Margins in the edit area
int GetLeftMargin();
int GetRightMargin();
void SetMargins(int left, int right);
// Margins for selection, markers, etc.
void SetMarginType(int margin, int type);
int GetMarginType(int margin);
void SetMarginWidth(int margin, int pixelWidth);
int GetMarginWidth(int margin);
void SetMarginMask(int margin, int mask);
int GetMarginMask(int margin);
void SetMarginSensitive(int margin, bool sensitive);
bool GetMarginSensitive(int margin);
// Selection and Caret styles
void SetSelectionForeground(const wxColour& colour);
void SetSelectionBackground(const wxColour& colour);
void SetCaretForeground(const wxColour& colour);
int GetCaretPeriod();
void SetCaretPeriod(int milliseconds);
// Other settings
void SetBufferedDraw(bool isBuffered);
void SetTabWidth(int numChars);
void SetWordChars(const wxString& wordChars);
// Brace highlighting
void BraceHighlight(int pos1, int pos2);
void BraceBadlight(int pos);
int BraceMatch(int pos, int maxReStyle=0);
// Markers
void MarkerDefine(int markerNumber, int markerSymbol,
const wxColour& foreground,
const wxColour& background);
void MarkerSetType(int markerNumber, int markerSymbol);
void MarkerSetForeground(int markerNumber, const wxColour& colour);
void MarkerSetBackground(int markerNumber, const wxColour& colour);
int MarkerAdd(int line, int markerNumber);
void MarkerDelete(int line, int markerNumber);
void MarkerDeleteAll(int markerNumber);
int MarkerGet(int line);
int MarkerGetNextLine(int lineStart, int markerMask);
int MarkerGetPrevLine(int lineStart, int markerMask);
int MarkerLineFromHandle(int handle);
void MarkerDeleteHandle(int handle);
// Indicators
void IndicatorSetStyle(int indicNum, int indicStyle);
int IndicatorGetStyle(int indicNum);
void IndicatorSetColour(int indicNum, const wxColour& colour);
// Auto completion
void AutoCompShow(const wxString& listOfWords);
void AutoCompCancel();
bool AutoCompActive();
int AutoCompPosAtStart();
void AutoCompComplete();
void AutoCompStopChars(const wxString& stopChars);
// Call tips
void CallTipShow(int pos, const wxString& text);
void CallTipCancel();
bool CallTipActive();
int CallTipPosAtStart();
void CallTipSetHighlight(int start, int end);
void CallTipSetBackground(const wxColour& colour);
// Key bindings
void CmdKeyAssign(int key, int modifiers, int cmd);
void CmdKeyClear(int key, int modifiers);
void CmdKeyClearAll();
void CmdKeyExecute(int cmd);
// Print formatting
int FormatRange(bool doDraw,
int startPos,
int endPos,
wxDC* draw,
wxDC* target, // Why does it use two? Can they be the same?
wxRect renderRect,
wxRect pageRect);
// Document Sharing (multiple views)
void* GetDocument();
void SetDocument(void* document);
// TODO: create a wx wrapper for Scintilla's document class
// TODO: Folding
// Long Lines
int GetEdgeColumn();
void SetEdgeColumn(int column);
wxSTC_EDGE GetEdgeMode();
void SetEdgeMode(wxSTC_EDGE mode);
wxColour GetEdgeColour();
void SetEdgeColour(const wxColour& colour);
// Lexer
void SetLexer(wxSTC_LEX lexer);
wxSTC_LEX GetLexer();
void Colourise(int start, int end);
void SetProperty(const wxString& key, const wxString& value);
void SetKeywords(int keywordSet, const wxString& keywordList);
private:
// Event handlers
void OnPaint(wxPaintEvent& evt);
void OnScrollWin(wxScrollWinEvent& evt);
void OnSize(wxSizeEvent& evt);
void OnMouseLeftDown(wxMouseEvent& evt);
void OnMouseMove(wxMouseEvent& evt);
void OnMouseLeftUp(wxMouseEvent& evt);
void OnMouseRightUp(wxMouseEvent& evt);
void OnChar(wxKeyEvent& evt);
void OnLoseFocus(wxFocusEvent& evt);
void OnGainFocus(wxFocusEvent& evt);
void OnSysColourChanged(wxSysColourChangedEvent& evt);
void OnEraseBackground(wxEraseEvent& evt);
void OnMenu(wxCommandEvent& evt);
// Turn notifications from Scintilla into events
void NotifyChange();
void NotifyParent(SCNotification* scn);
long SendMsg(int msg, long wp=0, long lp=0);
private:
DECLARE_EVENT_TABLE()
ScintillaWX* m_swx;
wxStopWatch m_stopWatch;
bool m_readOnly;
wxSTC_UndoType m_undoType;
friend class ScintillaWX;
friend class Platform;
};
//----------------------------------------------------------------------
class wxStyledTextEvent : public wxCommandEvent {
public:
wxStyledTextEvent(wxEventType commandType, int id);
~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; }
void SetText(const char* t) { m_text = 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; }
int GetPosition() const { return m_position; }
int GetKey() const { return m_key; }
int GetModifiers() const { return m_modifiers; }
int GetModificationType() const { return m_modificationType; }
wxString GetText() const { return m_text; }
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; }
bool GetShift() const;
bool GetControl() const;
bool GetAlt() const;
void CopyObject(wxObject& obj) const;
private:
int m_position;
int m_key;
int m_modifiers;
int m_modificationType; // wxEVT_STC_MODIFIED
wxString m_text;
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;
};
enum {
wxEVT_STC_CHANGE = 1650,
wxEVT_STC_STYLENEEDED,
wxEVT_STC_CHARADDED,
wxEVT_STC_UPDATEUI,
wxEVT_STC_SAVEPOINTREACHED,
wxEVT_STC_SAVEPOINTLEFT,
wxEVT_STC_ROMODIFYATTEMPT,
wxEVT_STC_DOUBLECLICK,
wxEVT_STC_MODIFIED,
wxEVT_STC_KEY,
wxEVT_STC_MACRORECORD,
wxEVT_STC_MARGINCLICK,
wxEVT_STC_NEEDSHOWN
};
typedef void (wxEvtHandler::*wxStyledTextEventFunction)(wxStyledTextEvent&);
#define EVT_STC_CHANGE(id, fn) { wxEVT_STC_CHANGE, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_STYLENEEDED(id, fn) { wxEVT_STC_STYLENEEDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_CHARADDED(id, fn) { wxEVT_STC_CHARADDED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_UPDATEUI(id, fn) { wxEVT_STC_UPDATEUI, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_SAVEPOINTREACHED(id, fn) { wxEVT_STC_SAVEPOINTREACHED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_SAVEPOINTLEFT(id, fn) { wxEVT_STC_SAVEPOINTLEFT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_ROMODIFYATTEMPT(id, fn) { wxEVT_STC_ROMODIFYATTEMPT, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_DOUBLECLICK(id, fn) { wxEVT_STC_DOUBLECLICK, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_MODIFIED(id, fn) { wxEVT_STC_MODIFIED, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_CMDKEY(id, fn) { wxEVT_STC_CMDKEY, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
#define EVT_STC_UNKNOWNCMDKEY(id, fn) { wxEVT_STC_UNKNOWNCMDKEY, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxStyledTextEventFunction) & fn, (wxObject *) NULL },
//----------------------------------------------------------------------
//----------------------------------------------------------------------
#endif