int Navigator::NavigatorDisplay::DoPaint(Draw& w, const Rect& r, const Value& q, Color ink, Color paper, dword style) const { int ii = q; if(ii < 0 || ii >= item.GetCount()) return 0; const NavItem& m = *item[ii]; bool focuscursor = (style & (FOCUS|CURSOR)) == (FOCUS|CURSOR) || (style & SELECT); int x = r.left; int ry = r.top + r.GetHeight() / 2; int y = ry - Draw::GetStdFontCy() / 2; if(findarg(m.kind, KIND_FILE, KIND_NEST) >= 0) { w.DrawRect(r, focuscursor ? paper : m.kind == KIND_NEST ? Blend(SColorMark, SColorPaper, 220) : SColorFace); if(m.kind == KIND_FILE) return PaintFileName(w, r, m.type, ink); String h = FormatNest(m.type); w.DrawText(x, y, h, StdFont().Bold(), ink); return GetTextSize(h, StdFont().Bold()).cx; } w.DrawRect(r, paper); if(m.kind == KIND_LINE) { w.DrawText(x, y, m.type, StdFont().Bold(), ink); return GetTextSize(m.type, StdFont().Bold()).cx; } PaintCppItemImage(w, x, ry, m.access, m.kind, focuscursor); x += Zx(15); Vector<ItemTextPart> n = ParseItemNatural(m.name, m.natural, m.ptype, m.pname, m.type, m.tname, m.ctname, ~m.natural + m.at); int starti = 0; for(int i = 0; i < n.GetCount(); i++) if(n[i].type == ITEM_NAME) { starti = i; break; } PaintText(w, x, y, m.natural, n, starti, n.GetCount(), focuscursor, ink, false); if(starti) { const char *h = " : "; w.DrawText(x, y, h, BrowserFont(), SColorText); x += GetTextSize(h, BrowserFont()).cx; } PaintText(w, x, y, m.natural, n, 0, starti, focuscursor, ink, false); return x; }
CodeBrowser::CodeBrowser() { scope.AddKey(); scope.AddColumn("Scope"); scope.WhenSel = THISBACK(LoadScope); scope.NoHeader().NoGrid(); search_scope <<= THISBACK(Load); search_scope.SetFilter(SearchItemFilter); search_scope.NullText("Search type or header "); item.AddKey(); item.AddColumn("Item").SetDisplay(display).Margin(2); item.NoHeader(); item.SetLineCy(BrowserFont().Info().GetHeight() + 3); search.NullText("Find "); search.SetFilter(SearchItemFilter); search <<= THISBACK(Search); // search.AddFrame(clear); // clear.SetImage(BrowserImg::Clear()); // clear.NoWantFocus(); // clear <<= THISBACK(ClearSearch); range = 0; static const char *tip[] = { "Nest", "Package", "File" }; for(int i = 0; i < 3; i++) rangebutton[i].SetImage(BrowserImg::Get(BrowserImg::I_range_nest + i)).Tip(tip[i]).NoWantFocus() <<= THISBACK1(SetRange, i + 1); SetRange(0); sort.Tip("Order by names"); sort.SetImage(BrowserImg::Sort()).NoWantFocus(); sort <<= THISBACK(LoadScope); }
void PaintText(Draw& w, int& x, int y, const CppItemInfo& m, const Vector<ItemTextPart>& n, int starti, int count, bool focuscursor, Color _ink) { for(int i = starti; i < count; i++) { const ItemTextPart& p = n[i]; Font f = BrowserFont(); Color ink = SColorText; switch(p.type) { case ITEM_PNAME: f.Bold(); case ITEM_NUMBER: ink = Red; break; case ITEM_TNAME: ink = Green; case ITEM_NAME: f.Bold(); break; case ITEM_UPP: ink = Cyan; break; case ITEM_CPP_TYPE: case ITEM_CPP: ink = LtBlue; break; case ITEM_SIGN: ink = Magenta; break; } if(m.overed) f.Italic(); Size fsz = GetTextSize(~m.natural + p.pos, f, p.len); w.DrawText(x, y, ~m.natural + p.pos, f, focuscursor ? _ink : ink, p.len); x += fsz.cx; } }
int CppItemInfoDisplay::DoPaint(Draw& w, const Rect& r, const Value& q, Color _ink, Color paper, dword style) const { const CppItemInfo& m = ValueTo<CppItemInfo>(q); w.DrawRect(r, paper); bool focuscursor = (style & (FOCUS|CURSOR)) == (FOCUS|CURSOR) || (style & SELECT); if(IsNull(q)) return 0; int x = r.left; int ry = r.top + r.GetHeight() / 2; Image img; if(m.access == PROTECTED) img = BrowserImg::mprotected(); else if(m.access == PRIVATE) img = BrowserImg::mprivate(); else if(m.access == WITHBODY) img = BrowserImg::impl(); if(!IsNull(img)) w.DrawImage(x, ry - img.GetHeight() / 2, img); x += 4; img = BrowserImg::unknown(); Image bk; switch(m.kind) { case FUNCTIONTEMPLATE: bk = BrowserImg::template_function(); case FUNCTION: img = BrowserImg::function(); break; case INSTANCEFUNCTIONTEMPLATE: bk = BrowserImg::template_function(); case INSTANCEFUNCTION: img = BrowserImg::instance_function(); break; case CLASSFUNCTIONTEMPLATE: bk = BrowserImg::template_function(); case CLASSFUNCTION: img = BrowserImg::class_function(); break; case STRUCTTEMPLATE: bk = BrowserImg::template_struct(); case STRUCT: img = BrowserImg::type_struct(); break; case INSTANCEVARIABLE: img = BrowserImg::instance_data(); break; case CLASSVARIABLE: img = BrowserImg::class_data(); break; case VARIABLE: img = BrowserImg::data(); break; case ENUM: img = BrowserImg::type_enum(); break; case INLINEFRIEND: img = BrowserImg::inline_friend(); break; case TYPEDEF: img = BrowserImg::type_def(); break; case CONSTRUCTOR: img = BrowserImg::constructor(); break; case DESTRUCTOR: img = BrowserImg::destructor(); break; case MACRO: img = BrowserImg::macro(); break; case FRIENDCLASS: img = BrowserImg::friend_class(); break; case KIND_INCLUDEFILE: img = IdeCommonImg::Header(); break; case KIND_INCLUDEFILE_ANY: img = CtrlImg::File(); break; case KIND_INCLUDEFOLDER: img = CtrlImg::Dir(); break; } int by = ry - bk.GetSize().cy / 2; int iy = ry - img.GetSize().cy / 2; if(focuscursor) { DrawHighlightImage(w, x, by, bk); w.DrawImage(x, iy, img); } else { w.DrawImage(x, by, bk); w.DrawImage(x, iy, img); } if(m.inherited) { w.DrawImage(x + 10, r.top, BrowserImg::inherited()); for(int i = 1; i < min(m.inherited, 5); i++) w.DrawRect(x + 10, r.top + 7 + 2 * i, 7, 1, SColorText); } x += 20; int y = ry - Draw::GetStdFontCy() / 2; int x0 = x; Vector<ItemTextPart> n = ParseItemNatural(m); int starti = 0; if(namestart) for(int i = 0; i < n.GetCount(); i++) if(n[i].type == ITEM_NAME) { starti = i; break; } PaintText(w, x, y, m, n, starti, n.GetCount(), focuscursor, _ink); if(starti) { const char *h = " : "; w.DrawText(x, y, h, BrowserFont(), SColorText); x += GetTextSize(h, BrowserFont()).cx; } PaintText(w, x, y, m, n, 0, starti, focuscursor, _ink); if(m.virt || m.over) w.DrawRect(x0, r.bottom - 2, x - x0, 1, m.over ? m.virt ? LtRed : LtBlue : SColorText); if(m.inherited && m.IsType()) w.DrawRect(r.left, r.top, r.Width(), 1, SColorDisabled); if(showtopic) { String k = MakeCodeRef(m.scope, m.qitem); int cnt = GetRefLinks(k).GetCount(); if(cnt) { Size sz = BrowserImg::Ref().GetSize(); int xx = r.right - sz.cx - 1; int yy = r.top + (r.Height() - sz.cy) / 2; DrawHighlightImage(w, xx, yy, BrowserImg::Ref()); if(cnt > 1) { String txt = AsString(cnt); Font fnt = Arial(Ctrl::VertLayoutZoom(10)).Bold(); Size tsz = GetTextSize(txt, fnt); Point p(xx + (sz.cx - tsz.cx) / 2, yy + (sz.cy - tsz.cy) / 2); for(int ax = -1; ax <= 1; ax++) for(int ay = -1; ay <= 1; ay++) w.DrawText(p.x + ax, p.y + ay, txt, fnt, White); w.DrawText(p.x, p.y, txt, fnt, Blue); } x += sz.cx + 3; } } return x; }
Size CppItemInfoDisplay::GetStdSize(const Value& q) const { NilDraw w; return Size(DoPaint(w, Rect(0, 0, INT_MAX, INT_MAX), q, Null, Null, 0), max(16, BrowserFont().Info().GetHeight())); }