"Fossies" - the Fresh Open Source Software archive 
Member "mgui/test/src/c/mtree.c" of archive mglin412.tgz:
/*
* File mtree.c
* Demonstrates the use of the MTREE Object
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "mgui.h"
/*
* Callback for closing and destroying a generic dialog
*/
extern void CloseDialogCB (MOBJECT p, void *s, void *v);
extern MTColor black, white, darkblue, cadetblue, seagreen;
static MIMAGE folder;
void
NodeSelectionCB (MTNODE node, void *ud)
{
MOBJECT slist = (MOBJECT) ud;
char text[256];
MSListClear (slist);
node = MTreeNodeGetFirstChild (node);
while (node)
{
MTreeNodeGetText (node, text);
MSListAddItem (slist, text, NULL);
node = MTreeNodeGetNext (node);
}
}
void
AddNodeCB (MOBJECT pb, void *od, void *ud)
{
MOBJECT edit = (MOBJECT) MObjectGetUserData (pb);
MOBJECT mtree = (MOBJECT) ud;
char text[64];
MObjectGetText (edit, text);
MTreeCreateNode (mtree, MTreeGetSelectedNode (mtree), 0, NF_CONTAINER,
text);
}
void
DestroyNodeCB (MOBJECT pb, void *od, void *ud)
{
MOBJECT mtree = (MOBJECT) ud;
MTNODE node = MTreeGetSelectedNode (mtree);
MTreeDestroyNode (node, False);
}
static void
CreateCB (MENU_ITEM item, MVALUE status, void *ud)
{
MTNODE node = (MTNODE)MObjectGetUserData (ud);
MTreeOpenNode (node, True);
node = MTreeCreateNode (MTreeNodeGetMTree (node), node, 0, NF_CONTAINER, "New");
MTreeNodeEdit (node);
}
static void
RenameCB (MENU_ITEM item, MVALUE status, void *ud)
{
MTreeNodeEdit ((MTNODE)MObjectGetUserData (ud));
}
static void
RemoveCB (MENU_ITEM item, MVALUE status, void *ud)
{
MTreeDestroyNode ((MTNODE)MObjectGetUserData (ud), False);
}
static void
NodePopupCB (MTNODE node, int mx, int my, void *ud)
{
MObjectSetUserData ((MOBJECT)ud, node);
MPopupMenu ((MOBJECT)ud, mx, my);
}
static int
NodeRenameCB (MTNODE node, const char *oldname, void *ud)
{
return 1;
}
static int
NodeDeleteCB (MTNODE node, void *ud)
{
return 1;
}
/*****************************************************
* This callback opens the dialog when the
* corresponding menu item is selected
*****************************************************/
void
MTreeCB (MOBJECT obj, void *a, void *b)
{
MOBJECT pbutton, shell, cform, mtree, slist, sfile, edit, pb, popup;
MTNODE first, second, third, fourth, one, two, four, last;
MIMAGE closed, opened, selected, leaf;
shell = MCreateShell ("MTree", 0);
cform = MCreateColForm (shell);
/*
* Create the MTree Object
*/
folder = closed = MReadBMPFile ("fbcfold.bmp");
MImageSetMaskByPixel (closed, 0, 0);
MInstallImage (closed);
opened = MReadBMPFile ("fbofold.bmp");
MImageSetMaskByPixel (opened, 0, 0);
MInstallImage (opened);
selected = MReadBMPFile ("fbsfold.bmp");
MImageSetMaskByPixel (selected, 0, 0);
MInstallImage (selected);
leaf = MReadBMPFile ("fdisk.bmp");
MImageSetMaskByPixel (leaf, 0, 0);
MInstallImage (leaf);
mtree = MCreateTree (cform, HELV_MEDIUM, 160, 160, 2);
MObjectSetBackgroundImageFile (mtree, "tile5.bmp", BI_TILED);
MTreeSetImagesByData (mtree, 0, closed, opened, selected);
MTreeSetImagesByData (mtree, 1, leaf, NULL, NULL);
MTreeSetRenameCallback (mtree, NodeRenameCB, NULL);
MTreeSetDeleteCallback (mtree, NodeDeleteCB, NULL);
slist = MCreateSList (cform, HELV_MEDIUM, 48, 12, 12);
MTreeSetSelectCallback (mtree, NodeSelectionCB, slist);
popup = MCreatePopupMenu (HELV_SMALL);
MMenuAddItem (popup, "New node ...", CreateCB, popup);
MMenuAddItem (popup, "Rename node ...", RenameCB, popup);
MMenuAddItem (popup, "Delete node", RemoveCB, popup);
MTreeSetPopupCallback (mtree, NodePopupCB, popup);
first = MTreeCreateNode (mtree, NULL, 0, NF_CONTAINER, "First Node");
second = MTreeCreateNode (mtree, NULL, 0, NF_CONTAINER, "Second Node");
third = MTreeCreateNode (mtree, NULL, 0, NF_CONTAINER, "Third Node");
fourth = MTreeCreateNode (mtree, NULL, 0, NF_CONTAINER, "Fourth Node");
one = MTreeCreateNode (mtree, first, 0, NF_CONTAINER, "First Child");
last = MTreeCreateNode (mtree, one, 1, 0, "Second Child");
last = MTreeCreateNode (mtree, one, 1, 0, "Last Child");
one = MTreeCreateNode (mtree, first, 0, NF_CONTAINER, "Another Child");
two = MTreeCreateNode (mtree, second, 0, NF_CONTAINER, "Second Child");
four = MTreeCreateNode (mtree, fourth, 0, NF_CONTAINER, "Fourth Child");
last = MTreeCreateNode (mtree, four, 1, 0, "Last Child");
cform = MCreateColForm (shell);
edit = MCreateEdit (cform, "new node text", 32, HELV_MEDIUM);
pb = MCreatePButton (cform, "&Add Node", TIMES_MEDIUM);
MObjectSetUserData (pb, edit);
MPButtonSetCallback (pb, AddNodeCB, mtree);
pb = MCreatePButton (cform, "&Destroy Node", TIMES_MEDIUM);
MPButtonSetCallback (pb, DestroyNodeCB, mtree);
/*
* Create a SFILE Object to show this source file in the dialog
*/
sfile = MCreateSFile (shell, __FILE__, FIXED_MEDIUM, 10, 48);
MObjectSetColor (sfile, darkblue, white);
/*
* This PUSH BUTTON closes the dialog
*/
pbutton = MCreatePButton (shell, "Close", TIMES_MEDIUM);
MPButtonSetCallback (pbutton, CloseDialogCB, 0L);
MShellRealize (shell);
MTreeSelectNode (last, False);
}