<> <> <> <> <<>> DIRECTORY Atom, Commander, Feedback, Rope, SimpleFeedback, XTk, XTkFeedback, XTkWidgets; XTkFeedbackCommands: CEDAR PROGRAM IMPORTS Atom, Commander, Feedback, Rope, SimpleFeedback, XTkFeedback, XTkWidgets ~ BEGIN <<------------------------------>> <> ExercizerRec: TYPE = RECORD [ routerWidget: XTkWidgets.Widget, msgClassWidget: XTkWidgets.Widget, msgWidget: XTkWidgets.Widget ]; DoExercise: XTk.WidgetNotifyProc = { tr: REF ExercizerRec ~ NARROW[registerData]; message: Rope.ROPE ¬ XTkWidgets.GetText[tr.msgWidget]; router: Rope.ROPE ¬ XTkWidgets.GetText[tr.routerWidget]; msgClass: Rope.ROPE ¬ XTkWidgets.GetText[tr.msgClassWidget]; SimpleFeedback.Append[Atom.MakeAtom[router], oneLiner, Atom.MakeAtom[msgClass], message]; }; CreateTestExercizer: Commander.CommandProc ~ { tr: REF ExercizerRec ~ NEW[ExercizerRec]; button: XTkWidgets.Widget ¬ XTkWidgets.CreateButton[text: "", hitProc: DoExercise, registerData: tr]; routerWidget: XTkWidgets.Widget ¬ tr.routerWidget ¬ XTkWidgets.CreateLabeledField[label: "Router:", init: "Unknown"]; msgClassWidget: XTkWidgets.Widget ¬ tr.msgClassWidget ¬ XTkWidgets.CreateLabeledField[label: "MsgClass:", init: "Unknown"]; msgWidget: XTkWidgets.Widget ¬ tr.msgWidget ¬ XTkWidgets.CreateLabeledField[label: "message:", init: "...Hello..."]; container: XTkWidgets.Widget ¬ XTkWidgets.CreateYStack[[], LIST[button, routerWidget, msgClassWidget, msgWidget]]; shell: XTkWidgets.Widget ¬ XTkWidgets.CreateShell[child: container, windowHeader: "Feedback exercisor", packageName: "XTkFeedback", shortName: "XTkFeedbackExercise"]; XTkWidgets.RealizeShell[shell]; }; <<------------------------------>> <> CreatorRec: TYPE = RECORD [ routerWidget: XTkWidgets.Widget, msgClassWidget: XTkWidgets.Widget ]; CreateAHandler: XTk.WidgetNotifyProc = { tr: REF ExercizerRec ~ NARROW[registerData]; routerName: Rope.ROPE ¬ XTkWidgets.GetText[tr.routerWidget]; msgClassName: Rope.ROPE ¬ XTkWidgets.GetText[tr.msgClassWidget]; routerKey: ATOM ~ Atom.MakeAtom[routerName]; msgClassKey: ATOM ~ Atom.MakeAtom[msgClassName]; router: Feedback.MsgRouter ¬ Feedback.EnsureRouter[routerKey]; h: Feedback.MsgHandler ~ XTkFeedback.CreateHandlerOnShell[name: Rope.Cat["Feedback for ", routerName, " (", msgClassName, ")"]]; [] ¬ Feedback.SetHandler[router, msgClassKey, h]; SimpleFeedback.Append[routerKey, oneLiner, msgClassKey, "Feedback widget just created"]; }; HandlerCreator: Commander.CommandProc ~ { cr: REF ExercizerRec ~ NEW[ExercizerRec]; button: XTkWidgets.Widget ¬ XTkWidgets.CreateButton[text: "", hitProc: CreateAHandler, registerData: cr]; routerWidget: XTkWidgets.Widget ¬ cr.routerWidget ¬ XTkWidgets.CreateLabeledField[label: "Router name:", init: "Unknown"]; msgClassWidget: XTkWidgets.Widget ¬ cr.msgClassWidget ¬ XTkWidgets.CreateLabeledField[label: "MsgClass name:", init: "Default"]; container: XTkWidgets.Widget ¬ XTkWidgets.CreateYStack[[], LIST[button, routerWidget, msgClassWidget]]; shell: XTkWidgets.Widget ¬ XTkWidgets.CreateShell[child: container, windowHeader: "Feedback handler creation", packageName: "XTkFeedback", shortName: "XTkFeedbackCreate"]; XTkWidgets.RealizeShell[shell]; }; <<------------------------------>> <<>> Commander.Register["XTkFeedbackExercise", CreateTestExercizer, "Create a feedback exercizer tool"]; Commander.Register["XTkFeedbackCreate", HandlerCreator, "Create a feedback-handler creation tool"]; END.