home *** CD-ROM | disk | FTP | other *** search
/ Fish 'n' More 2 / fishmore-publicdomainlibraryvol.ii1991xetec.iso / fish / applications / xlispstat / src / src1.lzh / Amiga / menu.c < prev    next >
C/C++ Source or Header  |  1990-10-11  |  3KB  |  88 lines

  1. /* Menu.c - Amiga specific menu routines                               */
  2. /* from Kickstart #6 by T.P. Bunce of 2am Software                     */
  3. /* Additions to XLISP-STAT 2.1 Copyright (c) 1990, by Luke Tierney     */
  4. /* Additions to Xlisp 2.1, Copyright (c) 1989 by David Michael Betz    */
  5. /* You may give out copies of this software; for conditions see the    */
  6. /* file COPYING included with this distribution.                       */
  7.  
  8.  
  9. #include <proto/intuition.h>
  10. #include <string.h>
  11. #include "autil2.h"
  12.  
  13. #define NL 0
  14.  
  15. struct MenuItem *BuildMenu(SM,GenericFlags,GenericMI,GenericIT)
  16. struct SuperMenuItem SM[];
  17. UWORD GenericFlags;
  18. struct MenuItem *GenericMI;
  19. struct IntuiText *GenericIT;{
  20.    static struct IntuiText DefIT={0,1,JAM2};
  21.    static struct MenuItem DefMI={NL,2,0,2,8,ITEMTEXT|HIGHCOMP|ITEMENABLED};
  22.    register struct SuperMenuItem *SMI=NULL;
  23.    register UWORD i=0;
  24.    UWORD CurBot=0;
  25.    UWORD MaxWidth=0;
  26.    UWORD MaxLeft=0;
  27.    BOOL ComSeq=FALSE;
  28.    BOOL Checkit=FALSE;
  29.    if(GenericMI==NULL)GenericMI=&DefMI;
  30.    if(GenericIT==NULL)GenericIT=&DefIT;
  31.    for(SMI=&SM[0],i=0;SMI->ItemNum!=(UWORD)-1;i++,SMI++){
  32.       if(SMI->ItemNum!=i){
  33.          SM[0].ItemNum=i;
  34.          return(NULL);}
  35.       SMI->MItem=*GenericMI;
  36.       SMI->IText=*GenericIT;
  37.       SMI->MItem.Flags|=SMI->SetFlags|GenericFlags;
  38.       SMI->MItem.Flags&=~SMI->ClrFlags;
  39.       Checkit=(CHECKIT&SMI->MItem.Flags);
  40.       if(SMI->SubItems)
  41.          SMI->MItem.SubItem=BuildMenu(SMI->SubItems,GenericFlags,GenericMI,GenericIT);
  42.       SMI->MItem.Command=SMI->CmndChar;
  43.       if(SMI->CmndChar){
  44.          SMI->MItem.Flags|=COMMSEQ;
  45.          ComSeq=TRUE;}
  46.       SMI->MItem.TopEdge=CurBot;
  47.       CurBot+=1+SMI->MItem.Height;
  48.       SMI->MItem.NextItem=&SM[i+1].MItem;
  49.       SMI->MItem.ItemFill=(APTR)&SMI->IText;
  50.       SMI->IText.IText=(UBYTE*)SMI->Text;
  51.       SMI->MItem.Width=IntuiTextLength(&SMI->IText)+4;
  52.       if(SMI->MItem.Width>MaxWidth)MaxWidth=SMI->MItem.Width;
  53.       if(SMI->MItem.LeftEdge>MaxLeft)MaxLeft=SMI->MItem.LeftEdge;}
  54.    if(ComSeq)MaxWidth+=COMMWIDTH+10;
  55.    if(Checkit){
  56.       MaxWidth+=(ComSeq)?CHECKWIDTH+COMMWIDTH:CHECKWIDTH;
  57.       MaxLeft+=CHECKWIDTH;}
  58.    for(SMI=&SM[0];SMI->ItemNum!=(UWORD)-1;++SMI){
  59.       SMI->IText.LeftEdge=MaxLeft;
  60.       SMI->MItem.Width=MaxWidth;}
  61.    SM[--i].MItem.NextItem=NULL;
  62.    return(&SM[0].MItem);}
  63.  
  64. struct Menu *BuildMenuStrip(MS,PixPerChar)
  65. struct SuperMenu MS[];
  66. UWORD PixPerChar;{
  67.    register struct SuperMenu *SMM=NULL;
  68.    register UWORD i=0;
  69.    UWORD CurLeft=0;
  70.    UWORD Width=0;
  71.    struct MenuItem *Items=NULL,*BuildMenu();
  72.    for(SMM=&MS[0],i=0;SMM->MenuNum!=(UWORD)-1;i++,SMM++){
  73.       if(SMM->MenuNum!=i){
  74.          MS[0].MenuNum=i;
  75.          return(NULL);}
  76.       SMM->Menu.NextMenu=&MS[i+1].Menu;
  77.       SMM->Menu.Flags=SMM->SetFlags|MENUENABLED;
  78.       SMM->Menu.Flags&=~SMM->ClrFlags;
  79.       SMM->Menu.MenuName=SMM->Title;
  80.       SMM->Menu.LeftEdge=CurLeft;
  81.       CurLeft+=(Width=strlen(SMM->Title)*PixPerChar+PixPerChar);
  82.       SMM->Menu.Width=Width;
  83.       Items=BuildMenu(SMM->Items,SMM->ItemFlags,SMM->GenMItem,SMM->GenIText);
  84.       if(Items==NULL)return(NULL);
  85.       SMM->Menu.FirstItem=Items;}
  86.    MS[--i].Menu.NextMenu=NULL;
  87.    return(&MS[0].Menu);}
  88.