DIRECTORY
ChoiceButtons USING [UpdateChoiceButtons],
Convert USING [RopeFromInt, RopeFromReal],
Graph USING [CaretIndex, ColorIndex, Entity, EntityHashSize, EntityList, FontIndex, GraphHandle, NumberOfColors, NumberOfFonts, ROPE, Text, Texts, XY],
GraphConvert USING [RopeFromJustifX, RopeFromJustifY, RopeFromMark, RopeOfSlope, RopeOfXYValues],
GraphPrivate USING [GraphAtomProc, PaintEntity, PaintText],
GraphUtil USING [AppendEntityList, BlinkMsg, ControllerViewerExits, Crosssection, EntityFromId, GetIntField, GetRealField, HandleNotNil, InitSegAll, InitSegEnd, SpecIndexedEntity, SpecIndexedText, RaiseError, SetIntField, SetRealField, SetToggleColor, TextFromId],
IO USING [int, PutFR],
Rope USING [Cat, Concat],
ViewerTools USING [SetContents];
GraphResume:
CEDAR
PROGRAM
IMPORTS ChoiceButtons, Convert, GraphConvert, GraphPrivate, GraphUtil, IO, Rope, ViewerTools
EXPORTS GraphPrivate = { OPEN Graph, GraphPrivate, GraphUtil;
ShowEntity:
PUBLIC
PROC[handle: GraphHandle ←
NIL, entity: Entity ←
NIL] = {
Check if it is indeed not plotted. If no, then {add it to end of graph.entityList. Init x and y segments. If plot exits, draw it and its legend.}
IF HandleNotNil[handle]
AND entity #
NIL
THEN {
OPEN handle;
IF EntityFromId[graph.entityList, entity.id] =
NIL
THEN {
graph.entityList ← AppendEntityList[graph.entityList, CONS[entity, NIL]];
IF entity.group.x.segments = NIL THEN InitSegEnd[entity.group.x];
InitSegAll[entity];
IF chart.viewer # NIL THEN PaintEntity[handle, paint, entity, TRUE];
};
IF controller # NIL THEN ResumeEntityFields[handle, entity];
};
}; -- ShowEntity
ResumeDivisionsFields:
PROC[handle: GraphHandle] = {
OPEN handle;
controller.auto[divisions] ← SetToggleColor[controller.swDivisions, graph.auto[divisions]];
SetIntField[controller.divX, graph.division[x]];
SetIntField[controller.divY, graph.division[y]];
}; -- SetDivisionFields
ResumeBoundsFields:
PUBLIC
PROC[handle: GraphHandle] = {
OPEN handle;
controller.auto[bounds] ← SetToggleColor[controller.swBounds, graph.auto[bounds]];
SetRealField[controller.xmin, graph.bounds.xmin];
SetRealField[controller.ymin, graph.bounds.ymin];
SetRealField[controller.xmax, graph.bounds.xmax];
SetRealField[controller.ymax, graph.bounds.ymax];
}; -- SetBoundsFields
ResumeCaretsFields:
PROC[handle: GraphHandle] = {
OPEN handle;
FOR i: CaretIndex IN CaretIndex DO ResumeCaretFields[handle, i] ENDLOOP;
ResumeSlopeFields[handle];
}; -- ResumeCaretsFields
ResumeCaretFields:
PROC [handle: GraphHandle, index: CaretIndex] = {
OPEN handle;
controller.caretOn[index] ← SetToggleColor[controller.swCaret[index], graph.caret[index].on];
SetRealField[controller.caretPlace[index][x], graph.caret[index].place.x];
SetRealField[controller.caretPlace[index][y], graph.caret[index].place.y];
}; -- ResumeCaretFields
ResumeSlopeFields:
PROC[handle: GraphHandle] = {
OPEN handle;
controller.slopeOn ← SetToggleColor[controller.swSlope, graph.showSlope];
IF graph.showSlope
THEN ViewerTools.SetContents[controller.slope,
GraphConvert.RopeOfSlope[graph.caret[primary].place, graph.caret[secondary].place]];
}; -- ResumeSlopeFields
ResumeTargetsFields:
PROC[handle: GraphHandle] = {
ResumeTargetFields[handle, x];
ResumeTargetFields[handle, y];
}; -- ResumeTargetsFields
ResumeTargetFields:
PROC [handle: GraphHandle, xy:
XY] = {
OPEN handle;
controller.targetOn[xy] ← SetToggleColor[controller.swTarget[xy], graph.target[xy].on];
SetRealField[controller.targetValue[xy], graph.target[xy].value];
SetRealField[controller.targetWidth[xy], graph.target[xy].width];
}; -- ResumeTargetFields
ResumeGridsFields:
PROC[handle: GraphHandle] = {
OPEN handle;
controller.gridOn[x] ← SetToggleColor[controller.swGrid[x], graph.grids[x]];
controller.gridOn[y] ← SetToggleColor[controller.swGrid[y], graph.grids[y]];
}; -- ResumeGridsFields
ResumeColorFields:
PROC[handle: GraphHandle, index: ColorIndex] = {
OPEN handle;
SetRealField[controller.red, graph.color[index].R];
SetRealField[controller.green, graph.color[index].G];
SetRealField[controller.blue, graph.color[index].B];
}; -- ResumeColorFields
ResumeFontFields:
PROC[handle: GraphHandle, index: FontIndex] = {
OPEN handle;
ViewerTools.SetContents[controller.fontFamily, graph.font[index].family];
controller.boldOn ← SetToggleColor[controller.swBold, graph.font[index].bold];
controller.italicOn ← SetToggleColor[controller.swItalic, graph.font[index].italic];
SetIntField[controller.vFontSize, graph.font[index].vFontSize];
SetRealField[controller.pFontScale, graph.font[index].pFontScale];
}; -- ResumeFontFields
ResumeTextFields:
PUBLIC
PROC [handle: GraphHandle ←
NIL, text: Text ←
NIL] = {
IF HandleNotNil[handle]
AND text #
NIL
THEN {
OPEN handle;
ViewerTools.SetContents[controller.textContent, text.text];
SetRealField[controller.textPlaceX, text.place.x];
ChoiceButtons.UpdateChoiceButtons[controller.viewer, controller.justifXRef,
GraphConvert.RopeFromJustifX[text.justifX]];
controller.justifX ← text.justifX;
SetRealField[controller.textPlaceY, text.place.y];
ChoiceButtons.UpdateChoiceButtons[controller.viewer, controller.justifYRef,
GraphConvert.RopeFromJustifY[text.justifY]];
controller.justifY ← text.justifY;
SetIntField[controller.textColor, text.colorIndex];
SetIntField[controller.textFont, text.fontIndex];
SetRealField[controller.textRotation, text.rotation];
};
}; -- ResumeTextFields
ResumeXButtonField: PROC[handle: GraphHandle] = { OPEN handle;
ViewerTools.SetContents[controller.xValues,
GraphConvert.RopeFromSDL[entityGroupList.first.x.segments]]; -- for now.
}; -- ResumeXButtonField
ResumeEntityFields:
PUBLIC
PROC [handle: GraphHandle ←
NIL, entity: Entity ←
NIL] = {
IF ControllerViewerExits[handle]
AND entity #
NIL
THEN {
OPEN handle;
ViewerTools.SetContents[controller.entityName, entity.name];
ViewerTools.SetContents[controller.entityCmt, entity.comment];
SetIntField[controller.entityColor, entity.colorIndex];
SetRealField[controller.entityWidth, entity.width];
ChoiceButtons.UpdateChoiceButtons[controller.viewer, controller.markRef,
GraphConvert.RopeFromMark[entity.mark]];
SetIntField[controller.entityGroupId, entity.groupId];
ViewerTools.SetContents[controller.idOfy, Convert.RopeFromInt[entity.id]];
ResumeXYValues[handle, entity];
};
}; -- ResumeEntityFields
ResumeXYValues:
PROC [handle: GraphHandle, entity: Entity] = {
IF ControllerViewerExits[handle]
AND entity #
NIL
THEN
ViewerTools.SetContents[handle.controller.values, GraphConvert.RopeOfXYValues[entity]];
}; -- ResumeXYValues
ResumeCurveGroupFields: PROC[handle: GraphHandle, eg: EntityGroup] = { OPEN handle;
ViewerTools.SetContent[controller.groupName, eg.name];
SetIntField[controller.xId, eg.x.id];
ViewerTools.SetContent[controller.yIds, RopeOfEntityListIds[eg.entityList, eg.x]];
}; -- ResumeCurveGroupFields
ResumeCrossSection:
PROC[handle: GraphHandle, x:
REAL] = {
OPEN handle;
rope, tRope: ROPE ← NIL;
ok: BOOL;
y: REAL;
count: INT ← 0;
FOR el: EntityList ← graph.entityList, el.rest
UNTIL el =
NIL
DO
[ok, y] ← Crosssection[el.first.group.x.segments, el.first.segments, x];
tRope ← IF ok THEN Convert.RopeFromReal[y] ELSE "*";
rope ← IF rope = NIL THEN tRope ELSE rope.Cat[", ", tRope];
count ← count + 1;
IF (count MOD 5) = 0 THEN rope ← rope.Concat[IO.PutFR[" -- %g\n", IO.int[count]]];
ENDLOOP;
ViewerTools.SetContents[controller.values, rope];
}; -- ResumeCrossSection
}.