********************************************************************
* NOTE: This file is generated automatically from the event
* definition file UnionFind.evt.
********************************************************************
<* PRAGMA LL *>
MODULE UnionFindBigTreeObliqView ;
<*NOWARN*> IMPORT ObLibM3, ObLibUI, SynWr, Obliq, ObliqParser, Rd;
<*NOWARN*> IMPORT Filter, Fmt, ObLibAnim, ZFmt, UnionFindViewClass;
<*NOWARN*> IMPORT ZeusPanel, ObValue, TextWr, View, VBT, Thread;
<*NOWARN*> IMPORT TextRd, Rsrc;
CONST
ViewName = "BigTree.obl";
TYPE
T = UnionFindViewClass.T BRANDED OBJECT
object : Obliq.Val;
env : Obliq.Env;
wr : TextWr.T;
swr : SynWr.T;
parser : ObliqParser.T;
OVERRIDES
<* LL.sup < VBT.mu *>
startrun := Startrun;
<* LL.sup < VBT.mu *>
oeSetup := Setup;
oeNewSet := NewSet;
oeFinishedSets := FinishedSets;
oeStartFind := StartFind;
oeEndFind := EndFind;
oeStartDoFind := StartDoFind;
oeStepUp := StepUp;
oeFound := Found;
oeStepDown := StepDown;
oeChangeParent := ChangeParent;
oeEndDoFind := EndDoFind;
oeStartUnion := StartUnion;
oeFoundFirst := FoundFirst;
oeCompareRanks := CompareRanks;
oeUnite := Unite;
oeEndUnion := EndUnion;
<* LL.sup = VBT.mu *>
END;
OUTPUT and UPDATE event handling methods:
PROCEDURE Setup (view: T; ) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "Setup") THEN
Invoke (view, "Setup", ""
)
END
END Setup;
PROCEDURE NewSet (view: T; nm: TEXT) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "NewSet") THEN
Invoke (view, "NewSet", ""
& ZFmt.Text(nm)
)
END
END NewSet;
PROCEDURE FinishedSets (view: T; numSets: INTEGER; usesRanks: BOOLEAN) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "FinishedSets") THEN
Invoke (view, "FinishedSets", ""
& ZFmt.Int(numSets)
& ","
& ZFmt.Bool(usesRanks)
)
END
END FinishedSets;
PROCEDURE StartFind (view: T; id: INTEGER) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "StartFind") THEN
Invoke (view, "StartFind", ""
& ZFmt.Int(id)
)
END
END StartFind;
PROCEDURE EndFind (view: T; id: INTEGER) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "EndFind") THEN
Invoke (view, "EndFind", ""
& ZFmt.Int(id)
)
END
END EndFind;
PROCEDURE StartDoFind (view: T; id: INTEGER) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "StartDoFind") THEN
Invoke (view, "StartDoFind", ""
& ZFmt.Int(id)
)
END
END StartDoFind;
PROCEDURE StepUp (view: T; child, parent: INTEGER) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "StepUp") THEN
Invoke (view, "StepUp", ""
& ZFmt.Int(child)
& ","
& ZFmt.Int(parent)
)
END
END StepUp;
PROCEDURE Found (view: T; id: INTEGER) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "Found") THEN
Invoke (view, "Found", ""
& ZFmt.Int(id)
)
END
END Found;
PROCEDURE StepDown (view: T; child, parent: INTEGER) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "StepDown") THEN
Invoke (view, "StepDown", ""
& ZFmt.Int(child)
& ","
& ZFmt.Int(parent)
)
END
END StepDown;
PROCEDURE ChangeParent (view: T; child, parent, root: INTEGER) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "ChangeParent") THEN
Invoke (view, "ChangeParent", ""
& ZFmt.Int(child)
& ","
& ZFmt.Int(parent)
& ","
& ZFmt.Int(root)
)
END
END ChangeParent;
PROCEDURE EndDoFind (view: T; id: INTEGER) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "EndDoFind") THEN
Invoke (view, "EndDoFind", ""
& ZFmt.Int(id)
)
END
END EndDoFind;
PROCEDURE StartUnion (view: T; id1, id2: INTEGER; bothRoots: BOOLEAN) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "StartUnion") THEN
Invoke (view, "StartUnion", ""
& ZFmt.Int(id1)
& ","
& ZFmt.Int(id2)
& ","
& ZFmt.Bool(bothRoots)
)
END
END StartUnion;
PROCEDURE FoundFirst (view: T; id1: INTEGER) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "FoundFirst") THEN
Invoke (view, "FoundFirst", ""
& ZFmt.Int(id1)
)
END
END FoundFirst;
PROCEDURE CompareRanks (view: T; id1, id2: INTEGER) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "CompareRanks") THEN
Invoke (view, "CompareRanks", ""
& ZFmt.Int(id1)
& ","
& ZFmt.Int(id2)
)
END
END CompareRanks;
PROCEDURE Unite (view: T; child, parent, pRank: INTEGER) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "Unite") THEN
Invoke (view, "Unite", ""
& ZFmt.Int(child)
& ","
& ZFmt.Int(parent)
& ","
& ZFmt.Int(pRank)
)
END
END Unite;
PROCEDURE EndUnion (view: T; ) =
<* LL.sup < VBT.mu *>
BEGIN
IF FieldDefined(view.object, "EndUnion") THEN
Invoke (view, "EndUnion", ""
)
END
END EndUnion;
PROCEDURE RegisterView () =
BEGIN
ZeusPanel.RegisterView(New, "BigTree.obl", "UnionFind")
END RegisterView;
PROCEDURE New (): View.T =
BEGIN
RETURN NEW(T).init(NIL)
END New;
CONST
ObliqStackSizeMultiplier = 8;
TYPE
Closure = Thread.SizedClosure OBJECT
view: T;
OVERRIDES
apply := ForkedStartrun;
END;
PROCEDURE Startrun (view: T) =
<* LL.sup < VBT.mu *>
BEGIN
EVAL
Thread.Join(
Thread.Fork(
NEW(Closure, view := view,
stackSize := ObliqStackSizeMultiplier * Thread.GetDefaultStackSize())));
END Startrun;
PROCEDURE ForkedStartrun (cl: Closure): REFANY =
VAR rd: Rd.T; view := cl.view;
BEGIN
IF view.parser = NIL THEN
view.wr := TextWr.New();
view.swr := SynWr.New(view.wr);
view.parser := ObliqParser.New(view.swr);
END;
view.object := NIL;
TRY
rd := Rsrc.Open(ViewName, ZeusPanel.GetPath());
view.env := ParseRd(view.parser, ViewName, rd);
WITH obj = Obliq.Lookup("view", view.env) DO
IF NOT ISTYPE(obj, ObValue.ValObj) THEN
ZeusPanel.ReportError(
"not an Obliq object in '" & ViewName & "'")
ELSIF FieldDefined (obj, "graphvbt") THEN
WITH graphvbt =
NARROW(Obliq.ObjectSelect(obj, "graphvbt"),
ObLibAnim.ValGraph).vbt DO
LOCK VBT.mu DO
EVAL Filter.Replace(view, graphvbt)
END
END;
view.object := obj;
ELSIF FieldDefined (obj, "rectsvbt") THEN
WITH rectsvbt =
NARROW(Obliq.ObjectSelect(obj, "rectsvbt"),
ObLibAnim.ValRects).vbt DO
LOCK VBT.mu DO
EVAL Filter.Replace(view, rectsvbt)
END
END;
view.object := obj;
ELSIF FieldDefined (obj, "formsvbt") THEN
WITH formsvbt =
NARROW(Obliq.ObjectSelect(obj, "formsvbt"),
ObLibUI.ValForm).vbt DO
LOCK VBT.mu DO
EVAL Filter.Replace(view, formsvbt)
END
END;
view.object := obj;
ELSE
ZeusPanel.ReportError(
"cannot find 'graphvbt', 'rectsvbt', or 'formsvbt' in '" & ViewName & "'")
END
END
EXCEPT
| Rsrc.NotFound =>
ZeusPanel.ReportError("cannot find '" & ViewName & "'")
| ObValue.Error (packet) => OblError(view, packet)
| ObValue.Exception (packet) => OblException(view, packet)
END;
RETURN NIL;
END ForkedStartrun;
PROCEDURE ParseRd (p: ObliqParser.T; name: TEXT; rd: Rd.T):
Obliq.Env RAISES {ObValue.Error, ObValue.Exception} =
VAR env := Obliq.EmptyEnv();
BEGIN
ObliqParser.ReadFrom(p, name, rd, TRUE);
TRY
LOOP
EVAL ObliqParser.EvalPhrase(p, ObliqParser.ParsePhrase(p), env)
END
EXCEPT
ObliqParser.Eof => (* clean exit of loop *)
END;
RETURN env
END ParseRd;
PROCEDURE Invoke (view: T; event, args: TEXT) =
VAR
exp := "view." & event & "(" & args & ");";
name := "Zeus Event <" & event & ">";
BEGIN
ObliqParser.ReadFrom (view.parser, name, TextRd.New(exp), FALSE);
TRY
EVAL Obliq.EvalTerm(ObliqParser.ParseTerm(view.parser), view.env)
EXCEPT
| ObliqParser.Eof => <* ASSERT FALSE *>
| ObValue.Error (packet) => OblError(view, packet)
| ObValue.Exception (packet) => OblException(view, packet)
END
END Invoke;
PROCEDURE FieldDefined (object: Obliq.Val; event: TEXT): BOOLEAN =
BEGIN
TRY
RETURN object # NIL AND Obliq.ObjectHas(object, event)
EXCEPT
| ObValue.Error =>
| ObValue.Exception =>
END;
RETURN FALSE
END FieldDefined;
PROCEDURE OblError (view: T; packet: ObValue.ErrorPacket) =
BEGIN
Obliq.ReportError(view.swr, packet);
ZeusPanel.ReportError(
"Obliq error: " & TextWr.ToText(view.wr))
END OblError;
PROCEDURE OblException (view: T; packet: ObValue.ExceptionPacket) =
BEGIN
Obliq.ReportException(view.swr, packet);
ZeusPanel.ReportError(
"Obliq exception: " & TextWr.ToText(view.wr))
END OblException;
BEGIN
SynWr.Setup();
ObliqParser.PackageSetup();
ObLibM3.PackageSetup();
ObLibUI.PackageSetup();
ObLibAnim.PackageSetup();
RegisterView ();
END UnionFindBigTreeObliqView.