home *** CD-ROM | disk | FTP | other *** search
- /* Menu.c - Amiga specific menu routines */
- /* from Kickstart #6 by T.P. Bunce of 2am Software */
- /* Additions to XLISP-STAT 2.1 Copyright (c) 1990, by Luke Tierney */
- /* Additions to Xlisp 2.1, Copyright (c) 1989 by David Michael Betz */
- /* You may give out copies of this software; for conditions see the */
- /* file COPYING included with this distribution. */
-
-
- #include <proto/intuition.h>
- #include <string.h>
- #include "autil2.h"
-
- #define NL 0
-
- struct MenuItem *BuildMenu(SM,GenericFlags,GenericMI,GenericIT)
- struct SuperMenuItem SM[];
- UWORD GenericFlags;
- struct MenuItem *GenericMI;
- struct IntuiText *GenericIT;{
- static struct IntuiText DefIT={0,1,JAM2};
- static struct MenuItem DefMI={NL,2,0,2,8,ITEMTEXT|HIGHCOMP|ITEMENABLED};
- register struct SuperMenuItem *SMI=NULL;
- register UWORD i=0;
- UWORD CurBot=0;
- UWORD MaxWidth=0;
- UWORD MaxLeft=0;
- BOOL ComSeq=FALSE;
- BOOL Checkit=FALSE;
- if(GenericMI==NULL)GenericMI=&DefMI;
- if(GenericIT==NULL)GenericIT=&DefIT;
- for(SMI=&SM[0],i=0;SMI->ItemNum!=(UWORD)-1;i++,SMI++){
- if(SMI->ItemNum!=i){
- SM[0].ItemNum=i;
- return(NULL);}
- SMI->MItem=*GenericMI;
- SMI->IText=*GenericIT;
- SMI->MItem.Flags|=SMI->SetFlags|GenericFlags;
- SMI->MItem.Flags&=~SMI->ClrFlags;
- Checkit=(CHECKIT&SMI->MItem.Flags);
- if(SMI->SubItems)
- SMI->MItem.SubItem=BuildMenu(SMI->SubItems,GenericFlags,GenericMI,GenericIT);
- SMI->MItem.Command=SMI->CmndChar;
- if(SMI->CmndChar){
- SMI->MItem.Flags|=COMMSEQ;
- ComSeq=TRUE;}
- SMI->MItem.TopEdge=CurBot;
- CurBot+=1+SMI->MItem.Height;
- SMI->MItem.NextItem=&SM[i+1].MItem;
- SMI->MItem.ItemFill=(APTR)&SMI->IText;
- SMI->IText.IText=(UBYTE*)SMI->Text;
- SMI->MItem.Width=IntuiTextLength(&SMI->IText)+4;
- if(SMI->MItem.Width>MaxWidth)MaxWidth=SMI->MItem.Width;
- if(SMI->MItem.LeftEdge>MaxLeft)MaxLeft=SMI->MItem.LeftEdge;}
- if(ComSeq)MaxWidth+=COMMWIDTH+10;
- if(Checkit){
- MaxWidth+=(ComSeq)?CHECKWIDTH+COMMWIDTH:CHECKWIDTH;
- MaxLeft+=CHECKWIDTH;}
- for(SMI=&SM[0];SMI->ItemNum!=(UWORD)-1;++SMI){
- SMI->IText.LeftEdge=MaxLeft;
- SMI->MItem.Width=MaxWidth;}
- SM[--i].MItem.NextItem=NULL;
- return(&SM[0].MItem);}
-
- struct Menu *BuildMenuStrip(MS,PixPerChar)
- struct SuperMenu MS[];
- UWORD PixPerChar;{
- register struct SuperMenu *SMM=NULL;
- register UWORD i=0;
- UWORD CurLeft=0;
- UWORD Width=0;
- struct MenuItem *Items=NULL,*BuildMenu();
- for(SMM=&MS[0],i=0;SMM->MenuNum!=(UWORD)-1;i++,SMM++){
- if(SMM->MenuNum!=i){
- MS[0].MenuNum=i;
- return(NULL);}
- SMM->Menu.NextMenu=&MS[i+1].Menu;
- SMM->Menu.Flags=SMM->SetFlags|MENUENABLED;
- SMM->Menu.Flags&=~SMM->ClrFlags;
- SMM->Menu.MenuName=SMM->Title;
- SMM->Menu.LeftEdge=CurLeft;
- CurLeft+=(Width=strlen(SMM->Title)*PixPerChar+PixPerChar);
- SMM->Menu.Width=Width;
- Items=BuildMenu(SMM->Items,SMM->ItemFlags,SMM->GenMItem,SMM->GenIText);
- if(Items==NULL)return(NULL);
- SMM->Menu.FirstItem=Items;}
- MS[--i].Menu.NextMenu=NULL;
- return(&MS[0].Menu);}
-