home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / dev / e / amigae / rkrmsrc / intuition / menus / simplemenu.e < prev   
Text File  |  1995-03-26  |  5KB  |  140 lines

  1. -> simplemenu.e: How to use the menu system with a window under all OS versions.
  2.  
  3. OPT PREPROCESS
  4.  
  5. MODULE 'graphics/rastport',
  6.        'graphics/text',
  7.        'intuition/intuition',
  8.        'intuition/screens'
  9.  
  10. -> These values are based on the ROM font Topaz8. Adjust these values to
  11. -> correctly handle the screen's current font.
  12. CONST MENWIDTH=56+8, -> Longest menu item name * font width + 8 pixels for trim
  13.       MENHEIGHT=10   -> Font height + 2 pixels
  14.  
  15. -> We only use a single menu, but the code is generalisable to more than
  16. -> one menu.
  17. CONST NUM_MENUS=1
  18.  
  19. ENUM ERR_NONE, ERR_WIN, ERR_MENU
  20.  
  21. RAISE ERR_WIN  IF OpenWindow()=NIL,
  22.       ERR_MENU IF SetMenuStrip()=FALSE  -> E-Note: not really necessary...
  23.  
  24. PROC main() HANDLE
  25.   -> E-Note: some of these are global arrays in the C version
  26.   DEF topaz80, submenu1, menu1, menutitle, menustrip:PTR TO menu,
  27.       win=NIL:PTR TO window, left=2
  28.  
  29.   win:=OpenWindow([40, 40, 300, 100, 0, 1, IDCMP_CLOSEWINDOW OR IDCMP_MENUPICK,
  30.                    WFLG_DRAGBAR OR WFLG_ACTIVATE OR WFLG_CLOSEGADGET, NIL, NIL,
  31.                    'Menu Test Window', NIL, NIL, 0, 0, 0, 0, WBENCHSCREEN]:nw)
  32.  
  33.   -> To keep this example simple, we'll hard-code the font used for menu items.
  34.   -> Algorithmic layout can be used to handle arbitrary fonts.  Under Release 2,
  35.   -> GadTools provides font-sensitive menu layout.  Note that we still must
  36.   -> handle fonts for the menu headers.
  37.   topaz80:=['topaz.font', 8, 0, 0]:textattr
  38.  
  39.   -> E-Note: linking needs to be done in reverse order to layout
  40.   -> Sub-item 1, NLQ
  41.   submenu1:=[NIL, MENWIDTH-2, MENHEIGHT-2, MENWIDTH, MENHEIGHT,
  42.              ITEMTEXT OR MENUTOGGLE OR ITEMENABLED OR HIGHCOMP, 0,
  43.              [0, 1, RP_JAM2, 0, 1, topaz80, 'NLQ', NIL]:intuitext,
  44.              NIL, NIL, NIL, NIL]:menuitem
  45.   -> Sub-item 0, Draft
  46.   submenu1:=[submenu1, MENWIDTH-2, -2, MENWIDTH, MENHEIGHT,
  47.              ITEMTEXT OR MENUTOGGLE OR ITEMENABLED OR HIGHCOMP, 0,
  48.              [0, 1, RP_JAM2, 0, 1, topaz80, 'Draft', NIL]:intuitext,
  49.              NIL, NIL, NIL, NIL]:menuitem
  50.  
  51.   -> E-Note: linking needs to be done in reverse order to layout
  52.   -> Item 3, Quit
  53.   menu1:=[NIL, 0, 3*MENHEIGHT, MENWIDTH, MENHEIGHT,
  54.           ITEMTEXT OR MENUTOGGLE OR ITEMENABLED OR HIGHCOMP, 0,
  55.           [0, 1, RP_JAM2, 0, 1, topaz80, 'Quit', NIL]:intuitext,
  56.           NIL, NIL, NIL, NIL]:menuitem
  57.   -> Item 2, Print
  58.   menu1:=[menu1, 0, 2*MENHEIGHT, MENWIDTH, MENHEIGHT,
  59.           ITEMTEXT OR MENUTOGGLE OR ITEMENABLED OR HIGHCOMP, 0,
  60.           [0, 1, RP_JAM2, 0, 1, topaz80, 'Print »', NIL]:intuitext,
  61.           NIL, NIL, submenu1, NIL]:menuitem
  62.   -> Item 1, Save
  63.   menu1:=[menu1, 0, MENHEIGHT, MENWIDTH, MENHEIGHT,
  64.           ITEMTEXT OR MENUTOGGLE OR ITEMENABLED OR HIGHCOMP, 0,
  65.           [0, 1, RP_JAM2, 0, 1, topaz80, 'Save', NIL]:intuitext,
  66.           NIL, NIL, NIL, NIL]:menuitem
  67.   -> Item 0, Open...
  68.   menu1:=[menu1, 0, 0, MENWIDTH, MENHEIGHT,
  69.           ITEMTEXT OR MENUTOGGLE OR ITEMENABLED OR HIGHCOMP, 0,
  70.           [0, 1, RP_JAM2, 0, 1, topaz80, 'Open...', NIL]:intuitext,
  71.           NIL, NIL, NIL, NIL]:menuitem
  72.  
  73.   menutitle:='Project'
  74.  
  75.   -> E-Note: use NEW, or remember to initialise last elements to 0
  76.   menustrip:=[NIL, left, 0,
  77.               TextLength(win.wscreen.rastport, menutitle, StrLen(menutitle))+8,
  78.               MENHEIGHT, MENUENABLED, menutitle, menu1, 0, 0, 0, 0]:menu
  79.  
  80.   left:=left+menustrip.width
  81.  
  82.   SetMenuStrip(win, menustrip)
  83.  
  84.   handleWindow(win, menustrip)
  85.  
  86.   ClearMenuStrip(win)
  87.  
  88.  -> E-Note: exit and clean up via handler
  89. EXCEPT DO
  90.   IF win THEN CloseWindow(win)
  91.   -> E-Note: we can print a minimal error message
  92.   SELECT exception
  93.   CASE ERR_WIN;  WriteF('Error: Failed to open window\n')
  94.   CASE ERR_MENU; WriteF('Error: Failed to attach menu\n')
  95.   ENDSELECT
  96. ENDPROC
  97.  
  98. -> E-Note: used to convert an INT to unsigned
  99. #define UNSIGNED(x) ((x) AND $FFFF)
  100.  
  101. -> Wait for the user to select the close gadget.
  102. -> E-Note: E version is simpler, since we use WaitIMessage
  103. PROC handleWindow(win, menuStrip)
  104.   DEF done=FALSE, class, menuNumber, menuNum, itemNum, subNum,
  105.       item:PTR TO menuitem
  106.   REPEAT
  107.     class:=WaitIMessage(win)
  108.     SELECT class
  109.     CASE IDCMP_CLOSEWINDOW
  110.       done:=TRUE
  111.     CASE IDCMP_MENUPICK
  112.       -> E-Note: menuNumber is an unsigned INT
  113.       menuNumber:=UNSIGNED(MsgCode())
  114.       WHILE (menuNumber<>MENUNULL) AND (done=FALSE)
  115.         item:=ItemAddress(menuStrip, menuNumber)
  116.  
  117.         -> Process this item
  118.         -> If there were no sub-items attached to that item,
  119.         -> SubNumber will equal NOSUB.
  120.         menuNum:=MENUNUM(menuNumber)
  121.         itemNum:=ITEMNUM(menuNumber)
  122.         subNum:=SUBNUM(menuNumber)
  123.  
  124.         -> Note that we are printing all values, even things like NOMENU,
  125.         -> NOITEM and NOSUB.  An application should check for these cases.
  126.         WriteF('IDCMP_MENUPICK: menu \d, item \d, sub \d\n',
  127.                menuNum, itemNum, subNum)
  128.  
  129.         -> This one is the quit menu selection...
  130.         -> stop if we get it, and don't process any more.
  131.         -> E-Note: the C version is wrong! QUIT is itemNum = 3
  132.         IF (menuNum=0) AND (itemNum=3) THEN done:=TRUE
  133.  
  134.         -> E-Note: menuNumber is an unsigned INT
  135.         menuNumber:=UNSIGNED(item.nextselect)
  136.       ENDWHILE
  137.     ENDSELECT
  138.   UNTIL done
  139. ENDPROC
  140.