status computeAscentDescentGrBox(GrBox grb) { Graphical gr = grb->graphical; int h, ascent, descent; ComputeGraphical(gr); h = valInt(gr->area->h); if ( grb->alignment == NAME_top ) ascent = 0; else if ( grb->alignment == NAME_bottom ) ascent = h; else ascent = h/2; descent = h-ascent; if ( grb->ascent != toInt(ascent) || grb->descent != toInt(descent) ) { assign(grb, ascent, toInt(ascent)); assign(grb, descent, toInt(descent)); succeed; /* changed */ } else fail; /* no change */ }
static int scrollGesture(Gesture g) { Name msg; Int amount; Graphical gr; Name dir = NAME_forwards; if ( !scrollMessage(g, g->drag_scroll_event, &gr, &msg, &amount) ) fail; if ( valInt(amount) < 0 ) { dir = NAME_backwards; amount = toInt(-valInt(amount)); } if ( hasSendMethodObject(gr, msg) && send(gr, msg, dir, NAME_line, amount, EAV) ) { EventObj ev = getCloneObject(g->drag_scroll_event); /* TBD: optimise? */ DEBUG(NAME_dragScroll, Cprintf("Drag event = %s, receiver %s\n", pp(ev->id), pp(ev->receiver))); ComputeGraphical(gr); restrictAreaEvent(ev, gr); /* Normalise to area of rec */ send(g, NAME_drag, ev, EAV); synchroniseGraphical(gr, ON); doneObject(ev); } succeed; }
static void includeArrowsInAreaArc(Arc a) { if ( notNil(a->first_arrow) || notNil(a->second_arrow) ) { int sx, sy, ex, ey; int cx, cy; Any av[4]; points_arc(a, &sx, &sy, &ex, &ey); cx = valInt(a->position->x); cy = valInt(a->position->y); if ( notNil(a->first_arrow) ) { av[0] = toInt(sx); av[1] = toInt(sy); if ( valReal(a->size_angle) >= 0.0 ) { av[2] = toInt(sx+(sy-cy)); av[3] = toInt(sy-(sx-cx)); } else { av[2] = toInt(sx-(sy-cy)); av[3] = toInt(sy+(sx-cx)); } if ( qadSendv(a->first_arrow, NAME_points, 4, av) ) { ComputeGraphical(a->first_arrow); unionNormalisedArea(a->area, a->first_arrow->area); } } if ( notNil(a->second_arrow) ) { av[0] = toInt(ex); av[1] = toInt(ey); if ( valReal(a->size_angle) >= 0.0 ) { av[2] = toInt(ex-(ey-cy)); av[3] = toInt(ey+(ex-cx)); } else { av[2] = toInt(ex+(ey-cy)); av[3] = toInt(ey-(ex-cx)); } if ( qadSendv(a->second_arrow, NAME_points, 4, av) ) { ComputeGraphical(a->second_arrow); unionNormalisedArea(a->area, a->second_arrow->area); } } } }
static status PlaceLBox(LBox lp, Graphical gr, Int x, Int y, Int w) { DEBUG(NAME_lbox, Cprintf("Placing %s on %s at %d,%d (width = %s)\n", pp(gr), pp(lp), valInt(x), valInt(y), pp(w))); ComputeGraphical(gr); if ( gr->area->x != x || gr->area->y != y || (notDefault(w) && gr->area->w != w) ) setGraphical(gr, x, y, w, DEFAULT); succeed; }
static Area getAreaTableCell(TableCell c) { Table tab = table_of_cell(c); Device dev; if ( tab && notNil(dev=tab->device) ) { table_cell_dimensions d; ComputeGraphical(dev); /* make sure area is up-to-date */ dims_table_cell(c, &d); answer(answerObject(ClassArea, toInt(d.x), toInt(d.y), toInt(d.w), toInt(d.h), EAV)); } fail; }
status adjustFirstArrowBezier(Bezier b) { if ( notNil(b->first_arrow) ) { Any av[4]; av[0] = b->start->x; av[1] = b->start->y; av[2] = b->control1->x; av[3] = b->control1->y; if ( qadSendv(b->first_arrow, NAME_points, 4, av) ) { assign(b->first_arrow, displayed, ON); return ComputeGraphical(b->first_arrow); } } fail; }
status adjustFirstArrowLine(Line ln) { if ( notNil(ln->first_arrow) ) { Any av[4]; av[0] = ln->start_x; av[1] = ln->start_y; av[2] = ln->end_x; av[3] = ln->end_y; if ( qadSendv(ln->first_arrow, NAME_points, 4, av) ) { assign(ln->first_arrow, displayed, ON); return ComputeGraphical(ln->first_arrow); } } fail; }
static status initialiseGrBox(GrBox grb, Graphical gr, Any align, /* left, right or @nil */ Rubber rubber) { if ( isDefault(align) ) align = NAME_center; if ( isDefault(rubber) ) rubber = NIL; assign(grb, graphical, gr); assign(grb, alignment, align); assign(grb, rubber, rubber); ComputeGraphical(gr); assign(grb, width, gr->area->w); computeAscentDescentGrBox(grb); succeed; }
status computeGrBox(GrBox grb) { Graphical gr = grb->graphical; ComputeGraphical(gr); if ( isNil(grb->rubber) || ( grb->rubber->stretch == ZERO && grb->rubber->shrink == ZERO ) ) { DEBUG(NAME_grbox, Cprintf("%s width %d --> %d\n", pp(grb), valInt(grb->width), valInt(gr->area->w))); assign(grb, width, gr->area->w); /* TBD */ } else { DEBUG(NAME_grbox, Cprintf("%s IGNORING width %d --> %d\n", pp(grb), valInt(grb->width), valInt(gr->area->w))); } computeAscentDescentGrBox(grb); succeed; }
status adjustSecondArrowBezier(Bezier b) { if ( notNil(b->second_arrow) ) { Any av[4]; av[0] = b->end->x; av[1] = b->end->y; if ( notNil(b->control2) ) { av[2] = b->control2->x; av[3] = b->control2->y; } else { av[2] = b->control1->x; av[3] = b->control1->y; } if ( qadSendv(b->second_arrow, NAME_points, 4, av) ) { assign(b->second_arrow, displayed, ON); return ComputeGraphical(b->second_arrow); } } fail; }
status placeImageTableCell(TableCell cell) { Graphical gr = cell->image; Table tab = table_of_cell(cell); table_cell_dimensions d; int grx, gry; Any av[4]; Point ref = NULL; Name halign = getHalignTableCell(cell); Name valign = getValignTableCell(cell); ComputeGraphical(gr); /* make sure */ av[2] = DEFAULT; /* width */ av[3] = DEFAULT; /* height */ dims_table_cell(cell, &d); if ( halign == NAME_left ) /* determine X-placement */ grx = d.x + d.px; else if ( halign == NAME_right ) grx = d.x + d.w-d.px-valInt(gr->area->w); else if ( halign == NAME_center ) grx = d.x + (d.w-valInt(gr->area->w)+1)/2; else if ( halign == NAME_stretch ) { grx = d.x + d.px; av[2] = toInt(d.w-2*d.px); } else /* if ( halign == NAME_reference ) */ { ref = getIf(gr, NAME_reference, NIL); if ( notNil(ref) ) grx = d.x + d.rx - valInt(ref->x); else grx = d.x + d.px; } if ( valign == NAME_top ) /* determine Y-placement */ gry = d.y + d.py; else if ( valign == NAME_bottom ) gry = d.y + d.h-d.py-valInt(gr->area->h); else if ( valign == NAME_center ) gry = d.y + (d.h-valInt(gr->area->h)+1)/2; else if ( valign == NAME_stretch ) { gry = d.y + d.py; av[3] = toInt(d.h-2*d.py); } else /* if ( halign == NAME_reference ) */ { if ( !ref ) ref = getIf(gr, NAME_reference, NIL); if ( notNil(ref) ) gry = d.y + d.ry - valInt(ref->y); else gry = d.y + d.py; } av[0] = toInt(grx); av[1] = toInt(gry); if ( instanceOfObject(gr, ClassWindow) && /* HACK */ notNil(((PceWindow)gr)->decoration) ) gr = (Graphical)((PceWindow)gr)->decoration; qadSendv(gr, NAME_doSet, 4, av); if ( gr->device != tab->device ) send(tab->device, NAME_display, gr, EAV); succeed; }
static status RedrawAreaArc(Arc a, Area area) { int x, y, w, h; int aw = valInt(a->size->w); int ah = valInt(a->size->h); int sx, sy, ex, ey; int cx, cy; initialiseDeviceGraphical(a, &x, &y, &w, &h); points_arc(a, &sx, &sy, &ex, &ey); cx = valInt(a->position->x); cy = valInt(a->position->y); r_thickness(valInt(a->pen)); r_dash(a->texture); #ifndef WIN32_GRAPHICS r_arcmode(a->close == NAME_none ? NAME_pieSlice : a->close); r_arc(valInt(a->position->x) - aw, valInt(a->position->y) - ah, 2*aw, 2*ah, rfloat(valReal(a->start_angle)*64.0), rfloat(valReal(a->size_angle)*64.0), a->fill_pattern); if ( a->close != NAME_none && a->pen != ZERO ) { if ( a->close == NAME_chord ) { r_line(sx, sy, ex, ey); } else /* if ( a->close == NAME_pieSlice ) */ { r_line(cx, cy, sx, sy); r_line(cx, cy, ex, ey); } } #else /*WIN32_GRAPHICS*/ { int ax, ay, bx, by; double sa = valReal(a->size_angle); int large; if ( sa >= 0.0 ) { ax = sx, ay = sy, bx = ex, by = ey; large = (sa >= 180.0); } else { ax = ex, ay = ey, bx = sx, by = sy; large = (sa <= -180.0); } r_msarc(valInt(a->position->x) - aw, valInt(a->position->y) - ah, 2*aw, 2*ah, ax, ay, bx, by, large, a->close, a->fill_pattern); } #endif /* __WINDOWS__ */ if (notNil(a->first_arrow)) { Any av[4]; av[0] = toInt(sx); av[1] = toInt(sy); if ( valReal(a->size_angle) >= 0.0 ) { av[2] = toInt(sx+(sy-cy)); av[3] = toInt(sy-(sx-cx)); } else { av[2] = toInt(sx-(sy-cy)); av[3] = toInt(sy+(sx-cx)); } if ( qadSendv(a->first_arrow, NAME_points, 4, av) ) { assign(a->first_arrow, displayed, ON); ComputeGraphical(a->first_arrow); RedrawArea(a->first_arrow, area); } } if (notNil(a->second_arrow)) { Any av[4]; av[0] = toInt(ex); av[1] = toInt(ey); if ( valReal(a->size_angle) >= 0.0 ) { av[2] = toInt(ex-(ey-cy)); av[3] = toInt(ey+(ex-cx)); } else { av[2] = toInt(ex+(ey-cy)); av[3] = toInt(ey-(ex-cx)); } if ( qadSendv(a->second_arrow, NAME_points, 4, av) ) { assign(a->second_arrow, displayed, ON); ComputeGraphical(a->second_arrow); RedrawArea(a->second_arrow, area); } } return RedrawAreaGraphical(a, area); }