home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1995-05-29 | 8.6 KB | 303 lines |
- IMPLEMENTATION MODULE CXCommodity;
-
- (* CXCommodity.mod - Brokerroutinen
- * Version : $VER: CXCommodity.mod 2.2 (© 1995 Fin Schuppenhauer)
- * Autor : Fin Schuppenhauer
- * Braußpark 10
- * 20537 Hamburg
- * (Germany)
- * E-Mail : 1schuppe@informatik.uni-hamburg.de
- * Erstellt am : 28 Jan 1995
- * Letzte Änd. : 29 Mai 1995
- *)
-
- (*$ DEFINE DEBUG:=FALSE *)
-
- IMPORT
- ed:ExecD, el:ExecL, es:ExecSupport,
- cd:CommoditiesD, cl:CommoditiesL, cs:CommoditiesSupport,
- ll:LocaleL,
- String,
- cp:CommoditiesPrivate,
- lan:ListsAndNodes,
- cxl:CXLokal,
- cxw:CXWindow,
- cxf:CXFileIO;
-
- FROM SYSTEM IMPORT
- ADR, ADDRESS, CAST;
-
-
-
- CONST
- HOTKEY_DEFAULT = "control alt help";
- EVENT_HOTKEY = 1;
-
- YES = "YES";
- ON = "ON";
-
- VAR
- brokerport: ed.MsgPortPtr;
- broker: cd.CxObjPtr;
- hotkey: StrPtr;
-
- (* --------------------------------------------------------------- *)
-
- PROCEDURE ExtractArguments;
- (* Die übergebenen Argumente und Tooltypes auswerten: *)
- VAR
- str: StrPtr;
- BEGIN
- WITH arguments DO
- priority := cs.ArgInt(ADR("CX_PRIORITY"), 0);
- hotkey := cs.ArgString(ADR("CX_POPKEY"), ADR(HOTKEY_DEFAULT));
-
- str := cs.ArgString(ADR("CX_POPUP"), ADR(YES));
- popup := String.Compare(str^, YES) = 0;
- END;
- END ExtractArguments;
-
- (* --------------------------------------------------------------- *)
-
- PROCEDURE InitBroker (): BOOLEAN;
- (* Richtet mein Exchange-Commodity ein. *)
- VAR
- newbroker: cd.NewBroker;
- error: LONGCARD;
- filter: cd.CxObjPtr;
-
- bool: BOOLEAN;
- str: StrPtr;
- success : BOOLEAN;
- BEGIN
- (* Zunächst muß ein Message-Port für unser Commodity ein-
- * gerichtet werden:
- *)
- success := FALSE;
- brokerport := el.CreateMsgPort();
- IF brokerport # NIL THEN
- (* Na prima, das hat geklappt. Jetzt initialisieren wir
- * unseren Broker (sozusagen den Chef unseres Commodities):
- *)
- WITH newbroker DO
- version := cd.nbVersion;
- (* Der Name MUSS "Exchange" sein, da wir sonst bestimmte
- * Nachrichten (nämlich wenn sich was an den Commodities
- * verändert hat) bekommen.
- *)
- name := ADR("Exchange");
- title := ADR("CX V2.2 © 1994/5 Fin Schuppenhauer");
- descr := ll.GetCatalogStr(cxw.catalog, cxl.BROKERDESCR, ADR(cxl.BROKERDESCRSTR));;
- unique := cd.UniqueFlagSet{cd.unique, cd.notify};
- flags := cd.NewBrokerFlagSet{cd.showHide};
- pri := arguments.priority;
- port := brokerport;
- END;
- broker := cl.CxBroker(newbroker, error);
-
- IF error = cd.cberrOk THEN
- (* Wunderbar. Da unser Commodity über einen Hotkey auch
- * erscheinen soll, basteln wir uns das entsprechende
- * CxObj dazu:
- *)
- hotkey := arguments.hotkey;
- filter := cs.HotKey(hotkey, brokerport, EVENT_HOTKEY);
-
- IF filter # NIL THEN
- cl.AttachCxObj (broker, filter);
- (* Wir wollen die dafür notwendige Tastaturkombination
- * auch im Fenstertitel anzeigen (ein Teil des Fenster-
- * titels wurde bereits in CXWindow.mod definiert):
- *)
- String.Concat (cxw.wintitle, " <");
- String.Concat (cxw.wintitle, hotkey^);
- String.ConcatChar (cxw.wintitle, ">");
- END;
-
- (* Jetzt ermitteln wir noch schnell das Signal
- * für unseren Wait-Aufruf in CX.mod ...
- *)
- brokersignal := brokerport^.sigBit;
- (* ... und aktivieren unseren Broker: *)
- bool := cl.ActivateCxObj(broker, TRUE);
-
- (* Falls gewünscht, öffnen wir noch schnell unser
- * Fenster:
- *)
- IF arguments.popup THEN
- cxw.ShowWindow;
- END;
- success := TRUE;
- END;
- END;
- RETURN success;
- END InitBroker;
-
- PROCEDURE FreeBroker;
- BEGIN
- (*$ IF DEBUG *)
- io.WriteString ("cxc.FreeBroker()\n");
- (*$ ENDIF *)
- cl.DeleteCxObjAll(broker);
- el.DeleteMsgPort (brokerport);
- brokerport := NIL;
- END FreeBroker;
-
- (* --------------------------------------------------------------- *)
-
- PROCEDURE InitBrokerList (VAR count: INTEGER);
- (* Rückgabewerte:
- * list : ListPtr auf die sortierte Liste der Broker
- * count : Anzahl der Broker in der Liste
- *)
- VAR
- li: LONGINT;
- node: ed.NodePtr;
- BEGIN
- (*$ IF DEBUG *)
- io.WriteString ("cxc.InitBrokerList (");
- io.WriteInt (count,0); io.WriteString (") => ");
- (*$ ENDIF *)
- count := 0;
- brokerlist := el.AllocMem(SIZE(ed.List), ed.MemReqSet{ed.public});
- IF brokerlist # NIL THEN
- es.NewList (brokerlist);
- li := cp.CopyBrokerList (brokerlist);
- lan.SortExecList(brokerlist, lan.ALLNODES);
- count := INTEGER(lan.CountNodes(brokerlist));
- END;
- (*$ IF DEBUG *)
- io.WriteInt (count,0); io.WriteLn;
- (*$ ENDIF *)
- END InitBrokerList;
-
- PROCEDURE FreeBrokerList;
- VAR
- count: LONGINT;
- BEGIN
- (*$ IF DEBUG *)
- io.WriteString ("cxc.FreeBrokerList()\n");
- (*$ ENDIF *)
- IF brokerlist # NIL THEN
- count := cp.FreeBrokerList(brokerlist);
- el.FreeMem (brokerlist, SIZE(ed.List));
- brokerlist := NIL;
- END;
- END FreeBrokerList;
-
- (* --------------------------------------------------------------- *)
-
- PROCEDURE GetBrokerCopy (num: INTEGER) : cp.BrokerCopyPtr;
- VAR
- node: ed.NodePtr;
- i: INTEGER;
- BEGIN
- node := brokerlist^.head;
- FOR i := 1 TO num DO
- node := node^.succ;
- END;
- RETURN CAST(cp.BrokerCopyPtr, node);
- END GetBrokerCopy;
-
- PROCEDURE GetBrokerCopyByName (name: StrPtr) : cp.BrokerCopyPtr;
- (* Wird von CXARexx.mod aufgerufen. *)
- VAR
- node: ed.NodePtr;
- BEGIN
- node := brokerlist^.head;
- WHILE node # NIL DO
- IF String.Compare(CAST(cp.BrokerCopyPtr, node)^.name, name^) = 0 THEN
- RETURN CAST(cp.BrokerCopyPtr, node);
- ELSE
- node := node^.succ;
- END;
- END;
- RETURN NIL;
- END GetBrokerCopyByName;
-
- PROCEDURE SendBrokerCommand (num: INTEGER; cmd: LONGCARD);
- VAR
- bc: cp.BrokerCopyPtr;
- li: LONGINT;
- BEGIN
- (*$ IF DEBUG *)
- io.WriteString ("cxc.SendBrokerCommand(");
- io.WriteInt (num,0); io.Write (","); io.WriteCard(cmd,0);
- io.WriteString (")\n");
- (*$ ENDIF *)
- bc := GetBrokerCopy(num);
- IF cmd = activeToggle THEN
- IF cp.active IN bc^.flags THEN
- cmd := cd.cxcmdDisable;
- ELSE
- cmd := cd.cxcmdEnable;
- END;
- END;
- li := cp.BrokerCommand (ADR(bc^.name), cmd);
- END SendBrokerCommand;
-
- PROCEDURE SendAllBrokerCommand (cmd: LONGCARD);
- (* Der Broker-Befehl "cmd" wird an alle Broker verschickt: *)
- VAR
- bc: cp.BrokerCopyPtr;
- li: LONGINT;
- BEGIN
- bc := CAST(cp.BrokerCopyPtr, brokerlist^.head);
- WHILE bc # NIL DO
- li := cp.BrokerCommand (ADR(bc^.name), cmd);
- bc := CAST(cp.BrokerCopyPtr, bc^.node.succ);
- END;
- END SendAllBrokerCommand;
-
- (* --------------------------------------------------------------- *)
-
- PROCEDURE HandleBrokerMsg (VAR done: BOOLEAN);
- VAR
- msg: cd.CxMsgPtr;
- msgid: LONGINT;
- msgtype: LONGCARD;
- bool: BOOLEAN;
- BEGIN
- (*$ IF DEBUG *)
- io.WriteString ("cxc.HandleBrokerMsg()\n");
- (*$ ENDIF *)
- LOOP
- msg := CAST(cd.CxMsgPtr, el.GetMsg (brokerport));
- IF msg = NIL THEN EXIT; END;
- msgid := cl.CxMsgID(msg);
- msgtype := cl.CxMsgType(msg);
- el.ReplyMsg (CAST(ADDRESS,msg));
-
- CASE msgtype OF
- cd.cxmIevent:
- IF msgid = EVENT_HOTKEY THEN
- (*$ IF DEBUG *)
- io.WriteString ("- Hotkey\n");
- (*$ ENDIF *)
- cxw.ShowWindow;
- END;
- | cd.cxmCommand:
- (*$ IF DEBUG *)
- io.WriteString ("- cxmCommand = ");
- io.WriteCard (msgid,0); io.WriteLn;
- (*$ ENDIF *)
- CASE msgid OF
- cd.cxcmdDisable: bool := cl.ActivateCxObj (broker, FALSE);
- | cd.cxcmdEnable: bool := cl.ActivateCxObj (broker, TRUE);
- | cd.cxcmdKill: done := TRUE;
- | cd.cxcmdDisappear: cxw.CloseWindow;
- | cd.cxcmdAppear, cd.cxcmdUnique: cxw.ShowWindow;
- | cd.cxcmdListChg: cxw.RefreshListview;
- ELSE
- END;
- ELSE
- END;
- END;
- END HandleBrokerMsg;
-
- (* --------------------------------------------------------------- *)
-
- BEGIN (* main *)
- ExtractArguments;
- END CXCommodity.
-