/* ** Clickable URL Class */ #include "include/config.h" #include #include "include/mui.h" #include #include #include "include/url.h" struct Library *OpenURLBase; ULONG url_new(struct IClass *cl, Object *obj, struct opSet *msg); ULONG url_setup(struct IClass *cl, Object *obj, Msg msg); ULONG url_minmax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg); ULONG url_draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg); ULONG url_cleanup(struct IClass *cl, Object *obj, Msg msg); ULONG url_clicked(struct IClass *cl, Object *obj, Msg msg); MUIF url_dispatch(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg) { switch(msg->MethodID) { case OM_NEW: return(url_new(cl,obj,(APTR)msg)); case MUIM_Setup: return(url_setup(cl,obj,(APTR)msg)); case MUIM_AskMinMax: return(url_minmax(cl,obj,(APTR)msg)); case MUIM_Draw: return(url_draw(cl,obj,(APTR)msg)); case MUIM_Cleanup: return(url_cleanup(cl,obj,(APTR)msg)); case URL_CLICKED: return(url_clicked(cl,obj,(APTR)msg)); } return(DoSuperMethodA(cl,obj,msg)); } ULONG url_new(struct IClass *cl, Object *obj, struct opSet *msg) { struct urldata *data; char *name, *href; /* char *help;*/ name = (char *)GetTagData(URL_NAME,0,msg->ops_AttrList); href = (char *)GetTagData(URL_HREF,0,msg->ops_AttrList); /* help = (char *)GetTagData(URL_HELP,0,msg->ops_AttrList);*/ obj = (Object *)DoSuperNew(cl,obj, MUIA_Font, MUIV_Font_Button, MUIA_ShowSelState, FALSE, MUIA_InputMode, MUIV_InputMode_RelVerify, /* MUIA_ShortHelp, help, */ TAG_MORE, msg->ops_AttrList); if(!obj) return(NULL); data = INST_DATA(cl,obj); data->name = name; data->href = href; data->len = strlen(name); data->color = -1; DoMethod(obj,MUIM_Notify,MUIA_Pressed,FALSE,obj,1,URL_CLICKED); return((ULONG)obj); } ULONG url_setup(struct IClass *cl, Object *obj, Msg msg) { struct urldata *data = INST_DATA(cl,obj); if (!DoSuperMethodA(cl,obj,msg)) return(FALSE); data->color = ObtainBestPen(_screen(obj)->ViewPort.ColorMap,0,0,0,OBP_Precision,PRECISION_GUI,TAG_DONE); return(TRUE); } ULONG url_minmax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg) { struct urldata *data = INST_DATA(cl,obj); int x,y; DoSuperMethodA(cl,obj,(APTR)msg); x = _font(obj)->tf_XSize * data->len; y = _font(obj)->tf_YSize; msg->MinMaxInfo->MinWidth += x; msg->MinMaxInfo->DefWidth += x + (x/10); msg->MinMaxInfo->MaxWidth += MUI_MAXMAX; msg->MinMaxInfo->MinHeight += y; msg->MinMaxInfo->DefHeight += y; msg->MinMaxInfo->MaxHeight += y; return(0); } ULONG url_draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg) { struct urldata *data = INST_DATA(cl,obj); int x,y,i; DoSuperMethodA(cl,obj,(APTR)msg); if(!(msg->flags & MADF_DRAWOBJECT)) return(0); SetFont(_rp(obj),_font(obj)); if(!data->pixlen) data->pixlen=TextLength(_rp(obj),data->name,data->len); x = _mleft(obj) + ( (_mwidth(obj) - data->pixlen) / 2); y = _mtop(obj) + _font(obj)->tf_Baseline + ( (_mheight(obj) - _font(obj)->tf_YSize) / 2 ); Move(_rp(obj),x,y); if(data->color != -1) SetAPen(_rp(obj),data->color); else SetAPen(_rp(obj),1); Text(_rp(obj),data->name,data->len); for (i=x; i<=x+data->pixlen; i+=4) { Move(_rp(obj), i, y+3); Draw(_rp(obj), i+1, y+3); } return(0); } ULONG url_cleanup(struct IClass *cl, Object *obj, Msg msg) { struct urldata *data = INST_DATA(cl,obj); if(data->color != -1) ReleasePen(_screen(obj)->ViewPort.ColorMap,data->color); return(DoSuperMethodA(cl,obj,msg)); } ULONG url_clicked(struct IClass *cl, Object *obj, Msg msg) { struct urldata *data = INST_DATA(cl,obj); OpenURLBase = OpenLibrary("openurl.library", 1); if (!OpenURLBase) return(0); URL_Open(data->href, TAG_DONE); CloseLibrary(OpenURLBase); return(0); }