home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 13
/
AACD13.ISO
/
AACD
/
Programming
/
MCC_NListtree
/
Developer
/
C
/
Examples
/
NListtree-Demo.c
< prev
Wrap
C/C++ Source or Header
|
2000-08-01
|
28KB
|
1,004 lines
/******************************************************************************\
********************************************************************************
***
*** NListtree.mcc Copyright (c) 1999-2000 by Apocalypse Hard- and Software
*** Carsten Scholling
***
*** Example program for MUI class NListtree.mcc
***
***
*** Please do not use this "to be rewritten"-piece of software as an
*** information resource on how to write programs in an object oriented
*** MUI environment. It simply shows how to use some of the NListtree
*** functions.
***
***
********************************************************************************
\******************************************************************************/
/*
** Includes
*/
#include <proto/muimaster.h>
#include <clib/alib_protos.h>
#include <clib/exec_protos.h>
#include <exec/memory.h>
#include <exec/types.h>
#include <string.h>
#include <stdio.h>
#include "Compiler.h"
#include <libraries/mui.h>
#include <mui/nlistview_mcc.h>
#include <mui/nlist_mcc.h>
#include "mui/nlisttree_mcc.h"
#ifdef MYDEBUG
#ifdef __APHASO__
#include <Debug.h>
#else
#define bug kprintf
#define D(x)
void kprintf( UBYTE *fmt, ... );
#endif
#endif
#ifndef MAKE_ID
#define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
#endif
/*
** Do not use stack sizes below 8KB!!
*/
LONG __stack = 16384;
/*
** MUI library base.
*/
struct Library *MUIMasterBase;
/*
** MUI objects.
*/
STATIC APTR app, window,lt_nodes,
tx_info1, tx_info2,
sl_treecol, st_string,
bt_open, bt_close, bt_expand, bt_collapse,
bt_insert, bt_remove, bt_exchange,bt_rename,
bt_move, bt_copy, bt_moveks, bt_copyks,
bt_find, bt_parent, bt_sort, bt_getnr,
bt_redraw, bt_selected;
/*
** Sample tree structure.
*/
struct SampleArray {
STRPTR name;
UWORD flags;
};
STATIC const struct SampleArray sa[] =
{
"comp", TNF_LIST | TNF_OPEN,
"sys", TNF_LIST | TNF_OPEN,
"amiga", TNF_LIST | TNF_OPEN,
"misc", 0x8000,
"mac", TNF_LIST,
"system", 0x8000,
"de", TNF_LIST | TNF_OPEN,
"comm", TNF_LIST,
"software", TNF_LIST,
"ums", 0x8000,
"comp", TNF_LIST | TNF_OPEN,
"sys", TNF_LIST | TNF_OPEN,
"amiga", TNF_LIST,
"misc", 0x8000,
"tech", 0x8000,
"amiga", 0x8000,
"sort test", TNF_LIST | TNF_OPEN,
"a", 0,
"x", TNF_LIST,
"v", 0,
"g", TNF_LIST,
"h", 0,
"k", TNF_LIST,
"u", 0,
"i", TNF_LIST,
"t", 0,
"e", TNF_LIST,
"q", 0,
"s", TNF_LIST,
"c", 0,
"f", TNF_LIST,
"p", 0,
"l", TNF_LIST,
"z", 0,
"w", TNF_LIST,
"b", 0,
"o", TNF_LIST,
"d", 0,
"m", TNF_LIST,
"r", 0,
"y", TNF_LIST,
"n", 0,
"j", TNF_LIST,
"m", TNF_LIST,
"i", TNF_LIST,
"c", TNF_LIST,
"h", TNF_LIST,
"e", TNF_LIST,
"l", TNF_LIST,
"a", TNF_LIST,
"n", TNF_LIST,
"g", TNF_LIST,
"e", TNF_LIST,
"l", TNF_LIST,
"o", 0,
"end", TNF_LIST,
"of", TNF_LIST,
"tree", 0,
NULL, 0
};
/*
** Prototypes and hooks.
*/
SAVEDS ASM LONG confunc( REG(a0) struct Hook *hook, REG(a2) Object *obj, REG(a1) struct MUIP_NListtree_ConstructMessage *msg );
STATIC struct Hook conhook = { {NULL, NULL}, (void *)confunc, NULL, NULL };
SAVEDS ASM LONG desfunc( REG(a0) struct Hook *hook, REG(a2) Object *obj, REG(a1) struct MUIP_NListtree_DestructMessage *msg );
STATIC struct Hook deshook = { {NULL, NULL}, (void *)desfunc, NULL, NULL };
SAVEDS ASM LONG dspfunc( REG(a0) struct Hook *hook, REG( a2 ) Object *obj, REG( a1 ) struct MUIP_NListtree_DisplayMessage *msg );
STATIC struct Hook dsphook = { { NULL,NULL }, (void *)dspfunc, NULL, NULL };
SAVEDS ASM LONG compfunc( REG(a0) struct Hook *hook, REG(a2) Object *obj, REG(a1) struct MUIP_NListtree_CompareMessage *msg );
STATIC struct Hook comphook = { {NULL, NULL}, (void *)compfunc, NULL, NULL };
SAVEDS ASM LONG insertfunc( REG(a2) APTR obj );
STATIC struct Hook inserthook = { {NULL, NULL}, (void *)insertfunc, NULL, NULL };
SAVEDS ASM LONG exchangefunc( REG(a2) APTR obj, REG(a1) ULONG **para );
STATIC struct Hook exchangehook = { {NULL, NULL}, (void *)exchangefunc, NULL, NULL };
SAVEDS ASM LONG renamefunc( REG(a2) APTR obj );
STATIC struct Hook renamehook = { {NULL, NULL}, (void *)renamefunc, NULL, NULL };
SAVEDS ASM LONG movefunc( REG(a2) APTR obj, REG(a1) ULONG **para );
STATIC struct Hook movehook = { {NULL, NULL}, (void *)movefunc, NULL, NULL };
SAVEDS ASM LONG copyfunc( REG(a2) APTR obj, REG(a1) ULONG **para );
STATIC struct Hook copyhook = { {NULL, NULL}, (void *)copyfunc, NULL, NULL };
SAVEDS ASM LONG moveksfunc( REG(a2) APTR obj, REG(a1) ULONG **para );
STATIC struct Hook movekshook = { {NULL, NULL}, (void *)moveksfunc, NULL, NULL };
SAVEDS ASM LONG copyksfunc( REG(a2) APTR obj, REG(a1) ULONG **para );
STATIC struct Hook copykshook = { {NULL, NULL}, (void *)copyksfunc, NULL, NULL };
SAVEDS ASM LONG findnamefunc( REG(a2) APTR obj );
STATIC struct Hook findnamehook = { {NULL, NULL}, (void *)findnamefunc, NULL, NULL };
SAVEDS ASM LONG getnrfunc( REG(a2) APTR obj );
STATIC struct Hook getnrhook = { {NULL, NULL}, (void *)getnrfunc, NULL, NULL };
SAVEDS ASM LONG numselfunc( REG(a2) APTR obj );
STATIC struct Hook numselhook = { {NULL, NULL}, (void *)numselfunc, NULL, NULL };
/*
** This function draws the sample tree structure.
*/
STATIC VOID DrawSampleTree( Object *ltobj )
{
struct MUI_NListtree_TreeNode *tn1, *tn2, *tn3;
WORD i = 0, j;
set( ltobj, MUIA_NListtree_Quiet, TRUE );
tn1 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, MUIV_NListtree_Insert_ListNode_Root, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn2 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn1, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn1 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn2, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn1 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn1, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn1 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn2, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn1 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn1, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn1 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, MUIV_NListtree_Insert_ListNode_Root, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn2 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn1, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn2 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn2, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn2 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn2, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn3 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn1, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn1 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn3, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn2 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn1, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn3 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn2, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn3 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn2, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn3 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn1, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn1 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, MUIV_NListtree_Insert_ListNode_Root, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
for( j = 0; j < 26; j++ )
{
DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn1, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
}
tn1 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, MUIV_NListtree_Insert_ListNode_Root, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
for( j = 0; j < 11; j++ )
{
tn1 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn1, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
}
tn1 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, MUIV_NListtree_Insert_ListNode_Root, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn1 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn1, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
tn1 = (struct MUI_NListtree_TreeNode *)DoMethod( ltobj, MUIM_NListtree_Insert, sa[i].name, (APTR)sa[i].flags, tn1, MUIV_NListtree_Insert_PrevNode_Tail, sa[i].flags ); i++;
set( ltobj, MUIA_NListtree_Quiet, FALSE );
}
/*
** Allocates memory for each entry we create.
*/
LONG ASM SAVEDS confunc( REG(a0) struct Hook *hook, REG(a2) Object *obj, REG(a1) struct MUIP_NListtree_ConstructMessage *msg )
{
struct SampleArray *sa;
/*
** Allocate needed piece of memory for the new entry.
*/
if ( sa = (struct SampleArray *)AllocVec( sizeof( struct SampleArray) + strlen( msg->Name ) + 1, MEMF_CLEAR ) )
{
/*
** Save the user data field right after the
** array structure.
*/
strcpy( (STRPTR)&sa[1], msg->Name );
sa->name = (STRPTR)&sa[1];
sa->flags = (UWORD)msg->UserData;
}
return( (LONG)sa );
}
/*
** Free memory we just allocated above.
*/
LONG ASM SAVEDS desfunc( REG(a0) struct Hook *hook, REG(a2) Object *obj, REG(a1) struct MUIP_NListtree_DestructMessage *msg )
{
if ( msg->UserData != NULL )
{
FreeVec( msg->UserData );
msg->UserData = NULL;
}
return( 0 );
}
/*
** Compare hook function.
*/
LONG ASM SAVEDS compfunc( REG(a0) struct Hook *hook, REG(a2) Object *obj, REG(a1) struct MUIP_NListtree_CompareMessage *msg )
{
return( stricmp( msg->TreeNode1->tn_Name, msg->TreeNode2->tn_Name ) );
}
/*
** Format the entry data for displaying.
*/
LONG ASM SAVEDS dspfunc( REG(a0) struct Hook *hook, REG( a2 ) Object *obj, REG( a1 ) struct MUIP_NListtree_DisplayMessage *msg )
{
STATIC STRPTR t1 = "\033b\033uNewsgroups", t2 = "\033b\033uFlags", t3 = "subscribed", t4 = "\0", t5 = "\033b\033uCnt";
STATIC char buf[10];
if ( msg->TreeNode != NULL )
{
/*
** The user data is a pointer to a SampleArray struct.
*/
struct SampleArray *a = (struct SampleArray *)msg->TreeNode->tn_User;
sprintf( buf, "%3ld", msg->Array[-1] );
*msg->Array++ = msg->TreeNode->tn_Name;
*msg->Array++ = ( a->flags & 0x8000 ) ? t3 : t4;
*msg->Array++ = buf;
}
else
{
*msg->Array++ = t1;
*msg->Array++ = t2;
*msg->Array++ = t5;
}
return( 0 );
}
/*
** Insert a new entry which name is given in
** the string gadget.
*/
SAVEDS ASM LONG insertfunc( REG(a2) APTR obj )
{
STRPTR x;
/*
** Get user string.
*/
get( st_string, MUIA_String_Contents, &x );
/*
** Insert the new entry after
** the active entry.
*/
DoMethod( obj, MUIM_NListtree_Insert, x, 0, MUIV_NListtree_Insert_ListNode_Active,
MUIV_NListtree_Insert_PrevNode_Active, MUIV_NListtree_Insert_Flag_Active );
return( 0 );
}
/*
** Exchange two entries.
*/
SAVEDS ASM LONG exchangefunc( REG(a2) APTR obj, REG(a1) ULONG **para )
{
STATIC struct MUI_NListtree_TreeNode *tn1, *tn2;
STATIC LONG exchcnt = 0;
LONG x;
if ( ( exchcnt == 0 ) && ( (ULONG)*para == 42 ) )
{
get( obj, MUIA_NListtree_Active, &tn1 );
if ( tn1 != MUIV_NListtree_Active_Off )
{
nnset( tx_info2, MUIA_Text_Contents, "Select entry to exchange selected entry with." );
exchcnt++;
}
}
else if ( exchcnt == 1 )
{
get( obj, MUIA_NListtree_Active, &tn2 );
if ( ( tn2 != MUIV_NListtree_Active_Off ) && ( tn1 != tn2 ) )
{
struct MUI_NListtree_ListNode *ln1;
if ( ln1 = (struct MUI_NListtree_ListNode *)DoMethod( obj, MUIM_NListtree_GetEntry, tn1, MUIV_NListtree_GetEntry_Position_Parent, 0 ) )
{
DoMethod( obj, MUIM_NListtree_Exchange, ln1, tn1, MUIV_NListtree_Exchange_ListNode2_Active, MUIV_NListtree_Exchange_TreeNode2_Active, 0 );
nnset( tx_info2, MUIA_Text_Contents, "Entries successfully exchanged!" );
}
else
nnset( tx_info2, MUIA_Text_Contents, "Something went wrong! Try again to select." );
}
else
nnset( tx_info2, MUIA_Text_Contents, "You should not exchange an entry with itself!" );
exchcnt = 0;
}
return( 0 );
}
/*
** Rename the selected entry with the name is given in
** the string gadget.
*/
SAVEDS ASM LONG renamefunc( REG(a2) APTR obj )
{
struct MUI_NListtree_TreeNode *tn;
STRPTR x;
/*
** Get user string.
*/
get( st_string, MUIA_String_Contents, &x );
get( obj, MUIA_NListtree_Active, &tn );
/*
** Insert the new entry sorted (compare hook)
** into the active list node.
*/
DoMethod( obj, MUIM_NListtree_Rename, tn,
x, 0 );
return( 0 );
}
/*
** Insert a new entry which name is given in
** the string gadget.
*/
SAVEDS ASM LONG movefunc( REG(a2) APTR obj, REG(a1) ULONG **para )
{
STATIC struct MUI_NListtree_TreeNode *tn1, *tn2;
STATIC LONG movecnt = 0;
LONG x;
if ( ( movecnt == 0 ) && ( (ULONG)*para == 42 ) )
{
get( obj, MUIA_NListtree_Active, &tn1 );
if ( tn1 != MUIV_NListtree_Active_Off )
{
nnset( tx_info2, MUIA_Text_Contents, "Select entry to insert after by simple click." );
movecnt++;
}
}
else if ( movecnt == 1 )
{
get( obj, MUIA_NListtree_Active, &tn2 );
if ( ( tn2 != MUIV_NListtree_Active_Off ) && ( tn1 != tn2 ) )
{
struct MUI_NListtree_ListNode *ln1;
if ( ln1 = (struct MUI_NListtree_ListNode *)DoMethod( obj, MUIM_NListtree_GetEntry, tn1, MUIV_NListtree_GetEntry_Position_Parent, 0 ) )
{
DoMethod( obj, MUIM_NListtree_Move, ln1, tn1, MUIV_NListtree_Move_NewListNode_Active, tn2, 0 );
nnset( tx_info2, MUIA_Text_Contents, "Entry successfully moved!" );
}
else
nnset( tx_info2, MUIA_Text_Contents, "Something went wrong! Try again to select destination." );
}
else
nnset( tx_info2, MUIA_Text_Contents, "You should not move an entry to itself!" );
movecnt = 0;
}
return( 0 );
}
/*
** Insert a new entry which name is given in
** the string gadget.
*/
SAVEDS ASM LONG copyfunc( REG(a2) APTR obj, REG(a1) ULONG **para )
{
STATIC struct MUI_NListtree_TreeNode *tn1, *tn2;
STATIC LONG copycnt = 0;
LONG x;
if ( ( copycnt == 0 ) && ( (ULONG)*para == 42 ) )
{
get( obj, MUIA_NListtree_Active, &tn1 );
if ( tn1 != MUIV_NListtree_Active_Off )
{
nnset( tx_info2, MUIA_Text_Contents, "Select entry to insert after by simple click." );
copycnt++;
}
}
else if ( copycnt == 1 )
{
get( obj, MUIA_NListtree_Active, &tn2 );
if ( ( tn2 != MUIV_NListtree_Active_Off ) && ( tn1 != tn2 ) )
{
struct MUI_NListtree_ListNode *ln1;
if ( ln1 = (struct MUI_NListtree_ListNode *)DoMethod( obj, MUIM_NListtree_GetEntry, tn1, MUIV_NListtree_GetEntry_Position_Parent, 0 ) )
{
DoMethod( obj, MUIM_NListtree_Copy, ln1, tn1, MUIV_NListtree_Copy_DestListNode_Active, tn2, 0 );
nnset( tx_info2, MUIA_Text_Contents, "Entry successfully copied!" );
}
else
nnset( tx_info2, MUIA_Text_Contents, "Something went wrong! Try again to select destination." );
}
else
nnset( tx_info2, MUIA_Text_Contents, "You should not copy an entry to itself!" );
copycnt = 0;
}
return( 0 );
}
/*
** Move KeepStructure
*/
SAVEDS ASM LONG moveksfunc( REG(a2) APTR obj, REG(a1) ULONG **para )
{
STATIC struct MUI_NListtree_TreeNode *tn1, *tn2;
STATIC LONG movekscnt = 0;
LONG x;
if ( ( movekscnt == 0 ) && ( (ULONG)*para == 42 ) )
{
get( obj, MUIA_NListtree_Active, &tn1 );
if ( tn1 != MUIV_NListtree_Active_Off )
{
nnset( tx_info2, MUIA_Text_Contents, "Select entry to make KeepStructure move with." );
movekscnt++;
}
}
else if ( movekscnt == 1 )
{
get( obj, MUIA_NListtree_Active, &tn2 );
if ( ( tn2 != MUIV_NListtree_Active_Off ) && ( tn1 != tn2 ) )
{
struct MUI_NListtree_ListNode *ln1;
if ( ln1 = (struct MUI_NListtree_ListNode *)DoMethod( obj, MUIM_NListtree_GetEntry, tn1, MUIV_NListtree_GetEntry_Position_Parent, 0 ) )
{
DoMethod( obj, MUIM_NListtree_Move, ln1, tn1, MUIV_NListtree_Move_NewListNode_Active, tn2, MUIV_NListtree_Move_Flag_KeepStructure );
nnset( tx_info2, MUIA_Text_Contents, "Entry successfully moved (structure keeped)" );
}
else
nnset( tx_info2, MUIA_Text_Contents, "Something went wrong! Try again to select destination." );
}
else
nnset( tx_info2, MUIA_Text_Contents, "You should not move an entry to itself!" );
movekscnt = 0;
}
return( 0 );
}
/*
** Copy KeepStructure
*/
SAVEDS ASM LONG copyksfunc( REG(a2) APTR obj, REG(a1) ULONG **para )
{
STATIC struct MUI_NListtree_TreeNode *tn1, *tn2;
STATIC LONG copykscnt = 0;
LONG x;
if ( ( copykscnt == 0 ) && ( (ULONG)*para == 42 ) )
{
get( obj, MUIA_NListtree_Active, &tn1 );
if ( tn1 != MUIV_NListtree_Active_Off )
{
nnset( tx_info2, MUIA_Text_Contents, "Select entry to make KeepStructure copy with." );
copykscnt++;
}
}
else if ( copykscnt == 1 )
{
get( obj, MUIA_NListtree_Active, &tn2 );
if ( ( tn2 != MUIV_NListtree_Active_Off ) && ( tn1 != tn2 ) )
{
struct MUI_NListtree_ListNode *ln1;
if ( ln1 = (struct MUI_NListtree_ListNode *)DoMethod( obj, MUIM_NListtree_GetEntry, tn1, MUIV_NListtree_GetEntry_Position_Parent, 0 ) )
{
DoMethod( obj, MUIM_NListtree_Copy, ln1, tn1, MUIV_NListtree_Copy_DestListNode_Active, tn2, MUIV_NListtree_Copy_Flag_KeepStructure );
nnset( tx_info2, MUIA_Text_Contents, "Entry successfully copied (structure keeped)" );
}
else
nnset( tx_info2, MUIA_Text_Contents, "Something went wrong! Try again to select destination." );
}
else
nnset( tx_info2, MUIA_Text_Contents, "You should not copy an entry to itself!" );
copykscnt = 0;
}
return( 0 );
}
/*
** Find the specified tree node by name.
*/
SAVEDS ASM LONG findnamefunc( REG(a2) APTR obj )
{
struct MUI_NListtree_TreeNode *tn;
char buf[100];
STRPTR x;
/*
** Let us see, which string the user wants to search for...
*/
get( st_string, MUIA_String_Contents, &x );
/*
** Is it somewhere in the tree?
*/
if ( tn = (struct MUI_NListtree_TreeNode *)DoMethod(obj, MUIM_NListtree_FindName, MUIV_NListtree_FindName_ListNode_Root, x, 0 ) )
{
/*
** If so, activate it (activation is only done
** if entry is visible).
*/
set( obj, MUIA_NListtree_Active, tn );
}
else
{
/*
** Not found. Inform the user.
*/
nnset( tx_info1, MUIA_Text_Contents, "NOT found specified node!" );
nnset( tx_info2, MUIA_Text_Contents, "" );
}
return( 0 );
}
/*
** Find the specified tree node by name.
*/
SAVEDS ASM LONG getnrfunc( REG(a2) APTR obj )
{
LONG temp;
temp = DoMethod( obj, MUIM_NListtree_GetNr,
MUIV_NListtree_GetNr_TreeNode_Active, MUIV_NListtree_GetNr_Flag_CountLevel );
if ( temp == 1 )
DoMethod( tx_info1, MUIM_SetAsString, MUIA_Text_Contents, "1 entry in parent node." );
else
DoMethod( tx_info1, MUIM_SetAsString, MUIA_Text_Contents, "%ld entries in parent node.", temp );
return( 0 );
}
/*
** Find the specified tree node by name.
*/
SAVEDS ASM LONG numselfunc( REG(a2) APTR obj )
{
LONG temp = 0;
DoMethod( obj, MUIM_NListtree_Select, MUIV_NListtree_Select_All,
MUIV_NListtree_Select_Ask, 0, &temp );
if ( temp == 1 )
DoMethod( tx_info1, MUIM_SetAsString, MUIA_Text_Contents, "1 node selected." );
else
DoMethod( tx_info1, MUIM_SetAsString, MUIA_Text_Contents, "%ld nodes selected.", temp );
return( 0 );
}
/*
** Main
*/
int main( int argc, STRPTR argv[] )
{
ULONG signals;
/*
** Is MUI V19 available?
*/
if ( MUIMasterBase = OpenLibrary( "muimaster.library", 19 ) )
{
/*
** Create application object.
*/
app = ApplicationObject,
MUIA_Application_Title, "NListtree-Demo",
MUIA_Application_Copyright, "©1999-2000 by Apocalypse Hard- and Software",
MUIA_Application_Author, "Carsten Scholling",
MUIA_Application_Description, "Demonstration program for MUI class NListtree.mcc",
MUIA_Application_Base, "NLISTTREEDEMO",
/*
** Build the window.
*/
SubWindow, window = WindowObject,
MUIA_Window_Title, "NListtree-Demo",
MUIA_Window_ID, MAKE_ID( 'N', 'L', 'T', 'R' ),
MUIA_Window_AppWindow, TRUE,
WindowContents, VGroup,
/*
** Create a NListview embedded NListtree object
*/
Child, NListviewObject,
MUIA_ShortHelp, "The NListtree object...",
MUIA_NListview_NList, lt_nodes = NListtreeObject,
InputListFrame,
MUIA_CycleChain, TRUE,
MUIA_NListtree_MultiSelect, MUIV_NListtree_MultiSelect_Shifted,
MUIA_NListtree_DisplayHook, &dsphook,
MUIA_NListtree_ConstructHook, &conhook,
MUIA_NListtree_DestructHook, &deshook,
//MUIA_NListtree_CompareHook, MUIV_NListtree_CompareHook_LeavesMixed,
MUIA_NListtree_CompareHook, &comphook,
MUIA_NListtree_DoubleClick, MUIV_NListtree_DoubleClick_Tree,
MUIA_NListtree_EmptyNodes, FALSE,
MUIA_NListtree_TreeColumn, 0,
MUIA_NListtree_DragDropSort, TRUE,
MUIA_NListtree_Title, TRUE,
MUIA_NListtree_Format, ",,",
End,
End,
/*
** Build some controls.
*/
Child, tx_info1 = TextObject,
MUIA_Background, MUII_TextBack,
TextFrame,
End,
Child, tx_info2 = TextObject,
MUIA_Background, MUII_TextBack,
TextFrame,
End,
Child, ColGroup( 2 ),
Child, FreeKeyLabel( "TreeCol:", 'c' ),
Child, sl_treecol = Slider( 0, 2, 0 ),
End,
Child, HGroup,
Child, st_string = StringObject,
StringFrame,
MUIA_String_MaxLen, 50,
End,
End,
Child, ColGroup( 4 ),
Child, bt_open = KeyButton( "Open", 'o' ),
Child, bt_close = KeyButton( "Close", 'c' ),
Child, bt_expand = KeyButton( "Expand", 'e' ),
Child, bt_collapse = KeyButton( "Collapse", 'a' ),
Child, bt_insert = KeyButton( "Insert", 'i' ),
Child, bt_remove = KeyButton( "Remove", 'r' ),
Child, bt_exchange = KeyButton( "Exchange", 'x' ),
Child, bt_rename = KeyButton( "Rename", 'r' ),
Child, bt_move = KeyButton( "Move", 'm' ),
Child, bt_copy = KeyButton( "Copy", 'y' ),
Child, bt_moveks = KeyButton( "Move KS", 'v' ),
Child, bt_copyks = KeyButton( "Copy KS", 'k' ),
Child, bt_find = KeyButton( "FindName", 'f' ),
Child, bt_parent = KeyButton( "Parent", 'p' ),
Child, bt_sort = KeyButton( "Sort", 's' ),
Child, bt_getnr = KeyButton( "GetNr", 'n' ),
Child, bt_redraw = KeyButton( "Redraw", 'w' ),
Child, bt_selected = KeyButton( "Selected", 'd' ),
Child, HVSpace,
Child, HVSpace,
End,
End,
End,
End;
if( app )
{
/*
** generate notifications
*/
DoMethod( window, MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
app, 2, MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit);
/*
** open/close/expand/collapse
*/
DoMethod( bt_open, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 4, MUIM_NListtree_Open, MUIV_NListtree_Open_ListNode_Active, MUIV_NListtree_Open_TreeNode_Active, 0 );
DoMethod( bt_close, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 4, MUIM_NListtree_Close, MUIV_NListtree_Close_ListNode_Active, MUIV_NListtree_Close_TreeNode_Active, 0 );
DoMethod( bt_expand, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 4, MUIM_NListtree_Open, MUIV_NListtree_Open_ListNode_Root, MUIV_NListtree_Open_TreeNode_All, 0 );
DoMethod( bt_collapse, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 4, MUIM_NListtree_Close, MUIV_NListtree_Close_ListNode_Root, MUIV_NListtree_Close_TreeNode_All, 0 );
/*
** insert/remove/exchange/rename
*/
DoMethod( bt_insert, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 2, MUIM_CallHook, &inserthook );
DoMethod( bt_remove, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 4, MUIM_NListtree_Remove, MUIV_NListtree_Remove_ListNode_Active, MUIV_NListtree_Remove_TreeNode_Active, 0 );
DoMethod( bt_exchange, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 3, MUIM_CallHook, &exchangehook, 42 );
DoMethod( lt_nodes, MUIM_Notify, MUIA_NListtree_Active, MUIV_EveryTime,
lt_nodes, 3, MUIM_CallHook, &exchangehook, 0 );
DoMethod( bt_rename, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 2, MUIM_CallHook, &renamehook );
/*
** move/copy/moveks/copyks
*/
DoMethod( bt_move, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 3, MUIM_CallHook, &movehook, 42 );
DoMethod( lt_nodes, MUIM_Notify, MUIA_NListtree_Active, MUIV_EveryTime,
lt_nodes, 3, MUIM_CallHook, &movehook, 0 );
DoMethod( bt_copy, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 3, MUIM_CallHook, ©hook, 42 );
DoMethod( lt_nodes, MUIM_Notify, MUIA_NListtree_Active, MUIV_EveryTime,
lt_nodes, 3, MUIM_CallHook, ©hook, 0 );
DoMethod( bt_moveks, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 3, MUIM_CallHook, &movekshook, 42 );
DoMethod( lt_nodes, MUIM_Notify, MUIA_NListtree_Active, MUIV_EveryTime,
lt_nodes, 3, MUIM_CallHook, &movekshook, 0 );
DoMethod( bt_copyks, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 3, MUIM_CallHook, ©kshook, 42 );
DoMethod( lt_nodes, MUIM_Notify, MUIA_NListtree_Active, MUIV_EveryTime,
lt_nodes, 3, MUIM_CallHook, ©kshook, 0 );
/*
** find/parent/sort/getnr
*/
DoMethod( bt_find, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 2, MUIM_CallHook, &findnamehook );
DoMethod( bt_parent, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 3, MUIM_Set, MUIA_NListtree_Active, MUIV_NListtree_Active_Parent );
DoMethod( bt_sort, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 3, MUIM_NListtree_Sort, MUIV_NListtree_Sort_TreeNode_Active, 0 );
DoMethod( bt_getnr, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 2, MUIM_CallHook, &getnrhook );
/*
** redraw/selected
*/
DoMethod( bt_redraw, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 3, MUIM_NListtree_Redraw, MUIV_NListtree_Redraw_All );
DoMethod( bt_selected, MUIM_Notify, MUIA_Pressed, FALSE,
lt_nodes, 2, MUIM_CallHook, &numselhook );
/*
** misc
*/
DoMethod( sl_treecol, MUIM_Notify, MUIA_Slider_Level, MUIV_EveryTime,
lt_nodes, 3, MUIM_Set, MUIA_NListtree_TreeColumn, MUIV_TriggerValue );
DoMethod( lt_nodes, MUIM_Notify, MUIA_NListtree_Active, MUIV_EveryTime,
tx_info1, 4, MUIM_SetAsString, MUIA_Text_Contents, "Active node: 0x%08lx", MUIV_TriggerValue );
DoMethod( lt_nodes, MUIM_Notify, MUIA_NListtree_ActiveList, MUIV_EveryTime,
tx_info2, 4, MUIM_SetAsString, MUIA_Text_Contents, "Active list: 0x%08lx", MUIV_TriggerValue );
DoMethod( lt_nodes, MUIM_Notify, MUIA_NListtree_DoubleClick, MUIV_EveryTime,
tx_info1, 4, MUIM_SetAsString, MUIA_Text_Contents, "Double clicked on node: 0x%08lx", MUIV_TriggerValue );
/*
** Open the window
**
*/
set( window, MUIA_Window_Open, TRUE );
/*
** Insert sample nodes
*/
DrawSampleTree( lt_nodes );
/*
** Minimal input loop.
*/
while( DoMethod( app, MUIM_Application_NewInput, &signals ) != MUIV_Application_ReturnID_Quit )
{
if ( signals )
{
signals = Wait( signals | SIGBREAKF_CTRL_C );
if ( signals & SIGBREAKF_CTRL_C )
break;
}
}
/*
** Close the window.
*/
set( window, MUIA_Window_Open, FALSE );
/*
** Shutdown
*/
MUI_DisposeObject( app );
}
else
printf( "Failed to create Application.\n" );
CloseLibrary( MUIMasterBase );
}
return( 0 );
}