diff --git a/cmd/xfe/XfeWidgets/tests/XmL/Makefile b/cmd/xfe/XfeWidgets/tests/XmL/Makefile new file mode 100644 index 000000000000..926ae7fc6618 --- /dev/null +++ b/cmd/xfe/XfeWidgets/tests/XmL/Makefile @@ -0,0 +1,40 @@ +#! gmake +# +# The contents of this file are subject to the Netscape Public License +# Version 1.0 (the "NPL"); you may not use this file except in +# compliance with the NPL. You may obtain a copy of the NPL at +# http://www.mozilla.org/NPL/ +# +# Software distributed under the NPL is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL +# for the specific language governing rights and limitations under the +# NPL. +# +# The Initial Developer of this code under the NPL is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All Rights +# Reserved. + + +DEPTH = ../../../../.. + +CSRCS = \ + TreeTest.c \ + $(NULL) + +REQUIRES = \ + XfeWidgets \ + XfeTest \ + Microline + +STATIC_PROGS = $(addprefix $(OBJDIR)/, $(CSRCS:.c=.static)) +SHARED_PROGS = $(addprefix $(OBJDIR)/, $(CSRCS:.c=.shared)) + +include $(DEPTH)/config/rules.mk +include $(DEPTH)/cmd/xfe/XfeWidgets/XfeWidgets.mk + +all:: $(STATIC_PROGS) $(SHARED_PROGS) +install:: $(STATIC_PROGS) $(SHARED_PROGS) + +shared: $(SHARED_PROGS) +static: $(STATIC_PROGS) diff --git a/cmd/xfe/XfeWidgets/tests/XmL/TreeTest.ad b/cmd/xfe/XfeWidgets/tests/XmL/TreeTest.ad new file mode 100644 index 000000000000..dd4f1fd92275 --- /dev/null +++ b/cmd/xfe/XfeWidgets/tests/XmL/TreeTest.ad @@ -0,0 +1,49 @@ +TreeTest*MainForm.width: 800 +TreeTest*MainForm.height: 400 +TreeTest*MainForm.background: Gray70 +TreeTest*MainForm.shadowThickness: 0 +TreeTest*MainForm.shadowType: shadow_in + +TreeTest*fontList: -*-helvetica-medium-r-*-*-*-140-*-*-*-*-iso8859-* +TreeTest*treeFontList: -*-helvetica-medium-r-*-*-*-140-*-*-*-*-iso8859-* +TreeTest*foreground: Black + +TreeTest*Tree1.leftAttachment: attach_form +TreeTest*Tree1.rightAttachment: attach_form +TreeTest*Tree1.topAttachment: attach_form +TreeTest*Tree1.bottomAttachment: attach_form + +TreeTest*Tree1.leftOffset: 10 +TreeTest*Tree1.rightOffset: 10 +TreeTest*Tree1.topOffset: 10 +TreeTest*Tree1.bottomOffset: 10 + +TreeTest*Tree2.leftAttachment: attach_form +TreeTest*Tree2.rightAttachment: attach_form +TreeTest*Tree2.topAttachment: attach_form +TreeTest*Tree2.bottomAttachment: attach_form + +TreeTest*Tree2.leftOffset: 10 +TreeTest*Tree2.rightOffset: 10 +TreeTest*Tree2.topOffset: 10 +TreeTest*Tree2.bottomOffset: 10 + +TreeTest*Tree3.leftAttachment: attach_form +TreeTest*Tree3.rightAttachment: attach_form +TreeTest*Tree3.topAttachment: attach_form +TreeTest*Tree3.bottomAttachment: attach_form + +TreeTest*Tree3.leftOffset: 10 +TreeTest*Tree3.rightOffset: 10 +TreeTest*Tree3.topOffset: 10 +TreeTest*Tree3.bottomOffset: 10 + +!TreeTest*Tree4.leftAttachment: attach_form +!TreeTest*Tree4.rightAttachment: attach_form +!TreeTest*Tree4.topAttachment: attach_form +!TreeTest*Tree4.bottomAttachment: attach_form + +!TreeTest*Tree4.leftOffset: 10 +!TreeTest*Tree4.rightOffset: 10 +!TreeTest*Tree4.topOffset: 10 +!TreeTest*Tree4.bottomOffset: 10 diff --git a/cmd/xfe/XfeWidgets/tests/XmL/TreeTest.c b/cmd/xfe/XfeWidgets/tests/XmL/TreeTest.c new file mode 100644 index 000000000000..2c611b6c41ea --- /dev/null +++ b/cmd/xfe/XfeWidgets/tests/XmL/TreeTest.c @@ -0,0 +1,539 @@ +#include +#include + +#include +#include +#include + +static void load_tree1 (Widget); +static void load_tree2 (Widget); + +static Widget create_tree1 (Widget,String); +static Widget create_tree2 (Widget,String); +static Widget create_tree3 (Widget,String); +static Widget create_tree4 (Widget,String); + +#define NUM_TREES 4 + +typedef Widget (*foo_create_t) (Widget,String); + +static foo_create_t funcs[NUM_TREES] = +{ + create_tree1, + create_tree2, + create_tree3, + create_tree4 +}; + +/*----------------------------------------------------------------------*/ +int +main(int argc,char *argv[]) +{ + Widget frames[4]; + Widget forms[4]; + Widget trees[4]; + Cardinal i; + + XfeAppCreate("TreeTest",&argc,argv); + + for(i = 0; i < NUM_TREES; i++) + { + frames[i] = XfeFrameCreate(XfeNameIndex("Frame",i + 1),NULL,0); + + forms[i] = XfeDescendantFindByName(frames[i], + "MainForm", + XfeFIND_ANY, + False); + + trees[i] = funcs[i](forms[i],XfeNameIndex("Tree",i + 1)); + + XtPopup(frames[i],XtGrabNone); + } + + XfeAppMainLoop(); + + return 0; +} +/*----------------------------------------------------------------------*/ +static Widget +create_tree1(Widget pw,String name) +{ + Widget tree; + + Pixmap pixmap, pixmask; + XmString str; + + tree = XtVaCreateManagedWidget(name, + xmlTreeWidgetClass, + pw, + XmNvisibleRows, 10, + XmNwidth, 250, + NULL); + + XtVaSetValues(tree, + XmNlayoutFrozen, True, + NULL); + + pixmap = XmUNSPECIFIED_PIXMAP; + pixmask = XmUNSPECIFIED_PIXMAP; + + str = XmStringCreateSimple("Root"); + XmLTreeAddRow(tree, 0, True, True, -1, pixmap, pixmask, str); + XmStringFree(str); + str = XmStringCreateSimple("Level 1 Parent"); + XmLTreeAddRow(tree, 1, True, True, -1, pixmap, pixmask, str); + XmStringFree(str); + str = XmStringCreateSimple("1st Child of Level 1 Parent"); + XmLTreeAddRow(tree, 2, False, False, -1, pixmap, pixmask, str); + XmStringFree(str); + str = XmStringCreateSimple("2nd Child of Level 1 Parent"); + XmLTreeAddRow(tree, 2, False, False, -1, pixmap, pixmask, str); + XmStringFree(str); + str = XmStringCreateSimple("Level 2 Parent"); + XmLTreeAddRow(tree, 2, True, True, -1, pixmap, pixmask, str); + XmStringFree(str); + str = XmStringCreateSimple("Child of Level 2 Parent"); + XmLTreeAddRow(tree, 3, False, False, -1, pixmap, pixmask, str); + XmStringFree(str); + str = XmStringCreateSimple("Level 1 Parent"); + XmLTreeAddRow(tree, 1, True, True, -1, pixmap, pixmask, str); + XmStringFree(str); + str = XmStringCreateSimple("Child of Level 1 Parent"); + XmLTreeAddRow(tree, 2, False, False, -1, pixmap, pixmask, str); + XmStringFree(str); + + XtVaSetValues(tree, + XmNlayoutFrozen, False, + NULL); + + return tree; +} +/*----------------------------------------------------------------------*/ +static Widget +create_tree2(Widget pw,String name) +{ + Widget tree; + + int i, n, size; + XmString str; + XmLTreeRowDefinition *rows; + static struct + { + Boolean expands; + int level; + char *string; + } data[] = + { + { True, 0, "Root" }, + { True, 1, "Level 1 Parent" }, + { False, 2, "1st Child of Level 1 Parent" }, + { False, 2, "2nd Child of Level 1 Parent" }, + { True, 2, "Level 2 Parent" }, + { False, 3, "Child of Level 2 Parent" }, + { True, 1, "Level 1 Parent" }, + { False, 2, "Child of Level 1 Parent" }, + }; + + tree = XtVaCreateManagedWidget(name, + xmlTreeWidgetClass, pw, + XtVaTypedArg, XmNbackground, XmRString, "#C0C0C0", 6, + XtVaTypedArg, XmNforeground, XmRString, "black", 6, + XtVaTypedArg, XmNblankBackground, XmRString, "white", 6, + XtVaTypedArg, XmNselectBackground, XmRString, "#000080", 8, + XtVaTypedArg, XmNselectForeground, XmRString, "white", 6, + XtVaTypedArg, XmNconnectingLineColor, XmRString, "#808080", 8, + XmNvisibleRows, 10, + XmNwidth, 250, + NULL); + XtVaSetValues(tree, + XmNcellDefaults, True, + XtVaTypedArg, XmNcellBackground, XmRString, "white", 6, + NULL); + + /* Create a TreeRowDefinition array from the data array */ + /* and add rows to the Tree */ + n = 8; + size = sizeof(XmLTreeRowDefinition) * n; + rows = (XmLTreeRowDefinition *)malloc(size); + for (i = 0; i < n; i++) + { + rows[i].level = data[i].level; + rows[i].expands = data[i].expands; + rows[i].isExpanded = True; + rows[i].pixmap = XmUNSPECIFIED_PIXMAP; + rows[i].pixmask = XmUNSPECIFIED_PIXMAP; + rows[i].string = XmStringCreateSimple(data[i].string); + } + XmLTreeAddRows(tree, rows, n, -1); + + /* Free the TreeRowDefintion array (and XmStrings) we created above */ + for (i = 0; i < n; i++) + XmStringFree(rows[i].string); + free((char *)rows); + + return tree; +} +/*----------------------------------------------------------------------*/ +static Widget +create_tree3(Widget pw,String name) +{ +#define sphere_width 16 +#define sphere_height 16 +static unsigned char sphere_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0xe0, 0x0f, 0xf0, 0x1f, 0x38, 0x3f, + 0xb8, 0x3f, 0xf8, 0x3f, 0xf8, 0x3f, 0xf8, 0x3f, 0xf0, 0x1f, 0xe0, 0x0f, + 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +#define monitor_width 16 +#define monitor_height 16 +static unsigned char monitor_bits[] = { + 0x00, 0x00, 0xf8, 0x3f, 0xf8, 0x3f, 0x18, 0x30, 0x58, 0x37, 0x18, 0x30, + 0x58, 0x37, 0x18, 0x30, 0xf8, 0x3f, 0xf8, 0x3f, 0x80, 0x03, 0x80, 0x03, + 0xf0, 0x1f, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00}; + + Widget tree; + + XmLTreeRowDefinition *rows; + Pixmap monitorPixmap, spherePixmap; + Pixel black, white; + int i, n, size; + static struct + { + Boolean expands; + int level; + char *string; + } data[] = + { + { True, 0, "Root" }, + { True, 1, "Parent A" }, + { False, 2, "Node A1" }, + { False, 2, "Node A2" }, + { True, 2, "Parent B" }, + { False, 3, "Node B1" }, + { False, 3, "Node B2" }, + { True, 1, "Parent C" }, + { False, 2, "Node C1" }, + { True, 1, "Parent D" }, + { False, 2, "Node D1" }, + }; + + black = BlackPixelOfScreen(XtScreen(pw)); + white = WhitePixelOfScreen(XtScreen(pw)); + spherePixmap = XCreatePixmapFromBitmapData(XtDisplay(pw), + DefaultRootWindow(XtDisplay(pw)), + sphere_bits, sphere_width, sphere_height, + black, white, + DefaultDepthOfScreen(XtScreen(pw))); + monitorPixmap = XCreatePixmapFromBitmapData(XtDisplay(pw), + DefaultRootWindow(XtDisplay(pw)), + monitor_bits, monitor_width, monitor_height, + black, white, + DefaultDepthOfScreen(XtScreen(pw))); + + /* Create a Tree with 3 columns and 1 heading row in multiple */ + /* select mode. We also set globalPixmapWidth and height here */ + /* which specifys that every Pixmap we set on the Tree will be */ + /* the size specified (16x16). This will increase performance. */ + tree = XtVaCreateManagedWidget(name, + xmlTreeWidgetClass, pw, + XtVaTypedArg, XmNbackground, XmRString, "#C0C0C0", 8, + XtVaTypedArg, XmNforeground, XmRString, "black", 6, + XtVaTypedArg, XmNblankBackground, XmRString, "white", 6, + XtVaTypedArg, XmNselectBackground, XmRString, "#000080", 8, + XtVaTypedArg, XmNselectForeground, XmRString, "white", 6, + XtVaTypedArg, XmNconnectingLineColor, XmRString, "#808080", 8, + XmNallowColumnResize, True, + XmNheadingRows, 1, + XmNvisibleRows, 14, + XmNcolumns, 3, + XmNvisibleColumns, 5, + XmNsimpleWidths, "12c 8c 10c", + XmNsimpleHeadings, "All Folders|SIZE|DATA2", + XmNselectionPolicy, XmSELECT_MULTIPLE_ROW, + XmNhighlightRowMode, True, + XmNglobalPixmapWidth, 16, + XmNglobalPixmapHeight, 16, + NULL); + + /* Set default values for new cells (the cells in the content rows) */ + XtVaSetValues(tree, + XmNcellDefaults, True, + XtVaTypedArg, XmNcellBackground, XmRString, "white", 6, + XmNcellLeftBorderType, XmBORDER_NONE, + XmNcellRightBorderType, XmBORDER_NONE, + XmNcellTopBorderType, XmBORDER_NONE, + XmNcellBottomBorderType, XmBORDER_NONE, + NULL); + + /* Create a TreeRowDefinition array from the data array */ + /* and add rows to the Tree */ + n = 11; + size = sizeof(XmLTreeRowDefinition) * n; + rows = (XmLTreeRowDefinition *)malloc(size); + for (i = 0; i < n; i++) + { + rows[i].level = data[i].level; + rows[i].expands = data[i].expands; + rows[i].isExpanded = True; + if (data[i].expands) + rows[i].pixmap = spherePixmap; + else + rows[i].pixmap = monitorPixmap; + rows[i].pixmask = XmUNSPECIFIED_PIXMAP; + rows[i].string = XmStringCreateSimple(data[i].string); + } + XmLTreeAddRows(tree, rows, n, -1); + + /* Free the TreeRowDefintion array we created above and set strings */ + /* in column 1 and 2 */ + for (i = 0; i < n; i++) + { + XmStringFree(rows[i].string); + XmLGridSetStringsPos(tree, XmCONTENT, i, XmCONTENT, 1, "1032|1123"); + } + free((char *)rows); + + return tree; +} +/*----------------------------------------------------------------------*/ + + +static void rowExpand(Widget w,XtPointer clientData,XtPointer callData); +static void rowCollapse(Widget w,XtPointer clientData,XtPointer callData); +static void cellSelect(Widget w,XtPointer clientData,XtPointer callData); + +static Widget grid; + +static Widget +create_tree4(Widget pw,String name) +{ + Widget tree; + XmString str; + + /* Add Tree to left of Form */ + tree = XtVaCreateManagedWidget(name, + xmlTreeWidgetClass, pw, + XmNhorizontalSizePolicy, XmCONSTANT, + XmNautoSelect, False, + XtVaTypedArg, XmNbackground, XmRString, "#C0C0C0", 8, + XtVaTypedArg, XmNforeground, XmRString, "black", 6, + XtVaTypedArg, XmNblankBackground, XmRString, "white", 6, + XtVaTypedArg, XmNselectBackground, XmRString, "#000080", 8, + XtVaTypedArg, XmNselectForeground, XmRString, "white", 6, + XtVaTypedArg, XmNconnectingLineColor, XmRString, "#808080", 8, + XmNleftAttachment, XmATTACH_FORM, + XmNtopAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_POSITION, + XmNrightPosition, 45, + NULL); + XtVaSetValues(tree, + XmNcellDefaults, True, + XtVaTypedArg, XmNcellBackground, XmRString, "white", 6, + NULL); + + /* Add a single row containing the root path to the Tree */ + str = XmStringCreateSimple("/"); + XmLTreeAddRow(tree, 1, True, False, 0, + XmUNSPECIFIED_PIXMAP, XmUNSPECIFIED_PIXMAP, str); + XmStringFree(str); + XtVaSetValues(tree, + XmNrow, 0, + XmNrowUserData, strdup("/"), + NULL); + + XtAddCallback(tree, XmNexpandCallback, rowExpand, NULL); + XtAddCallback(tree, XmNcollapseCallback, rowCollapse, NULL); + XtAddCallback(tree, XmNselectCallback, cellSelect, NULL); + + /* Add a Grid to the right of the Form and set cell defaults */ + grid = XtVaCreateManagedWidget("grid", + xmlGridWidgetClass, pw, + XtVaTypedArg, XmNbackground, XmRString, "#C0C0C0", 8, + XtVaTypedArg, XmNforeground, XmRString, "black", 6, + XtVaTypedArg, XmNblankBackground, XmRString, "white", 6, + XtVaTypedArg, XmNselectBackground, XmRString, "#000080", 8, + XtVaTypedArg, XmNselectForeground, XmRString, "white", 6, + XmNcolumns, 3, + XmNsimpleWidths, "24c 12c 10c", + XmNsimpleHeadings, "Name|Type|Size", + XmNvisibleColumns, 6, + XmNallowColumnResize, True, + XmNheadingRows, 1, + XmNvisibleRows, 16, + XmNhighlightRowMode, True, + XmNleftAttachment, XmATTACH_POSITION, + XmNleftPosition, 46, + XmNtopAttachment, XmATTACH_FORM, + XmNbottomAttachment, XmATTACH_FORM, + XmNrightAttachment, XmATTACH_FORM, + NULL); + XtVaSetValues(grid, + XmNcellDefaults, True, + XtVaTypedArg, XmNcellBackground, XmRString, "white", 6, + XmNcellTopBorderType, XmBORDER_NONE, + XmNcellBottomBorderType, XmBORDER_NONE, + XmNcellRightBorderType, XmBORDER_NONE, + XmNcellLeftBorderType, XmBORDER_NONE, + XmNcellAlignment, XmALIGNMENT_LEFT, + NULL); + XtVaSetValues(grid, + XmNcellDefaults, True, + XmNcolumn, 2, + XmNcellAlignment, XmALIGNMENT_RIGHT, + NULL); + + /* Invoke the select callback for the first row in the Tree */ + /* to fill the Grid with the data for the root path */ + XmLGridSelectRow(tree, 0, True); + + return tree; +} +/*----------------------------------------------------------------------*/ + +static +void rowExpand(Widget w,XtPointer clientData,XtPointer callData) +{ + XmLGridCallbackStruct *cbs; + XmLGridRow row; + int level, pos; + DIR *dir; + struct dirent *d; + struct stat s; + char *path, fullpath[1024]; + XmString str; + + /* Retrieve the path of the directory expanded. This is kept */ + /* in the row's rowUserData */ + cbs = (XmLGridCallbackStruct *)callData; + row = XmLGridGetRow(w, XmCONTENT, cbs->row); + XtVaGetValues(w, + XmNrowPtr, row, + XmNrowUserData, &path, + XmNrowLevel, &level, + NULL); + pos = cbs->row + 1; + dir = opendir(path); + if (!dir) + return; + + /* Add the subdirectories of the directory expanded to the Tree */ + XtVaSetValues(w, + XmNlayoutFrozen, True, + NULL); + while (d = readdir(dir)) + { + if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, "..")) + continue; + sprintf(fullpath, "%s/%s", path, d->d_name); + if (lstat(fullpath, &s) == -1) + continue; + if (!S_ISDIR(s.st_mode)) + continue; + str = XmStringCreateSimple(d->d_name); + XmLTreeAddRow(w, level + 1, True, False, pos, + XmUNSPECIFIED_PIXMAP, XmUNSPECIFIED_PIXMAP, str); + XmStringFree(str); + XtVaSetValues(w, + XmNrow, pos, + XmNrowUserData, strdup(fullpath), + NULL); + pos++; + } + closedir(dir); + XtVaSetValues(w, + XmNlayoutFrozen, False, + NULL); +} + +static +void rowCollapse(Widget w,XtPointer clientData,XtPointer callData) +{ + XmLGridCallbackStruct *cbs; + XmLGridRow row; + char *path; + int i, j, level, rows; + + /* Collapse the row by deleting the rows in the tree which */ + /* are children of the collapsed row. We also need to free */ + /* the path contained in the rowUserData of the rows deleted */ + cbs = (XmLGridCallbackStruct *)callData; + row = XmLGridGetRow(w, XmCONTENT, cbs->row); + XtVaGetValues(w, + XmNrowPtr, row, + XmNrowLevel, &level, + NULL); + XtVaGetValues(w, + XmNrows, &rows, + NULL); + i = cbs->row + 1; + while (i < rows) + { + row = XmLGridGetRow(w, XmCONTENT, i); + XtVaGetValues(w, + XmNrowPtr, row, + XmNrowLevel, &j, + XmNrowUserData, &path, + NULL); + if (j <= level) + break; + free(path); + i++; + } + j = i - cbs->row - 1; + XmLGridDeleteRows(w, XmCONTENT, cbs->row + 1, j); +} + +static +void cellSelect(Widget w,XtPointer clientData,XtPointer callData) +{ + XmLGridCallbackStruct *cbs; + XmLGridRow row; + DIR *dir; + struct stat s; + struct dirent *d; + char *path, fullpath[1024], buf[256]; + int pos; + + /* Retrieve the directory selected */ + cbs = (XmLGridCallbackStruct *)callData; + if (cbs->rowType != XmCONTENT) + return; + row = XmLGridGetRow(w, XmCONTENT, cbs->row); + XtVaGetValues(w, + XmNrowPtr, row, + XmNrowUserData, &path, + NULL); + dir = opendir(path); + if (!dir) + return; + + /* Add a row for each file in the directory to the Grid */ + pos = 0; + XtVaSetValues(grid, + XmNlayoutFrozen, True, + NULL); + XmLGridDeleteAllRows(grid, XmCONTENT); + while (d = readdir(dir)) + { + sprintf(fullpath, "%s/%s", path, d->d_name); + if (lstat(fullpath, &s) == -1) + continue; + XmLGridAddRows(grid, XmCONTENT, pos, 1); + XmLGridSetStringsPos(grid, XmCONTENT, pos, XmCONTENT, 0, d->d_name); + if (S_ISDIR(s.st_mode)) + sprintf(buf, "Directory"); + else if (S_ISLNK(s.st_mode)) + sprintf(buf, "Link"); + else + sprintf(buf, "File"); + XmLGridSetStringsPos(grid, XmCONTENT, pos, XmCONTENT, 1, buf); + sprintf(buf, "%d", (int)s.st_size); + XmLGridSetStringsPos(grid, XmCONTENT, pos, XmCONTENT, 2, buf); + pos++; + } + closedir(dir); + XtVaSetValues(grid, + XmNlayoutFrozen, False, + NULL); +} +