From 4c60cd5ba428c3a0dff3829dfdbffe57a55209bf Mon Sep 17 00:00:00 2001 From: kojima Date: Thu, 21 Dec 2000 21:06:00 +0000 Subject: [PATCH] changed stringselector for enumeration selector --- WINGs/Extras/tabledelegates.c | 220 ++++++++++++++++++++++++++++++++++++++++-- WINGs/Extras/tabledelegates.h | 4 +- WINGs/Extras/test.c | 59 +++++++++-- WINGs/Extras/wtableview.c | 40 +++++++- WINGs/Extras/wtableview.h | 5 + 5 files changed, 307 insertions(+), 21 deletions(-) diff --git a/WINGs/Extras/tabledelegates.c b/WINGs/Extras/tabledelegates.c index 03dc3c1e..ff23138c 100644 --- a/WINGs/Extras/tabledelegates.c +++ b/WINGs/Extras/tabledelegates.c @@ -6,6 +6,15 @@ typedef struct { + WMTableView *table; + WMFont *font; + GC gc; + GC selGc; + GC selTextGc; +} StringData; + + +typedef struct { WMTextField *widget; WMTableView *table; WMFont *font; @@ -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; +} diff --git a/WINGs/Extras/tabledelegates.h b/WINGs/Extras/tabledelegates.h index 09d83a25..d753d1bd 100644 --- a/WINGs/Extras/tabledelegates.h +++ b/WINGs/Extras/tabledelegates.h @@ -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 } diff --git a/WINGs/Extras/test.c b/WINGs/Extras/test.c index e4966813..7d420747 100644 --- a/WINGs/Extras/test.c +++ b/WINGs/Extras/test.c @@ -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); diff --git a/WINGs/Extras/wtableview.c b/WINGs/Extras/wtableview.c index 75610329..2f64d400 100644 --- a/WINGs/Extras/wtableview.c +++ b/WINGs/Extras/wtableview.c @@ -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: diff --git a/WINGs/Extras/wtableview.h b/WINGs/Extras/wtableview.h index 3999322d..7442b709 100644 --- a/WINGs/Extras/wtableview.h +++ b/WINGs/Extras/wtableview.h @@ -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); -- 2.11.4.GIT