home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / jËzyki_programowania / amigae / e_v3.2a / rkrmsrc / intuition / gadgets / updatestrgad.e < prev   
Text File  |  1977-12-31  |  5KB  |  119 lines

  1. -> updatestrgad.e - Show the use of a string gadget.  Shows both the use of
  2. -> ActivateGadget() and how to properly modify the contents of a string gadget.
  3.  
  4. MODULE 'graphics/rastport',
  5.        'intuition/intuition'
  6.  
  7. ENUM ERR_NONE, ERR_KICK, ERR_WIN
  8.  
  9. RAISE ERR_WIN IF OpenWindowTagList()=NIL
  10.  
  11. -> NOTE that the use of constant size and positioning values are not
  12. -> recommended; it just makes it easy to show what is going on.  The position
  13. -> of the gadget should be dynamically adjusted depending on the height of the
  14. -> font in the title bar of the window.  This example adapts the gadget height
  15. -> to the screen font. Alternatively, you could specify your font under V37
  16. -> with the StringExtend structure.
  17. CONST BUFSIZE=100, MYSTRGADWIDTH=200, MYSTRGADHEIGHT=8
  18.  
  19. DEF strBuffer[BUFSIZE]:STRING, strUndoBuffer[BUFSIZE]:STRING,
  20.     strGad:PTR TO gadget, ansnum=0, answers:PTR TO LONG
  21.  
  22. -> Show the use of a string gadget.
  23. PROC main() HANDLE
  24.   DEF win=NIL:PTR TO window
  25.   -> Make sure to get version 37, for OpenWindowTags()
  26.   IF KickVersion(37)=FALSE THEN Raise(ERR_KICK)
  27.   -> Load a value into the string gadget buffer.
  28.   -> This will be displayed when the gadget is first created.
  29.   StrCopy(strBuffer, 'START')
  30.  
  31.   -> E-Note: set-up the two globals...
  32.   answers:=['Try Again','Sorry','Perhaps','A Winner']
  33.   strGad:=[NIL, 20, 20, MYSTRGADWIDTH, MYSTRGADHEIGHT,
  34.            GFLG_GADGHCOMP, GACT_RELVERIFY OR GACT_STRINGCENTER,
  35.            GTYP_STRGADGET,
  36.             [-2, -2, 1, 0, RP_JAM1, 5,
  37.               [0, 0,
  38.                MYSTRGADWIDTH + 3, 0,
  39.                MYSTRGADWIDTH + 3, MYSTRGADHEIGHT + 3,
  40.                0, MYSTRGADHEIGHT + 3,
  41.                0, 0]:INT,
  42.              NIL]:border,
  43.            NIL, NIL, 0,
  44.            -> E-Note: use NEW so remaining fields are allocated (and set to 0)
  45.            NEW [strBuffer, strUndoBuffer, 0, BUFSIZE]:stringinfo,
  46.            0, NIL]:gadget
  47.  
  48.   win:=OpenWindowTagList(NIL,
  49.                         [WA_WIDTH, 400,
  50.                          WA_HEIGHT, 100,
  51.                          WA_TITLE, 'Activate Window, Enter Text',
  52.                          WA_GADGETS, strGad,
  53.                          WA_CLOSEGADGET, TRUE,
  54.                          WA_IDCMP, IDCMP_ACTIVEWINDOW OR
  55.                                    IDCMP_CLOSEWINDOW OR IDCMP_GADGETUP,
  56.                          NIL])
  57.  
  58.   handleWindow(win, strGad)
  59.  
  60.   -> E-Note: exit and clean up via handler
  61. EXCEPT DO
  62.   IF win THEN CloseWindow(win)
  63.   -> E-Note: we can print a minimal error message
  64.   SELECT exception
  65.   CASE ERR_KICK; WriteF('Error: Needs Kickstart V37+\n')
  66.   CASE ERR_WIN;  WriteF('Error: Failed to open window\n')
  67.   CASE "MEM";    WriteF('Error: Ran out of memory\n')
  68.   ENDSELECT
  69. ENDPROC
  70.  
  71. -> Process messages received by the window.  Quit when the close gadget
  72. -> is selected, activate the gadget when the window becomes active.
  73. -> E-Note: E version is simpler, since we use WaitIMessage
  74. PROC handleWindow(win, gad)
  75.   DEF class
  76.   REPEAT
  77.     class:=WaitIMessage(win)
  78.     SELECT class
  79.     CASE IDCMP_ACTIVEWINDOW
  80.       -> Activate the string gadget.  This is how to activate a string gadget
  81.       -> in a new window--wait for the window to become active by waiting for
  82.       -> the IDCMP_ACTIVEWINDOW event, then activate the gadget.  Here we
  83.       -> report on the success or failure.
  84.       IF ActivateGadget(gad, win, NIL)
  85.         updateStrGad(win, gad, 'Activated')
  86.       ENDIF
  87.     CASE IDCMP_GADGETUP
  88.       -> If it's a gadget message, IAddress points to Gadget.  If user hit
  89.       -> RETURN in our string gadget for demonstration, we will change what he
  90.       -> entered.  We only have 1 gadget, so we don't have to check which one.
  91.       updateStrGad(win, strGad, answers[ansnum])
  92.       INC ansnum  -> Point to next answer
  93.       -> E-Note: we know the lengths of lists, so no need for ANSCNT
  94.       IF ansnum>=ListLen(answers) THEN ansnum:=0
  95.     ENDSELECT
  96.   UNTIL class=IDCMP_CLOSEWINDOW
  97. ENDPROC
  98.  
  99. -> Routine to update the value in the string gadget's buffer, then activate
  100. -> the gadget.
  101. PROC updateStrGad(win, gad:PTR TO gadget, newstr)
  102.   -> First, remove the gadget from the window.  This must be done before
  103.   -> modifying any part of the gadget!!!
  104.   RemoveGList(win, gad, 1)
  105.  
  106.   -> For fun, change the value in the buffer, as well as the cursor and initial
  107.   -> display position.
  108.   StrCopy(gad.specialinfo::stringinfo.buffer, newstr)
  109.   gad.specialinfo::stringinfo.bufferpos:=0
  110.   gad.specialinfo::stringinfo.disppos:=0
  111.  
  112.   -> Add the gadget back, placing it at the end of the list (-1) and refresh
  113.   -> its imagery.
  114.   AddGList(win, gad, -1, 1, NIL)
  115.   RefreshGList(gad, win, NIL, 1)
  116.  
  117.   -> Activate the string gadget
  118.   ActivateGadget(gad, win, NIL)
  119. ENDPROC