#ifndef IDEEDITOR_H #define IDEEDITOR_H //#include #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, bool regexp); struct LineInfoRecord { int lineno; String breakpoint; int count; int firstedited; int edited; LineInfoRecord() { edited = 0; } }; typedef Array LineInfo; struct LineInfoRemRecord : Moveable { int firstedited; int edited; }; typedef Vector LineInfoRem; 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 MouseLeave(); virtual void LeftDown(Point p, dword flags); virtual void LeftDouble(Point p, dword flags); virtual void RightDown(Point p, dword flags); virtual void MouseWheel(Point p, int zdelta, dword keyflags); private: struct LnInfo : Moveable { int lineno = -1; String breakpoint; int firstedited = 0; int edited = 0; Image icon; String annotation; }; Vector li; LineInfoRem li_removed; CodeEditor *editor; int ptrline[2]; Image ptrimg[2]; bool bingenabled; bool hilite_if_endif; bool line_numbers; int annotations; bool ignored_next_edit; int next_age; int active_annotation; Vector animate; Image status_image; Color bg_color = Null; String text; String& PointBreak(int& y); void sPaintImage(Draw& w, int y, int fy, const Image& img); friend class CodeEditor; public: Event WhenBreakpoint; Event<> WhenAnnotationMove; Event<> WhenAnnotationClick; Event<> WhenAnnotationRightClick; void InsertLines(int i, int count); void RemoveLines(int i, int count); void ClearLines(); void Scroll() { Refresh(); } void SyncSize(); void Renumber(int linecount); void ClearBreakpoints(); void ValidateBreakpoints(); String GetBreakpoint(int ln); void SetBreakpoint(int ln, const String& s); void SetEdited(int ln, int count = 1); void ClearEdited(); void SetEditor(CodeEditor *e) { editor = e; } LineInfo GetLineInfo() const; void SetLineInfo(const LineInfo& li, int total); LineInfoRem & GetLineInfoRem() { return li_removed; } void SetLineInfoRem(LineInfoRem pick_ li) { li_removed = pick(li); } void ClearAnnotations(); void SetAnnotation(int line, const Image& img, const String& ann); String GetAnnotation(int line) const; 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); void Annotations(int width); bool IsHiliteIfEndif() const { return hilite_if_endif; } int GetActiveAnnotationLine() const { return active_annotation; } void SetAnimate(const Vector& a) { if(a != animate) { animate = clone(a); Refresh(); } } void StatusImage(const Image& m); void Background(Color c) { if(c != bg_color) { bg_color = c; Refresh(); }} void Text(const String& s) { if(s != text) { text = s; Refresh(); }} 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 iscidl(int c) { return iscid(c) || IsLetter(c); } 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); } struct FindReplaceDlg : FrameBottom< WithIDEFindReplaceLayout > { WString itext; bool replacing; virtual bool Key(dword key, int count); void Setup(bool doreplace); void Sync(); bool IsIncremental() const { return incremental.IsEnabled() && incremental; } typedef FindReplaceDlg CLASSNAME; FindReplaceDlg(); }; #include "Syntax.h" #include "CSyntax.h" #include "DiffSyntax.h" #include "TagSyntax.h" #include "LogSyntax.h" #include "PythonSyntax.h" class CodeEditor : public LineEdit, public HighlightSetup { 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 LeftTriple(Point p, dword keyflags); virtual void LeftRepeat(Point p, dword keyflags); virtual void MouseMove(Point p, dword keyflags); virtual Image CursorImage(Point p, dword keyflags); virtual void Serialize(Stream& s); virtual void MouseLeave(); virtual void MouseWheel(Point p, int zdelta, dword keyFlags); virtual void Layout(); virtual void Paint(Draw& w); public: struct MouseTip { int pos; Value value; const Display *display; Size sz; bool delayed = false; Color background; }; protected: virtual void HighlightLine(int line, Vector& h, int64 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(); virtual String GetPasteText(); TimeCallback delayed, closetip; EditorBar bar; Vector line2; struct SyntaxPos { int line; String data; void Clear() { line = 0; data.Clear(); } }; SyntaxPos syntax_cache[6]; // EditorSyntax rm_ins; char rmb; int64 highlight_bracket_pos0; int64 highlight_bracket_pos; bool bracket_flash; int64 bracket_start; bool barline; double stat_edit_time; Time last_key_time; bool auto_enclose; bool mark_lines; bool check_edited; bool persistent_find_replace; bool do_ff_restore_pos; bool withfindreplace; bool wordwrap; bool blk0_header; int ff_start_pos; FindReplaceDlg findreplace; enum { WILDANY = 16, WILDONE, WILDSPACE, WILDNUMBER, WILDID, }; struct Found { int type; WString text; }; Array foundwild; WString foundtext; bool foundsel; bool found, notfoundfw, notfoundbk; int64 foundpos; int foundsize; enum { SEL_CHARS, SEL_WORDS, SEL_LINES }; int selkind; WString illuminated; String iwc; String highlight; int spellcheck_comments = 0; bool wordwrap_comments = true; struct Tip : Ctrl { Value v; Color background; const Display *d; virtual void Paint(Draw& w); Tip(); }; bool delayed_tip = false; Point delayed_pos = Null; Tip tip; int tippos = Null; int replacei; bool search_canceled = false; int search_time0; One search_progress; String refresh_info; // serialized next line syntax context to detect the need of full Refresh Vector errors; // current file (compilation) errors struct ScrollBarItems : Ctrl { ScrollBar& sb; CodeEditor& editor; void Paint(Draw& w); Vector> pos; ScrollBarItems(ScrollBar& sb, CodeEditor& e); }; ScrollBarItems sbi; struct HlSt; bool MouseSelSpecial(Point p, dword flags); void InitFindReplace(); void CancelBracketHighlight(int64& pos); void FindPrevNext(bool prev); void CheckBrackets(); void OpenNormalFindReplace0(bool replace); void OpenNormalFindReplace(bool replace); void FindReplaceAddHistory(); void FindWildcard(); void ReplaceWildcard(); void InsertWildcard(const char *s); void IncrementalFind(); void NotFound(); void NoFindError(); void CheckSyntaxRefresh(int64 pos, const WString& text); void RefreshBlkHeader(); void SetFound(int fi, int type, const WString& text); int Match(const wchar *f, const wchar *s, int line, bool we, bool icase, int fi = 0); WString GetWild(int type, int& i); WString GetReplaceText(); bool InsertRS(int chr, int count = 1); void IndentInsert(int chr, int count); void ForwardWhenBreakpoint(int i); bool ToggleSimpleComment(int &start_line, int &end_line, bool usestars = true); void ToggleLineComments(bool usestars = false); void ToggleStarComments(); void Enclose(const char *c1, const char *c2, int l = -1, int h = -1); void Make(Event op); void TabsOrSpaces(String& out, bool maketabs); void LineEnds(String& out); enum { TIMEID_PERIODIC = Ctrl::TIMEID_COUNT, TIMEID_COUNT, }; void Periodic(); void StartSearchProgress(int64 l, int64 h); bool SearchProgress(int line); bool SearchCanceled(); void EndSearchProgress(); bool SyncCloseTip(); String GetRefreshInfo(int pos); public: Event<> WhenSelection; Gate WhenTip; Event<> WhenLeftDown; Event WhenCtrlClick; Event<> WhenAnnotationMove; Event<> WhenAnnotationClick; Event<> WhenAnnotationRightClick; Event<> WhenOpenFindReplace; Event WhenPaste; Event<> WhenUpdate; Event WhenBreakpoint; Event>&> WhenFindAll; FrameTop