123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- MODULE MenuEdit; (** AUTHOR "TF"; PURPOSE "Template/Example for component windows"; *)
- (** This program shows the implementation of a multi instance component containing window *)
- IMPORT
- Strings, WMGraphics, WMMessages, WMComponents, WMStandardComponents,
- Modules, KernelLog, WMRectangles,
- Streams, MultiLogger, Random, WMDialogs, XML, XMLObjects,
- WM := WMWindowManager;
- TYPE
- KillerMsg = OBJECT
- END KillerMsg;
- Window* = OBJECT (WMComponents.FormWindow)
- VAR add, store, delete, edit, toFront : WMStandardComponents.Button;
- panel, toolbar : WMStandardComponents.Panel;
- selectedObj : WMComponents.VisualComponent;
- lx, ly : LONGINT;
- generator : Random.Generator;
- PROCEDURE CreateForm() : WMComponents.VisualComponent;
- VAR e : WMStandardComponents.Panel;
- BEGIN
- NEW(e); e.bounds.SetExtents(500, 520); e.fillColor.Set(0); e.takesFocus.Set(TRUE);
- NEW(toolbar); toolbar.bounds.SetHeight(20); toolbar.fillColor.Set(0); toolbar.takesFocus.Set(TRUE);
- toolbar.alignment.Set(WMComponents.AlignTop);
- e.AddContent(toolbar);
- NEW(add); add.caption.SetAOC("Add"); add.onClick.Add(AddButton); add.alignment.Set(WMComponents.AlignLeft);
- toolbar.AddContent(add);
- NEW(store); store.caption.SetAOC("Get XML"); store.onClick.Add(Store); store.alignment.Set(WMComponents.AlignLeft);
- toolbar.AddContent(store);
- NEW(delete); delete.caption.SetAOC("Delete"); delete.onClick.Add(Delete); delete.alignment.Set(WMComponents.AlignLeft);
- toolbar.AddContent(delete);
- NEW(edit); edit.caption.SetAOC("Edit"); edit.onClick.Add(Edit); edit.alignment.Set(WMComponents.AlignLeft);
- toolbar.AddContent(edit);
- NEW(toFront); toFront.caption.SetAOC("To Front"); toFront.onClick.Add(ToFront); toFront.alignment.Set(WMComponents.AlignLeft);
- toolbar.AddContent(toFront);
- NEW(panel); panel.bounds.SetExtents(500, 500); panel.fillColor.Set(0); panel.alignment.Set(WMComponents.AlignTop); panel.takesFocus.Set(TRUE);
- e.AddContent(panel);
- RETURN e
- END CreateForm;
- PROCEDURE &New*;
- VAR vc : WMComponents.VisualComponent;
- BEGIN
- NEW(generator);
- IncCount;
- (* To create a multi language app, try loading the respective XML instead of CreateForm()
- if the XML was not found or does not contain all needed elements, use CreateForm as fallback *)
- vc := CreateForm();
- Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), TRUE);
- SetContent(vc);
- WM.DefaultAddWindow(SELF);
- SetTitle(Strings.NewString("Menu Edit"));
- END New;
- PROCEDURE PointerDown*(x, y : LONGINT; keys : SET);
- VAR button : WMStandardComponents.Button;
- BEGIN
- IF 1 IN keys THEN
- NEW(button);
- button.bounds.SetExtents(64, 64);
- panel.AddContent(button);
- panel.Invalidate;
- Select(button);
- END;
- END PointerDown;
- PROCEDURE AddButton(sender, data : ANY);
- VAR button : WMStandardComponents.Button;
- name, nameD, nameH, str : ARRAY 64 OF CHAR;
- type, direction : LONGINT;
- img : WMGraphics.Image;
- sc : WMStandardComponents.SystemCommand;
- BEGIN
- name := "present.tar://present";
- type := generator.Dice(5) + 1; direction := generator.Dice(3) + 1;
- Strings.IntToStr(type, str); Strings.Append(name, str);
- Strings.Append(name, "-");
- Strings.IntToStr(direction, str); Strings.Append(name, str);
- COPY(name, nameD); Strings.Append(nameD, ".png");
- COPY(name, nameH); Strings.Append(nameH, "h.png");
- img := WMGraphics.LoadImage(nameD, TRUE);
- IF img # NIL THEN
- NEW(button);
- button.bounds.SetExtents(img.width, img.height);
- button.imgDefaultName.SetAOC(nameD);
- button.imgHoverName.SetAOC(nameH);
- button.clTextDefault.Set(0FFFFH);
- button.useBgBitmaps.Set(TRUE);
- button.onClick.Add(SelectPresent);
- button.onClickHandler.SetAOC("X Run");
- NEW(sc);
- sc.id.SetAOC("X");
- button.AddContent(sc);
- panel.AddContent(button);
- button.Reset(NIL, NIL);
- panel.Invalidate;
- Select(button);
- END
- END AddButton;
- PROCEDURE Delete(sender, data : ANY);
- BEGIN
- IF selectedObj # NIL THEN
- panel.RemoveContent(selectedObj);
- selectedObj := NIL;
- panel.Invalidate
- END
- END Delete;
- PROCEDURE ToFront(sender, data : ANY);
- BEGIN
- IF selectedObj # NIL THEN
- panel.RemoveContent(selectedObj);
- panel.AddContent(selectedObj);
- panel.Invalidate
- END
- END ToFront;
- PROCEDURE Edit(sender, data : ANY);
- VAR caption, command : ARRAY 1024 OF CHAR;
- s : Strings.String;
- sc : WMStandardComponents.SystemCommand;
- e : XMLObjects.Enumerator; c : ANY;
- BEGIN
- IF selectedObj # NIL THEN
- s := selectedObj(WMStandardComponents.Button).caption.Get();
- IF s # NIL THEN COPY(s^, caption) END;
- IF WMDialogs.QueryString("Caption", caption) = WMDialogs.ResOk THEN
- selectedObj(WMStandardComponents.Button).caption.SetAOC(caption);
- END;
- sc := NIL;
- e := selectedObj.GetContents();
- IF e.HasMoreElements() THEN
- c := e.GetNext();
- s := c(XML.Element).GetName(); KernelLog.String("s^= "); KernelLog.String(s^); KernelLog.Ln;
- IF (c IS WMStandardComponents.SystemCommand) THEN sc := c(WMStandardComponents.SystemCommand) END;
- END;
- IF sc # NIL THEN
- s := sc.commandString.Get();
- IF s # NIL THEN COPY(s^, command) END;
- IF WMDialogs.QueryString("Command", command) = WMDialogs.ResOk THEN
- sc.commandString.SetAOC(command);
- END;
- END;
- panel.Invalidate
- END
- END Edit;
- PROCEDURE Store(sender, data : ANY);
- VAR ml : MultiLogger.LogWindow;
- w : Streams.Writer;
- BEGIN
- NEW(ml, "XML", w);
- panel.Write(w, NIL, 0);
- w.Update;
- END Store;
- PROCEDURE Select(vc : WMComponents.VisualComponent);
- BEGIN
- IF selectedObj # NIL THEN
- selectedObj.SetExtPointerDownHandler(NIL);
- selectedObj.SetExtPointerMoveHandler(NIL)
- END;
- selectedObj := vc;
- selectedObj.SetExtPointerMoveHandler(HandlePointerMove);
- selectedObj.SetExtPointerDownHandler(HandlePointerDown);
- END Select;
- PROCEDURE SelectPresent(sender, data : ANY);
- BEGIN
- IF (sender # NIL) & (sender IS WMComponents.VisualComponent) THEN
- Select(sender(WMComponents.VisualComponent))
- END
- END SelectPresent;
- PROCEDURE HandlePointerDown(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
- BEGIN
- lx := x; ly := y; handled := TRUE
- END HandlePointerDown;
- PROCEDURE HandlePointerMove(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
- VAR dx, dy : LONGINT; r : WMRectangles.Rectangle;
- BEGIN
- IF 0 IN keys THEN
- IF selectedObj # NIL THEN
- dy := y - ly; dx := x - lx;
- r := selectedObj.bounds.Get();
- WMRectangles.MoveRel(r, dx, dy);
- selectedObj.bounds.Set(r);
- panel.Invalidate;
- END
- END;
- handled := TRUE
- END HandlePointerMove;
- PROCEDURE Close*;
- BEGIN
- Close^;
- DecCount
- END Close;
- PROCEDURE Handle*(VAR x : WMMessages.Message);
- BEGIN
- IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) & (x.ext IS KillerMsg) THEN Close
- ELSE Handle^(x)
- END
- END Handle;
- END Window;
- VAR
- nofWindows : LONGINT;
- PROCEDURE Open*;
- VAR winstance : Window;
- BEGIN
- NEW(winstance);
- END Open;
- PROCEDURE IncCount;
- BEGIN {EXCLUSIVE}
- INC(nofWindows)
- END IncCount;
- PROCEDURE DecCount;
- BEGIN {EXCLUSIVE}
- DEC(nofWindows)
- END DecCount;
- PROCEDURE Cleanup;
- VAR die : KillerMsg;
- msg : WMMessages.Message;
- m : WM.WindowManager;
- BEGIN {EXCLUSIVE}
- NEW(die);
- msg.ext := die;
- msg.msgType := WMMessages.MsgExt;
- m := WM.GetDefaultManager();
- m.Broadcast(msg);
- AWAIT(nofWindows = 0)
- END Cleanup;
- BEGIN
- Modules.InstallTermHandler(Cleanup)
- END MenuEdit.
- SystemTools.Free MenuEdit ~
- MenuEdit.Open ~
|