"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);
}