GraphResume.mesa, Copyright © 1985 by Xerox Corporation. All rights reserved.
Last Edited by:
Sweetsun Chen, April 23, 1986 2:29:57 pm PST
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;
ResumeFromPanel: PUBLIC GraphAtomProc = {
If handle = nil or controller = nil then error; otherwise:
resumes fields values on panel in the entry denoted by atom, if they are not set yet.
if atom denotes text or entity and if chart.viewer # nil, then display it on graph viewer.
if atom doesn't denote text or entity, then has no effect on graph viewer display.
IF ControllerViewerExits[handle] THEN { OPEN handle;
msg: ROPE; i: INT; r: REAL;
SELECT atom FROM
$Divisions => ResumeDivisionsFields[handle];
$Bounds => ResumeBoundsFields[handle];
$Carets => ResumeCaretsFields[handle];
$Primary => ResumeCaretFields[handle, primary];
$Secondary => ResumeCaretFields[handle, secondary];
$Slope => ResumeSlopeFields[handle];
$TextCaret => ResumeCaretFields[handle, text];
$Targets => ResumeTargetsFields[handle];
$TargetX => ResumeTargetFields[handle, x];
$TargetY => ResumeTargetFields[handle, y];
$Grids => ResumeGridsFields[handle];
$Color => {
[msg, i] ← GetIntField[controller.colorIndex];
IF msg = NIL THEN
IF i IN ColorIndex THEN ResumeColorFields[handle, i]
ELSE BlinkMsg[Rope.Cat[
"Index must be in [0..", Convert.RopeFromInt[NumberOfColors], ")"]];
};
$Font => {
[msg, i]← GetIntField[controller.fontIndex];
IF msg = NIL THEN
IF i IN FontIndex THEN ResumeFontFields[handle, i]
ELSE BlinkMsg[Rope.Cat[
"Index must be in [0..", Convert.RopeFromInt[NumberOfFonts], ")"]];
};
$Text => {
text: Text ← SpecIndexedText[controller, allTexts];
IF text = NIL THEN BlinkMsg["No text with this id."]
ELSE ShowText[handle, text];
};
$Entity => {
entity: Entity ← SpecIndexedEntity[controller, entityHash];
IF entity = NIL THEN BlinkMsg["No curve with this id."]
ELSE ShowEntity[handle, entity];
};
$XYValues => {
msg: ROPE; i: INT;
[msg, i] ← GetIntField[controller.idOfy];
IF msg = NIL THEN {
entity: Entity ← EntityFromId[entityHash[i MOD EntityHashSize], i];
IF entity = NIL THEN BlinkMsg["No curve with this id."]
ELSE ResumeXYValues[handle, entity];
};
};
$Xsection => {
[msg, r] ← GetRealField[controller.xat];
IF msg = NIL THEN ResumeCrossSection[handle, r];
};
$CurveGroup => {
[msg, i] ← GetIntField[controller.groupId, "id"];
IF msg = NIL THEN {
eg: EntityGroup ← EntityGroupFromId[handle.entityGroupList, i];
IF eg = NIL THEN BlinkMsg[Rope.Concat["There is no curve group with id = ", Convert.RopeFromInt[i]]]
ResumeCurveGroupFields[handle, eg];
};
};
ENDCASE => RaiseError[$UnknownAtom, "in Resume"];
};
}; -- ResumeFromPanel
ShowText: PUBLIC PROC[handle: GraphHandle ← NIL, text: Text ← NIL] = {
IF HandleNotNil[handle] AND text # NIL THEN { OPEN handle;
IF TextFromId[graph.texts, text.id] = NIL THEN {
graph.texts ← CONS[text, graph.texts];
IF chart.viewer # NIL THEN PaintText[handle, text, paint];
};
IF controller # NIL THEN ResumeTextFields[handle, text];
};
}; -- ShowText
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, entity, TRUE, paint];
};
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]];
controller.mark ← 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: ROPENIL;
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
}.
LOG.
SChen, created at October 9, 1985 6:53:56 pm PDT.