>>>>>>>>>>>>>>>>>>>>>> Download file for GEM column #7 <<<<<<<<<<<<<<<<<<<<< >>>>>>>>>>>>>>>>>>>>>>>>>>>> Sample Menu Tree <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -1, 1, 6, G_IBOX, NONE, NORMAL, 0x0L, 0,0, 80,25, /* ROOT */ 6, 2, 2, G_BOX, NONE, NORMAL, 0x1100L, 0,0, 80,513, /* THE BAR */ 1, 3, 5, G_IBOX, NONE, NORMAL, 0x0L, 2,0, 20,769, /* THE ACTIVE */ 4, -1, -1, G_TITLE, NONE, NORMAL, 0x0L, 0,0, 6,769, /* Title #1 */ 5, -1, -1, G_TITLE, NONE, NORMAL, 0x1L, 6,0, 6,769, /* Title #2 */ 2, -1, -1, G_TITLE, NONE, NORMAL, 0x2L, 12,0, 8,769, /* Title #3 */ 0, 7, 22, G_IBOX, NONE, NORMAL, 0x0L, 0,769, 80,19, /* THE SCREEN */ 16, 8, 15, G_BOX, NONE, NORMAL, 0xFF1100L, 2,0, 20,8, /* Drop-down #1 */ 9, -1, -1, G_STRING, NONE, NORMAL, 0x3L, 0,0, 19,1, /* About... entry */ 10, -1, -1, G_STRING, NONE, DISABLED, 0x4L, 0,1, 20,1, 11, -1, -1, G_STRING, NONE, NORMAL, 0x5L, 0,2, 20,1, /* Desk acc entries */ 12, -1, -1, G_STRING, NONE, NORMAL, 0x6L, 0,3, 20,1, 13, -1, -1, G_STRING, NONE, NORMAL, 0x7L, 0,4, 20,1, 14, -1, -1, G_STRING, NONE, NORMAL, 0x8L, 0,5, 20,1, 15, -1, -1, G_STRING, NONE, NORMAL, 0x9L, 0,6, 20,1, 7, -1, -1, G_STRING, NONE, NORMAL, 0xAL, 0,7, 20,1, 22, 17, 21, G_BOX, NONE, NORMAL, 0xFF1100L, 8,0, 13,5, /* Drop-down #2 */ 18, -1, -1, G_STRING, NONE, NORMAL, 0xBL, 0,0, 13,1, 19, -1, -1, G_STRING, NONE, DISABLED, 0xCL, 0,1, 13,1, 20, -1, -1, G_STRING, NONE, NORMAL, 0xDL, 0,4, 13,1, 21, -1, -1, G_STRING, NONE, NORMAL, 0xEL, 0,2, 13,1, 16, -1, -1, G_STRING, NONE, DISABLED, 0xFL, 0,3, 13,1, 6, 23, 25, G_BOX, NONE, NORMAL, 0xFF1100L, 14,0, 26,3, /* Drop down #3 */ 24, -1, -1, G_STRING, NONE, NORMAL, 0x10L, 0,2, 26,1, 25, -1, -1, G_STRING, NONE, NORMAL, 0x11L, 0,0, 26,1, 22, -1, -1, G_STRING, LASTOB, DISABLED, 0x12L, 0,1, 26,1 >>>>>>>>>>>>>>>>>>>>>>>> Menu enable/disable utility <<<<<<<<<<<<<<<<<<<<<< /*------------------------------*/ /* undo_obj */ /*------------------------------*/ VOID undo_obj(tree, which, bit) LONG tree; WORD which; UWORD bit; { WORD state; state = LWGET(OB_STATE(which)); LWSET(OB_STATE(which), state & ~bit); } /*------------------------------*/ /* enab_obj */ /*------------------------------*/ WORD enab_obj(tree, which) LONG tree; WORD which; { undo_obj(tree, which, (UWORD) DISABLED); return (TRUE); } /*------------------------------*/ /* do_obj */ /*------------------------------*/ VOID do_obj(tree, which, bit) LONG tree; WORD which; UWORD bit; { WORD state; state = LWGET(OB_STATE(which)); LWSET(OB_STATE(which), state | bit); } /*------------------------------*/ /* disab_obj */ /*------------------------------*/ WORD disab_obj(tree, which) LONG tree; WORD which; { do_obj(tree, which, (UWORD) DISABLED); return (TRUE); } /*------------------------------*/ /* set_menu */ /*------------------------------*/ VOID set_menu(tree, change) /* change[0] TRUE selects all entries*/ LONG tree; /* FALSE deselects all. Change list */ WORD *change; /* of items is then toggled. */ { WORD dflt, screen, drop, obj; dflt = *change++; /* What is default? */ screen = LWGET(OB_TAIL(ROOT)); /* Get SCREEN */ drop = LWGET(OB_HEAD(screen)); /* Get DESK drop-down */ /* and skip it */ for (; (drop = LWGET(OB_NEXT(drop))) != screen; ) { obj = LWGET(OB_HEAD(drop)); if (obj != NIL) if (dflt) map_tree(tree, obj, drop, enab_obj); else map_tree(tree, obj, drop, disab_obj); } for (; *change; change++) if (dflt) disab_obj(tree, *change); else enab_obj(tree, *change); } >>>>>>>>>>>>>>>>>>>>> Definitions used in this article <<<<<<<<<<<<<<<<<<<<<< #define ROOT 0 #define G_IBOX 25 #define G_STRING 28 #define G_TITLE 32 #define R_TREE 0 #define MN_SELECTED 10 #define CHECKED 0x4 #define DISABLED 0x8 #define OB_NEXT(x) (tree + (x) * sizeof(OBJECT) + 0) #define OB_HEAD(x) (tree + (x) * sizeof(OBJECT) + 2) #define OB_TAIL(x) (tree + (x) * sizeof(OBJECT) + 4) #define OB_TYPE(x) (tree + (x) * sizeof(OBJECT) + 6) #define OB_FLAGS(x) (tree + (x) * sizeof(OBJECT) + 8) #define OB_STATE(x) (tree + (x) * sizeof(OBJECT) + 10) #define OB_SPEC(x) (tree + (x) * sizeof(OBJECT) + 12) #define OB_X(x) (tree + (x) * sizeof(OBJECT) + 16) #define OB_Y(x) (tree + (x) * sizeof(OBJECT) + 18) #define OB_WIDTH(x) (tree + (x) * sizeof(OBJECT) + 20) #define OB_HEIGHT(x) (tree + (x) * sizeof(OBJECT) + 22) #define M_OFF 256 #define M_ON 257