2
#include "../src/rccconfig.h"
6
#define RCC_UI_LOCK_CODE 0x1111
8
static rcc_ui_menu_context rccUiMenuCreateContext(rcc_ui_menu_type type, rcc_ui_id id, rcc_ui_context uictx) {
9
rcc_ui_menu_context ctx;
10
if ((!uictx)||(type>RCC_UI_MENU_MAX)) return NULL;
12
ctx = (rcc_ui_menu_context)malloc(sizeof(rcc_ui_menu_context_s));
19
ctx->widget = rccUiMenuCreateWidget(ctx);
25
static void rccUiMenuFreeContext(rcc_ui_menu_context ctx) {
27
rccUiMenuFreeWidget(ctx);
31
rcc_ui_context rccUiCreateContext(rcc_context rccctx) {
35
rcc_class_ptr *classes;
37
rcc_ui_menu_context *charsets;
38
rcc_ui_menu_context *options;
40
if (!rccctx) return NULL;
42
err = rccLockConfiguration(rccctx, RCC_UI_LOCK_CODE);
45
classes = rccGetClassList(rccctx);
46
for (i=0; classes[i]; i++);
48
ctx = (rcc_ui_context)malloc(sizeof(struct rcc_ui_context_t));
49
charsets = (rcc_ui_menu_context*)malloc((i+1)*sizeof(rcc_ui_menu_context));
50
options = (rcc_ui_menu_context*)malloc((RCC_MAX_OPTIONS)*sizeof(rcc_ui_menu_context));
51
if ((!ctx)||(!charsets)) {
53
if (charsets) free(charsets);
54
rccUnlockConfiguration(rccctx, RCC_UI_LOCK_CODE);
58
ctx->language_frame = NULL;
59
ctx->charset_frame = NULL;
60
ctx->engine_frame = NULL;
63
ctx->charsets = charsets;
66
ctx->language_names = rcc_default_language_names;
67
ctx->option_names = rcc_default_option_names;
69
ctx->internal = rccUiCreateInternal(ctx);
71
ctx->language = rccUiMenuCreateContext(RCC_UI_MENU_LANGUAGE, 0, ctx);
72
ctx->engine = rccUiMenuCreateContext(RCC_UI_MENU_ENGINE, 0, ctx);
73
for (i=0; classes[i]; i++) {
74
charsets[i] = rccUiMenuCreateContext(RCC_UI_MENU_CHARSET, i, ctx);
75
if (!charsets[i]) err = 1;
78
for (i=0; i<RCC_MAX_OPTIONS; i++) {
79
options[i] = rccUiMenuCreateContext(RCC_UI_MENU_OPTION, i, ctx);
80
if (!options[i]) err = 1;
83
if ((err)||(!ctx->language)||(!ctx->engine)) {
84
rccUiFreeContext(ctx);
91
void rccUiFreeContext(rcc_ui_context ctx) {
93
rcc_class_ptr *classes;
97
rccUiFreeInternal(ctx);
100
classes = rccGetClassList(ctx->rccctx);
101
for (i=0; classes[i]; i++)
102
if (ctx->charsets[i]) rccUiMenuFreeContext(ctx->charsets[i]);
106
for (i=0;i<RCC_MAX_OPTIONS;i++) {
107
if (ctx->options[i]) rccUiMenuFreeContext(ctx->options[i]);
111
if (ctx->engine) rccUiMenuFreeContext(ctx->engine);
112
if (ctx->language) rccUiMenuFreeContext(ctx->language);
114
rccUnlockConfiguration(ctx->rccctx, RCC_UI_LOCK_CODE);
119
int rccUiSetLanguageNames(rcc_ui_context ctx, rcc_language_name *names) {
122
if (names) ctx->language_names = names;
123
else ctx->language_names = rcc_default_language_names;
127
int rccUiSetOptionNames(rcc_ui_context ctx, rcc_option_name *names) {
130
if (names) ctx->option_names = names;
131
else ctx->option_names = rcc_default_option_names;
136
int rccUiRestoreLanguage(rcc_ui_context ctx) {
138
rcc_class_ptr *classes;
143
rccctx = ctx->rccctx;
145
rccUiMenuSet(ctx->engine, (rcc_ui_id)rccGetSelectedEngine(rccctx));
147
for (i=0;i<RCC_MAX_OPTIONS;i++)
148
rccUiMenuSet(ctx->options[i], rccGetOption(rccctx, (rcc_option)i));
150
classes = rccGetClassList(rccctx);
151
for (i=0;classes[i];i++)
152
rccUiMenuSet(ctx->charsets[i], rccGetSelectedCharset(rccctx, (rcc_class_id)i));
157
int rccUiRestore(rcc_ui_context ctx) {
158
rcc_language_id language_id;
162
language_id = rccGetSelectedLanguage(ctx->rccctx);
163
rccUiMenuSet(ctx->language, (rcc_ui_id)language_id);
167
int rccUiUpdate(rcc_ui_context ctx) {
169
rcc_class_ptr *classes;
174
rccctx = ctx->rccctx;
176
rccSetLanguage(rccctx, (rcc_language_id)rccUiMenuGet(ctx->language));
178
for (i=0;i<RCC_MAX_OPTIONS;i++)
179
rccSetOption(rccctx, (rcc_option)i, (rcc_option_value)rccUiMenuGet(ctx->options[i]));
181
rccSetEngine(rccctx, (rcc_language_id)rccUiMenuGet(ctx->engine));
183
classes = rccGetClassList(rccctx);
184
for (i=0;classes[i];i++)
185
rccSetCharset(rccctx, (rcc_class_id)i, rccUiMenuGet(ctx->charsets[i]));
192
rcc_ui_widget rccUiGetLanguageMenu(rcc_ui_context ctx) {
193
if (!ctx) return NULL;
195
if (rccUiMenuConfigureWidget(ctx->language)) return NULL;
196
return ctx->language->widget;
199
rcc_ui_widget rccUiGetCharsetMenu(rcc_ui_context ctx, rcc_class_id id) {
200
rcc_charset *charsets;
203
if ((!ctx)||(id<0)) return NULL;
205
charsets = rccGetCurrentCharsetList(ctx->rccctx);
206
for (i=0;charsets[i];i++);
207
if (id>=i) return NULL;
209
if (rccUiMenuConfigureWidget(ctx->charsets[i])) return NULL;
210
return ctx->charsets[i]->widget;
214
rcc_ui_widget rccUiGetEngineMenu(rcc_ui_context ctx) {
215
if (!ctx) return NULL;
217
if (rccUiMenuConfigureWidget(ctx->engine)) return NULL;
218
return ctx->engine->widget;
222
rcc_ui_widget rccUiGetOptionMenu(rcc_ui_context ctx, rcc_option option) {
223
if ((!ctx)||(option<0)||(option>RCC_MAX_OPTIONS)) return NULL;
225
if (rccUiMenuConfigureWidget(ctx->options[option])) return NULL;
226
return ctx->options[option]->widget;
230
rcc_ui_box rccUiGetLanguageBox(rcc_ui_context ctx, const char *title) {
231
rcc_ui_widget language;
233
if (!ctx) return NULL;
234
if (ctx->language->box) return ctx->language->box;
236
language = rccUiGetLanguageMenu(ctx);
237
if (!language) return NULL;
239
ctx->language->box = rccUiBoxCreate(ctx->language, title);
240
return ctx->language->box;
243
rcc_ui_box rccUiGetCharsetBox(rcc_ui_context ctx, rcc_class_id id, const char *title) {
245
rcc_class_ptr *classes;
246
rcc_ui_widget charset;
248
if (!ctx) return NULL;
250
classes = rccGetClassList(ctx->rccctx);
251
for (i=0; classes[i]; i++);
252
if (id>=i) return NULL;
254
if (ctx->charsets[id]->box) return ctx->charsets[id]->box;
257
charset = rccUiGetCharsetMenu(ctx, id);
258
if (!charset) return NULL;
260
ctx->charsets[id]->box = rccUiBoxCreate(ctx->charsets[id], title);
261
return ctx->charsets[id]->box;
264
rcc_ui_box rccUiGetEngineBox(rcc_ui_context ctx, const char *title) {
265
rcc_ui_widget engine;
267
if (!ctx) return NULL;
268
if (ctx->engine->box) return ctx->engine->box;
270
engine = rccUiGetEngineMenu(ctx);
271
if (!engine) return NULL;
273
ctx->engine->box = rccUiBoxCreate(ctx->engine, title);
274
return ctx->engine->box;
277
rcc_ui_box rccUiGetOptionBox(rcc_ui_context ctx, rcc_option option, const char *title) {
280
if ((!ctx)||(option<0)||(option>=RCC_MAX_OPTIONS)) return NULL;
281
if (ctx->options[option]->box) return ctx->options[option]->box;
283
opt = rccUiGetOptionMenu(ctx, option);
284
if (!opt) return NULL;
286
ctx->options[option]->box = rccUiBoxCreate(ctx->options[option], title);
287
return ctx->options[option]->box;
291
rcc_ui_frame rccUiGetLanguageFrame(rcc_ui_context ctx, const char *title) {
295
if (!ctx) return NULL;
297
if (ctx->language_frame) return ctx->language_frame;
299
frame = rccUiFrameCreate(ctx, title);
300
if (!frame) return NULL;
302
language = rccUiGetLanguageBox(ctx, title);
303
if (!language) return NULL;
305
rccUiFrameAdd(frame, language);
307
ctx->language_frame = frame;
312
rcc_ui_frame rccUiGetCharsetsFrame(rcc_ui_context ctx, const char *title) {
314
rcc_class_ptr *classes;
318
if (!ctx) return NULL;
320
if (ctx->charset_frame) return ctx->charset_frame;
322
frame = rccUiFrameCreate(ctx, title);
323
if (!frame) return NULL;
325
classes = rccGetClassList(ctx->rccctx);
326
for (i=0; classes[i]; i++) {
327
charset = rccUiGetCharsetBox(ctx, (rcc_class_id)i, classes[i]->fullname);
328
rccUiFrameAdd(frame, charset);
331
ctx->charset_frame = frame;
337
rcc_ui_frame rccUiGetEngineFrame(rcc_ui_context ctx, const char *title) {
343
if (!ctx) return NULL;
345
if (ctx->engine_frame) return ctx->engine_frame;
347
frame = rccUiFrameCreate(ctx, title);
348
if (!frame) return NULL;
350
engine = rccUiGetEngineBox(ctx, title);
351
rccUiFrameAdd(frame, engine);
353
for (i=0; i<RCC_MAX_OPTIONS; i++) {
354
opt = rccUiGetOptionBox(ctx, (rcc_option)i, rccUiGetOptionName(ctx, i));
355
rccUiFrameAdd(frame, opt);
358
ctx->engine_frame = frame;
364
rcc_ui_page rccUiGetPage(rcc_ui_context ctx, const char *title, const char *language_title, const char *charset_title, const char *engine_title) {
368
if (!ctx) return NULL;
370
if (ctx->page) return ctx->page;
372
page = rccUiPageCreate(ctx, title);
373
if (!page) return NULL;
375
frame = rccUiGetLanguageFrame(ctx, language_title);
376
rccUiPageAdd(page, frame);
378
frame = rccUiGetCharsetsFrame(ctx, charset_title);
379
rccUiPageAdd(page, frame);
381
frame = rccUiGetEngineFrame(ctx, engine_title);
382
rccUiPageAdd(page, frame);