home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / dev / e / amigae / rkrmsrc / intuition / menus / menulayout.e next >
Text File  |  1995-03-26  |  18KB  |  461 lines

  1. -> menulayout.e - Example showing how to do menu layout in general.  This
  2. -> example also illustrates handling menu events, including IDCMP_MENUHELP
  3. -> events.
  4. ->
  5. -> Note that handling arbitrary fonts is fairly complex.  Applications that
  6. -> require V37 should use the simpler menu layout routines found in the
  7. -> GadTools library.
  8.  
  9. OPT PREPROCESS
  10.  
  11. MODULE 'dos/dos',
  12.        'graphics/rastport',
  13.        'graphics/text',
  14.        'intuition/intuition',
  15.        'intuition/screens'
  16.  
  17. ENUM ERR_NONE, ERR_DRAW, ERR_FONT, ERR_KICK, ERR_MENU, ERR_PUB, ERR_WIN
  18.  
  19. RAISE ERR_DRAW IF GetScreenDrawInfo()=NIL,
  20.       ERR_FONT IF OpenFont()=NIL,
  21.       ERR_MENU IF SetMenuStrip()=FALSE,
  22.       ERR_PUB  IF LockPubScreen()=NIL,
  23.       ERR_WIN  IF OpenWindowTagList()=NIL
  24.  
  25. DEF firstMenu
  26.  
  27. -> Open all of the required libraries.  Note that we require V37, as the
  28. -> routine uses OpenWindowTags().
  29. PROC main() HANDLE
  30.   IF KickVersion(37)=FALSE THEN Raise(ERR_KICK)
  31.  
  32.   doWindow()
  33.  
  34. EXCEPT DO
  35.   -> E-Note: we can print a minimal error message
  36.   SELECT exception
  37.   CASE ERR_DRAW; WriteF('Error: Failed to get screen DrawInfo\n')
  38.   CASE ERR_KICK; WriteF('Error: Needs Kickstart V37+\n')
  39.   CASE ERR_MENU; WriteF('Error: Failed to attach menu\n')
  40.   CASE ERR_PUB;  WriteF('Error: Failed to lock public screen\n')
  41.   CASE ERR_WIN;  WriteF('Error: Failed to open window\n')
  42.   ENDSELECT
  43.   RETURN IF exception=ERR_NONE THEN RETURN_FAIL ELSE RETURN_OK
  44. ENDPROC
  45.  
  46. -> Open a window with some properly positioned text.  Layout and set the menus,
  47. -> then process any events received.  Cleanup when done.
  48. PROC doWindow() HANDLE
  49.   -> E-Note: some of these are global arrays in the C version
  50.   DEF settItem, editItem, prtItem, projItem, menus,
  51.       winText0:PTR TO intuitext, winText1:PTR TO intuitext,
  52.       window=NIL:PTR TO window, screen=NIL:PTR TO screen,
  53.       drawinfo=NIL:PTR TO drawinfo,
  54.       win_width, alt_width, win_height
  55.  
  56.   screen:=LockPubScreen(NIL)
  57.   drawinfo:=GetScreenDrawInfo(screen)
  58.  
  59.   -> Window Text for Explanation of Program
  60.   -> Get the colors for the window text
  61.   -> Use the screen's font for the text
  62.   -> E-Note: link directly without an array
  63.   winText0:=[drawinfo.pens[TEXTPEN], drawinfo.pens[BACKGROUNDPEN], RP_JAM2,
  64.             0, 0, screen.font, 'How to do a Menu', NIL]:intuitext
  65.   winText1:=[drawinfo.pens[TEXTPEN], drawinfo.pens[BACKGROUNDPEN], RP_JAM2,
  66.             0, 0, screen.font, '(with Style)', winText0]:intuitext
  67.  
  68.   -> Calculate window size
  69.   win_width:=100+IntuiTextLength(winText0)
  70.   alt_width:=100+IntuiTextLength(winText1)
  71.   IF win_width<alt_width THEN win_width:=alt_width
  72.   win_height:=1+screen.wbortop+screen.wborbottom+(screen.font.ysize*5)
  73.  
  74.   -> Calculate the correct positions for the text in the window
  75.   winText0.leftedge:=Shr(win_width-IntuiTextLength(winText0), 1)
  76.   winText0.topedge:=1+screen.wbortop+(2*screen.font.ysize)
  77.   winText1.leftedge:=Shr(win_width-IntuiTextLength(winText1), 1)
  78.   winText1.topedge:=winText0.topedge+screen.font.ysize
  79.  
  80.   -> Open the window
  81.   window:=OpenWindowTagList(NIL,
  82.             [WA_PUBSCREEN, screen,
  83.              WA_IDCMP, IDCMP_MENUPICK OR IDCMP_CLOSEWINDOW OR IDCMP_MENUHELP,
  84.              WA_FLAGS, WFLG_DRAGBAR OR WFLG_DEPTHGADGET OR WFLG_CLOSEGADGET OR
  85.                          WFLG_ACTIVATE OR WFLG_NOCAREREFRESH,
  86.              WA_LEFT,  10,             WA_TOP,      screen.barheight+1,
  87.              WA_WIDTH, win_width,      WA_HEIGHT,   win_height,
  88.              WA_TITLE, 'Menu Example', WA_MENUHELP, TRUE,
  89.              NIL])
  90.  
  91.   -> Give a brief explanation of the program
  92.   PrintIText(window.rport, winText1, 0, 0)
  93.  
  94.   -> E-Note: define the menus using (local) typed lists rather than arrays
  95.   -> E-Note: link menu items in reverse order to layout
  96.  
  97.   -> Settings Items
  98.   -> 'Eat It Too' (excludes 'Have Your Cake')
  99.   settItem:=[NIL, 0, 0, 0, 0,
  100.              ITEMTEXT OR ITEMENABLED OR HIGHCOMP OR CHECKIT, 4,
  101.               [0, 1, RP_JAM2, CHECKWIDTH, 1, NIL,
  102.                ' Eat It Too', NIL]:intuitext,
  103.              NIL, NIL, NIL, MENUNULL]:menuitem
  104.   -> 'Have Your Cake' (initially selected, excludes 'Eat It Too')
  105.   settItem:=[settItem, 0, 0, 0, 0,
  106.              ITEMTEXT OR ITEMENABLED OR HIGHCOMP OR CHECKIT OR CHECKED, 8,
  107.               [0, 1, RP_JAM2, CHECKWIDTH, 1, NIL,
  108.                ' Have Your Cake', NIL]:intuitext,
  109.              NIL, NIL, NIL, MENUNULL]:menuitem
  110.   -> 'Auto Save' (toggle-select, initially selected)
  111.   settItem:=[settItem, 0, 0, 0, 0,
  112.              ITEMTEXT OR ITEMENABLED OR HIGHCOMP OR CHECKIT OR
  113.                MENUTOGGLE OR CHECKED, 0,
  114.               [0, 1, RP_JAM2, CHECKWIDTH, 1, NIL,
  115.                ' Auto Save', NIL]:intuitext,
  116.              NIL, NIL, NIL, MENUNULL]:menuitem
  117.   -> 'Sound...'
  118.   settItem:=[settItem, 0, 0, 0, 0,
  119.              ITEMTEXT OR ITEMENABLED OR HIGHCOMP, 0,
  120.               [0, 1, RP_JAM2, 2, 1, NIL,
  121.                'Sound...', NIL]:intuitext,
  122.              NIL, NIL, NIL, MENUNULL]:menuitem
  123.  
  124.   -> Edit Menu Items
  125.   -> 'Undo' (key-equivalent: "Z")
  126.   editItem:=[NIL, 0, 0, 0, 0,
  127.              ITEMTEXT OR COMMSEQ OR ITEMENABLED OR HIGHCOMP, 0,
  128.               [0, 1, RP_JAM2, 2, 1, NIL, 'Undo', NIL]:intuitext,
  129.              NIL, "Z", NIL, MENUNULL]:menuitem
  130.   -> 'Erase' (disabled)
  131.   editItem:=[editItem, 0, 0, 0, 0,
  132.              ITEMTEXT OR HIGHCOMP, 0,
  133.               [0, 1, RP_JAM2, 2, 1, NIL, 'Erase', NIL]:intuitext,
  134.              NIL, NIL, NIL, MENUNULL]:menuitem
  135.   -> 'Paste' (key-equivalent: "V")
  136.   editItem:=[editItem, 0, 0, 0, 0,
  137.              ITEMTEXT OR COMMSEQ OR ITEMENABLED OR HIGHCOMP, 0,
  138.               [0, 1, RP_JAM2, 2, 1, NIL, 'Paste', NIL]:intuitext,
  139.              NIL, "V", NIL, MENUNULL]:menuitem
  140.   -> 'Copy' (key-equivalent: "C")
  141.   editItem:=[editItem, 0, 0, 0, 0,
  142.              ITEMTEXT OR COMMSEQ OR ITEMENABLED OR HIGHCOMP, 0,
  143.               [0, 1, RP_JAM2, 2, 1, NIL, 'Copy', NIL]:intuitext,
  144.              NIL, "C", NIL, MENUNULL]:menuitem
  145.   -> 'Cut' (key-equivalent: "X")
  146.   editItem:=[editItem, 0, 0, 0, 0,
  147.              ITEMTEXT OR COMMSEQ OR ITEMENABLED OR HIGHCOMP, 0,
  148.               [0, 1, RP_JAM2, 2, 1, NIL, 'Cut', NIL]:intuitext,
  149.              NIL, "X", NIL, MENUNULL]:menuitem
  150.  
  151.   -> Print Sub-Items
  152.   -> 'Draft'
  153.   prtItem:=[NIL, 0, 0, 0, 0,
  154.             ITEMTEXT OR ITEMENABLED OR HIGHCOMP, 0,
  155.              [0, 1, RP_JAM2, 2, 1, NIL, 'Draft', NIL]:intuitext,
  156.             NIL, NIL, NIL, MENUNULL]:menuitem
  157.   -> 'NLQ'
  158.   prtItem:=[prtItem, 0, 0, 0, 0,
  159.             ITEMTEXT OR ITEMENABLED OR HIGHCOMP, 0,
  160.              [0, 1, RP_JAM2, 2, 1, NIL, 'NLQ', NIL]:intuitext,
  161.             NIL, NIL, NIL, MENUNULL]:menuitem
  162.  
  163.   -> Uses the >> character to indicate a sub-menu item.
  164.   -> This is \273 Octal, 0xBB Hex or Alt-0 from the Keyboard.
  165.   ->
  166.   -> NOTE that standard menus place this character at the right margin of the
  167.   -> menu box.  This may be done by using a second IntuiText structure for the
  168.   -> single character, linking this IntuiText to the first one, and positioning
  169.   -> the IntuiText so that the character appears at the right margin.
  170.   -> GadTools library will provide the correct behavior.
  171.  
  172.   -> Project Menu Items
  173.   -> 'Quit' (key-equivalent: "Q")
  174.   projItem:=[NIL, 0, 0, 0, 0,
  175.              ITEMTEXT OR COMMSEQ OR ITEMENABLED OR HIGHCOMP, 0,
  176.               [0, 1, RP_JAM2, 2, 1, NIL, 'Quit', NIL]:intuitext,
  177.              NIL, "Q", NIL, MENUNULL]:menuitem
  178.   -> 'About...'
  179.   projItem:=[projItem, 0, 0, 0, 0,
  180.              ITEMTEXT OR ITEMENABLED OR HIGHCOMP, 0,
  181.               [0, 1, RP_JAM2, 2, 1, NIL, 'About...', NIL]:intuitext,
  182.              NIL, NIL, NIL, MENUNULL]:menuitem
  183.   -> 'Print' (has sub-menu)
  184.   projItem:=[projItem, 0, 0, 0, 0,
  185.              ITEMTEXT OR ITEMENABLED OR HIGHCOMP, 0,
  186.               [0, 1, RP_JAM2, 2, 1, NIL, 'Print     »', NIL]:intuitext,
  187.              NIL, NIL, prtItem, MENUNULL]:menuitem
  188.   -> 'Save As...' (key-equivalent: "A")
  189.   projItem:=[projItem, 0, 0, 0, 0,
  190.              ITEMTEXT OR COMMSEQ OR ITEMENABLED OR HIGHCOMP, 0,
  191.               [0, 1, RP_JAM2, 2, 1, NIL, 'Save As...', NIL]:intuitext,
  192.              NIL, "A", NIL, MENUNULL]:menuitem
  193.   -> 'Save' (key-equivalent: "S")
  194.   projItem:=[projItem, 0, 0, 0, 0,
  195.              ITEMTEXT OR COMMSEQ OR ITEMENABLED OR HIGHCOMP, 0,
  196.               [0, 1, RP_JAM2, 2, 1, NIL, 'Save', NIL]:intuitext,
  197.              NIL, "S", NIL, MENUNULL]:menuitem
  198.   -> 'Open...' (key-equivalent: "O")
  199.   projItem:=[projItem, 0, 0, 0, 0,
  200.              ITEMTEXT OR COMMSEQ OR ITEMENABLED OR HIGHCOMP, 0,
  201.               [0, 1, RP_JAM2, 2, 1, NIL, 'Open...', NIL]:intuitext,
  202.              NIL, "O", NIL, MENUNULL]:menuitem
  203.   -> 'New' (key-equivalent: "N")
  204.   projItem:=[projItem, 0, 0, 0, 0,
  205.              ITEMTEXT OR COMMSEQ OR ITEMENABLED OR HIGHCOMP, 0,
  206.               [0, 1, RP_JAM2, 2, 1, NIL, 'New', NIL]:intuitext,
  207.              NIL, "N", NIL, MENUNULL]:menuitem
  208.  
  209.   -> Menu Titles
  210.   -> E-Note: link in reverse order to layout
  211.   -> E-Note: use NEW to zero trailing fields
  212.   menus:=NEW [NIL,  120, 0, 88, 0, MENUENABLED, 'Settings', settItem]:menu
  213.   menus:=NEW [menus, 70, 0, 39, 0, MENUENABLED, 'Edit',     editItem]:menu
  214.   menus:=NEW [menus,  0, 0, 63, 0, MENUENABLED, 'Project',  projItem]:menu
  215.  
  216.   -> A pointer to the first menu for easy reference
  217.   firstMenu:=menus
  218.  
  219.   -> Adjust the menu to conform to the font (TextAttr)
  220.   adjustMenus(menus, window.wscreen.font)
  221.  
  222.   -> Attach the menu to the window
  223.   SetMenuStrip(window, menus)
  224.  
  225.   REPEAT
  226.   UNTIL handleIDCMP(window)
  227.  
  228.   -> Clean up everything used here
  229.   ClearMenuStrip(window)
  230.  
  231.   -> E-Note: exit and clean up via handler
  232. EXCEPT DO
  233.   IF window THEN CloseWindow(window)
  234.   IF drawinfo THEN FreeScreenDrawInfo(screen, drawinfo)
  235.   IF screen THEN UnlockPubScreen(NIL, screen)
  236.   -> E-Note: pass on error, or else RETURN_OK if no error
  237.   ReThrow()
  238. ENDPROC RETURN_OK
  239.  
  240. -> Print out what menu was selected.  Properly handle the IDCMP_MENUHELP
  241. -> events.  Set done to TRUE if quit is selected.
  242. PROC processMenus(selection, done)
  243.   DEF menuNum, itemNum, subNum, item:PTR TO menuitem
  244.  
  245.   menuNum:=MENUNUM(selection)
  246.   itemNum:=ITEMNUM(selection)
  247.   subNum:=SUBNUM(selection)
  248.  
  249.   -> When processing IDCMP_MENUHELP, you are not guaranteed to get a menu item.
  250.   IF itemNum<>NOITEM
  251.     item:=ItemAddress(firstMenu, selection)
  252.     IF item.flags AND CHECKED THEN WriteF('(Checked) ')
  253.   ENDIF
  254.  
  255.   SELECT menuNum
  256.   CASE 0 -> Project Menu
  257.     SELECT itemNum
  258.     CASE NOITEM; WriteF('Project Menu\n')
  259.     CASE 0;      WriteF('New\n')
  260.     CASE 1;      WriteF('Open\n')
  261.     CASE 2;      WriteF('Save\n')
  262.     CASE 3;      WriteF('Save As\n')
  263.     CASE 4;      WriteF('Print ')
  264.       SELECT subNum
  265.       CASE NOSUB; WriteF('Item\n')
  266.       CASE 0;     WriteF('NLQ\n')
  267.       CASE 1;     WriteF('Draft\n')
  268.       ENDSELECT
  269.     CASE 5;      WriteF('About\n')
  270.     CASE 6;      WriteF('Quit\n'); done:=TRUE
  271.     ENDSELECT
  272.   CASE 1 -> Edit Menu
  273.     SELECT itemNum
  274.     CASE NOITEM; WriteF('Edit Menu\n')
  275.     CASE 0;      WriteF('Cut\n')
  276.     CASE 1;      WriteF('Copy\n')
  277.     CASE 2;      WriteF('Paste\n')
  278.     CASE 3;      WriteF('Erase\n')
  279.     CASE 4;      WriteF('Undo\n')
  280.     ENDSELECT
  281.   CASE 2 -> Settings Menu
  282.     SELECT itemNum
  283.     CASE NOITEM; WriteF('Settings Menu\n')
  284.     CASE 0;      WriteF('Sound\n')
  285.     CASE 1;      WriteF('Auto Save\n')
  286.     CASE 2;      WriteF('Have Your Cake\n')
  287.     CASE 3;      WriteF('Eat It Too\n')
  288.     ENDSELECT
  289.   CASE NOMENU -> No menu selected, can happen with IDCMP_MENUHELP
  290.     WriteF('no menu\n')
  291.   ENDSELECT
  292. ENDPROC done
  293.  
  294. -> E-Note: used to convert an INT to unsigned
  295. #define UNSIGNED(x) ((x) AND $FFFF)
  296.  
  297. -> Handle the IDCMP messages.  Set done to TRUE if quit or closewindow is
  298. -> selected.
  299. PROC handleIDCMP(win)
  300.   DEF done=FALSE, selection, class, item:PTR TO menuitem
  301.   class:=WaitIMessage(win)
  302.   SELECT class
  303.   CASE IDCMP_CLOSEWINDOW
  304.     done:=TRUE  
  305.   CASE IDCMP_MENUHELP
  306.     -> The routine that handles the menus for IDCMP_MENUHELP must be very
  307.     -> careful it can receive menu information that is impossible under
  308.     -> IDCMP_MENUPICK.  For instance, the code value on a IDCMP_MENUHELP may
  309.     -> have a valid number for the menu, then NOITEM and NOSUB. IDCMP_MENUPICK
  310.     -> would get MENUNULL in this case.  IDCMP_MENUHELP never come as
  311.     -> multi-select items, and the event terminates the menu processing session.
  312.     ->
  313.     -> Note that the return value from the processMenus() routine is ignored:
  314.     -> the application should not quit if the user selects "help" over the quit
  315.     -> menu item.
  316.     WriteF('IDCMP_MENUHELP: Help on ')
  317.     processMenus(MsgCode(), done)
  318.   CASE IDCMP_MENUPICK
  319.     -> E-Note: convert message code to an unsigned INT
  320.     selection:=UNSIGNED(MsgCode())
  321.     WHILE selection<>MENUNULL
  322.       WriteF('IDCMP_MENUPICK: Selected ')
  323.       done:=processMenus(selection, done)
  324.       item:=ItemAddress(firstMenu, selection)
  325.       -> E-Note: convert item.nextselect to an unsigned INT
  326.       selection:=UNSIGNED(item.nextselect)
  327.     ENDWHILE
  328.   ENDSELECT
  329. ENDPROC done
  330.  
  331. -> Steps through each item to determine the maximum width of the strip
  332. PROC maxLength(textRPort, first_item, char_size)
  333.   DEF maxLength, total_textlen, cur_item:PTR TO menuitem,
  334.       itext:PTR TO intuitext, extra_width, maxCommCharWidth, commCharWidth
  335.  
  336.   extra_width:=char_size  -> Used as padding for each item
  337.  
  338.   -> Find the maximum length of a command character, if any.
  339.   -> If found, it will be added to the extra_width field.
  340.   maxCommCharWidth:=0
  341.   cur_item:=first_item
  342.   WHILE cur_item
  343.     IF cur_item.flags AND COMMSEQ
  344.       -> E-Note: requires address of the command character
  345.       commCharWidth:=TextLength(textRPort, [cur_item.command]:CHAR, 1)
  346.       IF commCharWidth>maxCommCharWidth THEN maxCommCharWidth:=commCharWidth
  347.     ENDIF
  348.     cur_item:=cur_item.nextitem
  349.   ENDWHILE
  350.  
  351.   -> If we found a command sequence, add it to the extra required space.  Add
  352.   -> space for the Amiga key glyph plus space for the command character.  Note
  353.   -> this only works for HIRES screens, for LORES, use LOWCOMMWIDTH.
  354.   IF maxCommCharWidth>0 THEN extra_width:=extra_width+maxCommCharWidth+COMMWIDTH
  355.  
  356.   -> Find the maximum length of the menu items, given the extra width
  357.   -> calculated above.
  358.   maxLength:=0
  359.   cur_item:=first_item
  360.   WHILE cur_item
  361.     itext:=cur_item.itemfill
  362.     total_textlen:=extra_width+itext.leftedge+
  363.                    TextLength(textRPort, itext.itext, StrLen(itext.itext))
  364.  
  365.     -> Returns the greater of the two
  366.     IF total_textlen>maxLength THEN maxLength:=total_textlen
  367.  
  368.     cur_item:=cur_item.nextitem
  369.   ENDWHILE
  370. ENDPROC maxLength
  371.  
  372. -> Set all IntuiText in a chain (they are linked through the nexttext field)
  373. -> to the same font.
  374. PROC setITextAttr(first_IText, textAttr)
  375.   DEF cur_IText:PTR TO intuitext
  376.   cur_IText:=first_IText
  377.   WHILE cur_IText
  378.     cur_IText.itextfont:=textAttr
  379.     cur_IText:=cur_IText.nexttext
  380.   ENDWHILE
  381. ENDPROC
  382.  
  383. -> Adjust the MenuItems and SubItems
  384. PROC adjustItems(textRPort, first_item, textAttr, char_size,
  385.                  height, level, left_edge)
  386.   DEF item_num, cur_item:PTR TO menuitem, strip_width, subitem_edge
  387.   IF first_item=NIL THEN RETURN
  388.  
  389.   -> The width of this strip is the maximum length of its members.
  390.   strip_width:=maxLength(textRPort, first_item, char_size)
  391.  
  392.   -> Position the items.
  393.   cur_item:=first_item
  394.   item_num:=0
  395.   WHILE cur_item
  396.     cur_item.topedge:=(item_num*height)-level
  397.     cur_item.leftedge:=left_edge
  398.     cur_item.width:=strip_width
  399.     cur_item.height:=height
  400.  
  401.     -> Place the sub_item 3/4 of the way over on the item
  402.     subitem_edge:=strip_width-(strip_width/4)
  403.  
  404.     setITextAttr(cur_item.itemfill, textAttr)
  405.     adjustItems(textRPort, cur_item.subitem, textAttr, char_size,
  406.                 height, 1, subitem_edge)
  407.  
  408.     cur_item:=cur_item.nextitem
  409.     INC item_num
  410.   ENDWHILE
  411. ENDPROC
  412.  
  413.  
  414. -> The following routines adjust an entire menu system to conform to the
  415. -> specified font's width and height.  Allows for Proportional Fonts.  This is
  416. -> necessary for a clean look regardless of what the users preference in Fonts
  417. -> may be.  Using these routines, you don't need to specify TopEdge, LeftEdge,
  418. -> Width or Height in the MenuItem structures.
  419. ->
  420. -> NOTE that this routine does not work for menus with images, but assumes that
  421. -> all menu items are rendered with IntuiText.
  422. ->
  423. -> This set of routines does NOT check/correct if the menu runs off the screen
  424. -> due to large fonts, too many items, lo-res screen.
  425. PROC adjustMenus(first_menu, textAttr) HANDLE
  426.   DEF textrp:PTR TO rastport, cur_menu:PTR TO menu, font=NIL:PTR TO textfont,
  427.       start, char_size, height
  428.  
  429.   -> E-Note: dynamically allocate a zeroed rastport (might raise exception)
  430.   NEW textrp
  431.  
  432.   -> Open the font
  433.   font:=OpenFont(textAttr)
  434.   SetFont(textrp, font)  -> Put font in to temporary RastPort
  435.  
  436.   char_size:=TextLength(textrp, 'n', 1)  -> Get the width of the font
  437.  
  438.   -> To prevent crowding of the Amiga key when using COMMSEQ, don't allow the
  439.   -> items to be less than 8 pixels high.  Also, add an extra pixel for
  440.   -> inter-line spacing.
  441.   height:=1+(IF font.ysize>8 THEN font.ysize ELSE 8)
  442.  
  443.   start:=2  -> Set Starting Pixel
  444.  
  445.   -> Step thru the menu structure and adjust it
  446.   cur_menu:=first_menu
  447.   WHILE cur_menu
  448.     cur_menu.leftedge:=start
  449.     cur_menu.width:=char_size+
  450.                     TextLength(textrp, cur_menu.menuname,
  451.                                StrLen(cur_menu.menuname))
  452.     adjustItems(textrp, cur_menu.firstitem, textAttr, char_size, height, 0, 0)
  453.     start:=start+cur_menu.width+(char_size*2)
  454.     cur_menu:=cur_menu.nextmenu
  455.   ENDWHILE
  456. EXCEPT DO
  457.   IF font THEN CloseFont(font)  -> Close the Font
  458.   -> E-Note: as C version ignores font error we'll ignore any NEW error...
  459.   RETURN exception=ERR_NONE
  460. ENDPROC
  461.