// Draw a RegionGraphNode void RegionGraphNode::draw(Widget w, const BoxRegion& exposed, const GraphGC& gc) const { const BoxRegion& r = region(gc); // if not exposed or invisible, return if (!(r <= exposed) || r.space(X) == 0 || r.space(Y) == 0) return; Display *display = XtDisplay(w); Window window = XtWindow(w); // clear the area XFillRectangle(display, window, gc.clearGC, r.origin(X), r.origin(Y), r.space(X), r.space(Y)); // draw contents forceDraw(w, exposed, gc); // if selected, invert area if (selected()) { const BoxRegion& h = highlightRegion(gc); XFillRectangle(display, window, gc.invertGC, h.origin(X), h.origin(Y), h.space(X), h.space(Y)); } }
// Draw a BoxGraphNode void BoxGraphNode::forceDraw(Widget w, const BoxRegion& /* exposed */, const GraphGC& gc) const { assert(box() != 0); // assert(box()->OK()); // We do not check for exposures here -- // boxes are usually small and partial display // doesn't work well with scrolling static BoxRegion exposed(BoxPoint(0, 0), BoxSize(INT_MAX, INT_MAX)); if (selected() && highlight()) { box()->draw(w, region(gc), exposed, gc.nodeGC, false); bool use_color = ColorBox::use_color; ColorBox::use_color = false; BoxRegion r = highlightRegion(gc); if (r <= exposed) { XFillRectangle(XtDisplay(w), XtWindow(w), gc.clearGC, r.origin(X), r.origin(Y), r.space(X), r.space(Y)); highlight()->draw(w, r, r, gc.nodeGC, false); } ColorBox::use_color = use_color; } else if (selected()) { bool use_color = ColorBox::use_color; ColorBox::use_color = false; box()->draw(w, region(gc), exposed, gc.nodeGC, false); ColorBox::use_color = use_color; } else { box()->draw(w, region(gc), exposed, gc.nodeGC, false); } }