(* ------------------------------------------------------------------------
   :Program.      xIntui.
   :Contents.     Hilfsproceduren zum Umgang mit Intuition.
   :Author.       Klaus Hlawaty.
   :Address.      Waldhof
   :Address.      3579 Schrecksbach
   :History.      v1.0 - 20.Nov.91
   :Copyright.    PD.
   :Language.     Oberon.
   :Translator.   OBERON v2.13 / OLink v2.13d
   :Imports.      Speed.
------------------------------------------------------------------------ *)
MODULE xIntui;

IMPORT
      e : Exec,
      g : Graphics,
      i : Intuition,
     ng : Requests,
          NoGuruRq,
          Speed,
    str : Strings,
      s : SYSTEM;

(* ======================================================================= *)
(* ========================== Proceduren ================================= *)
(* ======================================================================= *)

(* $CopyArrays- *)
PROCEDURE StrToPtr*(Text : ARRAY OF CHAR) : e.STRPTR;
(* ------------------------------------------------------------------------
   :Input.     Text  : String.
   :Output.    RETURN: Zeiger auf den Speicherbereich des STRPTR's.
   :Semantic.  Legt einen String im Speicher ab.
   :Remark.    verhindert doppelte Speicherfreigabe ???
------------------------------------------------------------------------ *)
VAR
    Str   : e.STRPTR;

BEGIN
  NEW(Str); (* := New(s.SIZE(e.STRING),e.any);*)
    ng.Assert(Str # NIL, "StrToPtr: Kein RAM für den Text");
    Speed.Fill(0,s.SIZE(Str^),Str^,Speed.Byte);
    Speed.StrCopy(Text,Str^);
  RETURN Str;
END StrToPtr;

(* $CopyArrays- *)
PROCEDURE TextToIntui*(Text     : ARRAY OF CHAR;
                       MenuText : BOOLEAN) : i.IntuiTextPtr;
(* ------------------------------------------------------------------------
  :Input.     Text     : String der in IntuiText gespeichert werden soll.
  :Input.     MenuText : FALSE = Normaler Text / TRUE = Menu-Text.
  :Output.    RETURN   : Zeiger auf die IntuiTextStructur.
  :Semantic.  Erzeugt IntuiTextStructur.
------------------------------------------------------------------------ *)
VAR
    Intui : i.IntuiTextPtr;

BEGIN
  NEW(Intui); (* := New(s.SIZE(i.IntuiText),e.any);*)
  ng.Assert(Intui # NIL, "TextToIntui: Kein RAM für IntuiTexT");
  IF(MenuText)THEN
    Intui.frontPen  := 0   ;
    Intui.backPen   := 1   ;
  ELSE
    Intui.frontPen  := 1   ;
    Intui.backPen   := 0   ;
  END (* IF MenuText *);
  Intui.drawMode  := g.jam1;
  Intui.leftEdge  := 0   ;
  Intui.topEdge   := 0   ;
  Intui.iTextFont := NIL ;
  Intui.iText     := StrToPtr(Text) ;
  Intui.nextText  := NIL ;
 RETURN Intui;
END TextToIntui;

(* $CopyArrays- *)
PROCEDURE FillMenu* (Menu     : i.MenuPtr;
                     Text     : ARRAY OF CHAR;
                     leftEdge,
                     width    : INTEGER
                     );
(* ------------------------------------------------------------------------
   :Input.     Menu     : Zeiger auf 'leere' Menu-Structur.
   :Input.     Text     : Text des Menüs.
   :Input.     leftEdge : Begin des Menües.
   :Input.     width    : Breite des Menües.
   :Output.    Menu     : Zeiger auf ausgefülltes Menu.
   :Semantic.  Füllt die Menü-Structur
   :Remark.    Wird sowohl von AddMenu als auch von InitMenu benutzt.
   :Remark.    Das Menu von InitMenu ist jedoch erweitert.
------------------------------------------------------------------------ *)
BEGIN
    Menu^.nextMenu  := NIL;
    Menu^.leftEdge  := leftEdge;
    Menu^.topEdge   := 0;                       (* Not used ? *)
    Menu^.width     := width;
    Menu^.height    := 0;                       (* Not used ? *)
    Menu^.flags     := {i.menuEnabled};         (* ? *)
    Menu^.menuName  := StrToPtr(Text);
    Menu^.firstItem := NIL;
END FillMenu;

(* $CopyArrays- *)
PROCEDURE FillItem*(item      : i.MenuItemPtr;
                    Text      : ARRAY OF CHAR;
                    leftEdge,
                    topEdge,
                    width,
                    height    : INTEGER;
                    Flags     : SET;
                    MutualEx  : LONGSET;
                    Command   : CHAR);
(* ------------------------------------------------------------------------
  :Input.     item     : Itemadresse wird übereicht.
  :Input.     Text     : Text des Menü-Items.
  :Input.     leftEdge : Begin des Menü-Items links.
  :Input.     topEdge  : Begin des Menü-Items oben.
  :Input.     width    : Breite des Menü-Items.
  :Input.     height   : Tiefe des Menü-Items.
  :Input.     Flags    : Item-Flags.
  :Input.     MutualEx : MutualExclude-Bits.
  :Input.     Command  : ShortCut.
  :Input.     Kennung  : Kennung # 0.
  :Output.    item     : Das Item wird gefüllt.
  :Semantic.  Füllt Item-Structur.
------------------------------------------------------------------------ *)
BEGIN
    item.nextItem      := NIL;
    item.leftEdge      := leftEdge;
    item.topEdge       := topEdge;
    item.width         := width;
    item.height        := height;
    INCL(Flags,i.itemText);         (* Behandle nur TextItems *)
    IF(Command # "\o")THEN
      INCL(Flags,i.commSeq);
    END (* IF *);
    item.flags         := Flags;
    item.mutualExclude := MutualEx;
    item.itemFill      := TextToIntui(Text,TRUE);
    item.selectFill    := NIL;
    item.command       := Command;
    item.subItem       := NIL;
END FillItem;

PROCEDURE decodeMenu*(    code  : INTEGER;
                      VAR Menu,
                          Item,
                          SubI  : INTEGER);
(* ------------------------------------------------------------------------
  :Input.     code     : aus IntuiMessage.
  :Output.    Menu     : Nummer des Menü's    [0 .. n].
  :Output.    Item     : Nummer des Item's    [0 .. n].
  :Output.    SubI     : Nummer des SubItem's [0 .. n].
  :Semantic.  Decodiert den code der IntuiMessage für Menü's.
------------------------------------------------------------------------ *)
BEGIN
   Menu := i.MenuNum(code);
   Item := i.ItemNum(code);
   SubI := i.SubNum(code);
END decodeMenu;

END xIntui.

