#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "toolbar.h"
#include "button.h"
#include "stock.h"
#include "list.h"
#include <ucx/mempool.h>
#include "../common/context.h"
static UcxMap *toolbar_items;
static UcxList *defaults;
void ui_toolbar_init() {
toolbar_items = ucx_map_new(
16);
}
void ui_toolitem(
char *name,
char *label, ui_callback f,
void *userdata) {
UiToolItem *item = malloc(
sizeof(UiToolItem));
item->item.add_to = (ui_toolbar_add_f)add_toolitem_widget;
item->label = label;
item->image =
NULL;
item->callback = f;
item->userdata = userdata;
item->groups =
NULL;
item->isimportant =
FALSE;
ucx_map_cstr_put(toolbar_items, name, item);
}
void ui_toolitem_st(
char *name,
char *stockid, ui_callback f,
void *userdata) {
ui_toolitem_stgr(name, stockid, f, userdata, -
1);
}
void ui_toolitem_stgr(
char *name,
char *stockid, ui_callback f,
void *userdata, ...) {
UiStToolItem *item = malloc(
sizeof(UiStToolItem));
item->item.add_to = (ui_toolbar_add_f)add_toolitem_st_widget;
item->stockid = stockid;
item->callback = f;
item->userdata = userdata;
item->groups =
NULL;
item->isimportant =
FALSE;
va_list ap;
va_start(ap, userdata);
int group;
while((group = va_arg(ap,
int)) != -
1) {
item->groups = ucx_list_append(item->groups, (
void*)(
intptr_t)group);
}
va_end(ap);
ucx_map_cstr_put(toolbar_items, name, item);
}
void ui_toolitem_img(
char *name,
char *label,
char *img, ui_callback f,
void *udata) {
UiToolItem *item = malloc(
sizeof(UiToolItem));
item->item.add_to = (ui_toolbar_add_f)add_toolitem_widget;
item->label = label;
item->image = img;
item->callback = f;
item->userdata = udata;
item->groups =
NULL;
item->isimportant =
FALSE;
ucx_map_cstr_put(toolbar_items, name, item);
}
void ui_toolitem_toggle_stgr(
char *name,
char *stockid, ui_callback f,
void *udata, ...) {
UiStToolItem *item = malloc(
sizeof(UiStToolItem));
item->item.add_to = (ui_toolbar_add_f)add_toolitem_st_toggle_widget;
item->stockid = stockid;
item->callback = f;
item->userdata = udata;
item->groups =
NULL;
item->isimportant =
FALSE;
va_list ap;
va_start(ap, udata);
int group;
while((group = va_arg(ap,
int)) != -
1) {
item->groups = ucx_list_append(item->groups, (
void*)(
intptr_t)group);
}
va_end(ap);
ucx_map_cstr_put(toolbar_items, name, item);
}
void ui_toolitem_toggle_imggr(
char *name,
char *label,
char *img, ui_callback f,
void *udata, ...) {
UiToolItem *item = malloc(
sizeof(UiToolItem));
item->item.add_to = (ui_toolbar_add_f)add_toolitem_toggle_widget;
item->label = label;
item->image = img;
item->callback = f;
item->userdata = udata;
item->groups =
NULL;
item->isimportant =
FALSE;
va_list ap;
va_start(ap, udata);
int group;
while((group = va_arg(ap,
int)) != -
1) {
item->groups = ucx_list_append(item->groups, (
void*)(
intptr_t)group);
}
va_end(ap);
ucx_map_cstr_put(toolbar_items, name, item);
}
void ui_toolbar_combobox(
char *name,
UiList *list,
ui_getvaluefunc getvalue,
ui_callback f,
void *udata)
{
UiToolbarComboBox *cb = malloc(
sizeof(UiToolbarComboBox));
cb->item.add_to = (ui_toolbar_add_f)add_toolbar_combobox;
cb->list = list;
cb->getvalue = getvalue;
cb->callback = f;
cb->userdata = udata;
ucx_map_cstr_put(toolbar_items, name, cb);
}
void ui_toolbar_combobox_str(
char *name,
UiList *list,
ui_callback f,
void *udata)
{
ui_toolbar_combobox(name, list, ui_strmodel_getvalue, f, udata);
}
void ui_toolbar_combobox_nv(
char *name,
char *listname,
ui_getvaluefunc getvalue,
ui_callback f,
void *udata)
{
UiToolbarComboBoxNV *cb = malloc(
sizeof(UiToolbarComboBoxNV));
cb->item.add_to = (ui_toolbar_add_f)add_toolbar_combobox_nv;
cb->listname = listname;
cb->getvalue = getvalue;
cb->callback = f;
cb->userdata = udata;
ucx_map_cstr_put(toolbar_items, name, cb);
}
void ui_toolbar_add_default(
char *name) {
char *s = strdup(name);
defaults = ucx_list_append(defaults, s);
}
Widget ui_create_toolbar(UiObject *obj, Widget parent) {
if(!defaults) {
return NULL;
}
Arg args[
8];
XtSetArg(args[
0], XmNshadowType, XmSHADOW_ETCHED_OUT);
XtSetArg(args[
1], XmNshadowThickness,
1);
XtSetArg(args[
2], XmNtopAttachment, XmATTACH_FORM);
XtSetArg(args[
3], XmNleftAttachment, XmATTACH_FORM);
XtSetArg(args[
4], XmNrightAttachment, XmATTACH_FORM);
Widget frame = XmCreateFrame(parent,
"toolbar_frame", args,
5);
XtSetArg(args[
0], XmNorientation, XmHORIZONTAL);
XtSetArg(args[
1], XmNpacking, XmPACK_TIGHT);
XtSetArg(args[
2], XmNspacing,
1);
Widget toolbar = XmCreateRowColumn (frame,
"toolbar", args,
3);
UCX_FOREACH(elm, defaults) {
UiToolItemI *item = ucx_map_cstr_get(toolbar_items, elm->data);
if(item) {
item->add_to(toolbar, item, obj);
}
else if(!strcmp(elm->data,
"@separator")) {
}
else {
fprintf(stderr,
"UI Error: Unknown toolbar item: %s\n", elm->data);
}
}
XtManageChild(toolbar);
XtManageChild(frame);
return frame;
}
void add_toolitem_widget(Widget parent, UiToolItem *item, UiObject *obj) {
Arg args[
4];
XmString label = XmStringCreateLocalized(item->label);
XtSetArg(args[
0], XmNlabelString, label);
XtSetArg(args[
1], XmNshadowThickness,
1);
XtSetArg(args[
2], XmNtraversalOn,
FALSE);
Widget button = XmCreatePushButton(parent,
"toolbar_button", args,
3);
XmStringFree(label);
if(item->callback) {
UiEventData *event = ucx_mempool_malloc(
obj->ctx->mempool,
sizeof(UiEventData));
event->obj = obj;
event->userdata = item->userdata;
event->callback = item->callback;
XtAddCallback(
button,
XmNactivateCallback,
(XtCallbackProc)ui_push_button_callback,
event);
}
XtManageChild(button);
if(item->groups) {
uic_add_group_widget(obj->ctx, button, (ui_enablefunc)XtSetSensitive, item->groups);
}
}
void add_toolitem_st_widget(Widget parent, UiStToolItem *item, UiObject *obj) {
Arg args[
8];
UiStockItem *stock_item = ui_get_stock_item(item->stockid);
XmString label = XmStringCreateLocalized(stock_item->label);
XtSetArg(args[
0], XmNlabelString, label);
XtSetArg(args[
1], XmNshadowThickness,
1);
XtSetArg(args[
2], XmNtraversalOn,
FALSE);
Widget button = XmCreatePushButton(parent,
"toolbar_button", args,
3);
XmStringFree(label);
if(item->callback) {
UiEventData *event = ucx_mempool_malloc(
obj->ctx->mempool,
sizeof(UiEventData));
event->obj = obj;
event->userdata = item->userdata;
event->callback = item->callback;
XtAddCallback(
button,
XmNactivateCallback,
(XtCallbackProc)ui_push_button_callback,
event);
}
XtManageChild(button);
if(item->groups) {
uic_add_group_widget(obj->ctx, button, (ui_enablefunc)XtSetSensitive, item->groups);
}
}
void add_toolitem_toggle_widget(Widget parent, UiToolItem *item, UiObject *obj) {
Arg args[
8];
XmString label = XmStringCreateLocalized(item->label);
XtSetArg(args[
0], XmNlabelString, label);
XtSetArg(args[
1], XmNshadowThickness,
1);
XtSetArg(args[
2], XmNtraversalOn,
FALSE);
XtSetArg(args[
3], XmNindicatorOn, XmINDICATOR_NONE);
Widget button = XmCreateToggleButton(parent,
"toolbar_toggle_button", args,
4);
XmStringFree(label);
if(item->callback) {
UiEventData *event = ucx_mempool_malloc(
obj->ctx->mempool,
sizeof(UiEventData));
event->obj = obj;
event->userdata = item->userdata;
event->callback = item->callback;
XtAddCallback(
button,
XmNvalueChangedCallback,
(XtCallbackProc)ui_toggle_button_callback,
event);
}
XtManageChild(button);
if(item->groups) {
uic_add_group_widget(obj->ctx, button, (ui_enablefunc)XtSetSensitive, item->groups);
}
}
void add_toolitem_st_toggle_widget(Widget parent, UiStToolItem *item, UiObject *obj) {
}
void add_toolbar_combobox(Widget tb, UiToolbarComboBox *item, UiObject *obj) {
UiListView *listview = ucx_mempool_malloc(
obj->ctx->mempool,
sizeof(UiListView));
UiVar *var = ucx_mempool_malloc(obj->ctx->mempool,
sizeof(UiVar));
var->value = item->list;
var->type =
UI_VAR_SPECIAL;
Arg args[
8];
XtSetArg(args[
0], XmNshadowThickness,
1);
XtSetArg(args[
1], XmNindicatorOn, XmINDICATOR_NONE);
XtSetArg(args[
2], XmNtraversalOn,
FALSE);
XtSetArg(args[
3], XmNwidth,
120);
Widget combobox = XmCreateDropDownList(tb,
"toolbar_combobox", args,
4);
XtManageChild(combobox);
listview->widget = combobox;
listview->list = var;
listview->getvalue = item->getvalue;
ui_listview_update(
NULL, listview);
if(item->callback) {
}
}
void add_toolbar_combobox_nv(Widget tb, UiToolbarComboBoxNV *item, UiObject *obj) {
}