void frmDebugger::DisplaySource(dbgCachedStack &_cached) { dbgModel *model = m_controller->GetModel(); m_codeViewer->SetFocus(); if (model->RequireDisplayUpdate()) { ctlVarWindow *varWin = NULL; if ((varWin = GetVarWindow(false)) != NULL) { varWin->DelVar(); } if ((varWin = GetParamWindow(false)) != NULL) { varWin->DelVar(); } if ((varWin = GetPkgVarWindow(false)) != NULL) { varWin->DelVar(); } model->GetDisplayedFunction() = _cached.m_func; model->GetDisplayedPackage() = _cached.m_pkg; // Now erase any old code and write out the new listing m_codeViewer->SetReadOnly(false); m_codeViewer->SetText(_cached.m_source); m_codeViewer->Colourise(0, _cached.m_source.Length()); m_codeViewer->SetReadOnly(true); } HighlightLine(model->GetCurrLineNo()); }
// Overrides the function from QSyntaxHighlighter; // gets called by QTextEditor whenever // a block (line of text) needs to be repainted void XHTMLHighlighter::highlightBlock(const QString &text) { // By default, all block states are -1; // in our implementation regular text is state == 1 if (previousBlockState() == -1) { setCurrentBlockState(State_Text); } // Propagate previous state; needed for state tracking else { setCurrentBlockState(previousBlockState()); } if (text.isEmpty()) { return; } SettingsStore settings; m_enableSpellCheck = settings.spellCheck(); // Run spell check over the text. if (m_enableSpellCheck && m_checkSpelling) { CheckSpelling(text); } // The order of these operations is important // because some states format text over previous states! HighlightLine(text, State_SpSpace); HighlightLine(text, State_Entity); HighlightLine(text, State_CSS); HighlightLine(text, State_HTML); HighlightLine(text, State_CSSComment); HighlightLine(text, State_HTMLComment); HighlightLine(text, State_DOCTYPE); }
static void ScrollText(ScrollType st) { EditorInfo einfo = {sizeof(EditorInfo)}; EditorSetPosition es = {sizeof(EditorSetPosition)}; Info.EditorControl(-1, ECTL_GETINFO, 0, &einfo); switch (st) { case stDn: es.CurLine = einfo.CurLine+1; break; case stUp: es.CurLine = einfo.CurLine-1; break; case stPgDn: es.CurLine = einfo.CurLine+einfo.WindowSizeY-1; es.TopScreenLine = einfo.TopScreenLine+einfo.WindowSizeY-1; break; case stPgUp: es.CurLine = einfo.CurLine-einfo.WindowSizeY+1; es.TopScreenLine = einfo.TopScreenLine-einfo.WindowSizeY+1; break; case stEnd: es.CurLine = /*es.TopScreenLine = */einfo.TotalLines-1; break; default: es.CurLine = /*es.TopScreenLine = */0; break; } bLineChanged = true; es.CurPos = -1; es.CurTabPos = es.LeftPos = es.Overtype = -1; Info.EditorControl(-1, ECTL_SETPOSITION, 0, &es); //обновим № исходной строки Info.EditorControl(-1, ECTL_GETINFO, 0, &einfo); char *Lines = (char*)StackPeek(); OriginalLine = CalcOriginalLine(einfo.CurLine); HighlightLine(einfo.CurLine); Info.AdvControl(&PluginId, ACTL_REDRAWALL, 0, NULL); }
void LineEdit::Paint0(Draw& w) { int sell, selh; GetSelection(sell, selh); if(!IsEnabled()) sell = selh = 0; Size sz = GetSize(); Size fsz = GetFontSize(); Point sc = sb; int ll = min(line.GetCount(), sz.cy / fsz.cy + sc.y + 1); int y = 0; cpos = GetPos(sc.y); cline = sc.y; sell -= cpos; selh -= cpos; int pos = cpos; Vector<int> dx, dx2; int fascent = font.Info().GetAscent(); for(int i = sc.y; i < ll; i++) { WString tx = line[i]; int len = tx.GetLength(); if(w.IsPainting(0, y, sz.cx, fsz.cy)) { Highlight ih; ih.ink = color[IsShowEnabled() ? INK_NORMAL : INK_DISABLED]; ih.paper = color[IsReadOnly() || !IsShowEnabled() ? PAPER_READONLY : PAPER_NORMAL]; if(nobg) ih.paper = Null; ih.font = font; ih.chr = 0; Vector<Highlight> hl; hl.SetCount(len + 1, ih); for(int q = 0; q < tx.GetCount(); q++) hl[q].chr = tx[q]; HighlightLine(i, hl, pos); int ln = hl.GetCount() - 1; int l = max(sell, 0); int h = selh > len ? len : selh; if(l < h) for(int i = l; i < h; i++) { hl[i].paper = color[PAPER_SELECTED]; hl[i].ink = color[INK_SELECTED]; } if(sell <= len && selh > len) for(int i = len; i < hl.GetCount(); i++) { hl[i].paper = color[PAPER_SELECTED]; hl[i].ink = color[INK_SELECTED]; } Buffer<wchar> txt(ln); for(int i = 0; i < ln; i++) txt[i] = hl[i].chr; for(int pass = 0; pass < 2; pass++) { int gp = 0; int scx = fsz.cx * sc.x; if(ln >= 0) { int q = 0; while(q < ln) { Highlight& h = hl[q]; if(txt[q] == '\t') { int ngp = (gp + tabsize) / tabsize * tabsize; int l = ngp - gp; LLOG("Highlight -> tab[" << q << "] paper = " << h.paper); if(pass == 0) { w.DrawRect(gp * fsz.cx - scx, y, fsz.cx * l, fsz.cy, h.paper); if(showtabs && h.paper != SColorHighlight && q < tx.GetLength()) { Color c = Blend(SColorLight, SColorHighlight); w.DrawRect(gp * fsz.cx - scx + 2, y + fsz.cy / 2, l * fsz.cx - 4, 1, c); w.DrawRect(ngp * fsz.cx - scx - 3, y + 3, 1, fsz.cy - 6, c); } if(bordercolumn > 0 && bordercolumn >= gp && bordercolumn < gp + l) w.DrawRect((bordercolumn - sc.x) * fsz.cx, y, 1, fsz.cy, bordercolor); } q++; gp = ngp; } else if(txt[q] == ' ') { LLOG("Highlight -> space[" << q << "] paper = " << h.paper); if(pass == 0) { w.DrawRect(gp * fsz.cx - scx, y, fsz.cx, fsz.cy, h.paper); if(showspaces && h.paper != SColorHighlight && q < tx.GetLength()) { Color c = Blend(SColorLight, SColorHighlight); w.DrawRect(gp * fsz.cx - scx + fsz.cx / 2, y + fsz.cy / 2, 2, 2, c); } if(bordercolumn > 0 && bordercolumn >= gp && bordercolumn < gp + 1) w.DrawRect((bordercolumn - sc.x) * fsz.cx, y, 1, fsz.cy, bordercolor); } q++; gp++; } else { bool cjk = IsCJKIdeograph(txt[q]); int p = q + 1; while(p < len && h == hl[p] && txt[p] != '\t' && txt[p] != ' ' && IsCJKIdeograph(txt[p]) == cjk && p - q < 128) p++; int l = p - q; int ll = cjk ? 2 * l : l; LLOG("Highlight -> paper[" << q << "] = " << h.paper); int x = gp * fsz.cx - scx; int xx = x + (gp + ll) * fsz.cx; if(max(x, 0) < min(xx, sz.cx)) if(pass == 0) { w.DrawRect(x, y, fsz.cx * ll, fsz.cy, h.paper); if(bordercolumn > 0 && bordercolumn >= gp && bordercolumn < gp + ll) w.DrawRect((bordercolumn - sc.x) * fsz.cx, y, 1, fsz.cy, bordercolor); } else { if(cjk) dx2.At(l, 2 * fsz.cx); else dx.At(l, fsz.cx); w.DrawText(x, y + fascent - h.font.Info().GetAscent(), ~txt + q, h.font, h.ink, l, cjk ? dx2 : dx); } q = p; gp += ll; if(x > sz.cx) break; } } } if(pass == 0) { int gpx = gp * fsz.cx - scx; w.DrawRect(gpx, y, sz.cx - gpx, fsz.cy, hl.Top().paper); if(bordercolumn > 0 && bordercolumn >= gp) w.DrawRect((bordercolumn - sc.x) * fsz.cx, y, 1, fsz.cy, bordercolor); } } } y += fsz.cy; sell -= len + 1; selh -= len + 1; pos += len + 1; } w.DrawRect(0, y, sz.cx, sz.cy - y, color[IsReadOnly() || !IsShowEnabled() ? PAPER_READONLY : PAPER_NORMAL]); DrawTiles(w, DropCaret(), CtrlImg::checkers()); }
void LineEdit::Paint0(Draw& w) { LTIMING("LineEdit::Paint0"); int sell, selh; GetSelection(sell, selh); if(!IsEnabled()) sell = selh = 0; Rect rect; bool rectsel = IsRectSelection(); if(IsRectSelection()) rect = GetRectSelection(); Size sz = GetSize(); Size fsz = GetFontSize(); Point sc = sb; int ll = min(line.GetCount(), sz.cy / fsz.cy + sc.y + 1); int y = 0; sc.y = minmax(sc.y, 0, line.GetCount() - 1); cpos = GetPos(sc.y); cline = sc.y; sell -= cpos; selh -= cpos; int pos = cpos; int fascent = font.Info().GetAscent(); int cursorline = GetLine(cursor); Highlight ih; ih.ink = color[IsShowEnabled() ? INK_NORMAL : INK_DISABLED]; ih.paper = color[IsReadOnly() && showreadonly || !IsShowEnabled() ? PAPER_READONLY : PAPER_NORMAL]; if(nobg) ih.paper = Null; ih.font = font; ih.chr = 0; for(int i = sc.y; i < ll; i++) { Color showcolor = color[WHITESPACE]; WString tx = line[i]; bool warn_whitespace = false; if(warnwhitespace && !IsSelection()) { int pos = GetCursor(); int linei = GetLinePos(pos); if(linei != i || pos < tx.GetCount()) { int wkind = 0; bool empty = true; for(const wchar *s = tx; *s; s++) { if(*s == '\t') { if(wkind == ' ') { warn_whitespace = true; break; } wkind = '\t'; } else if(*s == ' ') wkind = ' '; else if(*s > ' ') { empty = false; wkind = 0; } } if(wkind && !empty) warn_whitespace = true; if(warn_whitespace) showcolor = color[WARN_WHITESPACE]; } } bool do_highlight = tx.GetCount() < 100000; int len = tx.GetLength(); if(w.IsPainting(0, y, sz.cx, fsz.cy)) { LTIMING("PaintLine"); Vector<Highlight> hl; int ln; if(do_highlight) { hl.SetCount(len + 1, ih); for(int q = 0; q < tx.GetCount(); q++) hl[q].chr = tx[q]; LTIMING("HighlightLine"); HighlightLine(i, hl, pos); ln = hl.GetCount() - 1; } else ln = tx.GetCount(); int lgp = -1; for(int pass = 0; pass < 2; pass++) { int gp = 0; int scx = fsz.cx * sc.x; sOptimizedRectRenderer rw(w); if(ln >= 0) { int q = 0; int x = 0; int scx2 = scx - max(2, tabsize) * fsz.cx; while(q < ln && x < scx2) { // Skip part before left border wchar chr = do_highlight ? hl[q++].chr : tx[q++]; if(chr == '\t') { gp = (gp + tabsize) / tabsize * tabsize; x = fsz.cx * gp; } else if(IsCJKIdeograph(chr)) { x += 2 * fsz.cx; gp += 2; } else { x += fsz.cx; gp++; } } sOptimizedTextRenderer tw(w); while(q < ln) { if(q == tx.GetCount()) lgp = gp; Highlight h; if(do_highlight) h = hl[q]; else { h = ih; h.chr = tx[q]; } int pos = min(q, len); // Highligting can add chars at the end of line if(rectsel ? i >= rect.top && i <= rect.bottom && gp >= rect.left && gp < rect.right : pos >= sell && pos < selh) { h.paper = color[PAPER_SELECTED]; h.ink = color[INK_SELECTED]; } int x = gp * fsz.cx - scx; if(h.chr == '\t') { int ngp = (gp + tabsize) / tabsize * tabsize; int l = ngp - gp; LLOG("Highlight -> tab[" << q << "] paper = " << h.paper); if(pass == 0 && x >= -fsz.cy * tabsize) { rw.DrawRect(x, y, fsz.cx * l, fsz.cy, h.paper); if((showtabs || warn_whitespace) && h.paper != SColorHighlight && q < tx.GetLength()) { rw.DrawRect(x + 2, y + fsz.cy / 2, l * fsz.cx - 4, 1, showcolor); rw.DrawRect(ngp * fsz.cx - scx - 3, y + 3, 1, fsz.cy - 6, showcolor); } if(bordercolumn > 0 && bordercolumn >= gp && bordercolumn < gp + l) rw.DrawRect((bordercolumn - sc.x) * fsz.cx, y, 1, fsz.cy, bordercolor); } q++; gp = ngp; } else if(h.chr == ' ') { LLOG("Highlight -> space[" << q << "] paper = " << h.paper); if(pass == 0 && x >= -fsz.cy) { rw.DrawRect(x, y, fsz.cx, fsz.cy, h.paper); if((showspaces || warn_whitespace) && h.paper != SColorHighlight && q < tx.GetLength()) { int n = fsz.cy / 10 + 1; rw.DrawRect(x + fsz.cx / 2, y + fsz.cy / 2, n, n, showcolor); } if(bordercolumn > 0 && bordercolumn >= gp && bordercolumn < gp + 1) rw.DrawRect((bordercolumn - sc.x) * fsz.cx, y, 1, fsz.cy, bordercolor); } q++; gp++; } else { bool cjk = IsCJKIdeograph(h.chr); LLOG("Highlight -> paper[" << q << "] = " << h.paper); int xx = x + (gp + 1 + cjk) * fsz.cx; if(max(x, 0) < min(xx, sz.cx) && fsz.cx >= -fsz.cy) { if(pass == 0) { rw.DrawRect(x, y, (cjk + 1) * fsz.cx, fsz.cy, h.paper); if(bordercolumn > 0 && bordercolumn >= gp && bordercolumn < gp + 1 + cjk) rw.DrawRect((bordercolumn - sc.x) * fsz.cx, y, 1, fsz.cy, bordercolor); } else tw.DrawChar(x + (h.flags & SHIFT_L ? -fsz.cx / 6 : h.flags & SHIFT_R ? fsz.cx / 6 : 0), y + fascent - h.font.GetAscent(), h.chr, (cjk + 1) * fsz.cx, h.font, h.ink); } q++; gp += 1 + cjk; if(x > sz.cx) break; } } } if(pass == 0) { int gpx = gp * fsz.cx - scx; rw.DrawRect(gpx, y, sz.cx - gpx, fsz.cy, !rectsel && sell <= len && len < selh ? color[PAPER_SELECTED] : (do_highlight ? hl.Top() : ih).paper); if(bordercolumn > 0 && bordercolumn >= gp) rw.DrawRect((bordercolumn - sc.x) * fsz.cx, y, 1, fsz.cy, bordercolor); } if(pass == 0 && (showlines || warn_whitespace)) { int yy = 2 * fsz.cy / 3; int x = (lgp >= 0 ? lgp : gp) * fsz.cx - scx; rw.DrawRect(x, y + yy, fsz.cx / 2, 1, showcolor); if(fsz.cx > 2) rw.DrawRect(x + 1, y + yy - 1, 1, 3, showcolor); if(fsz.cx > 5) rw.DrawRect(x + 2, y + yy - 2, 1, 5, showcolor); rw.DrawRect(x + fsz.cx / 2, y + yy / 2, 1, yy - yy / 2, showcolor); } if(pass == 0 && !IsNull(hline) && sell == selh && i == cursorline) { rw.DrawRect(0, y, sz.cx, 1, hline); rw.DrawRect(0, y + fsz.cy - 1, sz.cx, 1, hline); } if(pass == 0 && rectsel && rect.left == rect.right && i >= rect.top && i <= rect.bottom) rw.DrawRect(rect.left * fsz.cx - scx, y, 2, fsz.cy, Blend(color[PAPER_SELECTED], color[PAPER_NORMAL])); } } y += fsz.cy; sell -= len + 1; selh -= len + 1; pos += len + 1; } w.DrawRect(0, y, sz.cx, sz.cy - y, color[IsReadOnly() && showreadonly || !IsShowEnabled() ? PAPER_READONLY : PAPER_NORMAL]); DrawTiles(w, DropCaret(), CtrlImg::checkers()); }