home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / sys / amiga / programmer / 546 < prev    next >
Encoding:
Text File  |  1996-08-05  |  5.4 KB  |  173 lines

  1. Path: mail2news.demon.co.uk!topic.demon.co.uk
  2. From: Mark Paddock <mark@topic.demon.co.uk>
  3. Newsgroups: comp.sys.amiga.programmer
  4. Subject: Re: List Gadget?
  5. Date: Mon, 8 Jan 96 22:52:47 GMT
  6. Organization: Home
  7. Message-ID: <9601082252.AA000pd@topic.demon.co.uk>
  8. References: <4cr443$6ce@roadkill.scms.rgu.ac.uk>
  9. X-NNTP-Posting-Host: topic.demon.co.uk
  10. X-Newsreader: TIN [version 1.2 PL3]
  11. X-Mail2News-Path: relay-4.mail.demon.net!post.demon.co.uk!topic.demon.co.uk
  12.  
  13. Lee Kindness (cs2lk@scms.rgu.ac.uk) wrote:
  14. : I am looking for a listview type gadget, either source
  15. : BOOPSI gadget or part of a library.
  16.  
  17. : I would like the following features:
  18.  
  19. : Multi-select
  20. : Multi-colour
  21. : Bold/Italic/Underline...
  22.  
  23. : (If you know Spot then the message list of it is
  24. : a prime example)
  25.  
  26. : Is there anything around that has these features
  27. : (except MUI) or is time to get into BOOPSI again...
  28.  
  29. : Thanks for any help.
  30.  
  31. You can use a GadTools Listview with GTLV_CallBack.
  32.  
  33. The following sample code implements multiple select and
  34. highlights some entries with "W" and "*" in character
  35. positions 1 and 2. This could easily be changed to bold,
  36. multi-colour etc. The nodes attached to the list use
  37. extended nodes.
  38.  
  39. The extended Node...
  40.  
  41. struct FileName {
  42.   struct Node Node;
  43.   struct FileName *FileName;
  44.   char *Name;
  45.   BOOL Selected;
  46.   BOOL Current;
  47.   ULONG seq;
  48.   BOOL WordSel;
  49. };
  50.  
  51. The callback hook...
  52.  
  53. ULONG __saveds __asm HookEntryList(register __a0 struct Hook *Hook,
  54.                      register __a2 struct FileName *FileName,
  55.                      register __a1 struct LVDrawMsg *msg) {
  56.   char buffer[3];
  57.   ULONG len;
  58.   WORD length;
  59.   struct TextExtent textExtent;
  60.   if (msg->lvdm_MethodID != LV_DRAW) {
  61.     return LVCB_UNKNOWN;
  62.   }
  63.   switch(msg->lvdm_State) {
  64.   case LVR_NORMAL:
  65.   case LVR_NORMALDISABLED:
  66.   case LVR_SELECTED:
  67.   case LVR_SELECTEDDISABLED:
  68.     Move(msg->lvdm_RastPort,msg->lvdm_Bounds.MinX,
  69.          msg->lvdm_Bounds.MinY+msg->lvdm_RastPort->TxBaseline);
  70.     length = TextLength(msg->lvdm_RastPort,"W*",2);
  71.     if (FileName->Current) {
  72.       buffer[1] = '*';
  73.     }
  74.     else {
  75.       buffer[1] = ' ';
  76.     }
  77.     if (FileName->WordSel) {
  78.       buffer[0] = 'W';
  79.     }
  80.     else {
  81.       buffer[0] = ' ';
  82.     }
  83.     buffer[2]=0;
  84.     len = TextFit(msg->lvdm_RastPort,FileName->Node.ln_Name,
  85.           strlen(FileName->Node.ln_Name),&textExtent,NULL,1,
  86.           msg->lvdm_Bounds.MaxX-msg->lvdm_Bounds.MinX+1-length,32767);
  87.     if (!FileName->Selected) {
  88.       SetABPenDrMd(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[TEXTPEN],
  89.                    msg->lvdm_DrawInfo->dri_Pens[BACKGROUNDPEN],JAM2);
  90.     }
  91.     else {
  92.       SetABPenDrMd(msg->lvdm_RastPort,
  93.                    msg->lvdm_DrawInfo->dri_Pens[FILLTEXTPEN],
  94.                    msg->lvdm_DrawInfo->dri_Pens[FILLPEN],JAM2);
  95.     }
  96.     Text(msg->lvdm_RastPort,buffer,2);
  97.     if (msg->lvdm_RastPort->cp_x < msg->lvdm_Bounds.MinX+length) {
  98.       if (!FileName->Selected) {
  99.         SetAPen(msg->lvdm_RastPort,
  100.                 msg->lvdm_DrawInfo->dri_Pens[BACKGROUNDPEN]);
  101.       }
  102.       else {
  103.         SetAPen(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[FILLPEN]);
  104.       }
  105.       RectFill(msg->lvdm_RastPort,msg->lvdm_RastPort->cp_x,
  106.                msg->lvdm_Bounds.MinY,
  107.                msg->lvdm_Bounds.MinX-1+length,msg->lvdm_Bounds.MaxY);
  108.     }
  109.     Move(msg->lvdm_RastPort,msg->lvdm_Bounds.MinX+length,
  110.          msg->lvdm_Bounds.MinY+msg->lvdm_RastPort->TxBaseline);
  111.     if (!FileName->Selected) {
  112.       SetABPenDrMd(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[TEXTPEN],
  113.                    msg->lvdm_DrawInfo->dri_Pens[BACKGROUNDPEN],JAM2);
  114.     }
  115.     else {
  116.       SetABPenDrMd(msg->lvdm_RastPort,
  117.                    msg->lvdm_DrawInfo->dri_Pens[FILLTEXTPEN],
  118.                    msg->lvdm_DrawInfo->dri_Pens[FILLPEN],JAM2);
  119.     }
  120.     Text(msg->lvdm_RastPort,FileName->Node.ln_Name,len);
  121.     if (!FileName->Selected) {
  122.       SetAPen(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[BACKGROUNDPEN]);
  123.     }
  124.     else {
  125.       SetAPen(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[FILLPEN]);
  126.     }
  127.     RectFill(msg->lvdm_RastPort,msg->lvdm_RastPort->cp_x,
  128.              msg->lvdm_Bounds.MinY,
  129.              msg->lvdm_Bounds.MaxX,msg->lvdm_Bounds.MaxY);
  130.     break;
  131.   default:
  132.     break;
  133.   }
  134.   return LVCB_OK;
  135. }
  136.  
  137. The processing when the Listview is clicked. This is coded in Gadtoolsbox
  138. style. It needs some set other things to have been set up...
  139.  
  140. int GuideClicked(void) {
  141.   int i;
  142.   DisableWindow();  // This disables the whole window
  143.   GT_SetGadgetAttrs(MPIndexGadgets[GDX_Guide],MPIndexWnd,NULL,
  144.                     GTLV_Labels,~0,
  145.                     TAG_END);
  146.   // Note MyNamep is an array which matches the list
  147.   // attached to the Listview
  148.   if (MyNamep[MPIndexMsg.Code]->Selected) {
  149.     MyNamep[MPIndexMsg.Code]->Selected = FALSE;
  150.   }
  151.   else {
  152.     MyNamep[MPIndexMsg.Code]->Selected = TRUE;
  153.   }
  154.   GT_SetGadgetAttrs(MPIndexGadgets[GDX_Guide],MPIndexWnd,NULL,
  155.                     GTLV_Labels,&FileList,
  156.                     TAG_END);
  157.   EnableWindow();  // This enables the whole window
  158.   return 1;
  159. }
  160.  
  161. You can use some other form of highlighting if you also need
  162. keyboard control.
  163.  
  164. If you need a fully working example then let me know.
  165.  
  166. Mark
  167.  
  168. -- 
  169. .-------------------------------------------------------------------------.
  170. !HomePage http://metro.turnpike.net/M/mpaddock/index.html (under cnstrctn)!
  171. !Email    mark@topic.demon.co.uk      mpaddock@cix.compulink.co.uk        !
  172. `+++++-E(I?(C/?T.EI?/;P/?P.1,T.EI?/P-1G)?G)I?PEP-1E?E+++++++++++++++++++++'
  173.