home *** CD-ROM | disk | FTP | other *** search
/ NetNews Offline 2 / NetNews Offline Volume 2.iso / news / comp / sys / amiga / programmer / 5178 < prev    next >
Encoding:
Text File  |  1996-08-05  |  4.6 KB  |  146 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: Multiselect LISTVIEW possible?
  5. Date: Sun, 10 Mar 96 20:10:55 GMT
  6. Organization: Home
  7. Message-ID: <9603102010.AA000qg@topic.demon.co.uk>
  8. References: <Pine.A32.3.91.960308202356.8600B-100000@lire.ts.umu.se>
  9. X-NNTP-Posting-Host: topic.demon.co.uk
  10. X-Newsreader: TIN [version 1.2 PL3]
  11. X-Mail2News-Path: disperse.demon.co.uk!post.demon.co.uk!topic.demon.co.uk
  12.  
  13. Jonas Hulten (yak@ts.umu.se) wrote:
  14. : Is it possible to create a multiselect LISTVIEW_KIND? How?
  15.  
  16. With OS3.0+ it is possible...
  17.  
  18. You can use a GadTools Listview with GTLV_CallBack.
  19.  
  20. The following sample code implements multiple select and
  21. highlights some entries with "W" and "*" in character
  22. positions 1 and 2. This could easily be changed to bold,
  23. multi-colour etc. The nodes attached to the list use
  24. extended nodes.
  25.  
  26. The extended Node...
  27.  
  28. struct FileName {
  29.   struct Node Node;
  30.   struct FileName *FileName;
  31.   char *Name;
  32.   BOOL Selected;
  33.   BOOL Current;
  34.   ULONG seq;
  35.   BOOL WordSel;
  36. };
  37.  
  38. The callback hook...
  39.  
  40. ULONG __saveds __asm HookEntryList(register __a0 struct Hook *Hook,
  41.                      register __a2 struct FileName *FileName,
  42.                      register __a1 struct LVDrawMsg *msg) {
  43.   char buffer[3];
  44.   ULONG len;
  45.   WORD length;
  46.   struct TextExtent textExtent;
  47.   if (msg->lvdm_MethodID != LV_DRAW) {
  48.     return LVCB_UNKNOWN;
  49.   }
  50.   switch(msg->lvdm_State) {
  51.   case LVR_NORMAL:
  52.   case LVR_NORMALDISABLED:
  53.   case LVR_SELECTED:
  54.   case LVR_SELECTEDDISABLED:
  55.     Move(msg->lvdm_RastPort,msg->lvdm_Bounds.MinX,
  56.          msg->lvdm_Bounds.MinY+msg->lvdm_RastPort->TxBaseline);
  57.     length = TextLength(msg->lvdm_RastPort,"W*",2);
  58.     if (FileName->Current) {
  59.       buffer[1] = '*';
  60.     }
  61.     else {
  62.       buffer[1] = ' ';
  63.     }
  64.     if (FileName->WordSel) {
  65.       buffer[0] = 'W';
  66.     }
  67.     else {
  68.       buffer[0] = ' ';
  69.     }
  70.     buffer[2]=0;
  71.     len = TextFit(msg->lvdm_RastPort,FileName->Node.ln_Name,
  72.           strlen(FileName->Node.ln_Name),&textExtent,NULL,1,
  73.           msg->lvdm_Bounds.MaxX-msg->lvdm_Bounds.MinX+1-length,32767);
  74.     if (!FileName->Selected) {
  75.       SetABPenDrMd(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[TEXTPEN],
  76.                    msg->lvdm_DrawInfo->dri_Pens[BACKGROUNDPEN],JAM2);
  77.     }
  78.     else {
  79.       SetABPenDrMd(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[FILLTEXTPEN],
  80.                    msg->lvdm_DrawInfo->dri_Pens[FILLPEN],JAM2);
  81.     }
  82.     Text(msg->lvdm_RastPort,buffer,2);
  83.     if (msg->lvdm_RastPort->cp_x < msg->lvdm_Bounds.MinX+length) {
  84.       if (!FileName->Selected) {
  85.         SetAPen(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[BACKGROUNDPEN]);
  86.       }
  87.       else {
  88.         SetAPen(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[FILLPEN]);
  89.       }
  90.       RectFill(msg->lvdm_RastPort,msg->lvdm_RastPort->cp_x,msg->lvdm_Bounds.MinY,
  91.                msg->lvdm_Bounds.MinX-1+length,msg->lvdm_Bounds.MaxY);
  92.     }
  93.     Move(msg->lvdm_RastPort,msg->lvdm_Bounds.MinX+length,
  94.          msg->lvdm_Bounds.MinY+msg->lvdm_RastPort->TxBaseline);
  95.     if (!FileName->Selected) {
  96.       SetABPenDrMd(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[TEXTPEN],
  97.                    msg->lvdm_DrawInfo->dri_Pens[BACKGROUNDPEN],JAM2);
  98.     }
  99.     else {
  100.       SetABPenDrMd(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[FILLTEXTPEN],
  101.                    msg->lvdm_DrawInfo->dri_Pens[FILLPEN],JAM2);
  102.     }
  103.     Text(msg->lvdm_RastPort,FileName->Node.ln_Name,len);
  104.     if (!FileName->Selected) {
  105.       SetAPen(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[BACKGROUNDPEN]);
  106.     }
  107.     else {
  108.       SetAPen(msg->lvdm_RastPort,msg->lvdm_DrawInfo->dri_Pens[FILLPEN]);
  109.     }
  110.     RectFill(msg->lvdm_RastPort,msg->lvdm_RastPort->cp_x,msg->lvdm_Bounds.MinY,
  111.              msg->lvdm_Bounds.MaxX,msg->lvdm_Bounds.MaxY);
  112.     break;
  113.   default:
  114.     break;
  115.   }
  116.   return LVCB_OK;
  117. }
  118.  
  119. The processing when the Listview is clicked. This is coded in Gadtoolsbox
  120. style. It needs some set other things to have been set up...
  121.  
  122. int GuideClicked(void) {
  123.   int i;
  124.   DisableWindow();  // This disables the whole window
  125.   GT_SetGadgetAttrs(MPIndexGadgets[GDX_Guide],MPIndexWnd,NULL,
  126.                     GTLV_Labels,~0,
  127.                     TAG_END);
  128.   // Note MyNamep is an array which matches the list
  129.   // attached to the Listview
  130.   if (MyNamep[MPIndexMsg.Code]->Selected) {
  131.     MyNamep[MPIndexMsg.Code]->Selected = FALSE;
  132.   }
  133.   else {
  134.     MyNamep[MPIndexMsg.Code]->Selected = TRUE;
  135.   }
  136.   GT_SetGadgetAttrs(MPIndexGadgets[GDX_Guide],MPIndexWnd,NULL,
  137.                     GTLV_Labels,&FileList,
  138.                     TAG_END);
  139.   EnableWindow();  // This enables the whole window
  140.   return 1;
  141. }
  142.  
  143. If you need fully working source then mail me.
  144.  
  145. Mark
  146.