This commit is contained in:
ramiro 1998-05-03 11:52:01 +00:00
Родитель 42d44aac7b
Коммит c01c75fdc3
3 изменённых файлов: 628 добавлений и 0 удалений

Просмотреть файл

@ -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)

Просмотреть файл

@ -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

Просмотреть файл

@ -0,0 +1,539 @@
#include <Xfe/XfeTest.h>
#include <XmL/Tree.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
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);
}