home *** CD-ROM | disk | FTP | other *** search
- Path: mail2news.demon.co.uk!topic.demon.co.uk
- From: Mark Paddock <mark@topic.demon.co.uk>
- Newsgroups: comp.sys.amiga.programmer
- Subject: Re: List Gadget?
- Date: Mon, 8 Jan 96 22:52:47 GMT
- Organization: Home
- Message-ID: <9601082252.AA000pd@topic.demon.co.uk>
- References: <4cr443$6ce@roadkill.scms.rgu.ac.uk>
- X-NNTP-Posting-Host: topic.demon.co.uk
- X-Newsreader: TIN [version 1.2 PL3]
- X-Mail2News-Path: relay-4.mail.demon.net!post.demon.co.uk!topic.demon.co.uk
-
- Lee Kindness (cs2lk@scms.rgu.ac.uk) wrote:
- : I am looking for a listview type gadget, either source
- : BOOPSI gadget or part of a library.
-
- : I would like the following features:
-
- : Multi-select
- : Multi-colour
- : Bold/Italic/Underline...
-
- : (If you know Spot then the message list of it is
- : a prime example)
-
- : Is there anything around that has these features
- : (except MUI) or is time to get into BOOPSI again...
-
- : Thanks for any help.
-
- You can use a GadTools Listview with GTLV_CallBack.
-
- The following sample code implements multiple select and
- highlights some entries with "W" and "*" in character
- positions 1 and 2. This could easily be changed to bold,
- multi-colour etc. The nodes attached to the list use
- extended nodes.
-
- The extended Node...
-
- struct FileName {
- struct Node Node;
- struct FileName *FileName;
- char *Name;
- BOOL Selected;
- BOOL Current;
- ULONG seq;
- BOOL WordSel;
- };
-
- The callback hook...
-
- ULONG __saveds __asm HookEntryList(register __a0 struct Hook *Hook,
- register __a2 struct FileName *FileName,
- register __a1 struct LVDrawMsg *msg) {
- char buffer[3];
- ULONG len;
- WORD length;
- struct TextExtent textExtent;
- if (msg->lvdm_MethodID != LV_DRAW) {
- return LVCB_UNKNOWN;
- }
- switch(msg->lvdm_State) {
- case LVR_NORMAL:
- case LVR_NORMALDISABLED:
- case LVR_SELECTED:
- case LVR_SELECTEDDISABLED:
- Move(msg->lvdm_RastPort,msg->lvdm_Bounds.MinX,
- msg->lvdm_Bounds.MinY+msg->lvdm_RastPort->TxBaseline);
- length = TextLength(msg->lvdm_RastPort,"W*",2);
- if (FileName->Current) {
- buffer[1] = '*';
- }
- else {
- buffer[1] = ' ';
- }
- if (FileName->WordSel) {
- buffer[0] = 'W';
- }
- else {
- buffer[0] = ' ';
- }
- buffer[2]=0;
- len = TextFit(msg->lvdm_RastPort,FileName->Node.ln_Name,
- strlen(FileName->Node.ln_Name),&textExtent,NULL,1,
- msg->lvdm_Bounds.MaxX-msg->lvdm_Bounds.MinX+1-length,32767);
- if (!FileName->Selected) {
- SetABPenDrMd(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[TEXTPEN],
- msg->lvdm_DrawInfo->dri_Pens[BACKGROUNDPEN],JAM2);
- }
- else {
- SetABPenDrMd(msg->lvdm_RastPort,
- msg->lvdm_DrawInfo->dri_Pens[FILLTEXTPEN],
- msg->lvdm_DrawInfo->dri_Pens[FILLPEN],JAM2);
- }
- Text(msg->lvdm_RastPort,buffer,2);
- if (msg->lvdm_RastPort->cp_x < msg->lvdm_Bounds.MinX+length) {
- if (!FileName->Selected) {
- SetAPen(msg->lvdm_RastPort,
- msg->lvdm_DrawInfo->dri_Pens[BACKGROUNDPEN]);
- }
- else {
- SetAPen(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[FILLPEN]);
- }
- RectFill(msg->lvdm_RastPort,msg->lvdm_RastPort->cp_x,
- msg->lvdm_Bounds.MinY,
- msg->lvdm_Bounds.MinX-1+length,msg->lvdm_Bounds.MaxY);
- }
- Move(msg->lvdm_RastPort,msg->lvdm_Bounds.MinX+length,
- msg->lvdm_Bounds.MinY+msg->lvdm_RastPort->TxBaseline);
- if (!FileName->Selected) {
- SetABPenDrMd(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[TEXTPEN],
- msg->lvdm_DrawInfo->dri_Pens[BACKGROUNDPEN],JAM2);
- }
- else {
- SetABPenDrMd(msg->lvdm_RastPort,
- msg->lvdm_DrawInfo->dri_Pens[FILLTEXTPEN],
- msg->lvdm_DrawInfo->dri_Pens[FILLPEN],JAM2);
- }
- Text(msg->lvdm_RastPort,FileName->Node.ln_Name,len);
- if (!FileName->Selected) {
- SetAPen(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[BACKGROUNDPEN]);
- }
- else {
- SetAPen(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[FILLPEN]);
- }
- RectFill(msg->lvdm_RastPort,msg->lvdm_RastPort->cp_x,
- msg->lvdm_Bounds.MinY,
- msg->lvdm_Bounds.MaxX,msg->lvdm_Bounds.MaxY);
- break;
- default:
- break;
- }
- return LVCB_OK;
- }
-
- The processing when the Listview is clicked. This is coded in Gadtoolsbox
- style. It needs some set other things to have been set up...
-
- int GuideClicked(void) {
- int i;
- DisableWindow(); // This disables the whole window
- GT_SetGadgetAttrs(MPIndexGadgets[GDX_Guide],MPIndexWnd,NULL,
- GTLV_Labels,~0,
- TAG_END);
- // Note MyNamep is an array which matches the list
- // attached to the Listview
- if (MyNamep[MPIndexMsg.Code]->Selected) {
- MyNamep[MPIndexMsg.Code]->Selected = FALSE;
- }
- else {
- MyNamep[MPIndexMsg.Code]->Selected = TRUE;
- }
- GT_SetGadgetAttrs(MPIndexGadgets[GDX_Guide],MPIndexWnd,NULL,
- GTLV_Labels,&FileList,
- TAG_END);
- EnableWindow(); // This enables the whole window
- return 1;
- }
-
- You can use some other form of highlighting if you also need
- keyboard control.
-
- If you need a fully working example then let me know.
-
- Mark
-
- --
- .-------------------------------------------------------------------------.
- !HomePage http://metro.turnpike.net/M/mpaddock/index.html (under cnstrctn)!
- !Email mark@topic.demon.co.uk mpaddock@cix.compulink.co.uk !
- `+++++-E(I?(C/?T.EI?/;P/?P.1,T.EI?/P-1G)?G)I?PEP-1E?E+++++++++++++++++++++'
-