	IFND	INTUITION_SGHOOKS_I
INTUITION_SGHOOKS_I	EQU	1
**
** $Filename: intuition/sghooks.i $
** $Release: 2.04 Includes, V37.4 $
** $Revision: 36.5 $
** $Date: 91/11/08 $
**
**  String gadget extensions and hooks
**
**  (C) Copyright 1988-1991 Commodore-Amiga, Inc.
**	    All Rights Reserved
**

	IFND	EXEC_TYPES_I
	INCLUDE	"exec/types.i"
	ENDC

	STRUCTURE	StringExtend,0
	; display specifications
	APTR	sex_Font	; must be an open Font (not TextAttr)
	STRUCT	sex_Pens,2	; color of text/background
	STRUCT	sex_ActivePens,2 ; colors when gadget is active

	; edit specifications
	ULONG	sex_InitialModes ; initial mode flags, below
	APTR	sex_EditHook	; if non-NULL, must supply WorkBuffer
	APTR	sex_WorkBuffer	; must be as large as StringInfo.Buffer

	STRUCT	sex_Reserved,16	; set to 0
	LABEL	sex_SIZEOF


	STRUCTURE	SGWork,0
	; set up when gadget is first activated
	APTR	sgw_Gadget	; the contestant itself
	APTR	sgw_StringInfo	; easy access to sinfo
	APTR	sgw_WorkBuffer	; intuition's planned result
	APTR	sgw_PrevBuffer	; what was there before
	ULONG	sgw_Modes	; current mode

	; modified for each input event
	APTR	sgw_IEvent	; actual event: do not change
	UWORD	sgw_Code	; character code, if one byte
	WORD	sgw_BufferPos	; cursor position
	WORD	sgw_NumChars
	ULONG	sgw_Actions	; what Intuition will do
	LONG	sgw_LongInt	; temp storage for longint

	APTR	sgw_GadgetInfo	; see cghooks.h
	UWORD	sgw_EditOp	; from constants below
	LABEL	sgw_SIZEOF	; this may change as the structure is extended


* SGWork.EditOp -
* These values indicate what basic type of operation the global
* editing hook has performed on the string before your gadget's custom
* editing hook gets called.  You do not have to be concerned with the
* value your custom hook leaves in the sgw_EditOp field, only if you
* write a global editing hook.
*
* For most of these general edit operations, you'll want to compare
* the BufferPos and NumChars of the StringInfo (before global editing)
* and SGWork (after global editing).

EO_NOOP	EQU	($0001)
	; did nothing
EO_DELBACKWARD	EQU	($0002)
	; deleted some chars (maybe 0).
EO_DELFORWARD	EQU	($0003)
	; deleted some characters under and in front of the cursor
EO_MOVECURSOR	EQU	($0004)
	; moved the cursor
EO_ENTER	EQU	($0005)
	; "enter" or "return" key, terminate
EO_RESET	EQU	($0006)
	; current Intuition-style undo	
EO_REPLACECHAR	EQU	($0007)
	; replaced one character and (maybe) advanced cursor
EO_INSERTCHAR	EQU	($0008)
	; inserted one char into string or added one at end
EO_BADFORMAT	EQU	($0009)
	; didn't like the text data, e.g., Bad LONGINT
EO_BIGCHANGE	EQU	($000A)	; unused by Intuition
	; complete or major change to the text, e.g. new string
EO_UNDO	EQU	($000B)	; unused by Intuition
	; some other style of undo
EO_CLEAR	EQU	($000C)
	; clear the string
EO_SPECIAL	EQU	($000D)	; unused by Intuition
	; some operation that doesn't fit into the categories here


; Mode Flags definitions (ONLY first group allowed as InitialModes)

SGM_REPLACE	EQU	1
SGMB_REPLACE	EQU	0
SGMF_REPLACE	EQU	1
; please initialize StringInfo with in-range value of BufferPos 
; if you are using SGM_REPLACE mode.

; fixed length buffer, always set SGM_REPLACE, too.
SGM_FIXEDFIELD	EQU	$00000002
SGMB_FIXEDFIELD	EQU	1
SGMF_FIXEDFIELD	EQU	2

; don't filter control chars
SGM_NOFILTER	EQU	$00000004
SGMB_NOFILTER	EQU	2
SGMF_NOFILTER	EQU	4

; SGM_EXITHELP is new for V37, and ignored by V36:
; exit with code = 0x5F if HELP hit
SGM_EXITHELP	EQU	$00000080
SGMB_EXITHELP	EQU	7
SGMF_EXITHELP	EQU	$80


; String Gadget Action Flags (put in SGWork.Actions by EditHook)
SGA_USE	EQU	$1		; use contents of SGWork
SGAB_USE	EQU	0
SGAF_USE	EQU	$1

SGA_END	EQU	$2		; terminate gadget, code in Code field
SGAB_END	EQU	1
SGAF_END	EQU	$2

SGA_BEEP	EQU	$4		; flash the screen for the user
SGAB_BEEP	EQU	2
SGAF_BEEP	EQU	$4

SGA_REUSE	EQU	$8		; reuse input event
SGAB_REUSE	EQU	3
SGAF_REUSE	EQU	$8

SGA_REDISPLAY	EQU	$10		; gadget visuals changed
SGAB_REDISPLAY	EQU	4
SGAF_REDISPLAY	EQU	$10

; New for V37:
SGA_NEXTACTIVE	EQU	$20		; Make next possible gadget active.
SGAB_NEXTACTIVE	EQU	5
SGAF_NEXTACTIVE	EQU	$20

; New for V37:
SGA_PREVACTIVE	EQU	$40		; Make previous possible gadget active.
SGAB_PREVACTIVE	EQU	6
SGAF_PREVACTIVE	EQU	$40


; function id for only existing custom string gadget edit hook
SGH_KEY	EQU	1	; process editing keystroke
SGH_CLICK	EQU	2	; process mouse click cursor position

* Here's a brief summary of how the custom string gadget edit hook works:
*	You provide a hook in StringInfo.Extension.EditHook.
*	The hook is called in the standard way with the 'object'
*	a pointer to SGWork, and the 'message' a pointer to a command
*	block, starting either with (longword) SGH_KEY, SGH_CLICK,
*	or something new.
*
*	You return 0 if you don't understand the command (SGH_KEY is
*	required and assumed).	Return non-zero if you implement the
*	command.
*
*   SGH_KEY:
*	There are no parameters following the command longword.
*
*	Intuition will put its idea of proper values in the SGWork
*	before calling you, and if you leave SGA_USE set in the
*	SGWork.Actions field, Intuition will use the values
*	found in SGWork fields WorkBuffer, NumChars, BufferPos,
*	and LongInt, copying the WorkBuffer back to the StringInfo
*	Buffer.
*
*	NOTE WELL: You may NOT change other SGWork fields.
*
*	If you clear SGA_USE, the string gadget will be unchanged.
*
*	If you set SGA_END, Intuition will terminate the activation
*	of the string gadget.  If you also set SGA_REUSE, Intuition
*	will reuse the input event after it deactivates your gadget.
*
*	In this case, Intuition will put the value found in SGWork.Code
*	into the IntuiMessage.Code field of the IDCMP_GADGETUP message it
*	sends to the application.
*
*	If you set SGA_BEEP, Intuition will call DisplayBeep(); use
*	this if the user has typed in error, or buffer is full.
*
*	Set SGA_REDISPLAY if the changes to the gadget warrant a
*	gadget redisplay.  Note: cursor movement requires a redisplay.
*
*	Starting in V37, you may set SGA_PREVACTIVE or SGA_NEXTACTIVE
*	when you set SGA_END.  This tells Intuition that you want
*	the next or previous gadget with GFLG_TABCYCLE to be activated.
*
*   SGH_CLICK:
*	This hook command is called when Intuition wants to position
*	the cursor in response to a mouse click in the string gadget.
*
*	Again, here are no parameters following the command longword.
*
*	This time, Intuition has already calculated the mouse position
*	character cell and put it in SGWork.BufferPos.	The previous
*	BufferPos value remains in the SGWork.StringInfo.BufferPos.
*
*	Intuition will again use the SGWork fields listed above for
*	SGH_KEY.  One restriction is that you are NOT allowed to set
*	SGA_END or SGA_REUSE for this command.	Intuition will not
*	stand for a gadget which goes inactive when you click in it.
*
*	You should always leave the SGA_REDISPLAY flag set, since Intuition
*	uses this processing when activating a string gadget.

	ENDC
