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: Multiselect LISTVIEW possible?
- Date: Sun, 10 Mar 96 20:10:55 GMT
- Organization: Home
- Message-ID: <9603102010.AA000qg@topic.demon.co.uk>
- References: <Pine.A32.3.91.960308202356.8600B-100000@lire.ts.umu.se>
- X-NNTP-Posting-Host: topic.demon.co.uk
- X-Newsreader: TIN [version 1.2 PL3]
- X-Mail2News-Path: disperse.demon.co.uk!post.demon.co.uk!topic.demon.co.uk
-
- Jonas Hulten (yak@ts.umu.se) wrote:
- : Is it possible to create a multiselect LISTVIEW_KIND? How?
-
- With OS3.0+ it is possible...
-
- 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;
- }
-
- If you need fully working source then mail me.
-
- Mark
-