/* ** gaugeclass V0.9 by Tinic Urou ** ** Class implementation ** ** tested compilers: ** ** · DCC 2.6.2 ** · GCC 2.7.0 with libnix V1.0 (libnix is necessary!!) ** */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "gaugeclass.h" #define col_label 0 #define col_format 1 #define col_base 2 #define col_current 3 #define col_negative 4 #define col_bright 5 #define col_dark 6 #define col_bg 7 #define ind_centered 0 #define ind_left 1 #define ind_right 2 struct GaugeData { ULONG min; ULONG max; ULONG current; ULONG base; ULONG old_cur; ULONG old_bas; WORD labelpos; UBYTE fmtind; ULONG type; char *txtlbl; char *txtfmt; struct GAU_Color Colors[GAU_UsedColors]; BOOL Style3D; BOOL StyleBorder; BOOL StyleBackground; BOOL StyleShadowLabel; BOOL StyleNoGauge; BOOL StyleNoFormat; BOOL StyleNoBase; struct TextFont *textFont; ULONG Pens[GAU_UsedColors]; BOOL PorC[GAU_UsedColors]; BOOL InitNotDone; struct RastPort *nolock_rp; LONG histpos; WORD text_y; struct Locale *locale; char clocktxt[256]; char voltxt[64]; struct RastPort *bg_buffer; struct RastPort *wk_buffer; struct RastPort *hs_buffer; WORD clockpos; BOOL highlight; WORD oldclockx; WORD oldclockw; ULONG voltype; }; extern ULONG DoSuperMethodA( struct IClass *cl, Object *obj, Msg message ); extern ULONG DoMethod( Object *obj, unsigned long MethodID, ... ); extern ULONG HookEntry(); #ifdef __GNUC__ ULONG dispatchGaugeGadget(); #else static ULONG dispatchGaugeGadget(__a0 Class *cl,__a2 Object *o,__a1 Msg msg); #endif static ULONG renderGauge(Class *cl,struct Gadget *g, struct gpRender *msg); void SPrintf(STRPTR buffer, STRPTR format, ...); Class *initGaugeGadgetClass(void) { Class *cl; if( cl = (Class *)MakeClass( NULL, "gadgetclass", NULL, sizeof(struct GaugeData), 0) ) { cl->cl_Dispatcher.h_Entry = (ULONG(*)()) HookEntry; cl->cl_Dispatcher.h_SubEntry = (ULONG(*)()) dispatchGaugeGadget; return(cl); } return(0L); } BOOL freeGaugeGadgetClass( Class *cl ) { return FreeClass(cl); } struct TextAttr topaz_font = { "topaz.font", 8, 0, FPF_ROMFONT, }; struct TextFont *OpenTopaz() { return((struct TextFont *)OpenFont( &topaz_font)); } void SPrintf(STRPTR buffer, STRPTR format, ...) { struct Library *SysBase= *((void **)4L); RawDoFmt( format, (APTR)(&format+1), (void (*)())"\x16\xc0\x4E\x75", buffer); } int my_strlen(char s[]) { int i=0; while (s[i]!='\0')++i; return(i); } struct GAU_Color dummycol={ TRUE, 0, 0, 0 }; struct GAU_Color *GetGaugePen(WORD pen){ dummycol.red=pen; return(&dummycol); } GetGaugePenNew(struct gpRender *msg,struct GaugeData *inst,struct GAU_Color *col,ULONG number) { inst->PorC[number]= col->pen ? FALSE : TRUE; inst->Pens[number]= col->pen ? col->red : ObtainBestPenA(msg->gpr_GInfo->gi_Screen->ViewPort.ColorMap, col->red, col->green, col->blue, 0L); } ULONG newGauge(Class *cl,struct Gadget *g,struct gpRender *msg,struct GaugeData *inst) { struct TagItem *ti; ti = ((struct opSet *)msg)->ops_AttrList; if(inst->textFont = (struct TextFont *)GetTagData(GAU_TextFont,OpenTopaz(),ti)) { struct RastPort *dummy; if(dummy=(struct RastPort *)AllocVec(sizeof(struct RastPort),0L)) { InitRastPort(dummy); dummy->Font=inst->textFont; inst->min = GetTagData(GAU_Min, 0, ti); inst->max = GetTagData(GAU_Max, 65535L, ti); inst->current = GetTagData(GAU_Current,32162L, ti); inst->base = GetTagData(GAU_Base, 16384L, ti); inst->txtfmt = (char *)GetTagData(GAU_TextFormat, "%td", ti); inst->txtlbl = (char *)GetTagData(GAU_Label, "Gauge", ti); inst->labelpos = GetTagData(GAU_LabelPos,TextLength(dummy,inst->txtlbl,my_strlen(inst->txtlbl))+4, ti); inst->Style3D = GetTagData(GAU_3D, TRUE, ti); inst->StyleBorder = GetTagData(GAU_Border, TRUE, ti); inst->StyleBackground = GetTagData(GAU_Background, FALSE, ti); inst->StyleShadowLabel = GetTagData(GAU_ShadowLabel, FALSE, ti); inst->StyleNoGauge = GetTagData(GAU_NoGauge, FALSE, ti); inst->StyleNoFormat = GetTagData(GAU_NoFormat, FALSE, ti); inst->StyleNoBase = GetTagData(GAU_NoBase, FALSE, ti); inst->fmtind = GetTagData(GAU_FmtIndent, FALSE, ti); inst->type = GetTagData(GAU_Type, GAU_Type_gauge, ti); inst->voltype = GetTagData(GAU_VolType, 0L, ti); inst->locale = ( inst->type==GAU_Type_clock ) ? (struct Locale *)OpenLocale(NULL) : 0L ; CopyMem(GetTagData(GAU_ColLabel , GetGaugePen(2), ti), &inst->Colors[col_label],sizeof(struct GAU_Color)); CopyMem(GetTagData(GAU_ColFormat , GetGaugePen(2), ti), &inst->Colors[col_format],sizeof(struct GAU_Color)); CopyMem(GetTagData(GAU_ColBase , GetGaugePen(1), ti), &inst->Colors[col_base],sizeof(struct GAU_Color)); CopyMem(GetTagData(GAU_ColCurrent , GetGaugePen(3), ti), &inst->Colors[col_current],sizeof(struct GAU_Color)); CopyMem(GetTagData(GAU_ColNegative , GetGaugePen(1), ti), &inst->Colors[col_negative],sizeof(struct GAU_Color)); CopyMem(GetTagData(GAU_ColBrightEdg , GetGaugePen(2), ti), &inst->Colors[col_bright],sizeof(struct GAU_Color)); CopyMem(GetTagData(GAU_ColDarkEdg , GetGaugePen(1), ti), &inst->Colors[col_dark],sizeof(struct GAU_Color)); CopyMem(GetTagData(GAU_ColBackground, GetGaugePen(0), ti), &inst->Colors[col_bg],sizeof(struct GAU_Color)); inst->InitNotDone=TRUE; inst->highlight=TRUE; inst->oldclockw=0L; inst->oldclockx=0L; FreeVec(dummy); return((ULONG)g); } else return(0L); } else return(0L); } freeRPorts(struct GaugeData *inst) { if(inst->bg_buffer) { FreeBitMap(inst->bg_buffer->BitMap); FreeVec(inst->bg_buffer); inst->bg_buffer=0L; } if(inst->wk_buffer) { FreeBitMap(inst->wk_buffer->BitMap); FreeVec(inst->wk_buffer); inst->wk_buffer=0L; } if(inst->hs_buffer) { FreeBitMap(inst->hs_buffer->BitMap); FreeVec(inst->hs_buffer); inst->hs_buffer=0L; } } ULONG disposeGauge(Class *cl,struct Gadget *g,struct gpRender *msg) { CloseLocale(((struct GaugeData *)INST_DATA(cl,g))->locale); freeRPorts (INST_DATA(cl,g)); } ULONG getGauge(Class *cl,struct Gadget *g,struct gpRender *msg) { struct GaugeData *inst=INST_DATA(cl,g); switch (((struct opGet *)msg)->opg_AttrID) { case GAU_RPBackground: *(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->bg_buffer; break; case GAU_Base: *(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->base; break; case GAU_Current: *(((struct opGet *)msg)->opg_Storage)=(ULONG)inst->current; break; default: return((ULONG)FALSE); break; } return((ULONG)TRUE); } setGauge(Class *cl,struct Gadget *g,struct gpRender *msg) { struct TagItem *ti,*tstate=((struct opSet *)msg)->ops_AttrList; struct GaugeData *inst=INST_DATA(cl,g); struct RastPort *rp; ULONG t_data; while(ti=(struct TagItem *)NextTagItem(&tstate)) { t_data=(ULONG)ti->ti_Data; switch(ti->ti_Tag) { case GAU_Current: inst->current= (ULONG)t_data; break; case GAU_Base: inst->base= (ULONG)t_data; break; case GAU_Max: inst->max= (ULONG)t_data; break; case GAU_VolType: inst->voltype= (ULONG)t_data; break; } } if ( FindTagItem(GA_Width, ((struct opSet *)msg)->ops_AttrList) || FindTagItem(GA_Height, ((struct opSet *)msg)->ops_AttrList) || FindTagItem(GA_Top, ((struct opSet *)msg)->ops_AttrList) || FindTagItem(GA_Left, ((struct opSet *)msg)->ops_AttrList) ) { inst->highlight=TRUE; inst->InitNotDone=TRUE; freeRPorts(inst); } } UBYTE long_2_string_with_thousand(ULONG num, char output[], char point, BOOL negative) { char output_private[16]; char n = 0; char n_1 = 0; if(negative)output[n_1++]='-'; SPrintf(output_private,"%12ld",num); while(output_private[n]==0x20)n++; for(;(output_private[n]!=0)&(output_private[n]!=0x20);n++) { output[n_1++]=output_private[n]; if((n==2)||(n==5)||(n==8)) output[n_1++]=(char)point; } output[n_1]=0; return(n_1); } char *formattext(ULONG current, ULONG base, ULONG max, char format[], ULONG special) { int i=0, j=0; char temp_str_1[64]; BOOL negative; static char temp_str[256]; while(format[i]!=0) { if(format[i]=='%') { ULONG dummy=0; UBYTE dummy_2=0, dummy_1=0, dummy_3=0; i++; if(format[i]=='t'){dummy_2=1;i++;} if(format[i]=='T'){dummy_2=4;i++;} if(format[i]=='k'){dummy_1=1;i++;} if(format[i]=='m'){dummy_1=2;i++;} if(format[i]=='o'){dummy_3=1;i++;} if(format[i]=='%'){dummy_2=3;i++;} switch(format[i]) { case 'd': dummy=current; negative=FALSE; break; case 'b': dummy=base; negative=FALSE; break; case 'f': dummy = base>10; if(dummy_1==2)dummy=dummy>>20; switch(dummy_2) { case 4: dummy_2=long_2_string_with_thousand(dummy,&temp_str_1[0],'.',negative); for(dummy_1=0;dummy_1>8)*100)/((max>>8)+1))); else SPrintf(&temp_str_1[0],"%ld", (((dummy>>8)*100)/((max>>8)+1))); while ((temp_str_1[dummy_2] != 0)&(dummy_2<64)) temp_str[j++]=temp_str_1[dummy_2++]; break; case 0: dummy_2=0; if(negative) SPrintf(&temp_str_1[0],"-%ld",dummy); else SPrintf(&temp_str_1[0],"%ld", dummy); while ((temp_str_1[dummy_2] != 0)&(dummy_2<64)) temp_str[j++]=temp_str_1[dummy_2++]; break; case 3: temp_str[j++]='%'; break; case 5: if(special&0xFF000000)temp_str[j++]=(char)((special>>24)&0xFF); if(special&0x00FF0000)temp_str[j++]=(char)((special>>16)&0xFF); if(special&0x0000FF00)temp_str[j++]=(char)((special>>8) &0xFF); temp_str[j++]='\\'; temp_str[j++]=(char)( special &0xFF)+0x30; break; } } else temp_str[j++]=format[i++]; } temp_str[j++]=0; return(temp_str); } void draw_border_new( struct RastPort *rp,ULONG x, ULONG y, ULONG width, ULONG height, int b_col1, int b_col2 ) { width--;height--; SetAPen(rp,b_col2); RectFill(rp,x+width,y+1,x+width,y+height); RectFill(rp,x,y+height,x+width,y+height); SetAPen(rp,b_col1); RectFill(rp,x,y,x,y+height-1); RectFill(rp,x,y,x+width-1,y); } my_RectFill(struct RastPort *rp,WORD x,WORD y,WORD width,WORD height) { if(((x+width)>1)&&((y+height)>1)) RectFill(rp,x,y,x+width-1,y+height-1); } putChar_hook(struct Hook *hook,struct Locale *locale,ULONG thechar) { struct GaugeData *data; geta4(); data=(struct GaugeData *)hook->h_Data; data->clocktxt[data->clockpos++]=(UBYTE)(thechar); } struct Hook putCharHook = { { 0,0 },(void *)HookEntry,(void *)putChar_hook, NULL }; my_Blit(struct RastPort *src, WORD topx, WORD topy, struct RastPort *dest, WORD dtopx, WORD dtopy, WORD width, WORD height) { ClipBlit(src,topx,topy,dest,dtopx,dtopy,width,height,0xC0); } char *getSTR(struct GaugeData *inst) { switch (inst->current-inst->max) { case GAU_err_busy: return("Disk is busy"); case GAU_err_notmount: return("Not mounted"); case GAU_err_notpresent: return("No disk present"); case GAU_err_unreadable: return("Disk unreadable"); case GAU_err_nodos: return("No DOS format"); case GAU_err_notavail: return("n.a."); case GAU_err_kickstart: return("Kickstart disk"); break; default: return(formattext(inst->current,inst->base,inst->max,inst->txtfmt,inst->voltype)); } } ULONG renderGauge(Class *cl,struct Gadget *g,struct gpRender *msg) { struct RastPort *rp; struct BitMap *work_bm; struct RastPort *wk_rp,*bg_rp,*hs_rp; struct GaugeData *inst=INST_DATA(cl,g); struct DateStamp d_stamp; WORD text_x,w,h; WORD x1,x2,g_x,g_size,g_height,t_length; char *fmt,*mlm; LONG max; if(rp = ( msg->MethodID == GM_RENDER ) ? msg->gpr_RPort : (struct RastPort *) ObtainGIRPort(msg->gpr_GInfo) ) { if(inst->InitNotDone) { if(work_bm=(struct BitMap *)AllocBitMap(g->Width,g->Height+2,rp->BitMap->Depth,BMF_CLEAR,rp->BitMap)) { if(inst->bg_buffer=(struct RastPort *)AllocVec(sizeof(struct RastPort)+8,MEMF_CLEAR|MEMF_PUBLIC)) { InitRastPort(inst->bg_buffer); inst->bg_buffer->BitMap=work_bm; my_Blit(rp,g->LeftEdge,g->TopEdge,inst->bg_buffer,0,0,g->Width,g->Height); } else { FreeBitMap(work_bm); return(0L); } } else return(0L); if(work_bm=(struct BitMap *)AllocBitMap(g->Width,g->Height+2,rp->BitMap->Depth,BMF_CLEAR,inst->bg_buffer->BitMap)) { if(inst->wk_buffer=(struct RastPort *)AllocVec(sizeof(struct RastPort)+8,MEMF_CLEAR|MEMF_PUBLIC)) { InitRastPort(inst->wk_buffer); inst->wk_buffer->BitMap=work_bm; inst->text_y=((g->Height-((inst->textFont->tf_Baseline+inst->textFont->tf_YSize)>>1))>>1); if(inst->textFont->tf_BaselinetextFont->tf_YSize) { inst->text_y+=inst->textFont->tf_Baseline-1; if(inst->text_ytextFont->tf_Baseline)inst->text_y=inst->textFont->tf_Baseline; } else { inst->text_y+=inst->textFont->tf_YSize-1; if(inst->text_ytextFont->tf_YSize) inst->text_y=inst->textFont->tf_YSize; } SetDrMd(inst->wk_buffer,JAM1); SetFont(inst->wk_buffer,inst->textFont); } else { FreeBitMap(work_bm); return(0L); } } else return(0L); for(w=0;wColors[w],w); if(inst->type==GAU_Type_histmeter) { if(work_bm=(struct BitMap *)AllocBitMap(g->Width,g->Height+2,rp->BitMap->Depth,BMF_CLEAR,inst->wk_buffer->BitMap)) { if(inst->hs_buffer=(struct RastPort *)AllocVec(sizeof(struct RastPort)+8,MEMF_CLEAR|MEMF_PUBLIC)) { inst->histpos=0; InitRastPort(inst->hs_buffer); inst->hs_buffer->BitMap=work_bm; SetAPen(inst->hs_buffer,inst->Pens[col_bg]); if(inst->StyleBackground) { my_Blit(inst->bg_buffer,0,0,inst->hs_buffer,0,0,g->Width,g->Height); } else { my_RectFill(inst->hs_buffer,0,0,g->Width,g->Height); } } else { FreeBitMap(work_bm); return(0L); } } else return(0L); } inst->old_cur=-1; inst->old_bas=-1; inst->InitNotDone=FALSE; } wk_rp=inst->wk_buffer; bg_rp=inst->bg_buffer; switch (inst->type) { case GAU_Type_gauge: w=g->Width; h=g->Height; max=inst->max>>8; if((inst->current!=inst->old_cur)||(inst->base!=inst->old_bas)) { inst->old_cur=inst->current; inst->old_bas=inst->base; if(inst->highlight) { SetDrMd(bg_rp,JAM1); SetFont(bg_rp,inst->textFont); if(inst->StyleBorder)draw_border_new(bg_rp,inst->labelpos,0,w-inst->labelpos,g->Height,inst->Pens[col_dark],inst->Pens[col_bright]); if(inst->StyleShadowLabel) { SetAPen(bg_rp,inst->Pens[col_dark]); Move(bg_rp,1,inst->text_y+1); Text(bg_rp,inst->txtlbl,my_strlen(inst->txtlbl)); } SetAPen(bg_rp,inst->Pens[col_label]); Move(bg_rp,0,inst->text_y); Text(bg_rp,inst->txtlbl,my_strlen(inst->txtlbl)); inst->highlight=FALSE; } my_Blit(bg_rp,0,0,wk_rp,0,0,w,h); g_x=1+inst->labelpos; g_size=w-inst->labelpos-2; g_height=h-2; if((!inst->StyleNoGauge)&&(inst->currentmax)) { x1=g_size-(WORD)(((inst->base>>8) *g_size)/((max)==0 ? 1 : (max))); x2=g_size-(WORD)(((inst->current>>8)*g_size)/((max)==0 ? 1 : (max))); if(!inst->StyleNoBase) { if(x1Pens[col_base]); my_RectFill(wk_rp,g_x,1,x1,g_height); SetAPen(wk_rp,inst->Pens[col_current]); my_RectFill(wk_rp,g_x+x1,1,x2-x1,g_height); if(!inst->StyleBackground) { SetAPen(wk_rp,inst->Pens[col_bg]); my_RectFill(wk_rp,g_x+x2,1,g_size-x2,g_height); } if(inst->Style3D) { if(x1>1) draw_border_new(wk_rp,g_x,1,x1,g_height,inst->Pens[col_bright],inst->Pens[col_dark]); if(x2-x1>1)draw_border_new(wk_rp,g_x+x1,1,x2-x1,g_height,inst->Pens[col_bright],inst->Pens[col_dark]); } } else if(x1>x2) { SetAPen(wk_rp,inst->Pens[col_base]); my_RectFill(wk_rp,g_x,1,x2,g_height); SetAPen(wk_rp,inst->Pens[col_negative]); my_RectFill(wk_rp,g_x+x2,1,x1-x2,g_height); if(!inst->StyleBackground) { SetAPen(wk_rp,inst->Pens[col_bg]); my_RectFill(wk_rp,g_x+x1,1,g_size-x1,g_height); } if(inst->Style3D) { if(x2>1) draw_border_new(wk_rp,g_x,1,x2,g_height,inst->Pens[col_bright],inst->Pens[col_dark]); if(x1-x2>1)draw_border_new(wk_rp,g_x+x2,1,x1-x2,g_height,inst->Pens[col_bright],inst->Pens[col_dark]); } } else { SetAPen(wk_rp,inst->Pens[col_base]); my_RectFill(wk_rp,g_x,1,x1,g_height); if(!inst->StyleBackground) { SetAPen(wk_rp,inst->Pens[col_bg]); my_RectFill(wk_rp,g_x+x1,1,g_size-x1,g_height); } if((inst->Style3D)&&(x1>1))draw_border_new(wk_rp,g_x,1,x1,g_height,inst->Pens[col_bright],inst->Pens[col_dark]); } } else { SetAPen(wk_rp,inst->Pens[col_current]); my_RectFill(wk_rp,g_x,1,x2,g_height); if(!inst->StyleBackground) { SetAPen(wk_rp,inst->Pens[col_bg]); my_RectFill(wk_rp,g_x+x2,1,g_size-x2,g_height); } if(inst->Style3D) draw_border_new(wk_rp,g_x,1,x2,g_height,inst->Pens[col_bright],inst->Pens[col_dark]); } } if(!inst->StyleNoFormat) { fmt=getSTR(inst); SetAPen(wk_rp,inst->Pens[col_format]); t_length=TextLength(wk_rp,fmt,my_strlen(fmt)); if(t_length<(w-inst->labelpos-1)) { switch(inst->fmtind) { case ind_centered: text_x=g_x+((g_size-t_length)>>1); break; case ind_left: text_x=g_x+2; break; case ind_right: text_x=w-t_length-3; break; } Move(wk_rp,text_x,inst->text_y); Text(wk_rp,fmt,my_strlen(fmt)); } } my_Blit(wk_rp,0,0,rp,g->LeftEdge,g->TopEdge,w,h); } break; case GAU_Type_histmeter: max=inst->max>>8; w=g->Width; h=g->Height; g_size=h-2; hs_rp=inst->hs_buffer; if((!inst->StyleNoGauge)&&(inst->currentmax)) { x1=(WORD)(((inst->base >>8)*(g_size-1))/((max)==0 ? 1 : (max)))+1; x2=(WORD)(((inst->current>>8)*(g_size-1))/((max)==0 ? 1 : (max)))+1; inst->histpos++; if(inst->histpos>w-3) { WORD dummy; dummy=w-(w>>1)-2; SetAPen(hs_rp,inst->Pens[col_bg]); my_Blit(hs_rp,w>>1,0,hs_rp,0,0,dummy,h); if(inst->StyleBackground) { my_Blit(inst->bg_buffer,dummy,0,inst->hs_buffer,dummy,0,w-dummy,h); } else { RectFill(hs_rp,dummy,0,w,h); } inst->histpos=dummy; } if(!inst->StyleNoBase) { SetAPen(hs_rp,inst->Pens[col_base]); if(x1>x2) { RectFill(hs_rp,inst->histpos,x1,inst->histpos,g_size); SetAPen(hs_rp,inst->Pens[col_current]); RectFill(hs_rp,inst->histpos,x2,inst->histpos,x1); } else if(x1histpos,x1,inst->histpos,g_size); SetAPen(hs_rp,inst->Pens[col_negative]); RectFill(hs_rp,inst->histpos,x1,inst->histpos,x2); } else { RectFill(hs_rp,inst->histpos,x1,inst->histpos,g_size); } } else { SetAPen(hs_rp,inst->Pens[col_current]); RectFill(hs_rp,inst->histpos,x2,inst->histpos,g_size); } my_Blit(hs_rp,0,0,wk_rp,0,0,w,h); } if(inst->StyleBorder)draw_border_new(wk_rp,0,0,w,h,inst->Pens[col_dark],inst->Pens[col_bright]); if(!inst->StyleNoFormat) { fmt=getSTR(inst); SetAPen(wk_rp,inst->Pens[col_format]); t_length=TextLength(wk_rp,fmt,my_strlen(fmt)); if(t_lengthfmtind) { case ind_centered: text_x=((w-t_length)>>1); break; case ind_left: text_x=2; break; case ind_right: text_x=w-t_length-2; break; } Move(wk_rp,text_x,h-3); Text(wk_rp,fmt,my_strlen(fmt)); } } my_Blit(wk_rp,0,0,rp,g->LeftEdge,g->TopEdge,w,h); break; case GAU_Type_clock: w=g->Width-1; h=g->Height; DateStamp(&d_stamp); inst->clockpos=0; putCharHook.h_Data=inst; FormatDate(inst->locale,inst->txtfmt,&d_stamp,&putCharHook); if((t_length=TextLength(wk_rp,&inst->clocktxt[0],my_strlen(&inst->clocktxt[0])))fmtind) { case ind_centered: text_x=(w-t_length)>>1; break; case ind_left: text_x=0; break; case ind_right: text_x=w-t_length-1; break; } if(inst->oldclockw>t_length) { my_Blit(bg_rp,inst->oldclockx,0,wk_rp,inst->oldclockx,0,inst->oldclockw,h); } else { my_Blit(bg_rp,text_x,0,wk_rp,text_x,0,t_length,h); } if(inst->StyleShadowLabel) { SetAPen(wk_rp,inst->Pens[col_dark]); Move(wk_rp,text_x+1,inst->text_y+1); Text(wk_rp,&inst->clocktxt[0],my_strlen(&inst->clocktxt[0])); } SetAPen(wk_rp,inst->Pens[col_format]); Move(wk_rp,text_x,inst->text_y); Text(wk_rp,&inst->clocktxt[0],my_strlen(&inst->clocktxt[0])); if(inst->oldclockw>t_length) { my_Blit(wk_rp,inst->oldclockx,0,rp,g->LeftEdge+inst->oldclockx,g->TopEdge,inst->oldclockw,h); } else { my_Blit(wk_rp,text_x,0,rp,g->LeftEdge+text_x,g->TopEdge,t_length,h); } inst->oldclockx=text_x; inst->oldclockw=t_length; } break; } if(msg->MethodID !=GM_RENDER) ReleaseGIRPort(rp); return(TRUE); } else return(FALSE); } #ifdef __GNUC__ ULONG dispatchGaugeGadget(Class *cl,Object *o, Msg msg) #else __geta4 ULONG dispatchGaugeGadget(__a0 Class *cl,__a2 Object *o,__a1 Msg msg) #endif { #ifdef __GNUC__ geta4(); #endif switch( msg->MethodID ) { case OM_SET: setGauge(cl,(struct Gadget *)o,(struct gpRender *)msg); return(DoSuperMethodA(cl,o,msg)); case GM_RENDER: return(renderGauge(cl,(struct Gadget *)o,(struct gpRender *)msg)); case OM_NEW: if(o = (Object *)DoSuperMethodA(cl, o, msg) ) return(newGauge(cl,(struct Gadget *)o,(struct gpRender *)msg,INST_DATA(cl, o))); else return(0L); case OM_GET: return(getGauge(cl,(struct Gadget *)o,(struct gpRender *)msg)); case OM_DISPOSE: disposeGauge(cl,(struct Gadget *)o,(struct gpRender *)msg); default: return(DoSuperMethodA(cl,o,msg)); } }