#include <stdio.h>
#include <stdlib.h>
#include "toolkit.h"
#include "menu.h"
#include "toolbar.h"
#include "container.h"
#include "../ui/window.h"
#include "../common/context.h"
static int nwindows =
0;
static int window_default_width =
600;
static int window_default_height =
500;
static void window_close_handler(Widget window,
void *udata,
void *cdata) {
UiObject *obj = udata;
UiEvent ev;
ev.window = obj->window;
ev.document = obj->ctx->document;
ev.obj = obj;
ev.eventdata =
NULL;
ev.intval =
0;
if(obj->ctx->close_callback) {
obj->ctx->close_callback(&ev, obj->ctx->close_data);
}
nwindows--;
if(nwindows ==
0) {
ui_exit_mainloop();
}
}
static UiObject* create_window(
char *title,
void *window_data, UiBool simple) {
UcxMempool *mp = ucx_mempool_new(
256);
UiObject *obj = ucx_mempool_calloc(mp,
1,
sizeof(UiObject));
obj->ctx = uic_context(obj, mp);
obj->window = window_data;
Arg args[
16];
int n =
0;
XtSetArg(args[
0], XmNtitle, title);
XtSetArg(args[
1], XmNminWidth,
100);
XtSetArg(args[
2], XmNminHeight,
50);
XtSetArg(args[
3], XmNwidth, window_default_width);
XtSetArg(args[
4], XmNheight, window_default_height);
Widget toplevel = XtAppCreateShell(
"Test123",
"abc",
vendorShellWidgetClass,
ui_get_display(),
args,
5);
Atom wm_delete_window;
wm_delete_window = XmInternAtom(
XtDisplay(toplevel),
"WM_DELETE_WINDOW",
0);
XmAddWMProtocolCallback(
toplevel,
wm_delete_window,
window_close_handler,
obj);
ui_set_active_window(toplevel);
Widget window = XtVaCreateManagedWidget(
title,
xmMainWindowWidgetClass,
toplevel,
NULL);
obj->widget = window;
Widget form = XtVaCreateManagedWidget(
"window_form",
xmFormWidgetClass,
window,
NULL);
Widget toolbar =
NULL;
if(!simple) {
ui_create_menubar(obj);
toolbar = ui_create_toolbar(obj, form);
}
XtSetArg(args[
0], XmNshadowType, XmSHADOW_ETCHED_OUT);
XtSetArg(args[
1], XmNshadowThickness,
0);
XtSetArg(args[
2], XmNleftAttachment, XmATTACH_FORM);
XtSetArg(args[
3], XmNrightAttachment, XmATTACH_FORM);
XtSetArg(args[
4], XmNbottomAttachment, XmATTACH_FORM);
if(toolbar) {
XtSetArg(args[
5], XmNtopAttachment, XmATTACH_WIDGET);
XtSetArg(args[
6], XmNtopWidget, toolbar);
n =
7;
}
else {
XtSetArg(args[
5], XmNtopAttachment, XmATTACH_FORM);
n =
6;
}
Widget frame = XmCreateFrame(form,
"content_frame", args, n);
XtManageChild(frame);
Widget content_form = XmCreateForm(frame,
"content_form",
NULL,
0);
XtManageChild(content_form);
obj->container = ui_box_container(obj, content_form,
0,
0,
UI_BOX_VERTICAL);
XtManageChild(form);
obj->widget = toplevel;
nwindows++;
return obj;
}
UiObject* ui_window(
char *title,
void *window_data) {
return create_window(title, window_data,
FALSE);
}
UiObject* ui_simplewindow(
char *title,
void *window_data) {
return create_window(title, window_data,
TRUE);
}
void ui_close(UiObject *obj) {
XtDestroyWidget(obj->widget);
window_close_handler(obj->widget, obj,
NULL);
}
typedef struct FileDialogData {
int running;
char *file;
} FileDialogData;
static void filedialog_select(
Widget widget,
FileDialogData *data,
XmFileSelectionBoxCallbackStruct *selection)
{
char *path =
NULL;
XmStringGetLtoR(selection->value, XmSTRING_DEFAULT_CHARSET, &path);
data->running =
0;
data->file = strdup(path);
XtFree(path);
XtUnmanageChild(widget);
}
static void filedialog_cancel(
Widget widget,
FileDialogData *data,
XmFileSelectionBoxCallbackStruct *selection)
{
data->running =
0;
XtUnmanageChild(widget);
}
char* ui_openfiledialog(UiObject *obj) {
Widget dialog = XmCreateFileSelectionDialog(obj->widget,
"openfiledialog",
NULL,
0);
XtManageChild(dialog);
FileDialogData data;
data.running =
1;
data.file =
NULL;
XtAddCallback(dialog, XmNokCallback, (XtCallbackProc)filedialog_select, &data);
XtAddCallback(dialog, XmNcancelCallback, (XtCallbackProc)filedialog_cancel, &data);
ui_secondary_event_loop(&data.running);
return data.file;
}
char* ui_savefiledialog(UiObject *obj) {
return ui_openfiledialog(obj);
}