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 >
Wrap
C/C++ Source or Header
|
1990-10-11
|
3KB
|
88 lines
/* 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);}