(*---------------------------------------------------------------------------
    :Program.     PopMenu.def
    :Contents.	  Routinen, um ein simples Auswahlmenü beim Mauszeiger
    :Contents.	  erscheinen zu lassen.
    :Author.      Bernd Preusing (aus C übersetzt, angepaßt und verfeinert)
    :Address.	  Gerhardstr. 16  D-2200 Elmshorn
    :Phone.	  04121/22486
    :Copyright.	  Public Domain
    :Language.	  Modula-2
    :Translator.  M2Amiga V3.2e
    :Support.	  Helene (Lee) Taran (C-Programm Splines, Fish Disk #57)
    :History.	  V1.0 Preusing 26-Apr-89
    :Bugs.	  Nicht für GimmeZeroZero-Windows!
    :Remark.      Great, Helene!
    :Remark.	  Das Original macht LockLayers auf irgendwas, nur nicht auf
    :Remark.	  die betroffenen Layer, dies ist korrigiert.
---------------------------------------------------------------------------*)
DEFINITION MODULE PopMenu;

FROM SYSTEM	IMPORT	ADDRESS;
FROM Graphics	IMPORT	RastPort, ClipRect, BitMap;
FROM Exec	IMPORT	Byte;
FROM Intuition	IMPORT	WindowPtr;

CONST
    FONTHEIGHT = 8; (* uses topaz.8 *)
    FONTWIDTH  = 8;
    FONTBASELINE = 6;

    NOITEMSELECTED = 0; (* returned from PopUp if no item was selected *)
    OUTSIDEWINDOW = -1; (* returned from PopUp if cursor outside of window *)

TYPE

    PopUpItemPtr = POINTER TO PopUpItem;
    PopUpItem = RECORD
		  text: ADDRESS; (* text string to be displayed *)
		  selectionId,	 (* id returned when this item is selected *)
		  left,
		  top,		 (* top/left offset within menu *)
		  height,
		  width: INTEGER;(* desired height/width of selection box *)
		  color: Byte;	 (* desired text color (=color register) *)
		  next: PopUpItemPtr (* link to next menu item *)
		END;
    PopUpMenu = RECORD
		  depth,		(* # of bitplanes to use *)
		  left,			(* used internally *)
		  top,
		  height,
		  width: INTEGER;	(* desired width of menu *)
		  deactivate: CARDINAL;	(* what MOUSEBUTTON deactivates menu *)
		  outlineColor,
		  areaColor: Byte;	(* color registers *)
		  cr: ClipRect;		(* clipping rectangle for display *)
		  rp: RastPort;		(* rastport for drawing into menu area*)
		  bitmap: BitMap;	(* actual bitmap for rendering menu *)
		  firstItem,		(* first in list of menu items *)
		  activeItem: PopUpItemPtr (* for internal use only! *)
		END;



PROCEDURE StructPopUp(VAR Menu:PopUpMenu;
		      Depth:INTEGER;
		      oCol,
		      aCol:Byte);
(* :Input.	Menu:   die zu initialisierende Struktur
   :Input.	Depth:  die Tiefe des Screens, auf dem das Menü
   :Input.		erscheinen soll
   :Input.	oCol:   die Farbe der Umrahmung des Menüs
   :Input.	aCol:   die Hintergrundfarbe des Menüs
   :Semantic.	Die Menü-Struktur wird mit den gegebenen Werten
   :Semantic.	initialisiert. Alle anderen Werte werden mit
   :Semantic.	0 bzw. NIL vorbelegt.
   :Semantic.	Menu.deactivate wird auf selectUp gesetzt, d.h.
   :Semantic.	das Menü kann so nur mit der LINKEN Maustaste
   :Semantic.	aufgerufen werden. Falls man die rechte Maustaste
   :Semantic.	dafür benutzen möchte, muß deactivate auf menuUp
   :Semantic.	geändert werden und in die window.flags muß
   :Semantic.	rmbTrap.
*)

PROCEDURE AddItem(VAR Menu:PopUpMenu;
		  VAR Item:PopUpItem;
		  Mtext:ADDRESS;
		  Id:INTEGER;
		  Color:Byte);
(* :Input.	Menu: um das es hier geht
   :Input.	Item: die PopUpItem-Struktur, die angehängt werden soll
   :Input.	MText: die Adresse des Item-Textes
   :Input.	Id: eine einmalige Nummer, die später von PopUp
   :Input.	    zurückgeliefert wird. Sollte >0 sein.
   :Input.	Color: die Farbe des Textes
   :Semantic.	Das Item wird initialisiert und an des Menü an-
   :Semantic.	gehängt. Item.left wird auf 3, Item.top auf 1
   :Semantic.	gesetzt; diese Werte garantieren einen 'sauberen'
   :Semantic.	Menü-Aufbau, sie können aber für spezielle Effekte
   :Semantic.	oder z.B. zur Zentrierung des Textes noch erhöht
   :Semantic.	werden.
*)

PROCEDURE InitPopUp(VAR Menu:PopUpMenu);
(* :Input.	Menu: eben das
   :Semantic.	Das Menü wird nun, nachdem alle Items angehängt
   :Semantic.	sind, komplett strukturiert, ein RastPort wird
   :Semantic.	aufgebaut und die Items und der Rahmen gezeichnet.
   :Semantic.	Danach kann es durch PopUp benutzt werden.
*)

PROCEDURE PopUp(VAR Menu:PopUpMenu;
		window:WindowPtr):INTEGER;
(* :Input.	Menu: das darzustellende Manü
   :Input.	window: das Fenster, in dem es gezeigt werden soll
   :Output.	die Id des ausgewählten Items oder NOITEMSELECTED
   :Output.	oder OUTSIDEWINDOW
   :Semantic.	Das Menü wird gezeigt, der Anwender kann mit der
   :Semantic.	Maus auswählen und dann die entsprechende Maustaste
   :Semantic.	wieder loslassen (normalerweise die linke, sonst
   :Semantic.	Menu.deactivate ändern!) woraufhin das Menü wieder
   :Semantic.	verschwindet und das id des gewählten Items
   :Semantic.	zurückgeliefert wird.
   :Note.	Das Menü wird im RastPort des Screen gezeigt, deshalb
   :Note.	muß vom Programmierer darauf geachtet werden, daß
   :Note.	es nicht größer als der Screen wird! Während der
   :Note.	Darstellung sind alle Layer blockiert.
*)

PROCEDURE DisposePopUp(VAR Menu:PopUpMenu);
(* :Input.	Menu: das freizugebende Menü
   :Semantic.	Der für das Menü durch InitPopUp belegte Speicher
   :Semantic.	(BitPlanes) wird wieder freigegeben.
*)

END PopMenu.def
