bool CodeEditor::GetStringRange(int cursor, int& b, int &e) const { int cl = GetLine(cursor); cursor -= GetPos(cl); bool is_begin, is_end; //@@@@@@ Vector<Point> list = GetLineString(GetWLine(cl), is_begin, is_end); int i = list.GetCount(); while(--i >= 0 && (list[i].x > cursor || list[i].y < cursor)) ; if(i < 0) return false; int bl = cl, bp = list[i].x; int el = cl, ep = list[i].y; while(is_begin && bl > 0) { list = GetLineString(GetWLine(bl - 1), is_begin, is_end); if(list.IsEmpty() || !is_end) break; bl--; bp = list.Top().x; } while(el + 1 < GetLineCount() && ep >= GetLineLength(el)) { list = GetLineString(GetWLine(el + 1), is_begin, is_end); if(list.IsEmpty() || !is_begin) break; el++; ep = list[0].y; } b = GetPos(bl, bp); e = GetPos(el, ep); return b < e; }
void LineEdit::AlignChar() { int c = GetCursor(); if(c == 0) return; Point pos = GetColumnLine(c); if(pos.x == 0) return; for(int d = 1; d <= pos.y && d < 100; d++) { int lny = pos.y - d; WString above = GetWLine(lny); int offset = GetGPos(lny, pos.x) - GetPos(lny); int end = offset; char ch = GetChar(c - 1); if(ch == ' ') { offset++; while(end < above.GetLength() && above[end] != ' ') end++; while(end < above.GetLength() && above[end] == ' ') end++; } else while(end < above.GetLength() && above[end] != ch) end++; if(end < above.GetLength()) { int count = end - offset + 1; WString s(' ', count); Insert(c - 1, s, true); SetCursor(c + count); return; } } }
void AssistEditor::StartParamInfo(const CppItem& m, int pos) { int x = GetCursor(); ParamInfo& f = param[parami]; f.line = GetLinePos(x); f.test = GetWLine(f.line).Mid(0, x); f.item = m; f.editfile = theide->editfile; f.pos = pos; SyncParamInfo(); parami = (parami + 1) % PARAMN; }
WString LineEdit::CopyRectSelection() { WString txt; Rect rect = GetRectSelection(); for(int i = rect.top; i <= rect.bottom; i++) { int l, h; CacheLinePos(i); int pos = GetPos(i); GetRectSelection(rect, i, l, h); txt.Cat(GetWLine(i).Mid(l - pos, h - l)); #ifdef PLATFORM_WIN32 txt.Cat('\r'); #endif txt.Cat('\n'); } return txt; }
bool CodeEditor::FindString(bool back) { int l, h; if(!GetSelection(l, h)) h = GetCursor(); else h = (back ? l : h); h -= GetPos(l = GetLine(h)); while(l >= 0 && l < GetLineCount()) { bool is_begin, is_end; Vector<Point> list = GetLineString(GetWLine(l), is_begin, is_end); if(back) { int i = list.GetCount(); while(--i >= 0 && list[i].x >= h) ; if(i >= 0) { h = list[i].x; break; } h = 1000000; --l; } else { int i = 0; while(i < list.GetCount() && list[i].y <= h) i++; if(i < list.GetCount()) { h = list[i].x; break; } h = 0; ++l; } } int b, e; if(l < 0 || l >= GetLineCount() || !GetStringRange(GetPos(l, h), b, e)) return false; SetSelection(b, e); return true; }
int LineEdit::RemoveRectSelection() { Rect rect = GetRectSelection(); WString txt; for(int i = rect.top; i <= rect.bottom; i++) { int l, h; CacheLinePos(i); GetRectSelection(rect, i, l, h); WString s = GetWLine(i); s.Remove(l - GetPos(i), h - l); txt.Cat(s); txt.Cat('\n'); } int l = GetPos(rect.top); int h = GetPos(rect.bottom) + GetLineLength(rect.bottom); if(h < GetLength()) h++; Remove(l, h - l); Insert(l, txt); return GetGPos(rect.bottom, rect.left); }
CodeEditor::SyntaxState CodeEditor::ScanSyntax(int line) { SyntaxState st; for(int i = 0; i < 4; i++) if(line >= scache[i].line) { st = scache[i]; break; } if(st.macro != SyntaxState::MACRO_CONT) st.macro = SyntaxState::MACRO_OFF; line = min(line, GetLineCount()); while(st.line < line) { if(st.macro != SyntaxState::MACRO_CONT) st.macro = SyntaxState::MACRO_OFF; WString l = GetWLine(st.line); st.ScanSyntax(l, l.End(), GetTabSize()); st.line++; static int d[] = { 0, 100, 2000 }; for(int i = 0; i < 3; i++) if(st.line == cline - d[i]) scache[i] = st; } scache[3] = st; return st; }
void AssistEditor::SyncParamInfo() { String qtf; Ctrl *p = GetTopCtrl(); int mpar = INT_MAX; int pos = 0; if(p && p->HasFocusDeep()) { for(int q = 0; q < PARAMN; q++) { ParamInfo& m = param[q]; int i = GetCursorLine(); if(m.line >= 0 && m.line < GetLineCount() && i >= m.line && i < m.line + 10 && m.editfile == theide->editfile && GetWLine(m.line).StartsWith(m.test)) { int c = GetCursor(); i = GetPos(m.line) + m.test.GetCount(); if(c >= i) { int par = 0; int pari = 0; for(;;) { int ch = Ch(i++); if(i > c) { if(par < mpar) { qtf = "[A1 " + DecoratedItem(m.item.name, m.item, m.item.natural, pari); mpar = par; pos = m.pos; } break; } if(ch == ')') { if(par <= 0) break; par--; } if(ch == '(') par++; if(ch == ',' && par == 0) pari++; } } } } } if(param_qtf != qtf) param_info.SetQTF(qtf); Rect r = GetLineScreenRect(GetCursorLine()); int cx = max(GetSize().cx - 30, 300); int h = param_info.GetHeight(cx); h = min(h, 550); int y = r.top - h - 6; if(y < GetWorkArea().top) y = r.bottom; r = RectC(r.left, y, min(param_info.GetWidth(), cx) + 8, h + 6); r.OffsetHorz(GetColumnLine(pos).x * GetFontSize().cx); r.OffsetHorz(min(GetWorkArea().right - r.right, 0)); if(param_qtf != qtf || r != param_info.GetRect()) { param_qtf = qtf; if(IsNull(qtf)) { if(param_info.IsOpen()) param_info.Close(); } else { param_info.SetRect(r); if(!param_info.IsOpen() && !IsSelection()) param_info.Ctrl::PopUp(this, false, false, false); } } }