;/*
sc test.c GST=ram:hd2.sym CPU=ANY PARMS=BOTH IGNORE=73,100 LINK
delete test.o test.lnk
quit
;*/

#ifdef WANT_ERRORS

+-----------------------+
| ListViewDemo 31.01.93 |
+-----------------------+
|(c) Achim Tetzel       |
|                       |
|Bugreports, comments   |
| and questions to:     |
|                       |
|Fido: 2:247/122.4      |
|Zer : DARWIN@APD.ZER   |
+-----------------------+

Compilieren mit SAS 6.x:
"execute test.c"

This is FreeWare!

#endif

#include <proto/all.h>

struct Node *addNode(struct List *list, UBYTE *name)
{
struct Node *node;
if(node = AllocMem(sizeof(struct Node), MEMF_CLEAR))
	{
	if(node->ln_Name = AllocMem(strlen(name) + 1, NULL))
		{
		strcpy(node->ln_Name, name);
		AddTail(list, node);
		return(node);
		}
	FreeMem(node, sizeof(struct Node));
	}
return(NULL);
}

VOID	sortList(struct List *list)
{
struct Node *node1, *node2;
for(node1 = list->lh_Head; node1 != (struct Node *)&list->lh_Tail; node1 = node1->ln_Succ)
	for(node2 = node1->ln_Succ; node2 != (struct Node *)&list->lh_Tail; node2 = node2->ln_Succ)
		if(stricmp(node2->ln_Name, node1->ln_Name) < 0)
			{
			UBYTE *dummy = node1->ln_Name;
			node1->ln_Name = node2->ln_Name;
			node2->ln_Name = dummy;
			}
}

VOID	freeList(struct List *list)
{
struct Node *node;
while((node = list->lh_Head) != (struct Node *)&list->lh_Tail)
	{
	RemHead(list);
	FreeMem(node->ln_Name, strlen(node->ln_Name) + 1);
	FreeMem(node, sizeof(struct Node));
	}
}

VOID	getFiles(UBYTE *dir, struct List *list)
{
struct FileInfoBlock *fib; ULONG lock;

if(fib = AllocDosObject(DOS_FIB, TAG_DONE))
	{
	if(lock = Lock(dir, SHARED_LOCK))
		{
		if(Examine(lock, fib))
			while(ExNext(lock, fib))
				if(!addNode(list, fib->fib_FileName)) break;

		UnLock(lock);
		}
	FreeDosObject(DOS_FIB, fib);
	}
}

BOOL	requestFile(UBYTE *dir, UBYTE *file)
{
BOOL cont = TRUE, ok = FALSE;
struct IntuiMessage *imsg;
struct TextAttr topaz8 = {"topaz.font", 8, FS_NORMAL, FPF_ROMFONT};
struct TagItem wtags[] = {
	WA_Left, 160, WA_Top, 40, WA_InnerWidth, 320, WA_InnerHeight, 100,
    WA_IDCMP, LISTVIEWIDCMP|IDCMP_CLOSEWINDOW,
	WA_Flags, WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_CLOSEGADGET|WFLG_ACTIVATE|WFLG_GIMMEZEROZERO,
	WA_Gadgets, NULL, WA_MinWidth, -1, WA_MinHeight, -1, WA_MaxWidth, -1, WA_MaxHeight, -1,
	WA_Title, (LONG) "Bitte wählen:",
    TAG_DONE};
struct Screen *scr; APTR vi; struct Window *win;
struct Gadget *glist, *g; struct NewGadget ng;
struct List files;

NewList(&files); getFiles(dir, &files); sortList(&files);

if(scr = LockPubScreen("Workbench"))
	{
	if(vi = GetVisualInfo(scr, TAG_DONE))
		{
		if(g = CreateContext(&glist))
			{
			ng.ng_LeftEdge = 10; ng.ng_TopEdge = 16;
			ng.ng_Width  = 300;  ng.ng_Height = 80;
			ng.ng_GadgetText = dir; ng.ng_Flags = PLACETEXT_ABOVE;
			ng.ng_TextAttr = &topaz8;
			ng.ng_GadgetID = 1;
			ng.ng_VisualInfo = vi;

			if(g = CreateGadget(LISTVIEW_KIND, g, &ng, GTLV_Labels, &files, GTLV_ShowSelected, NULL, TAG_DONE))
				{
				wtags[6].ti_Data = (LONG) glist;

				if(win = OpenWindowTagList(NULL, wtags))
					{
					GT_RefreshWindow(win, NULL); ok = TRUE;

					while(cont) {
						WaitPort(win->UserPort);

						while(imsg = GT_GetIMsg(win->UserPort))
							{
							if(imsg->Class == IDCMP_CLOSEWINDOW) cont = FALSE;
								else if(imsg->Class == IDCMP_GADGETUP)
									{
									struct Node *node; SHORT i;
									for(i = 0, node = files.lh_Head;
										i < imsg->Code;
										i++, node = node->ln_Succ)
											;
									strcpy(file, node->ln_Name);
									}
							GT_ReplyIMsg(imsg);
							}
						}
					CloseWindow(win);
					}
				}
			FreeGadgets(glist);
			}
		FreeVisualInfo(vi);
		}
	UnlockPubScreen(NULL, scr);
	}

freeList(&files);

return(ok);
}

VOID	main(int argc, char **argv)
{
UBYTE file[128] = "";

if(requestFile(argv[1], file))
	{
	if(strlen(file)) printf("Ausgewählt: %s\n", file);
		else printf("Nichts ausgewählt.\n");
	} else printf("Fehler: Konnte Fenster nicht erstellen.\n");
}
