home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
199.lha
/
GimmeLib
/
requester.c
< prev
next >
Wrap
C/C++ Source or Header
|
1988-12-27
|
5KB
|
184 lines
/*
* FILE: requester.c
* Support routines for putting up an Auto Request or creating a Requester.
*
* Public Domain, but keep my name in it as the original author.
* 31-Aug-88 Jan Sven Trabandt first release version
* 31-Oct-88 Jan Sven Trabandt added more functionality to gimmeRequester
*/
#define I_AM_REQUESTER
#include <clib/macros.h>
#include "gimmelib/gimmefuncs.h"
#include "gimmelib/requester.h"
#include "gimmelib/macros.h"
extern struct GfxBase *GfxBase;
SHORT gimmeAutoRequest( window, s, textattr )
struct Window *window;
UBYTE *s;
struct TextAttr *textattr;
{
struct IntuiText itext, ptext, ntext;
SHORT xsize, ysize, width;
if( !s ) {
s = (UBYTE *) GAR_DUMMY_TEXT;
}
itext.FrontPen = AUTOFRONTPEN;
itext.BackPen = AUTOBACKPEN;
itext.DrawMode = AUTODRAWMODE;
itext.LeftEdge = AUTOLEFTEDGE;
itext.TopEdge = AUTOTOPEDGE;
itext.ITextFont = textattr;
itext.IText = s;
itext.NextText = AUTONEXTTEXT;
ptext = itext; /* struct copy */
ntext = itext; /* struct copy */
ptext.IText = gimAutReqPostext;
ntext.IText = gimAutReqNegtext;
xsize = 0;
if( textattr ) {
ysize = textattr->ta_YSize;
} else if( window ) {
ysize = window->RPort->TxHeight;
xsize = window->RPort->TxWidth;
} else {
ysize = GfxBase->DefaultFont->tf_YSize;
}
if( !xsize ) {
xsize = GfxBase->DefaultFont->tf_XSize;
}
width = MAX(IntuiTextLength(&itext),
IntuiTextLength(&ptext) + IntuiTextLength(&ntext) + 3*xsize);
return (
AutoRequest( window, &itext, &ptext, &ntext, ENDGADGET, ENDGADGET,
(ULONG) width + xsize * GAR_BORDER_WIDTH,
(ULONG) ysize * GAR_HEIGHT )
);
} /* gimmeAutoRequest */
#define XLEEWAY 8 /* border space */
#define YLEEWAY 4
#define MIN_WIDTH 50 /* minimum dimensions if calculating dimension(s) */
#define MIN_HEIGHT 20 /* not counting y leeways */
struct Requester *gimmeRequester( mh, left, top, width, height, backfill,
gp, s, textattr, flags )
void **mh;
SHORT left, top;
SHORT width, height;
UBYTE backfill;
struct Gadget *gp;
UBYTE *s;
struct TextAttr *textattr;
ULONG flags;
{
register struct Requester *req;
register struct Border *bp;
struct Gadget *gadg;
SHORT len, extra;
void *mymh = NULL;
GUESS
QUIF( !mh );
req = chainAllocMem( &mymh, (ULONG)sizeof(struct Requester),
MEMF_PUBLIC | MEMF_CLEAR );
QUIF( !req );
if( flags & POINTREL ) {
req->RelLeft = left;
req->RelTop = top;
}
req->LeftEdge = left;
req->TopEdge = top;
req->ReqGadget = gp;
req->ReqText = gimmeIntuiText( &mymh, s != NULL ? s : (UBYTE *)"",
textattr, 0 );
QUIF( !req->ReqText );
req->ReqText->TopEdge = YLEEWAY;
req->ReqText->LeftEdge = XLEEWAY;
req->ReqText->BackPen = backfill;
req->Flags = flags;
req->BackFill = backfill;
if( width <= 0 ) {
width = IntuiTextLength( req->ReqText );
extra = 0;
for( gadg = gp; gadg; gadg = gadg->NextGadget ) {
if( gadg->Flags & GRELRIGHT ) {
len = -gadg->LeftEdge;
} else {
len = gadg->LeftEdge;
}
if( !(gadg->Flags & GRELWIDTH) ) {
len += gadg->Width;
}
if( len > width ) {
width = len;
} else if( gadg->Activation & (RIGHTBORDER | LEFTBORDER) ) {
if( len > extra ) {
extra = gadg->Width;
}
}
} /* for */
width += extra + XLEEWAY;
if( width <= 0 ) {
width = MIN_WIDTH;
}
}
req->Width = width;
if( height <= 0 ) {
if( textattr ) {
height = textattr->ta_YSize;
} else {
height = MIN_HEIGHT;
}
extra = 0;
for( gadg = gp; gadg; gadg = gadg->NextGadget ) {
if( gadg->Flags & GRELBOTTOM ) {
len = -gadg->TopEdge;
} else {
len = gadg->TopEdge;
}
if( !(gadg->Flags & GRELHEIGHT) ) {
len += gadg->Height;
}
if( len > height ) {
height = len;
} else if( gadg->Activation & (BOTTOMBORDER | TOPBORDER) ) {
if( len > extra ) {
extra = gadg->Height;
}
}
} /* for */
height += extra + YLEEWAY;
}
req->Height = height;
bp = gimmeBorder( &mymh, width - 4, height - 2 );
if( bp ) {
bp->LeftEdge = 2;
bp->TopEdge = 1;
bp->FrontPen = ~backfill;
req->ReqBorder = bp;
/* double thickness vertical lines */
bp = gimmeBorder( &mymh, width - 6, height - 2 );
if( bp ) {
bp->LeftEdge = 3;
bp->TopEdge = 1;
bp->FrontPen = ~backfill;
req->ReqBorder->NextBorder = bp;
}
}
linkChainMem( mh, mymh );
return( req );
ENDGUESS
if( mymh ) {
chainFreeMem( mymh );
}
return( NULL );
} /* gimmeRequester */