Lines Matching refs:tree

59 #define IsHorizontal(tw) ((tw)->tree.gravity == WestGravity || \
60 (tw)->tree.gravity == EastGravity)
83 * resources of the tree itself
87 XtOffsetOf(TreeRec, tree.auto_reconfigure), XtRImmediate,
90 XtOffsetOf(TreeRec, tree.hpad), XtRImmediate, (XtPointer) 0 },
92 XtOffsetOf(TreeRec, tree.vpad), XtRImmediate, (XtPointer) 0 },
94 XtOffsetOf(TreeRec, tree.foreground), XtRString,
97 XtOffsetOf(TreeRec, tree.line_width), XtRImmediate, (XtPointer) 0 },
99 XtOffsetOf(TreeRec, tree.gravity), XtRImmediate,
105 * resources that are attached to all children of the tree
109 XtOffsetOf(TreeConstraintsRec, tree.parent), XtRImmediate, NULL },
111 XtOffsetOf(TreeConstraintsRec, tree.gc), XtRImmediate, NULL },
180 * tree utility routines *
218 values.foreground = w->tree.foreground;
219 if (w->tree.line_width != 0) {
221 values.line_width = w->tree.line_width;
234 nc->tree.parent = parent;
243 nindex = pc->tree.n_children;
245 if (pc->tree.n_children == pc->tree.max_children) {
246 pc->tree.max_children += (pc->tree.max_children / 2) + 2;
247 pc->tree.children = (WidgetList) XtRealloc ((char *)pc->tree.children,
249 ((pc->tree.max_children) *
257 pc->tree.children[nindex] = node;
258 pc->tree.n_children++;
277 for (pos = 0; pos < pc->tree.n_children; pos++)
278 if (pc->tree.children[pos] == node) break;
280 if (pos == pc->tree.n_children) return;
285 pc->tree.n_children--;
291 for (i = pos; i < pc->tree.n_children; i++)
292 pc->tree.children[i] = pc->tree.children[i+1];
294 pc->tree.children[pc->tree.n_children]=0;
301 switch (tw->tree.gravity) {
305 tw->tree.gravity = grav;
313 * tree class methods *
344 if (request->tree.hpad == 0 && request->tree.vpad == 0) {
346 new->tree.hpad = TREE_HORIZONTAL_DEFAULT_SPACING;
347 new->tree.vpad = TREE_VERTICAL_DEFAULT_SPACING;
349 new->tree.hpad = TREE_VERTICAL_DEFAULT_SPACING;
350 new->tree.vpad = TREE_HORIZONTAL_DEFAULT_SPACING;
357 new->tree.gc = get_tree_gc (new);
362 new->tree.tree_root = (Widget) NULL;
365 new->tree.tree_root = XtCreateWidget ("root", widgetClass, gnew,
371 new->tree.largest = NULL;
372 new->tree.n_largest = 0;
373 initialize_dimensions (&new->tree.largest, &new->tree.n_largest,
395 tc->tree.n_children = 0;
396 tc->tree.max_children = 0;
397 tc->tree.children = (Widget *) NULL;
398 tc->tree.x = tc->tree.y = 0;
399 tc->tree.bbsubwidth = 0;
400 tc->tree.bbsubheight = 0;
408 if (tc->tree.parent)
409 insert_node (tc->tree.parent, new);
410 else if (tw->tree.tree_root)
411 insert_node (tw->tree.tree_root, new);
428 if (new->tree.foreground != current->tree.foreground ||
430 new->tree.line_width != current->tree.line_width) {
431 XtReleaseGC (gnew, new->tree.gc);
432 new->tree.gc = get_tree_gc (new);
438 * tree layout. layout_tree() does a redraw, so we don't
441 if (new->tree.gravity != current->tree.gravity) {
442 check_gravity (new, current->tree.gravity);
446 if (new->tree.vpad == current->tree.vpad &&
447 new->tree.hpad == current->tree.hpad) {
448 new->tree.vpad = current->tree.hpad;
449 new->tree.hpad = current->tree.vpad;
453 if (new->tree.vpad != current->tree.vpad ||
454 new->tree.hpad != current->tree.hpad ||
455 new->tree.gravity != current->tree.gravity) {
478 if (curc->tree.parent != newc->tree.parent){
479 if (curc->tree.parent)
480 delete_node (curc->tree.parent, new);
481 if (newc->tree.parent)
482 insert_node(newc->tree.parent, new);
507 if (tw->tree.tree_root == w) {
508 if (tc->tree.n_children > 0)
509 tw->tree.tree_root = tc->tree.children[0];
511 tw->tree.tree_root = NULL;
514 delete_node (tc->tree.parent, (Widget) w);
515 for (i = 0; i< tc->tree.n_children; i++)
516 insert_node (tc->tree.parent, tc->tree.children[i]);
548 if (tw->tree.auto_reconfigure) layout_tree (tw, FALSE);
564 XtReleaseGC (gw, w->tree.gc);
565 if (w->tree.largest) XtFree ((char *) w->tree.largest);
592 if (child != tw->tree.tree_root && tc->tree.n_children) {
596 switch (tw->tree.gravity) {
612 for (j = 0; j < tc->tree.n_children; j++) {
613 Widget k = tc->tree.children[j];
614 GC gc = (tc->tree.gc ? tc->tree.gc : tw->tree.gc);
616 switch (tw->tree.gravity) {
674 preferred->width = tw->tree.maxwidth;
675 preferred->height = tw->tree.maxheight;
692 * tree layout algorithm *
694 * Each node in the tree is "shrink-wrapped" with a minimal bounding *
701 static void compute_bounding_box_subtree (tree, w, depth)
702 TreeWidget tree;
708 Bool horiz = IsHorizontal (tree);
715 if (depth >= tree->tree.n_largest) {
716 initialize_dimensions (&tree->tree.largest,
717 &tree->tree.n_largest, depth + 1);
720 if (tree->tree.largest[depth] < newwidth)
721 tree->tree.largest[depth] = newwidth;
727 tc->tree.bbwidth = w->core.width + bw2;
728 tc->tree.bbheight = w->core.height + bw2;
730 if (tc->tree.n_children == 0) return;
733 * Figure the size of the opposite dimension (vertical if tree is
739 for (i = 0; i < tc->tree.n_children; i++) {
740 Widget child = tc->tree.children[i];
743 compute_bounding_box_subtree (tree, child, depth + 1);
746 if (newwidth < cc->tree.bbwidth) newwidth = cc->tree.bbwidth;
747 newheight += tree->tree.vpad + cc->tree.bbheight;
749 if (newheight < cc->tree.bbheight) newheight = cc->tree.bbheight;
750 newwidth += tree->tree.hpad + cc->tree.bbwidth;
755 tc->tree.bbsubwidth = newwidth;
756 tc->tree.bbsubheight = newheight;
763 tc->tree.bbwidth += tree->tree.hpad + newwidth;
764 newheight -= tree->tree.vpad;
765 if (newheight > tc->tree.bbheight) tc->tree.bbheight = newheight;
767 tc->tree.bbheight += tree->tree.vpad + newheight;
768 newwidth -= tree->tree.hpad;
769 if (newwidth > tc->tree.bbwidth) tc->tree.bbwidth = newwidth;
788 switch (tw->tree.gravity) {
790 tc->tree.x = (((Position) tw->tree.maxwidth) -
791 ((Position) w->core.width) - tc->tree.x);
795 tc->tree.y = (((Position) tw->tree.maxheight) -
796 ((Position) w->core.height) - tc->tree.y);
803 XtMoveWidget (w, tc->tree.x, tc->tree.y);
809 for (i = 0; i < tc->tree.n_children; i++)
810 set_positions (tw, tc->tree.children[i], level + 1);
815 static void arrange_subtree (tree, w, depth, x, y)
816 TreeWidget tree;
825 Bool horiz = IsHorizontal (tree);
835 tc->tree.x = x;
836 tc->tree.y = y;
841 if (myh > (int)tc->tree.bbsubheight) {
842 y += (myh - (int)tc->tree.bbsubheight) / 2;
848 if (myw > (int)tc->tree.bbsubwidth) {
849 x += (myw - (int)tc->tree.bbsubwidth) / 2;
854 if ((tmp = ((Dimension) x) + tc->tree.bbwidth) > tree->tree.maxwidth)
855 tree->tree.maxwidth = tmp;
856 if ((tmp = ((Dimension) y) + tc->tree.bbheight) > tree->tree.maxheight)
857 tree->tree.maxheight = tmp;
859 if (tc->tree.n_children == 0) return;
863 * Have children, so walk down tree laying out children, then laying
867 newx = x + tree->tree.largest[depth];
868 if (depth > 0) newx += tree->tree.hpad;
872 newy = y + tree->tree.largest[depth];
873 if (depth > 0) newy += tree->tree.vpad;
876 for (i = 0; i < tc->tree.n_children; i++) {
879 child = tc->tree.children[i]; /* last value is used outside loop */
882 arrange_subtree (tree, child, depth + 1, newx, newy);
884 newy += tree->tree.vpad + cc->tree.bbheight;
886 newx += tree->tree.hpad + cc->tree.bbwidth;
895 firstcc = TREE_CONSTRAINT (tc->tree.children[0]);
903 tc->tree.x = x;
904 adjusted = firstcc->tree.y +
905 ((lastcc->tree.y + (Position) child->core.height +
907 firstcc->tree.y - (Position) w->core.height -
909 if (adjusted > tc->tree.y) tc->tree.y = adjusted;
911 adjusted = firstcc->tree.x +
912 ((lastcc->tree.x + (Position) child->core.width +
914 firstcc->tree.x - (Position) w->core.width -
916 if (adjusted > tc->tree.x) tc->tree.x = adjusted;
917 tc->tree.y = y;
955 * box for the tree at that position (and below). Then, walk again using
959 if (tw->tree.tree_root == NULL)
962 tw->tree.maxwidth = tw->tree.maxheight = 0;
963 for (i = 0, dp = tw->tree.largest; i < tw->tree.n_largest; i++, dp++)
965 initialize_dimensions (&tw->tree.largest, &tw->tree.n_largest,
966 tw->tree.n_largest);
967 compute_bounding_box_subtree (tw, tw->tree.tree_root, 0);
974 arrange_subtree (tw, tw->tree.tree_root, 0, 0, 0);
979 set_tree_size (tw, insetvalues, tw->tree.maxwidth, tw->tree.maxheight);
980 set_positions (tw, tw->tree.tree_root, 0);
1000 XawTreeForceLayout (Widget tree)
1002 XawTreeForceLayout (tree)
1003 Widget tree;
1006 layout_tree ((TreeWidget) tree, FALSE);