home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD1.bin / new / util / cdity / cx / txt / cx.mod < prev    next >
Text File  |  1994-09-19  |  39KB  |  1,175 lines

  1. MODULE CX;
  2.  
  3.    (* CX.mod - Ersatz für das "Exchange"-Programm der Workbench
  4.     * Version     : $VER: CX.mod 1.2 (© 1994 Fin Schuppenhauer)
  5.     * Autor       : Fin Schuppenhauer
  6.     *               Braußpark 10
  7.     *               20537 Hamburg
  8.     *               (Germany)
  9.     * E-Mail      : schuppenhauer@informatik.uni-hamburg.de
  10.     * Erstellt am : 31 Aug 1994
  11.     * Letzte Änd. : 18 Sep 1994
  12.     *)
  13.  
  14.    (*$ DEFINE Debug:=FALSE *)
  15.  
  16. IMPORT cd:CommoditiesD,          cl:CommoditiesL,   cp:CommoditiesPrivate,
  17.        cs:CommoditiesSupport,
  18.        ed:ExecD,                 el:ExecL,          es:ExecSupport,
  19.        id:IntuitionD,            il:IntuitionL,     im:IntuiMacros,
  20.        gtd:GadToolsD,            gtl:GadToolsL,
  21.        gd:GraphicsD,             gl:GraphicsL,
  22.        dd:DosD,                  dl:DosL,
  23.        ld:LocaleD,               ll:LocaleL,
  24.        iv:InputEvent,
  25.        ASCII,
  26.        lan:ListsAndNodes,
  27.        cxc:CXCatalog,
  28.    (*$ IF Debug *)
  29.        Arts,
  30.        t:Terminal,
  31.    (*$ ENDIF *)
  32.        str:String;
  33.  
  34. FROM SYSTEM IMPORT LONGSET, CAST, ADR, ADDRESS, TAG, BITSET;
  35. FROM UtilityD IMPORT tagEnd;
  36. (*$ IF Debug *)
  37. FROM InOut IMPORT WriteCard;
  38. (*$ ENDIF *)
  39.  
  40. CONST
  41.    (* Konstanten für die Gadgets: *)
  42.    LISTGADGET        = 0; (* Die ID-Nummern der ersten drei Gadgets *)
  43.    SHOWGADGET        = 1; (* dürfen nicht verändert werden! (siehe  *)
  44.    HIDEGADGET        = 2; (* ProcessMsg())                          *)
  45.    ENABLEGADGET      = 3;
  46.    KILLGADGET        = 4;
  47.    DISABLEALLGADGET  = 5; (* Diese zwei ID-Nummern dürfen ebenfalls *)
  48.    KILLALLGADGET     = 6; (* nicht verändert werden!                *)
  49.    GADGETCOUNT       = 7;
  50.  
  51.    (* Koordinaten der Bevelbox: *)
  52.    BEVELTOP    = 25;
  53.    BEVELLEFT   = 209;
  54.    BEVELWIDTH  = 340;
  55.    BEVELHEIGHT = 28;
  56.  
  57.    IVHOTKEY = 1;
  58.  
  59.    (* Menü: *)
  60.    PROJEKT  = 0;
  61.       ABOUTMENU      = 0;
  62.       (* ~~~~~~~~~~~ = 1 *)
  63.       HIDEMENU       = 2;
  64.       QUITMENU       = 3;
  65.    EDIT     = 1;
  66.       DISABLEALLMENU = 0;
  67.       ENABLEALLMENU  = 1;
  68.       KILLALLMENU    = 2;
  69.       (* nmEnd *)
  70.  
  71.    MENUCOUNT = 10;
  72.  
  73. CONST
  74.    YSTEP    = 2;
  75.    XSTEP    = 4;
  76.  
  77. TYPE
  78.    StrPtr = POINTER TO ARRAY [0..127] OF CHAR;
  79.  
  80.    UpperLowerCase = (lower, upper);
  81.  
  82.    MyTime = RECORD
  83.       seconds, micros : LONGCARD;
  84.    END;
  85.  
  86. VAR
  87.    brokerport  : ed.MsgPortPtr;  (* über diesen Port läuft die gesamte Kommunikation *)
  88.    nb          : cd.NewBroker;
  89.    broker      : cd.CxObjPtr;
  90.    error       : LONGCARD;       (* für Errorcode von CxBroker() *)
  91.    cxsigflag   : SHORTCARD;      (* Signal bei eintreffenden Broker- oder Intuition-Msgs. *)
  92.    bool        : BOOLEAN;        (* dummy *)
  93.    msg         : ed.MessagePtr;
  94.    defhotkey   : ARRAY [0..127] OF CHAR;
  95.    hotkey      : StrPtr;
  96.    hotkeyfilter: cd.CxObjPtr;
  97.    dummystr    : StrPtr;
  98.  
  99. VAR
  100.    window      : id.WindowPtr;
  101.    wintitle    : ARRAY [0..127] OF CHAR;
  102.    winreplyport: ed.MsgPortPtr;
  103.    vi          : ADDRESS;
  104.    glist       : id.GadgetPtr;
  105.    gadget      : ARRAY [0..GADGETCOUNT-1] OF id.GadgetPtr;
  106.    CycleLabels : POINTER TO ARRAY [0..2] OF ADDRESS;
  107.    allCycleLabels: POINTER TO ARRAY [0..2] OF ADDRESS;
  108.    menuStrip   : id.MenuPtr;
  109.    topazfont   : gd.TextFontPtr;
  110.    topaz8      : gd.TextAttr;
  111.    bevelWidth,
  112.    bevelHeight : INTEGER;
  113.  
  114.    brokerlist  : ed.ListPtr;    (* Liste der Broker; wird gleichzeitig für das LV-Gadget genutzt *)
  115.  
  116.    catalog     : ld.CatalogPtr;
  117.  
  118.    requester   : BOOLEAN;
  119.  
  120.  
  121.  
  122. PROCEDURE CreateCommoditiesList (VAR blist : ed.ListPtr);
  123. (** "Liste für Listview-Gadget erzeugen"
  124. *)
  125. VAR
  126.    li                : LONGINT;
  127. BEGIN
  128.    blist := el.AllocMem(SIZE(ed.List), ed.MemReqSet{ed.public});
  129.    IF blist # NIL THEN
  130.       es.NewList (blist);
  131.  
  132.       (* Kopie der System-Broker-List anlegen: *)
  133.       li := cp.CopyBrokerList (blist);
  134.    END;
  135.    lan.SortExecList (blist, INTEGER(lan.CountNodes(blist)));
  136. END CreateCommoditiesList;
  137. (* **)
  138.  
  139. PROCEDURE FreeCommoditiesList (VAR blist : ed.ListPtr);
  140. (** "Gibt den durch CreateCommoditiesList() belegeten speicher frei" *)
  141. VAR
  142.    li : LONGINT;
  143. BEGIN
  144.    IF blist # NIL THEN
  145.       li := cp.FreeBrokerList(blist);
  146.       el.FreeMem (blist, SIZE(ed.List));
  147.       blist := NIL;
  148.    END;
  149. END FreeCommoditiesList;
  150. (* **)
  151.  
  152. PROCEDURE UpdateCommoditiesList (VAR blist : ed.ListPtr);
  153. (** "Erneuert die LV-Gadget-Liste" *)
  154. VAR
  155.    dummylistptr: ADDRESS;
  156.    li          : LONGINT;
  157.    taglist     : ARRAY [0..7] OF LONGINT;
  158. BEGIN
  159.    FreeCommoditiesList (blist);
  160.    CreateCommoditiesList (blist);
  161.  
  162.    dummylistptr := blist;
  163.    gtl.GTSetGadgetAttrsA (gadget[LISTGADGET], window, NIL, TAG(taglist,
  164.       gtd.gtlvLabels,   dummylistptr,
  165.       tagEnd));
  166. END UpdateCommoditiesList;
  167. (* **)
  168.  
  169. PROCEDURE CountBrokers (blist : ed.ListPtr) : CARDINAL;
  170. (** "Berechnet die Anzahl der angezeigten Broker" *)
  171. VAR
  172.    node  : ed.NodePtr;
  173.    count : CARDINAL;
  174. BEGIN
  175.    RETURN CARDINAL(lan.CountNodes (blist)) - 1;
  176.    (* Bemerkung:
  177.     * In der Brokerliste gibt es einen besonderen Broker, der
  178.     * die Liste abschließt (CxObj-Type = cxZero). Den wollen
  179.     * wir natürlich nicht mitzählen.
  180.     *)
  181. END CountBrokers;
  182. (* **)
  183.  
  184.  
  185.  
  186. PROCEDURE ShowWindow;
  187. (** "Fenster öffnen, Gadgets zeichnen u.s.w." *)
  188. VAR
  189.    screen      : id.ScreenPtr;
  190.    taglist     : ARRAY [0..29] OF LONGINT;
  191.    gad         : id.GadgetPtr;
  192.    ng          : gtd.NewGadget;
  193.    rp          : gd.RastPortPtr;
  194.    mynewmenu   : POINTER TO ARRAY [0..MENUCOUNT-1] OF gtd.NewMenu;
  195.    font        : gd.TextAttrPtr;
  196.    buttonHeight: INTEGER;
  197.    buttonWidth : INTEGER;
  198.    listviewTop : INTEGER;
  199.    buttonTop   : INTEGER;
  200.    infostr     : StrPtr;
  201.    dummy       : INTEGER;
  202.    innerHeight : INTEGER;
  203.  
  204.    PROCEDURE ComputeWidths(VAR bevelwidth, buttonwidth : INTEGER);
  205. (** "Berechnet den Platz des längsten Buttons": *)
  206.    VAR
  207.       userfont : gd.TextFontPtr;
  208.    BEGIN
  209.       userfont := gl.OpenFont(screen^.font);
  210.       bevelwidth := userfont^.xSize * 44;
  211.       buttonwidth := (bevelwidth - XSTEP) DIV 2;
  212.       gl.CloseFont(userfont);
  213.    END ComputeWidths;
  214. (* **)
  215.  
  216.    PROCEDURE SetShortcutAndLabel (VAR nm : gtd.NewMenu;
  217.                                   localMsg : ADDRESS);
  218. (** "Für Menü Shortcut und Labeltext setzen" *)
  219.    BEGIN
  220.       WITH nm DO
  221.          commKey  := localMsg;
  222.          label    := localMsg + CAST(ADDRESS, 2);
  223.          IF CAST(StrPtr, localMsg)^[0] = " " THEN
  224.             commKey := NIL;
  225.          END;
  226.       END;
  227.    END SetShortcutAndLabel;
  228. (* **)
  229.  
  230. BEGIN
  231.    IF window # NIL THEN
  232.       (* Das Fenster ist bereist geöffnet! *)
  233.       RETURN;
  234.    END;
  235.  
  236.    (* Fenster soll auf dem Default(Workbench)-Screen erscheinen: *)
  237.    screen := il.LockPubScreen (NIL);
  238.    IF screen = NIL THEN
  239.       RETURN;
  240.    END;
  241.  
  242.    vi := gtl.GetVisualInfoA(screen, TAG(taglist, tagEnd));
  243.    IF vi = NIL THEN
  244.       il.UnlockPubScreen (NIL, screen);
  245.       RETURN;
  246.    END;
  247.  
  248. (** Menü-Stuff: *)
  249.    mynewmenu := el.AllocMem(MENUCOUNT*SIZE(gtd.NewMenu), ed.MemReqSet{ed.public,ed.memClear});
  250.    IF mynewmenu # NIL THEN
  251.       WITH mynewmenu^[0] DO
  252.          type        := gtd.nmTitle;
  253.          label       := ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_MENU, ADR(cxc.MSG_PROJECT_MENUSTR));
  254.          menuFlags   := BITSET{};
  255.       END;
  256.       WITH mynewmenu^[1] DO
  257.          type        := gtd.nmItem;
  258.          SetShortcutAndLabel (mynewmenu^[1], ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_ABOUT, ADR(cxc.MSG_PROJECT_ABOUTSTR)));
  259. (*         label       := ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_ABOUT, ADR(cxc.MSG_PROJECT_ABOUTSTR));
  260.          commKey     := ADR("?");*)
  261.       END;
  262.       WITH mynewmenu^[2] DO
  263.          type        := gtd.nmItem;
  264.          label       := gtd.nmBarlabel;
  265.       END;
  266.       WITH mynewmenu^[3] DO
  267.          type        := gtd.nmItem;
  268.          SetShortcutAndLabel (mynewmenu^[3], ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_HIDE, ADR(cxc.MSG_PROJECT_HIDESTR)));
  269. (*         label       := ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_HIDE, ADR(cxc.MSG_PROJECT_HIDESTR));
  270.          commKey     := ADR("H");*)
  271.       END;
  272.       WITH mynewmenu^[4] DO
  273.          type        := gtd.nmItem;
  274.          SetShortcutAndLabel (mynewmenu^[4], ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_QUIT, ADR(cxc.MSG_PROJECT_QUITSTR)));
  275. (*         label       := ll.GetCatalogStr(catalog, cxc.MSG_PROJECT_QUIT, ADR(cxc.MSG_PROJECT_QUITSTR));
  276.