// Region occupied by edge BoxRegion LineGraphEdge::region(const GraphGC& gc) const { BoxRegion r; if (gc.drawAnnotations && annotation() != 0) { BoxPoint anno_pos = annotationPosition(gc); if (anno_pos.isValid()) { BoxRegion anno_region = annotation()->region(anno_pos, gc); if (r.origin().isValid()) r = r | anno_region; else r = anno_region; } } if (from() == to()) { BoxRegion region = from()->region(gc); if (from()->selected()) region.origin() += gc.offsetIfSelected; LineGraphEdgeSelfInfo info(region, gc); BoxRegion self_region(info.arc_pos, BoxSize(info.diameter, info.diameter)); if (r.origin().isValid()) r = r | self_region; else r = self_region; } return r; }
// 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))); }
// vspace(box) static Box *vspace(ListBox *args) { CHECK_ATOMS(args); CHECK_SIZE(args); const Box *child = (*args)[0]; return new SpaceBox(BoxSize(0, child->size(Y))); }
// Recompute size Box *StringBox::resize() { if (_font != 0) { int direction, font_ascent, font_descent; XCharStruct overall; XTextExtents(_font, _string.chars(), _string.length(), &direction, &font_ascent, &font_descent, &overall); #if USE_MAX_BOUNDS XCharStruct max_bounds = _font->max_bounds; _ascent = max_bounds.ascent; thesize() = BoxSize(overall.width, max_bounds.ascent + max_bounds.descent); #else _ascent = font_ascent; thesize() = BoxSize(overall.width, font_ascent + font_descent); #endif } return this; }
// 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); }
// Event size BoxSize size(XEvent *ev) { if (ev == 0) { // LessTif 0.79 and Motif 1.1 sometimes pass 0 as event; // provide some reasonable default invalid_event("size"); return BoxSize(0, 0); } switch (ev->type) { case Expose: return BoxSize(ev->xexpose.width, ev->xexpose.height); case GraphicsExpose: return BoxSize(ev->xgraphicsexpose.width, ev->xgraphicsexpose.height); case CreateNotify: return BoxSize(ev->xcreatewindow.width, ev->xcreatewindow.height); case ConfigureNotify: return BoxSize(ev->xconfigure.width, ev->xconfigure.height); case ResizeRequest: return BoxSize(ev->xresizerequest.width, ev->xresizerequest.height); case ConfigureRequest: return BoxSize(ev->xconfigurerequest.width, ev->xconfigurerequest.height); default: invalid_event("size"); return BoxSize(0, 0); } }
// 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); } }