// When selecting: redraw all (for statistics) static void SelectCB(Widget w, XtPointer, XtPointer) { XClearArea(XtDisplay(w), XtWindow(w), 0, 0, 0, 0, false); redraw(w, BoxRegion(BoxPoint(0,0), thebox->size()), BoxRegion(BoxPoint(0,0), BoxSize(1000000, 1000000))); }
// Draw void LineBox::_draw(Widget w, const BoxRegion& r, const BoxRegion& exposed, GC gc, bool context_selected) const { XGCValues gcvalues; // Set width and cap style; project beyond end point up to 1/2 // line thickness gcvalues.line_width = _linethickness; gcvalues.cap_style = CapProjecting; XChangeGC(XtDisplay(w), gc, GCLineWidth | GCCapStyle, &gcvalues); // Keep an empty frame of 1/2 line thickness around R (X may cross // R's boundaries otherwise) BoxPoint origin = r.origin(); BoxSize space = r.space(); origin += _linethickness / 2; space -= _linethickness; // Draw children __draw(w, BoxRegion(origin, space), exposed, gc, context_selected); // Attention: We leave LINE_WIDTH and CAP_STYLE changed! // (Works within Box::draw(), but the used GC may be changed) }
BoxRegion BoxEdgeAnnotation::region(const BoxPoint& p, const GraphGC& gc) const { // Center box horizontally 2 pixels above P BoxPoint origin(p); origin[X] -= size(gc)[X] / 2; origin[Y] -= size(gc)[Y] + 2; return BoxRegion(origin, size(gc)); }
// Expose Callback static void ExposeCB(Widget w, XtPointer, XtPointer call_data) { // Set size Arg arglist[10]; int a = 0; XtSetArg(arglist[a], XtNwidth, thebox->size(X)); a++; XtSetArg(arglist[a], XtNheight, thebox->size(Y)); a++; XtSetValues(w, arglist, a); // Get region XExposeEvent* event = (XExposeEvent *)call_data; BoxPoint expose_origin = BoxPoint(event->x, event->y); BoxSize expose_space = BoxSize(event->width, event->height); BoxRegion exposed(expose_origin, expose_space); redraw(w, BoxRegion(BoxPoint(0,0), thebox->size()), exposed); }
// Draw DiagBox void DiagBox::_draw(Widget w, const BoxRegion& r, const BoxRegion& exposed, GC gc, bool context_selected) const { const BoxSize space = r.space(); const BoxPoint origin = r.origin(); // Draw a 10-pixel-grid BoxCoordinate i; for (i = 0; i < space[X]; i += 10) XDrawLine(XtDisplay(w), XtWindow(w), gc, origin[X] + i, origin[Y], origin[X] + i, origin[Y] + space[Y]); for (i = 0; i < space[Y]; i += 10) XDrawLine(XtDisplay(w), XtWindow(w), gc, origin[X], origin[Y] + i, origin[X] + space[X], origin[Y] + i); // Make space info std::ostringstream oss; oss << space << '\0'; const string ss(oss); // Draw it (centered) StringBox *s = new StringBox(ss); const BoxSize stringSize = s->size(); const BoxPoint stringOrigin = origin + space/2 - stringSize/2; XClearArea(XtDisplay(w), XtWindow(w), stringOrigin[X], stringOrigin[Y], stringSize[X], stringSize[Y], False); s->draw(w, BoxRegion(stringOrigin, stringSize), exposed, gc, context_selected); s->unlink(); }
void ArcGraphEdge::_print(std::ostream& os, const GraphGC& gc) const { makeLine(0, BoxRegion(), os, gc); }