(*
                     IntuiSup library interface

              Para usar con Modula-2 Software Construction Set                
   -----------------------------------------------------------------------

	por:   Mauricio Hunt R.
               Apt 856 - 2150, Moravia,
               San Jose, Costa Rica
               Central America

   -----------------------------------------------------------------------

        Intuisup library por:

	Torsten Jürgeleit
	Am Sandberg 4
	W-5270 Gummersbach
	Germany

   Gracias Torsten !
*)

DEFINITION MODULE IntuiSupInterface;

FROM SYSTEM    IMPORT ADDRESS, LONGWORD, BYTE;
FROM Intuition IMPORT IDCMPFlags, IDCMPFlagsSet, ImagePtr, ScreenPtr, 
                  WindowPtr, NewWindow, MenuPtr, MenuItemPtr, IntuiMessagePtr,
                  GadgetPtr;
FROM Text      IMPORT TextAttrPtr, TextFontPtr;
FROM DiskFont  IMPORT AvailFontsHeaderPtr;
FROM Lists     IMPORT ListPtr;
FROM Ports     IMPORT MsgPortPtr;
FROM Libraries IMPORT LibraryPtr;

CONST
  Version  = 4;
  Revision = 0;
  Priority = 0;

  LibName = "intuisup.library";
  LibID   = "Intuition Support library v3.1 by Torsten Jürgeleit";

  IntuiSupName     = LibName;
  IntuiSupVersion  = Version;
  IntuiSupRevision = Revision;
  IntuiSupPriority = Priority;

VAR
  IntuiSupBase:LibraryPtr;

CONST

  (*
    para Render.
  *)

  (* usar esquina sup izq de ventana interna como (0,0) *)
  RenderInfoFlagInnerWindow  = 1;

  (* llenar el fondo de la ventana con otro color *)
  RenderInfoFlagBackFill = 2;

  (* buscar fonts disponibles y usar esto para IAskfont/IOpenfont *)
  RenderInfoFlagAvailFonts = 4;

  IntuiSupDataEnd = 0; (* marca el fin del arreglo de datos *)

  (*
    flags para open window
  *)

  (* centrar la ventana en la pantalla *)
  OpenWindowFlagCenterWindow = 1;

  (* usar los pens para render detail y backfill *)
  OpenWindowFlagRenderPens   = 2;

  (*
    flags para clear window
  *)


  (* no cambiar modo de dibujo *)
  ClearWindowFlagCustomDrawMode = 1;

  (* no cambiar el color de fondo *)
  ClearWindowFlagCustomColor = 2;

  (* usar el color background normal *)
  ClearWindowFlagNormalColor = 4;

  (* usar standard raster para el bacground de la ventana *)
  ClearWindowFlagUseRaster   = 8;

  (* no sume el offset del borde de la ventana a la posicion sup.izq dada *)
  ClearWindowFlagAbsolutePos = 16;

  (* usar el color 1 para el texto *)
  ClearWindowFlagText1Color  = 32;

  (* usar el color 2 para el texto *)
  ClearWindowFlagText2Color  = 64;

  (*
    para texto.
  *)

  TextDataTypeText           = 1;
  TextDataTypeNumUnsignedDec = 2;
  TextDataTypeNumSignedDec   = 3;
  TextDataTypeNumHex         = 4;
  TextDataTypeNumBin         = 5;

  TextDataFlagBold          = 1;
  TextDataFlagItalic        = 2;
  TextDataFlagUnderLined    = 4;
  TextDataFlagAbsolutePos   = 8;   (* se da la posicion absoluta no offsets *)
  TextDataFlagCenter        = 16;  (* centrar el texto en la ventana *)
  TextDataFlagPlaceLeft     = 32;  (* hacia la izquierda, segun esquina *)
  TextDataFlagColor2        = 64;  (* usar 2do pen *)
  TextDataFlagComplement    = 128; (* complementar pens *)
  TextDataFlagBackFill      = 256; (* usar Jam2 *)
  TextDataFlagNoPrint       = 512; (* no imprimir texto, solo calcular ancho *)
  TextDataFlagNumIdentifier = 1024;(* convertir el numero con identificadores de ensamblador*)
  TextDataFlagNumCStyle     = 2048;(* usar identificadores de C '0x' para numero hexadecimales *)
  TextDataFlagNumLeadingZeroes = 4096; (* convertir numeros con ceros al inicio *)
  TextDataFlagNumUpperCase = 8192;  (* usar mayuscula para caracteres hexadecimales *)

  ConvertFlagIdentifier    = 1; (* convertir el numero con identificadores de ensamblador*)
  ConvertFlagCStyle        = 2; (* usar identificadores de C '0x' para numero hexadecimales *)
  ConvertFlagLeadingZeroes = 4; (* convertir numeros con ceros al inicio *)
  ConvertFlagUpperCase     = 8; (* usar mayuscula para caracteres hexadecimales *)

TYPE
  TextDataPtr = POINTER TO TextData;

  TextData = RECORD
               tdType     : CARDINAL;
               tdFlags    : CARDINAL;
               tdLeftEdge : INTEGER;
               tdTopEdge  : INTEGER;
               tdText     : ADDRESS;
               tdTextAttr : TextAttrPtr;
             END;

  (*
    los bordes.
  *)

CONST
  BorderDataTypeBox1Out = 1;
  BorderDataTypeBox1In  = 2;
  BorderDataTypeBox2Out = 3;
  BorderDataTypeBox2In  = 4;

TYPE
  BorderDataPtr = POINTER TO BorderData;

  BorderData = RECORD
                 bdType     : CARDINAL;
                 bdLeftEdge : INTEGER;
                 bdTopEdge  : INTEGER;
                 bdWidth    : CARDINAL;
                 bdHeight   : CARDINAL
               END;

  (*
    los gadgets.
  *)

TYPE
  ID = LONGCARD;

CONST
  H = 16777216D; (* x << 24 *)
  M = 65536D;    (* x << 16 *)
  L = 256D;      (* x << 8  *)

  ISupID = ID('I')*H + ID('S')*M + ID('U')*L + ID('P');

  GadgetDataTypeButton   = 1;  (* button gadget *)
  GadgetDataTypeCheck    = 2;  (* checkmark gadget *)
  GadgetDataTypeMx       = 3;  (* mutual exclude gadget *)
  GadgetDataTypeString   = 4;  (* string input gadget *)
  GadgetDataTypeInteger  = 5;  (* integer input gadget *)
  GadgetDataTypeSlider   = 6;  (* slider gadget *)
  GadgetDataTypeScroller = 7;  (* scroller gadget *)
  GadgetDataTypeCycle    = 8;  (* cycle gadget *)
  GadgetDataTypeCount    = 9;  (* count gadget *)
  GadgetDataTypeListView = 10; (* list view gadget *)
  GadgetDataTypePalette  = 11; (* palette gadget *)

  GadgetDataFlagDisabled             = 1D;
  GadgetDataFlagNoBorder             = 2D;
  GadgetDataFlagHighComp             = 4D;
  GadgetDataFlagOrientationVert      = 8D;
  GadgetDataFlagHotKey               = 16D;
  GadgetDataFlagNoTextOutput         = 32D;
  GadgetDataFlagTextLeft             = 64D;
  GadgetDataFlagTextRight            = 128D;
  GadgetDataFlagTextAbove            = 256D;
  GadgetDataFlagTextBelow            = 512D;
  GadgetDataFlagTextColor2           = 1024D;
  GadgetDataFlagButtonToggle         = 2048D;
  GadgetDataFlagButtonImage          = 4096D;
  GadgetDataFlagInputAutoActive      = 8192D;
  GadgetDataFlagStringUnsignedDec    = 16384D;
  GadgetDataFlagStringSignedDec      = 32768D;
  GadgetDataFlagStringHex            = 65536D;
  GadgetDataFlagStringBin            = 131072D;
  GadgetDataFlagScrollerNoArrows     = 262144D;
  GadgetDataFlagCountSignedDec       = 524288D;
  GadgetDataFlagListViewReadOnly     = 1048576D;
  GadgetDataFlagListViewShowSelected = 2097152D;
  GadgetDataFlagPaletteNoIndicator   = 4194304D;
  GadgetDataFlagPaletteIndicatorTop  = 8388607D;
  GadgetDataFlagMovePointer          = 16777216D;
  GadgetDataFlagNoClear              = 33554432D;

  GadgetIDCMPFlagsButton   = IDCMPFlagsSet{GadgetUp,VanillaKey};
  GadgetIDCMPFlagsCheck    = IDCMPFlagsSet{GadgetDown,VanillaKey};
  GadgetIDCMPFlagsMx       = IDCMPFlagsSet{GadgetDown,VanillaKey};
  GadgetIDCMPFlagsString   = IDCMPFlagsSet{GadgetUp,VanillaKey};
  GadgetIDCMPFlagsInteger  = IDCMPFlagsSet{GadgetUp,VanillaKey};
  GadgetIDCMPFlagsSlider   = IDCMPFlagsSet{GadgetUp,MouseMove,VanillaKey};
  GadgetIDCMPFlagsScroller = IDCMPFlagsSet{GadgetDown,GadgetUp,MouseMove,
                                           IntuiTicks,VanillaKey};
  GadgetIDCMPFlagsCycle    = IDCMPFlagsSet{GadgetUp,VanillaKey};
  GadgetIDCMPFlagsCount    = IDCMPFlagsSet{GadgetDown, GadgetUp, MouseMove,
                                           VanillaKey};
  GadgetIDCMPFlagsListView = IDCMPFlagsSet{GadgetDown, GadgetUp, MouseMove,
                                           IntuiTicks,VanillaKey};
  GadgetIDCMPFlagsPalette  = IDCMPFlagsSet{GadgetUp,VanillaKey};
  GadgetIDCMPFlagsAll      = IDCMPFlagsSet{GadgetDown, GadgetUp, MouseMove,
                                           IntuiTicks, VanillaKey};

  (* se usa en SetGadgetAtributtes *)
  UseCurrentValue = 2147483648D; (* 1L << 31 *)

TYPE
  DADDRESS = POINTER TO ADDRESS;

  GadgetDataPtr = POINTER TO GadgetData;

  GadgetData = RECORD
                  gdType     : LONGCARD;
                  gdFlags    : LONGCARD;
                  gdLeftEdge : CARDINAL;
                  gdTopEdge  : CARDINAL;
                  gdWidth    : CARDINAL;
                  gdHeight   : CARDINAL;
                  gdText     : ADDRESS;
                  gdTextAttr : TextAttrPtr;

                  CASE :CARDINAL OF
                    1 : gdData:RECORD
                                 gdData1 : LONGINT;
                                 gdData2 : LONGINT;
                                 gdData3 : ADDRESS
                               END |
                    2: gdButtonData : RECORD
                                        gdButtonSelected     : LONGCARD;
                                        gdButtonNormalRender : ImagePtr;
                                        gdButtonSelectRender : ImagePtr
                                      END |
                    3: gdCheckData : RECORD
                                       gdCheckSelected : LONGCARD;
                                       gdCheckPad1     : LONGCARD;
                                       gdCheckPad2     : LONGCARD
                                     END |
                    4: gdMXData : RECORD
                                    gdMXSpacing     : LONGCARD;
                                    gdMXActiveEntry : LONGCARD;
                                    gdMXTextArray   : DADDRESS
                                  END |
                    5: gdInputData : RECORD
                                       gdInputLen          : LONGCARD;
                                       gdInputActiveNext   : CARDINAL;
                                       gdInputActivatePrev : CARDINAL;
                                       gdInputDefault      : LONGWORD;
                                     END |
                    6: gdSliderData : RECORD
                                        gdSliderMin   : LONGINT;
                                        gdSliderMax   : LONGINT;
                                        gdSliderLevel : LONGINT
                                      END |
                    7: gdScrollerData : RECORD
                                          gdScrollerVisible : LONGCARD;
                                          gdScrollerTotal   : LONGCARD;
                                          gdScrollerTop     : LONGCARD
                                        END |
                    8: gdCycleData : RECORD
                                       gdCycleSpacing   : LONGCARD;
                                       gdCycleActive    : LONGCARD;
                                       gdCycleTextArray : DADDRESS
                                     END |
                    9: gdCountData : RECORD
                                       gdCountMin   : LONGCARD;
                                       gdCountMax   : LONGCARD;
                                       gdCountValue : LONGCARD
                                     END |
                    10: gdListViewData : RECORD
                                           gdListViewSpacing : LONGCARD;
                                           gdListViewTop     : LONGCARD;
                                           gdListViewList    : ListPtr
                                         END |
                    11: gdPaletteData : RECORD
                                          gdPaletteDepth       : LONGCARD;
                                          gdPaletteColorOffset : LONGCARD;
                                          gdPaletteActiveColor : LONGCARD
                                        END
                  END (* case *)
                END;

  (*
    para auto request
  *)

CONST
  AutoReqFlagBackFill       = 1;
  AutoReqFlagRenderPens     = 2;
  AutoReqFlagTextCenter     = 4;
  AutoReqFlagTextColor2     = 8;
  AutoReqFlagHotKey         = 16;
  AutoReqFlagBeep           = 32;
  AutoReqFlagMovePointerPos = 64;
  AutoReqFlagMovePointerNeg = 128;
  AutoReqFlagDrawRaster     = 256; (* dibujar raster alrededor de area de texro *)

  (*
    para requester.
  *)

  ReqDataFlagBackFill    = 1;
  ReqDataFlagRenderPens  = 2;
  ReqDataFlagInnerWindow = 4;
  ReqDataFlagAvailFonts  = 8;
  ReqDataFlagCenter      = 16;
  ReqDataFlagDragGadget  = 32;
  ReqDataFlagDepthGadget = 64;
  ReqDataFlagDrawRaster  = 128; (* dibujar raster alrededor de area de texto *)

TYPE
  RequesterDataPtr = POINTER TO RequesterData;

  RequesterData = RECORD
                    rdLeftEdge: INTEGER;
                    rdTopEdge : INTEGER;
                    rdWidth   : INTEGER;
                    rdHeight  : INTEGER;
                    rdFlags   : LONGCARD;
                    rdTitle   : ADDRESS;
                    rdTexts   : TextDataPtr;
                    rdBorders : BorderDataPtr;
                    rdGadgets : GadgetDataPtr
                  END;
  (*
    los menues.
  *)

CONST
  MenuDataTypeTitle   = 1;
  MenuDataTypeItem    = 2;
  MenuDataTypeSubItem = 3;

  MenuDataFlagDisabled   = 1;
  MenuDataFlagAtributte  = 2;
  MenuDataFlagSelected   = 4;
  MenuDataFlagEmptyLine  = 8;
  MenuDataFlagHighNone   = 16;
  MenuDataFlagHighBox    = 32;
  MenuDataFlagTextColor2 = 64;

TYPE
  MenuDataPtr = POINTER TO MenuData;

  MenuData = RECORD
               mdType          : CARDINAL;
               mdFlags         : CARDINAL;
               mdName          : ADDRESS;
               mdCommandKey    : ADDRESS;
               mdMutualExclude : LONGCARD
             END;

  (*
    para Text file.
  *)

CONST
  TextFileFlagTrimLine         = 1;
  TextFileFlagSkipComments     = 2;
  TextFileFlagSkipEmptyLines   = 4;
  TextFileFlagLineContinuation = 8;

  TextFileStatusNormal = 0;
  TextFileStatusEOF    = 1;

  TextFileErrorNoFileData  = -1;
  TextFileErrorLineTooLong = -2;
  TextFileErrorNoComment   = -3;
  TextFileErrorReadFailed  = -4;

TYPE
  FileDataPtr = POINTER TO FileData;

  FileData = RECORD
               fdLine    :ADDRESS;
               fdLineLen : INTEGER;
               fdLineNum : INTEGER
             END;

  (*
     mouse pointer.
  *)

  PointerDataPtr = POINTER TO PointerData;

  PointerData = RECORD
                  pdWidth   : BYTE;
                  pdHeight  : BYTE;
                  pdXOffset : BYTE;
                  pdYOffset : BYTE;
                  pdData    : POINTER TO WORD
                END;

PROCEDURE IGetRenderInfo(screen : ScreenPtr; flags : CARDINAL):ADDRESS;

(*
  screen - puntero a la pantalla donde el objeto ISUP se debe desplegar o
           NIL para usar la pantalla del Workbench.

  flags  - RenderInfoFlag...

  Retorna un puntero a una estructura de datos interna con alguna informa-
  cion visual necesaria para la creacion de los objectos ISUP. Use este
  MISMO puntero (solo una llamada de IGetRenderInfo para todos los objetos
  ISUP desplegados en la misma pantalla) como parametro a las funciones ISUP.
  Esta estructura de datos debe ser liberada con la funcion IFreeRenderInfo
  ANTES de cerrar la libreria.

*)

PROCEDURE IFreeRenderInfo(ri:ADDRESS);

(*
  ri - puntero a una estructura de datos interna retornada por IGetRenderInfo

  Libera la memoria reservada por IGetRenderInfo para la estructura de datos
  interna.

*)

PROCEDURE IOpenWindow(ri:ADDRESS; nw:NewWindow; flags:CARDINAL):WindowPtr;

(*

  ri - puntero a una estructura de datos interna retornada por IGetRenderInfo

  nw - puntero a la estructura ya inicializada NewWindow.

  flags - OpenWindowFlag...

  Manipula la estructura NewWindow de acuerdo a las banderas (flags) dadas
  y abre la ventana. Retorna el puntero a la ventana abierta o NIL si no se
  pudo.

*)

PROCEDURE IClearRenderWindow(ri:ADDRESS; win:WindowPtr; 
                             leftedge, topedge, width, height,
                             flags:LONGCARD);

(*
  ri - puntero a una estructura de datos interna retornada por IGetRenderInfo

  win - puntero a la ventana abierta por IOpenWindow.

  leftedge, topedge, width, height - dimensiones y posicion del area a limpiar

  flags - ClearWindowFlag...

  Limpia el area de la ventana dada de acuerdo a la informacion visual (ri).
  El area sera recortada (clipped) a las dimensiones de la ventana si es
  necesario.
*)

PROCEDURE ICloseWindow(win:WindowPtr; morewindows:BOOLEAN);

(*
  win - puntero a la ventana abierta por IOpenWindow.

  morewindows - TRUE si el UserPort^ de la ventana es compartido con otras.

  Cierra la ventana de una manera sana (todos los IntuiMessages son respon-
  didos, se cierra el UserPort^ solamente si no es compartido.

*)

PROCEDURE IAvailFonts(ri:ADDRESS):AvailFontsHeaderPtr;

(*
  ri - puntero a una estructura de datos interna retornada por IGetRenderInfo

  Crea una lista de todos los fonts (ROM + Disk) y las deja en la estructura
  ri.
*)

PROCEDURE IAskFont(ri:ADDRESS; ta:TextAttrPtr):TextAttrPtr;

(*
  ri - puntero a una estructura de datos interna retornada por IGetRenderInfo

  ta - punteor a una estructura inicializada con atributos de texto.

  Revisa si existe el font dado en la lista interna de fonts (ri ) creada
  con IAvailFonts.
*)

PROCEDURE IOpenFont(ri:ADDRESS; ta:TextAttrPtr):TextFontPtr;

(*
  ri - puntero a una estructura de datos interna retornada por IGetRenderInfo

  ta - puntero a una estructura inicializada con atributos de texto.

  Abre el font de acuerdo a la estructura TextAttr dada de la lista interna
  en ri.
*)

PROCEDURE IDisplayTexts(ri:ADDRESS; win:WindowPtr; td:TextDataPtr;
                        hoffset:INTEGER; voffset:INTEGER;
                        languagetextarray:DADDRESS);

(*
  ri - puntero a una estructura de datos interna retornada por IGetRenderInfo

  win - puntero a la ventana abierta por IOpenWindow

  td - puntero a un arreglo de estructuras TextData inicializadas. 

  hoffset, voffset - diferencias agregadas a las posiciones de TODO texto.

  languagetextarray - puntero a un arreglo de punteros a strings creados con
                      IBuildLanguageTextArray o NIL.


  Despliega el texto descrito en el arreglo dado, Si languagetextarray no
  es NIL entonces tdText no contiene un puntero a string si no un offset del
  puntero al string en el arreglo con punteros a texto en otros lenguajes.

*)

PROCEDURE IPrintText(ri:ADDRESS; win:WindowPtr; text:ADDRESS;
                     leftedge, topedge, type:CARDINAL; flags:LONGCARD;
                     textattr : TextAttrPtr):CARDINAL;

(*
  ri - puntero a una estructura de datos interna retornada por IGetRenderInfo

  win - puntero a la ventana abierta con IOpenWindow

  text - puntero al string con texto

  leftedge, topedge - posicion del texto

  type - TextDataType...

  flags - TextDataFlag...

  textattr - font usado para texto

  Despliega texto en la posicion dada
*)

PROCEDURE IConvertUnsignedDec(num:LONGCARD; buffer:ADDRESS; flags:CARDINAL):CARDINAL;

(*
  num - numero a convertir

  buffer - puntero al buffer para el numero convertido

  flags - ConvertFlag...

  Convierte un numero binario a un string en formato decimal sin signo.
*)

PROCEDURE IConvertSignedDec(num:LONGINT; buffer:ADDRESS; flags:CARDINAL):CARDINAL;

(*
  num - numero a convertir

  buffer - puntero al buffer para el numero convertido

  flags - ConvertFlag...

  Convierte un numero binario a un string en formato decimal sin signo.
*)

PROCEDURE IConvertHex(num:LONGCARD; buffer:ADDRESS; flags:CARDINAL):CARDINAL;

(*
  num - numero a convertir

  buffer - puntero al buffer para el numero convertido

  flags - ConvertFlag...

  Convierte un numero binario a un string en formato hexadecimal.
*)

PROCEDURE IConvertBin(num:LONGCARD; buffer:ADDRESS; flags:CARDINAL):CARDINAL;

(*
  num - numero a convertir

  buffer - puntero al buffer para el numero convertido

  flags - ConvertFlag...

  Convierte un numero binario a un string en formato binario.
*)

PROCEDURE IDisplayBorders(ri:ADDRESS; win:WindowPtr; bd:ADDRESS;
                          hoffset, voffset:INTEGER);

(*
  ri - puntero a una estructura de datos interna retornada por IGetRenderInfo

  win - puntero a la ventana abierta con IOpenWindow

  td - puntero a un arreglo de BorderData inicializado

  hoffset, voffset - offset sumado a la posicion de todo borde.

  Despliega borders descritos en el arreglo dado.
*)

PROCEDURE IDrawBorder(ri:ADDRESS; win:WindowPtr; leftedge, topedge,
                      width, height, type:LONGCARD);

(*
  ri - puntero a una estructura de datos interna retornada por IGetRenderInfo

  win - puntero a la ventana abierta con IOpenWindow

  leftedge, topedge, width, height - dimension del borde

  type - BorderDataType...

  Dibuja un borde en la posicion dada.
*)

PROCEDURE ICreateGadgets(ri:ADDRESS; gd:GadgetDataPtr; 
                         hoffset, voffset:INTEGER;
                         languagetextarray:DADDRESS):ADDRESS;

(*
  ri - puntero a una estructura de datos interna retornada por IGetRenderInfo

  gd - puntero al arreglo que contiene las descripciones de GadgetData

  hoffset, voffset - offsets sumados a las posiciones de los gadgets

  languagetextarray - puntero al arreglos de punteros a strings creados con
                      IBuildLanguageTextArray o NIL

  Crea una estructura de datos interna para los gadgets ISUP dado un arreglo
  de estructuras de datos. Esta funcion no despliega ningun objeto. El des-
  pliegue se realiza con IDisplayGadgets. La estructura de datos interna DEBE
  ser liberada con IFreeGadgets. Si se da un languagetextarray entonces 
  gdTextArray no contiene un puntero a un string sino que un offset de
  punteros de string en el arreglo dado con punteros a texto en otro lenguaje.
 
*)

PROCEDURE IFreeGadgets(gl:ADDRESS);

(*
  gl - puntero a una estructura de datos retornada por ICreateGadgets

  Libera la memoria para la estructura de datos reservada con ICreateGadgets
  Si los gadgets se estan desplegando entonces debe de ser removidos con
  IRemoveGadgets primero.
*)

PROCEDURE IDisplayGadgets(win:WindowPtr; gl:ADDRESS);

(*
  win - puntero a la ventana abierta con IOpenWindow

  gl - puntero a la estructura de datos retornada por ICreateGadgets


  Despliega todos los gadgets dados en la estructura de datos interna
  (ahora los gadgets son seleccionables). Para removerlos del depsliegue
  se usa IRemoveGadgets (los gadgets ya no seran seleccionables).
*)

PROCEDURE IRefreshGadgets(gl:ADDRESS);

(*
  gl - puntero a estructuras de datos retornadas por ICreateGadgets

  Refresca las imagenes de todos los gadgets dados en la estructura de
  datos interna
*)

PROCEDURE IModifyGadget(gl:ADDRESS; dataentry:CARDINAL; leftedge, 
                        topedge:INTEGER; width, height : CARDINAL);

(*
  gl - puntero a la estructura de datos interna retornada por ICreateGadgets

  dataentry - offset (en el arreglo de estructuras GadgetData) del gadget a
              modificar
  leftedge, topedge, width, height - nuevas dimensiones del gadget o usar
                                     UseCurrentValue para no cambiar

  Reposiciona y/o cambia el tamano de un gadget. Todos los gadgets pueden ser
  movidos pero algunos pueden ser modificados: buttons, sliders y scrollers.
*)

PROCEDURE ISetGadgetAttributes(gl:ADDRESS; dataentry:CARDINAL;
                              flagmask, flagbits:LONGCARD;
                              data1, data2:LONGINT; data3:ADDRESS):LONGCARD;

(*
  gl - puntero a la estructura de datos interna retornada por ICreateGadgets

  dataentry - offset (en el arreglo de estructuras GadgetData) del gadget a
              modificar

  flagmask - mascara con los bits a poner para los bits a modificar

  flagbits - nuevos bits de flags (solor los bits con flag mask encendido
             son cambiados)

  data1, data2, data3 - nuevos valores paralos apropiados gdSpecialData o usar
                        UseCurrentValue

  Cambia los flags o los datos especiales de un gadget. No todos los miembros
  pueden ser cambiados de todos los gadgets. Algunos son fijos al crearse.
*)

PROCEDURE IActivateInputGadget(gl:ADDRESS; dataentry:CARDINAL);

(*
  gl - puntero a la estructura de datos interna retornada por ICreateGadgets

  dataentry - offset (en el arreglo de estructuras GadgetData) del gadget a
              activar

  Activa un gadget de entrada: string o integer.
*)

PROCEDURE IGadgetAddress(gl:ADDRESS; dataentry:CARDINAL):GadgetPtr;

(*
  gl - puntero a la estructura de datos interna retornada por ICreateGadgets

  dataentry - offset (en el arreglo de estructuras GadgetData) del gadget a
              obtener un puntero de su estructura Gadget Normal

  Retorna un puntero a una estructura Gadget normal.
*)

PROCEDURE IRemoveGadgets(gl:ADDRESS):WindowPtr;

(*
  gl - puntero a la estructura de datos interna retornada por ICreateGadgets

  Quita todos los gadget pertenecientes a la estructura de datos interna
  del despligue (ya no se pueden seleccionar). Se retorna un puntero a la
  ventana donde estaban desplegados los gadgets.

*)

PROCEDURE IGetMsg(uport:MsgPortPtr):IntuiMessagePtr;

(*
  uport - el UserPort de la ventana

  DEBE de ser usado en lugar de GetMsg (de Exec) para el manejo de todas
  las acciones de los objetos ISUP. Para todos los eventos producidos por
  obbjetos ISUP, un estructura IntuiMessage modificada es retornada, su
  campo Class se pone con el valor ISupID y el campo Code contiene el offset
  (en el arreglo de las estructuras GadgetData) del gadget apropiado y en
  el campo IAddress reside el valor retornado por el gadget. Todas las 
  estructuras especiales de IntuiMessage DEBEN ser respondidas con IReplyMsg
  en lugar de ReplyMsg (de Exec).

  Ejemplo:

  msg : IntuiMessagePtr;

	LOOP
          msg := IGetMsg(win^.UserPort);

          IF (msg # NIL) THEN

            IF (LONGCARD(msg^.Class) = ISupID) THEN

              CASE msg^.Code OF
                0 : | (* primer objeto *)
		1 : | (* segundo objeto *)
              END

            ELSIF (.... cualquier otro mensaje IDCMP) THEN

            END;

            IReplyMsg(msg)

          END

        END; (* loop *)
 
*)

PROCEDURE IReplyMsg(imsg:IntuiMessagePtr);

(*
  imsg - IntuiMessage recibido con IGetMsg

  Responde al IntuiMessage creado por IGetMsg, DEBE usarse.
*)

PROCEDURE IAutoRequest(reqwin:WindowPtr; title,  bodytext, postext, 
                       negtext:ADDRESS; posidcmpflags,
                       negidcmpflags:IDCMPFlagsSet; reqflags:CARDINAL;
                       languagetextarray:DADDRESS):BOOLEAN;

(*
  reqwin - puntero a la ventana creado por IOpenIWindow o NIL o NIL para
           la ventana del workbench.

  title - puntero al titulo de la ventana del requester o NIL para un titulo
          default

  bodytext - puntero a texto para el cuerpo del requester.

  postext - puntero al texto para el gadget positivo o NIL para el texto
            default

  negtext - puntero al texto para el gadget negativo o NIL para el texto
            default

  posidcmpflags - IDCMP para la activacion del gadget positivo

  negidcmpflags - IDCMP para la activacion del gadget negativo

  reqflags - ReqDataFlag...

  languagetextarray - puntero al arreglo de puntero a strings creados con
                      IBuildLanguageTextArray o NIL

  Despliega un autorequester segun los datos dados y espera su terminacion
  el gadget positivo o negativo. Para el texto del cuerpo del requester se
  delinea una nueva linea con '\n'. Si se da un languagetextarray el campo
  tdText no contiene un puntero a un string sino un offset del puntero al
  arreglo de punteros al texto en otros lenguages.
*)

PROCEDURE IDisplayRequester(reqwin:WindowPtr; rd:RequesterDataPtr;
                            languagetextarray:DADDRESS):ADDRESS;

(*
  reqwin - puntero a la ventana abierta con IOpenWindow o NIL para la
           ventana del workbench

  rd - puntero a una estructura RequesterData ya inicializada

  languagetextarray - puntero al arreglo de puntero a strings creados con
                      IBuildLanguageTextArray o NIL

  Despliega un requester definido por una estructura RequesterData. Todos los
  otros gadgets desplegados en la ventana a la que pertenece el requester
  (reqwin) son paralizados hasta que se retire el requester. Cualquier
  IntuiMessage con Class = ISupID recibidos por IGetMsg vienen del requester
  Si se da un languagetextarray el campotdText no contiene un puntero a un
  string sino un offset del puntero al arreglo de punteros al texto en otros
  lenguages. Se retorna un puntero a la estructura de datos interna. El
  requester DEBE ser retirado del despliegue con IRemoveRequester.
*)

PROCEDURE IRemoveRequester(rl:ADDRESS);

(*
  rl - puntero a la estructura de datos retornada por IDisplayRequester.

  Retira el requester del despliegue. Todos los gadgets antes paralizados
  son activables de nuevo.
*)

PROCEDURE ICreateMenu(ri:ADDRESS; win:WindowPtr; md:MenuDataPtr;
                      ta:TextAttrPtr; languagetextarray:DADDRESS):ADDRESS;

(*
  ri - puntero a la estructura retornada por IGetRenderInfo

  win - puntero a la ventana abierta por IOpenWindow

  md - puntero al arreglo inicializado de estructuras MenuData

  ta - puntero a una estructura inicializada con atributos de texto

  languagetextarray - puntero a un arreglo de punteros a stringa creados por
                      IBuildLanguageTextArray o NIL

  Crea una estructura de datos interna para un menu de un arreglo de
  estructuras de datos dada. Esta funcion NO despliega el menu. El despliegue
  se hace con IAtachMenu. Esta estructura DEBE ser liberada con IFreeMenu
  Si se da un languagetextarray el campo tdText no contiene un puntero a un
  string sino un offset del puntero al arreglo de punteros al texto en otros
  lenguages. Se retorna un puntero a la estructura de datos del menu.
*)

PROCEDURE IAttachMenu(win:WindowPtr; ml:ADDRESS);

(*
  win - puntero a la ventana abierta con IOpenWindow

  ml - puntero a la estructura de datos retornada por ICreateMenu

  Hace los menus construidos con ICreateMenu disponible al conectarla a la
  ventana, el Menu DEBE ser removido con IRemoveMenu.
*)

PROCEDURE IMenuItemAddress(ml:ADDRESS; menunum:CARDINAL):MenuItemPtr;

(*
  ml - puntero a la estructura de datos retornados por ICreateMenu

  menunum - offset (en el arreglo de estructuras MenuData) del item para
            obtener su direccion

  Retorna  un puntero a un MenuItem normal.
*)

PROCEDURE IRemoveMenu(ml:ADDRESS):WindowPtr;

(*
  ml - puntero a la estructura de datos retornados por ICreateMenu

  Retira el menu conectado con IAttachMenu.
*)

PROCEDURE IFreeMenu(ml:ADDRESS);

(*
  ml - puntero a la estructura de datos retornados por ICreateMenu

  Libera la memoria de la estructura de datos reservada por ICreateMenu
  Si el menu aun esta connectad, DEBE de ser removido con IRemoveMenu antes.
*)

PROCEDURE IOpenTextFile(name:ADDRESS; readbuffersize, linebuffersize,
                        flags:CARDINAL):FileDataPtr;

(*
  name - puntero al string con el nombre del archivo

  readbuffersize - tamano en bytes del buffer usado para leer el archivo

  linebuffersize - numero de bytes usados para la linea mas larga de texto

  flags - TextFileFla...

  Abre el archivo de texto dado y retorna un puntero a una estructura de
  datos con los buffers reservados. Esta estructura DEBE de ser liberada
  con ICloseTextFile
*)

PROCEDURE IReadTextLine(fd:FileDataPtr):INTEGER;

(*
  fd - puntero a la estructura de datos retornada por IOpenTextFile

  Lee la siguiente linea del archivo, esta linea se almecena en la estructura
  FileData.
*)

PROCEDURE ICloseTextFile(fd:FileDataPtr);

(*
  fd - puntero a la estructura de datos retornada por IOpenTextFile

  Cierra el archivo y libera los buffers.
*)

PROCEDURE IBuildLanguageTextArray(name:ADDRESS; entries:CARDINAL):DADDRESS;

(*
  name - puntero al string con el nombre del archivo con el texto del
         lenguage

  entries - numero de entradas de texto en el archivo.

  Pasa el texto del archivo a un arreglo de strings. Este arreglo DEBE ser 
  liberado con IFreeLanguageTextArray.
*)

PROCEDURE IGetLanguageText(text:ADDRESS; textarray:DADDRESS):ADDRESS;

(*
  text - offset (en le arreglo de texto) del texto del lenguage
         (empezando en 1 no en 0 !!!)

  textarray - puntero al arreglo de strings creado por
              IBuildLanguageTextArray

  Retorna la entrada especificada de dentro del arrglo.
*)

PROCEDURE IFreeLanguageTextArray(textarray:DADDRESS);

(*
  textarray - puntero al arreglo de texto creados por IBuilLanguageTextArray

  Libera la memoria del arreglo.
*)

PROCEDURE IChangeMousePointer(win:WindowPtr; pd:PointerDataPtr);

(*
  win - puntero a la ventana creada con IOpenWindow

  pd - puntero a una estructura PointerData inicializada o NIL para el
       busy pointer.

  Reemplaza el pointer del mouse actual se la ventana con el descrito en
  en pd. El pointer anterior se guardara y puede ser restaurado con
  IRestoreMousePointer.
*)

PROCEDURE IRestoreMousePointer(win:WindowPtr);

(*
  win - puntero a la ventana abierta con IOpenWindow

  Restaura el pointer anterior de mouse cambiado con IChangeMousePointer
*)

PROCEDURE IMoveMousePointer(win:WindowPtr; x,y:INTEGER; button:BOOLEAN);

(*
  win - puntero a la ventana abierta con IOpenWindow

  x, y - nueva posicion, relativa a la esquina superior izquierda de
         la ventana.

  button - TRUE para que le boton izquierdo sea presionado

  Mueve el pointer del mouse de una ventana a una nueva posicion.
*)

(* ------------------------- Funciones de apoyo --------------------------*)

PROCEDURE InputAutoActive(next,prev:LONGINT):LONGINT;

PROCEDURE InitIntuiSupLibNoVer():BOOLEAN;

PROCEDURE InitIntuiSupLib():BOOLEAN;

PROCEDURE CloseIntuiSupLib();

END IntuiSupInterface.
