#ifndef IDEEDITOR_H #define IDEEDITOR_H //#include #include NAMESPACE_UPP #define LAYOUTFILE #include #define IMAGEVECTOR Vector #define IMAGECLASS CodeEditorImg #define IMAGEFILE #include void FindWildcardMenu(Callback1 cb, Point p, bool tablf, Ctrl *owner = NULL); struct LineInfoRecord { int lineno; String breakpoint; int count; }; typedef Array LineInfo; void Renumber(LineInfo& lf); void ClearBreakpoints(LineInfo& lf); void ValidateBreakpoints(LineInfo& lf); class CodeEditor; class EditorBar : public FrameLeft { public: virtual void Paint(Draw& w); virtual void MouseMove(Point p, dword flags); virtual void LeftDown(Point p, dword flags); virtual void LeftDouble(Point p, dword flags); virtual void RightDown(Point p, dword flags); private: struct LnInfo : Moveable { int lineno; String breakpoint; LnInfo() { lineno = -1; } }; Vector li; int sy; CodeEditor *editor; int ptrline[2]; Image ptrimg[2]; bool bingenabled; bool hilite_if_endif; bool line_numbers; String& PointBreak(int& y); void sPaintImage(Draw& w, int y, int fy, const Image& img); public: Callback1 WhenBreakpoint; void InsertLines(int i, int count); void RemoveLines(int i, int count); void ClearLines(); void Scroll() { Refresh(); } void Renumber(int linecount); void ClearBreakpoints(); void ValidateBreakpoints(); String GetBreakpoint(int ln); void SetBreakpoint(int ln, const String& s); void SetEditor(CodeEditor *e) { editor = e; } LineInfo GetLineInfo() const; void SetLineInfo(const LineInfo& li, int total); int GetLineNo(int lineno) const; int GetNoLine(int line) const; void SetPtr(int line, const Image& img, int i); void HidePtr(); void EnableBreakpointing(bool b) { bingenabled = b; } void HiliteIfEndif(bool b) { hilite_if_endif = b; Refresh(); } void LineNumbers(bool b); bool IsHiliteIfEndif() const { return hilite_if_endif; } EditorBar(); virtual ~EditorBar(); }; struct IdentPos { int begin; int end; String ident; }; Array GetLineIdent(const char *line); Vector GetLineString(const wchar *wline, bool& is_begin, bool& is_end); inline int CharFilterCIdent(int i) { return IsAlNum(i) || i == '_' ? i : 0; } inline bool islbrkt(int c) { return c == '{' || c == '[' || c == '('; } inline bool isrbrkt(int c) { return c == '}' || c == ']' || c == ')'; } inline bool isbrkt(int c) { return islbrkt(c) || isrbrkt(c); } class CodeEditor : public LineEdit { friend class EditorBar; public: virtual bool Key(dword code, int count); virtual void LeftDown(Point p, dword keyflags); virtual void LeftDouble(Point p, dword keyflags); virtual void MouseMove(Point p, dword keyflags); virtual void Serialize(Stream& s); protected: virtual void HighlightLine(int line, Vector& h, int pos); virtual void PreInsert(int pos, const WString& s); virtual void PostInsert(int pos, const WString& s); virtual void PreRemove(int pos, int size); virtual void PostRemove(int pos, int size); virtual void DirtyFrom(int line); virtual void SelectionChanged(); virtual void ClearLines(); virtual void InsertLines(int line, int count); virtual void RemoveLines(int line, int count); virtual void NewScrollPos(); EditorBar bar; struct Isx : Moveable { int line; int pos; friend bool operator==(Isx a, Isx b) { return a.line == b.line && a.pos == b.pos; } friend bool operator!=(Isx a, Isx b) { return !(a == b); } }; struct IfState : Moveable { enum { IF = '0', ELIF, ELSE, ELSE_ERROR, ENDIF_ERROR }; WString iftext; short ifline; char state; bool operator==(const IfState& b) const { return iftext == b.iftext && state == b.state && ifline == b.ifline; } IfState() { ifline = state = 0; } }; struct SyntaxState { int line; bool comment; bool linecomment; bool string; bool linecont; char macro; enum { MACRO_OFF, MACRO_CONT, MACRO_END }; int cl, bl, pl; WithDeepCopy< Vector > brk; WithDeepCopy< Vector > blk; WithDeepCopy< Vector > bid; WithDeepCopy< Vector > par; WithDeepCopy< Vector > ifstack; int stmtline; int endstmtline; int seline; int spar; Color uvscolor; void DropItem(int type); bool Drop(int type); void Clear(); bool MatchHilite(const SyntaxState& st) const; void ScanSyntax(const wchar *ln, const wchar *e); static Color IfColor(char ifstate); SyntaxState() { Clear(); } }; friend struct SyntaxState; SyntaxState scache[4]; SyntaxState rm_ins; char rmb; byte hilite_bracket; int highlight_bracket_pos0; int highlight_bracket_pos; bool bracket_flash; int bracket_start; byte hilite_scope; byte hilite_ifdef; bool indent_spaces : 1; bool no_parenthesis_indent : 1; int indent_amount; double stat_edit_time; Time last_key_time; bool auto_enclose; struct FindReplace : WithIDEFindReplaceLayout { WString itext; virtual bool Key(dword key, int count); } findreplace; FrameRight