1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-23 22:52:34 +01:00

changed stringselector for enumeration selector

This commit is contained in:
kojima
2000-12-21 21:06:00 +00:00
parent f912d9f38d
commit 4c60cd5ba4
5 changed files with 308 additions and 22 deletions

View File

@@ -5,6 +5,15 @@
#include "wtableview.h"
typedef struct {
WMTableView *table;
WMFont *font;
GC gc;
GC selGc;
GC selTextGc;
} StringData;
typedef struct {
WMTextField *widget;
WMTableView *table;
@@ -15,6 +24,19 @@ typedef struct {
} StringEditorData;
typedef struct {
WMPopUpButton *widget;
WMTableView *table;
WMFont *font;
char **options;
int count;
GC gc;
GC selGc;
GC selTextGc;
} EnumSelectorData;
static void stringDraw(WMScreen *scr, Drawable d, GC gc,
GC sgc, GC stgc, WMFont *font, void *data,
WMRect rect, Bool selected)
@@ -52,8 +74,10 @@ static void stringDraw(WMScreen *scr, Drawable d, GC gc,
static void cellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
int row)
static void SECellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
StringEditorData *strdata = (StringEditorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
@@ -67,7 +91,7 @@ static void cellPainter(WMTableColumnDelegate *self, WMTableColumn *column,
}
static void selectedCellPainter(WMTableColumnDelegate *self,
static void selectedSECellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
StringEditorData *strdata = (StringEditorData*)self->data;
@@ -82,7 +106,7 @@ static void selectedCellPainter(WMTableColumnDelegate *self,
}
static void beginCellEdit(WMTableColumnDelegate *self,
static void beginSECellEdit(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
StringEditorData *strdata = (StringEditorData*)self->data;
@@ -97,8 +121,19 @@ static void beginCellEdit(WMTableColumnDelegate *self,
}
static void endSECellEdit(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
StringEditorData *strdata = (StringEditorData*)self->data;
WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
char *text;
text = WMGetTextFieldText(strdata->widget);
WMSetTableViewDataForCell(strdata->table, column, row, (void*)text);
}
WMTableColumnDelegate *WTCreateStringDelegate(WMTableView *parent)
WMTableColumnDelegate *WTCreateStringEditorDelegate(WMTableView *parent)
{
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
WMScreen *scr = WMWidgetScreen(parent);
@@ -115,13 +150,180 @@ WMTableColumnDelegate *WTCreateStringDelegate(WMTableView *parent)
data->gc = WMColorGC(WMBlackColor(scr));
delegate->data = data;
delegate->drawCell = cellPainter;
delegate->drawSelectedCell = selectedCellPainter;
delegate->beginCellEdit = beginCellEdit;
delegate->endCellEdit = NULL;
delegate->drawCell = SECellPainter;
delegate->drawSelectedCell = selectedSECellPainter;
delegate->beginCellEdit = beginSECellEdit;
delegate->endCellEdit = endSECellEdit;
return delegate;
}
/* ---------------------------------------------------------------------- */
static void ESCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
int i = WMTableViewDataForCell(table, column, row);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
strdata->options[i],
WMTableViewRectForCell(table, column, row),
False);
}
static void selectedESCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
int i = WMTableViewDataForCell(table, column, row);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
strdata->options[i],
WMTableViewRectForCell(table, column, row),
True);
}
static void beginESCellEdit(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
int data = (int)WMTableViewDataForCell(strdata->table, column, row);
wassertr(data < strdata->count);
WMSetPopUpButtonSelectedItem(strdata->widget, data);
WMMoveWidget(strdata->widget, rect.pos.x, rect.pos.y-1);
WMResizeWidget(strdata->widget, rect.size.width, rect.size.height+2);
WMMapWidget(strdata->widget);
}
static void endESCellEdit(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
EnumSelectorData *strdata = (EnumSelectorData*)self->data;
WMRect rect = WMTableViewRectForCell(strdata->table, column, row);
int option;
option = WMGetPopUpButtonSelectedItem(strdata->widget);
WMSetTableViewDataForCell(strdata->table, column, row, (void*)option);
}
WMTableColumnDelegate *WTCreateEnumSelectorDelegate(WMTableView *parent)
{
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
WMScreen *scr = WMWidgetScreen(parent);
EnumSelectorData *data = wmalloc(sizeof(EnumSelectorData));
data->widget = WMCreatePopUpButton(parent);
W_ReparentView(WMWidgetView(data->widget),
WMGetTableViewDocumentView(parent),
0, 0);
data->table = parent;
data->font = WMSystemFontOfSize(scr, 12);
data->selGc = WMColorGC(WMDarkGrayColor(scr));
data->selTextGc = WMColorGC(WMWhiteColor(scr));
data->gc = WMColorGC(WMBlackColor(scr));
data->count = 0;
data->options = NULL;
delegate->data = data;
delegate->drawCell = ESCellPainter;
delegate->drawSelectedCell = selectedESCellPainter;
delegate->beginCellEdit = beginESCellEdit;
delegate->endCellEdit = endESCellEdit;
return delegate;
}
void WTSetEnumSelectorOptions(WMTableColumnDelegate *delegate,
char **options, int count)
{
EnumSelectorData *data = (EnumSelectorData*)delegate->data;
int i;
for (i = 0;
i < WMGetPopUpButtonNumberOfItems(data->widget);
i++) {
WMRemovePopUpButtonItem(data->widget, 0);
}
data->options = options;
data->count = count;
for (i = 0; i < count; i++) {
WMAddPopUpButtonItem(data->widget, options[i]);
}
}
/* ---------------------------------------------------------------------- */
static void SCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
StringData *strdata = (StringData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
WMTableViewDataForCell(table, column, row),
WMTableViewRectForCell(table, column, row),
False);
}
static void selectedSCellPainter(WMTableColumnDelegate *self,
WMTableColumn *column, int row)
{
StringData *strdata = (StringData*)self->data;
WMTableView *table = WMGetTableColumnTableView(column);
stringDraw(WMWidgetScreen(table),
WMViewXID(WMGetTableViewDocumentView(table)),
strdata->gc, strdata->selGc, strdata->selTextGc, strdata->font,
WMTableViewDataForCell(table, column, row),
WMTableViewRectForCell(table, column, row),
True);
}
WMTableColumnDelegate *WTCreateStringDelegate(WMTableView *parent)
{
WMTableColumnDelegate *delegate = wmalloc(sizeof(WMTableColumnDelegate));
WMScreen *scr = WMWidgetScreen(parent);
StringData *data = wmalloc(sizeof(StringData));
data->table = parent;
data->font = WMSystemFontOfSize(scr, 12);
data->selGc = WMColorGC(WMDarkGrayColor(scr));
data->selTextGc = WMColorGC(WMWhiteColor(scr));
data->gc = WMColorGC(WMBlackColor(scr));
delegate->data = data;
delegate->drawCell = SCellPainter;
delegate->drawSelectedCell = selectedSCellPainter;
delegate->beginCellEdit = NULL;
delegate->endCellEdit = NULL;
return delegate;
}

View File

@@ -6,7 +6,9 @@
extern "C" {
#endif
WMTableColumnDelegate *WTCreateStringDelegate(WMScreen *scr);
WMTableColumnDelegate *WTCreateStringDelegate(WMTableView *table);
WMTableColumnDelegate *WTCreateStringEditorDelegate(WMTableView *table);
WMTableColumnDelegate *WTCreateEnumSelectorDelegate(WMTableView *table);
#ifdef __cplusplus
}

View File

@@ -5,6 +5,18 @@
#include "tabledelegates.h"
static char *col1[20] = {0};
static int col2[20];
static char *options[] = {
"Option1",
"Option2",
"Option3",
"Option4",
"Option5"
};
int numberOfRows(WMTableViewDelegate *self, WMTableView *table)
{
@@ -15,8 +27,27 @@ int numberOfRows(WMTableViewDelegate *self, WMTableView *table)
void *valueForCell(WMTableViewDelegate *self, WMTableColumn *column, int row)
{
WMTableView *table = (WMTableView*)WMGetTableColumnTableView(column);
return "TESTE";
int i;
if (col1[0] == 0) {
for (i = 0; i < 20; i++) {
col1[i] = "teste";
col2[i] = 0;
}
}
if (WMGetTableColumnId(column) == 1)
return col1[row];
else
return col2[row];
}
void setValueForCell(WMTableViewDelegate *self, WMTableColumn *column, int row,
void *data)
{
if (WMGetTableColumnId(column) == 1)
col1[row] = data;
else
col2[row] = data;
}
@@ -24,11 +55,21 @@ static WMTableViewDelegate delegate = {
NULL,
numberOfRows,
valueForCell,
NULL
setValueForCell
};
void selectedRowObserver(void *self, WMNotification *notif)
{
int row = (int)WMGetNotificationClientData(notif);
WMEditTableViewRow(self, row);
}
main(int argc, char **argv)
{
Display *dpy = XOpenDisplay("");
@@ -60,8 +101,11 @@ main(int argc, char **argv)
WMSetTableViewGridColor(table, WMGrayColor(scr));
WMSetTableViewHeaderHeight(table, 20);
WMSetTableViewDelegate(table, &delegate);
WMAddNotificationObserver(selectedRowObserver, table,
WMTableViewRowWasSelectedNotification,
table);
colDeleg = WTCreateStringDelegate(table);
colDeleg = WTCreateStringEditorDelegate(table);
col = WMCreateTableColumn("Group");
WMSetTableColumnWidth(col, 180);
@@ -69,10 +113,11 @@ main(int argc, char **argv)
WMSetTableColumnDelegate(col, colDeleg);
WMSetTableColumnId(col, (void*)1);
colDeleg = WTCreateStringDelegate(table);
colDeleg = WTCreateEnumSelectorDelegate(table);
WTSetEnumSelectorOptions(colDeleg, options, 5);
col = WMCreateTableColumn("Package");
WMSetTableColumnWidth(col, 240);
WMSetTableColumnWidth(col, 140);
WMAddTableViewColumn(table, col);
WMSetTableColumnDelegate(col, colDeleg);
WMSetTableColumnId(col, (void*)2);

View File

@@ -142,6 +142,8 @@ struct W_TableView {
void *dataSource;
WMTableViewDelegate *delegate;
int editingRow;
unsigned headerHeight;
@@ -296,6 +298,8 @@ WMTableView *WMCreateTableView(WMWidget *parent)
table->gridGC = XCreateGC(WMScreenDisplay(scr), W_DRAWABLE(scr),
GCForeground, &gcv);
}
table->editingRow = -1;
table->drawsGrid = 1;
table->rowHeight = 16;
@@ -428,6 +432,13 @@ void *WMTableViewDataForCell(WMTableView *table, WMTableColumn *column,
}
void WMSetTableViewDataForCell(WMTableView *table, WMTableColumn *column,
int row, void *data)
{
(*table->delegate->setValueForCell)(table->delegate, column, row, data);
}
WMRect WMTableViewRectForCell(WMTableView *table, WMTableColumn *column,
int row)
{
@@ -686,15 +697,37 @@ static void repaintTable(WMTableView *table, int x, int y,
}
static void startRowEdit(WMTableView *table, int row)
static void stopRowEdit(WMTableView *table, int row)
{
int i;
WMTableColumn *column;
table->editingRow = -1;
for (i = 0; i < WMGetArrayItemCount(table->columns); i++) {
column = WMGetFromArray(table->columns, i);
wassertr(column->delegate && column->delegate->drawCell);
wassertr(column->delegate && column->delegate->endCellEdit);
(*column->delegate->endCellEdit)(column->delegate, column, row);
}
}
void WMEditTableViewRow(WMTableView *table, int row)
{
int i;
WMTableColumn *column;
if (table->editingRow >= 0) {
stopRowEdit(table, table->editingRow);
}
table->editingRow = row;
for (i = 0; i < WMGetArrayItemCount(table->columns); i++) {
column = WMGetFromArray(table->columns, i);
wassertr(column->delegate && column->delegate->beginCellEdit);
(*column->delegate->beginCellEdit)(column->delegate, column, row);
}
@@ -708,7 +741,6 @@ static void handleTableEvents(XEvent *event, void *data)
switch (event->type) {
case ButtonPress:
setRowSelected(table, event->xbutton.y/table->rowHeight, True);
startRowEdit(table, event->xbutton.y/table->rowHeight);
break;
case Expose:

View File

@@ -72,9 +72,14 @@ void WMSetTableViewDelegate(WMTableView *table, WMTableViewDelegate *delegate);
WMView *WMGetTableViewDocumentView(WMTableView *table);
void WMEditTableViewRow(WMTableView *table, int row);
void *WMTableViewDataForCell(WMTableView *table, WMTableColumn *column,
int row);
void WMSetTableViewDataForCell(WMTableView *table, WMTableColumn *column,
int row, void *data);
WMRect WMTableViewRectForCell(WMTableView *table, WMTableColumn *column,
int row);