home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 19
/
AACD19.BIN
/
CDTools
/
ClassAct
/
Examples
/
ListBrowser
/
ListBrowserExample.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-07-09
|
15KB
|
543 lines
/**
** ListBrowserTest.c -- List Browser class test.
**
** This is a simple example testing some of the capabilities of the
** ListBrowser gadget class.
**
** This code opens a simple window and then a ListBrowser gadget which is
** subsequently attached to the window's gadget list. Everytime the user
** clicks on the close gadget, this code changes some of the attributes
** of the ListBrowser gadget to demonstrate different ways it can be used,
** including one demonstration which creates two images using the Label
** class and shows them in the ListBrowser.
**
**/
#include <exec/types.h>
#include <exec/memory.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <intuition/imageclass.h>
#include <intuition/icclass.h>
#include <utility/tagitem.h>
#include <proto/dos.h>
#include <proto/exec.h>
#include <proto/intuition.h>
#include <gadgets/listbrowser.h>
#include <images/label.h>
#include <proto/listbrowser.h>
#include <proto/label.h>
#include <string.h>
#include <stdio.h>
/* Soon to be moved to gadgets/listbrowser.h
*/
#define LBNCA_Editable (LBNA_Dummy+13)
#define LBNCA_MaxChars (LBNA_Dummy+14)
#define LBNCA_CopyText (LBNA_Dummy+15)
#define LISTBROWSER_Editable (LISTBROWSER_Dummy+33)
#define LISTBROWSER_Position (LISTBROWSER_Dummy+34)
#define LISTBROWSER_EditNode (LISTBROWSER_Dummy+35)
#define LISTBROWSER_EditColumn (LISTBROWSER_Dummy+36)
#define LBP_LINEUP 1
#define LBP_LINEDOWN 2
#define LBP_PAGEUP 3
#define LBP_PAGEDOWN 4
#define LBP_TOP 5
#define LBP_BOTTOM 6
#define RAWKEY_CURSORUP 76
#define RAWKEY_CURSORDOWN 77
#define QUALIFIER_SHIFT 0x03
#define QUALIFIER_ALT 0x30
#define QUALIFIER_CTRL 0x08
/* Function prototypes.
*/
BOOL make_list(struct List *, UBYTE **, LONG *);
VOID free_list(struct List *);
VOID wait_for_close(struct Window *, struct Gadget *);
struct ClassLibrary * OpenClass(STRPTR, ULONG);
/* Global variables.
*/
struct ClassLibrary *ListBrowserBase;
struct ClassLibrary *LabelBase;
UBYTE *col1[] =
{
"This is a", "test of the", "ListBrowser", "gadget class.",
"This is like", "a souped-up", "listview", "gadget. It", "has many",
"cool new", "features", "though like", "multiple", "columns,",
"horizontal", "scrolling,", "images in", "nodes,", "columns titles",
"and much much", "more!",
"This is a", "test of the", "ListBrowser", "gadget class.",
"This is like", "a souped-up", "listview", "gadget. It", "has many",
"cool new", "features", "though like", "multiple", "columns,",
"horizontal", "scrolling,", "images in", "nodes,", "columns titles",
"and much much", "more!",
"This is a", "test of the", "ListBrowser", "gadget class.",
"This is like", "a souped-up", "listview", "gadget. It", "has many",
"cool new", "features", "though like", "multiple", "columns,",
"horizontal", "scrolling,", "images in", "nodes,", "columns titles",
"and much much", "more!", NULL
};
LONG col2[] =
{
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
63
};
struct ColumnInfo ci[] =
{
{ 80, "Col 1", 0 },
{ 60, "Col 2", 0 },
{ 60, "Col 3", 0 },
{ -1, (STRPTR)~0, -1 }
};
struct ColumnInfo fancy_ci[] =
{
{ 100, NULL, 0 },
{ -1, (STRPTR)~0, -1 }
};
/* Some fonts for our fancy list.
*/
struct TextAttr helvetica24b = { (STRPTR)"helvetica.font", 24, FSF_BOLD, FPF_DISKFONT };
struct TextAttr times18i = { (STRPTR)"times.font", 18, FSF_ITALIC, FPF_DISKFONT };
struct TextAttr times18 = { (STRPTR)"times.font", 18, 0, FPF_DISKFONT };
/* This is the start of our programme.
*/
main()
{
struct Screen *screen = NULL;
/* We'll just open up on the default public screen, and use its screen font.
*/
if (screen = LockPubScreen(NULL))
{
struct Window *win = NULL;
/* Open the window, note how we size the window to perfectly fit
* all the gadgets.
*/
if (win = OpenWindowTags(NULL,
WA_Left, 0,
WA_Top, screen->Font->ta_YSize + 3,
WA_Width, 300,
WA_Height, 160,
WA_CustomScreen, screen,
WA_IDCMP, IDCMP_GADGETUP | IDCMP_MOUSEMOVE | IDCMP_RAWKEY |
IDCMP_CLOSEWINDOW | IDCMP_GADGETDOWN,
WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET |
WFLG_SIZEGADGET | WFLG_ACTIVATE | WFLG_SMART_REFRESH,
WA_Title, "ListBrowser Class Demo",
WA_MinWidth, 50,
WA_MinHeight, 50,
WA_MaxWidth, -1,
WA_MaxHeight, -1,
TAG_DONE))
{
/* Create the private BOOPSI image class.
*/
PutStr("Creating ListBrowser class\n");
if (ListBrowserBase = OpenClass("gadgets/listbrowser.gadget", 0))
{
struct Gadget *listbrowser_gad;
struct List label_list;
make_list(&label_list, col1, col2);
/* Create a listbrowser gadget.
*/
PutStr("Creating ListBrowser object\n");
if (listbrowser_gad = (struct Gadget *)NewObject(LISTBROWSER_GetClass(), NULL,
GA_ID, 1,
GA_Top, win->BorderTop + 5,
GA_Left, 10,
GA_RelWidth, -34,
GA_RelHeight, -(win->BorderTop + win->BorderBottom + 10),
GA_RelVerify, TRUE,
LISTBROWSER_Labels, (ULONG)&label_list,
LISTBROWSER_ColumnInfo, (ULONG)&ci,
LISTBROWSER_ColumnTitles, TRUE,
LISTBROWSER_MultiSelect, FALSE,
LISTBROWSER_Separators, TRUE,
LISTBROWSER_ShowSelected, FALSE,
LISTBROWSER_Editable, TRUE,
TAG_END))
{
/* Adding gadgets.
*/
PutStr("Adding gadget\n");
AddGList(win, listbrowser_gad, -1, -1, NULL);
PutStr("Refreshing gadget\n");
RefreshGList(listbrowser_gad, win, NULL, -1);
/* Wait for close gadget click to continue.
*/
SetWindowTitles(win, "<- Click here to continue", (UBYTE *)~0);
wait_for_close(win, listbrowser_gad);
/* Make Visible
*/
SetWindowTitles(win, "Make Visible 10", (UBYTE *)~0);
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_MakeVisible, 10,
LISTBROWSER_EditNode, 8,
LISTBROWSER_EditColumn, 1,
TAG_DONE);
ActivateGadget(listbrowser_gad, win, NULL);
wait_for_close(win, listbrowser_gad);
/* Show selected
*/
SetWindowTitles(win, "Show selected, Auto-Fit", (UBYTE *)~0);
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_ShowSelected, TRUE,
LISTBROWSER_AutoFit, TRUE,
LISTBROWSER_HorizontalProp, TRUE,
TAG_DONE);
wait_for_close(win, listbrowser_gad);
/* Multi-select
*/
SetWindowTitles(win, "Multi-select, Virtual Width of 500", (UBYTE *)~0);
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_MultiSelect, TRUE,
LISTBROWSER_VirtualWidth, 500,
LISTBROWSER_AutoFit, FALSE,
TAG_DONE);
wait_for_close(win, listbrowser_gad);
/* Detach the list.
*/
SetWindowTitles(win, "Detached list", (UBYTE *)~0);
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_MultiSelect, FALSE,
LISTBROWSER_Labels, ~0,
TAG_DONE);
wait_for_close(win, listbrowser_gad);
/* No separators, no title, 1 column.
*/
SetWindowTitles(win, "No separators, no title, 1 column.", (UBYTE *)~0);
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_Labels, (ULONG)&label_list,
LISTBROWSER_ColumnInfo, (ULONG)&fancy_ci,
LISTBROWSER_Separators, FALSE,
LISTBROWSER_ColumnTitles, FALSE,
LISTBROWSER_AutoFit, TRUE,
LISTBROWSER_VirtualWidth, 0,
TAG_DONE);
wait_for_close(win, listbrowser_gad);
/* Fancy list.
*/
PutStr("Creating Label class\n");
if (LabelBase = OpenClass("images/label.image", 0))
{
struct List fancy_list;
struct Image *image1, *image2;
struct Node *node1, *node2;
NewList(&fancy_list);
PutStr("Creating Label object\n");
if (image1 = (struct Image *)NewObject(LABEL_GetClass(), NULL,
IA_FGPen, 1,
IA_BGPen, 2,
IA_Font, (ULONG)&helvetica24b,
LABEL_Text, (ULONG)"C",
IA_Font, (ULONG)×18i,
LABEL_Text, (ULONG)"lass ",
IA_Font, (ULONG)&helvetica24b,
LABEL_Text, (ULONG)"A",
IA_Font, (ULONG)×18i,
LABEL_Text, (ULONG)"ct",
TAG_END))
{
PutStr("Creating Label object\n");
if (image2 = (struct Image *)NewObject(LABEL_GetClass(), NULL,
IA_FGPen, 2,
IA_BGPen, 0,
IA_Font, (ULONG)×18,
LABEL_Text, (ULONG)"By Phantom Development",
TAG_END))
{
if (node1 = AllocListBrowserNode(1,
LBNA_Column, 0,
LBNCA_Image, (ULONG)image1,
LBNCA_Justification, LCJ_CENTRE,
TAG_DONE))
{
AddTail(&fancy_list, node1);
if (node2 = AllocListBrowserNode(1,
LBNA_Column, 0,
LBNCA_Image, (ULONG)image2,
LBNCA_Justification, LCJ_CENTRE,
TAG_DONE))
{
AddTail(&fancy_list, node2);
/* Set listbrowser.
*/
SetWindowTitles(win, "Fancy", (UBYTE *)~0);
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_ColumnInfo, &fancy_ci,
LISTBROWSER_Labels, (ULONG)&fancy_list,
LISTBROWSER_AutoFit, TRUE,
TAG_DONE);
wait_for_close(win, listbrowser_gad);
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_Labels, ~0,
TAG_DONE);
FreeListBrowserNode(node2);
}
FreeListBrowserNode(node1);
}
DisposeObject(image2);
}
DisposeObject(image1);
}
PutStr("Closing Label class\n");
CloseLibrary((struct Library *)LabelBase);
}
else
PutStr("ERROR: Couldn't create Label class\n");
/* Read-only
*/
SetWindowTitles(win, "Read-only", (UBYTE *)~0);
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_ColumnInfo, (ULONG)&ci,
LISTBROWSER_Labels, (ULONG)&label_list,
LISTBROWSER_AutoFit, TRUE,
LISTBROWSER_Selected, -1,
GA_ReadOnly, TRUE,
TAG_DONE);
wait_for_close(win, listbrowser_gad);
/* Disabled.
*/
SetWindowTitles(win, "Disabled", (UBYTE *)~0);
SetGadgetAttrs(listbrowser_gad, win, NULL,
GA_Disabled, TRUE,
GA_ReadOnly, FALSE,
TAG_DONE);
wait_for_close(win, listbrowser_gad);
/* No scrollbars, borderless. (Note that it isn't
* correct to hard-code the window border size like
* this, I was just being lazy :)
*/
SetWindowTitles(win, "No scrollbars, borderless", (UBYTE *)~0);
SetGadgetAttrs(listbrowser_gad, win, NULL,
GA_Disabled, FALSE,
GA_Top, win->BorderTop,
GA_Left, 4,
GA_RelWidth, -22,
GA_RelHeight, -(win->BorderTop + win->BorderBottom),
LISTBROWSER_Borderless, TRUE,
LISTBROWSER_HorizontalProp, FALSE,
LISTBROWSER_VerticalProp, FALSE,
TAG_DONE);
wait_for_close(win, listbrowser_gad);
RemoveGList(win, listbrowser_gad, -1);
DisposeObject(listbrowser_gad);
}
else
PutStr("ERROR: Couldn't create ListBrowser gadgetn");
free_list(&label_list);
PutStr("Freeing ListBrowser class\n");
CloseLibrary((struct Library *)ListBrowserBase);
}
else
PutStr("ERROR: Couldn't create ListBrowser class\n");
CloseWindow(win);
}
else
PutStr("ERROR: Couldn't open window\n");
UnlockPubScreen(0, screen);
}
else
PutStr("ERROR: Couldn't lock public screen\n");
}
/* Function to make a List of ListBrowserNodes from a couple of arrays.
* Just to demonstrate things, we make make three columns, 2 with text
* (the same text) and the third with numbers.
*/
BOOL make_list(struct List *list, UBYTE **labels1, LONG *labels2)
{
struct Node *node;
WORD i = 0;
NewList(list);
while (*labels1)
{
if (node = AllocListBrowserNode(3,
LBNA_Column, 0,
LBNCA_CopyText, TRUE,
LBNCA_Text, *labels1,
LBNCA_MaxChars, 40,
LBNCA_Editable, TRUE,
LBNA_Column, 1,
LBNCA_CopyText, TRUE,
LBNCA_Text, *labels1,
LBNCA_MaxChars, 40,
LBNCA_Editable, TRUE,
LBNA_Column, 2,
LBNCA_Integer, &labels2[i],
LBNCA_Justification, LCJ_RIGHT,
TAG_DONE))
{
AddTail(list, node);
}
else
break;
labels1++;
i++;
}
return(TRUE);
}
/* Function to free an Exec List of ListBrowser nodes.
*/
VOID free_list(struct List *list)
{
struct Node *node, *nextnode;
node = list->lh_Head;
while (nextnode = node->ln_Succ)
{
FreeListBrowserNode(node);
node = nextnode;
}
NewList(list);
}
/* Function to open a BOOPSI class library.
*/
struct ClassLibrary * OpenClass(STRPTR name, ULONG version)
{
struct Library *retval;
UBYTE buffer[256];
if ((retval = OpenLibrary(name, version)) == NULL)
{
sprintf (buffer, ":classes/%s", name);
if ((retval = OpenLibrary(buffer, version)) == NULL)
{
sprintf(buffer, "classes/%s", name);
retval = OpenLibrary(buffer, version);
}
}
return((struct ClassLibrary *)retval);
}
/* Wait for the window close gadget to be pressed.
*/
VOID wait_for_close(struct Window *win, struct Gadget *listbrowser_gad)
{
BOOL ok = TRUE;
/* Just wait around until the close gadget is pressed.
*/
while (ok)
{
struct Gadget *gadget;
struct IntuiMessage *imsg;
WaitPort(win->UserPort);
while (imsg = (struct IntuiMessage *)GetMsg(win->UserPort))
{
switch (imsg->Class)
{
case IDCMP_CLOSEWINDOW:
ok = FALSE;
break;
case IDCMP_RAWKEY:
if (!(imsg->Code & IECODE_UP_PREFIX))
{
switch (imsg->Code)
{
case RAWKEY_CURSORUP:
if (imsg->Qualifier & QUALIFIER_CTRL)
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_Position, LBP_TOP,
TAG_DONE);
if (imsg->Qualifier & QUALIFIER_SHIFT)
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_Position, LBP_PAGEUP,
TAG_DONE);
else
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_Position, LBP_LINEUP,
TAG_DONE);
break;
case RAWKEY_CURSORDOWN:
if (imsg->Qualifier & QUALIFIER_CTRL)
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_Position, LBP_BOTTOM,
TAG_DONE);
if (imsg->Qualifier & QUALIFIER_SHIFT)
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_Position, LBP_PAGEDOWN,
TAG_DONE);
else
SetGadgetAttrs(listbrowser_gad, win, NULL,
LISTBROWSER_Position, LBP_LINEDOWN,
TAG_DONE);
break;
default:
break;
}
}
break;
case IDCMP_GADGETUP:
gadget = (struct Gadget *)imsg->IAddress;
Printf("Gadget: %ld Code: %ld\n",
(LONG)gadget->GadgetID, (LONG)imsg->Code);
break;
default:
break;
}
ReplyMsg((struct Message *)imsg);
}
}
}