зеркало из https://github.com/mozilla/gecko-dev.git
add XmL tests
This commit is contained in:
Родитель
42d44aac7b
Коммит
c01c75fdc3
|
@ -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);
|
||||
}
|
||||
|
Загрузка…
Ссылка в новой задаче