Contents page

Rules for Tools/ScrollingPopUpMenu()


ScrollingPopUpMenu()
SYNOPSIS
     APTR ScrollingPopUpMenu(struct Screen screen, APTR list,
                        void (*drawroutine)(),
                        short height, short width, short number)

ARGUMENTS
    `struct Screen *screen'
          Screen to open menu in.

    `APTR list'
          Linked list of your structures.

    `void (*drawroutine)()'
          Routine to draw one list item.

    `short height'
          Pixel height of one item.

    `short width'
          Pixel width of one item.

    `short number'
          Length of displayed list.

DESCRIPTION
     Call `ScrollingPopUpMenu()' whenever the user must select an item
     from a variable length linked list.  Provide
     `ScrollingPopUpMenu()' with `screen', a pointer to the screen
     (`functions->screen') will do,) list, a pointer to the top of your
     linked list, `drawroutine', a routine that draws one list item,
     the `height' and `width' of a displayed list item, and `number',
     the maximimum number of items to display at one time in the list
     (the rest will be hidden under the scroll bars.)
     `ScrollingPopUpMenu()' returns a pointer to the list item the user
     selects or 0, if they don't choose anything.

     drawroutine is passed three parameters: the rastport to draw in,
     the list item to draw, and the y coordinate of the list item
     within the rastport.  The x coordinate is not needed because it is
     always 0.

     Here's an example drawroutine that displays the value of a MIDI
     note Event:

drawroutine(rastport,item,y) 
struct RastPort *rastport;      /* Rastport to draw in. */ 
struct NoteEvent *item;         /* Linked list item to draw. */ 
short y; /* Top edge. */ 
{
    char text[50];
    sprintf(text,"%ld",item->value);
    SetAPen(rastport,6);
    SetDrMd(rastport,JAM1);
    Move(rastport,2,y+6);
    Text(rastport,text,strlen(text)); 
}

     We can use the above routine to let the user select from a list of
     MIDI Note Events:

  struct NoteEvent  *list;
  struct NoteEvent  *choice;

  choice = (struct NoteEvent  *)(*functions->ScrollingPopUpMenu)
                       (functions->screen,list,drawroutine,8,40,10);