summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
Diffstat (limited to 'ui')
-rw-r--r--ui/Makefile.am5
-rw-r--r--ui/gtk.c64
-rw-r--r--ui/internal.h29
-rw-r--r--ui/librccui.c301
-rw-r--r--ui/librccui.h28
-rw-r--r--ui/rccmenu.c89
-rw-r--r--ui/rccmenu.h55
-rw-r--r--ui/rccnames.c107
-rw-r--r--ui/rccnames.h6
9 files changed, 595 insertions, 89 deletions
diff --git a/ui/Makefile.am b/ui/Makefile.am
index 121d2c4..69395fb 100644
--- a/ui/Makefile.am
+++ b/ui/Makefile.am
@@ -1,12 +1,13 @@
if HAVE_GTK
lib_LTLIBRARIES = librccgtk.la
librccgtk_la_SOURCES = librccui.c \
+ rccmenu.c rccmenu.h \
rccnames.c rccnames.h \
internal.h \
gtk.c
-librccgtk_la_LIBADD = @GTK_LIBS@ ../src/librcc.la
+librccgtk_la_LIBADD = @GTK_LIBS@ @XML_LIBS@ ../src/librcc.la
librccgtk_la_LDFLAGS = -version-info @LIBRCC_VERSION_INFO@
endif
-INCLUDES = -I../src @GTK_INCLUDES@
+INCLUDES = -I../src @GTK_INCLUDES@ @XML_INCLUDES@
include_HEADERS = librccui.h
diff --git a/ui/gtk.c b/ui/gtk.c
index 2fdf2f4..22854ab 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1,5 +1,8 @@
#include <stdio.h>
#include <gtk/gtk.h>
+
+#include <librcc.h>
+
#include "internal.h"
#include "rccnames.h"
@@ -71,7 +74,10 @@ int rccUiMenuConfigureWidget(rcc_ui_menu_context ctx) {
rcc_charset_id charset_id;
rcc_engine_id engine_id;
-
+
+ rcc_option_name *option_name;
+ rcc_option_value_names optnames;
+
GtkWidget *list, *item, *menu;
if (!ctx) return -1;
@@ -81,9 +87,10 @@ int rccUiMenuConfigureWidget(rcc_ui_menu_context ctx) {
switch (ctx->type) {
case RCC_UI_MENU_LANGUAGE:
- list = gtk_menu_new();
-
languages=rccGetLanguageList(rccctx);
+ if (!languages) return -1;
+
+ list = gtk_menu_new();
for (i=0; languages[i]; i++) {
item = gtk_menu_item_new_with_label(rccUiGetLanguageName(uictx, languages[i]->sn));
gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(rccGtkMenuLanguageCB), ctx);
@@ -104,11 +111,12 @@ int rccUiMenuConfigureWidget(rcc_ui_menu_context ctx) {
gtk_option_menu_set_history(GTK_OPTION_MENU(menu), language_id);
break;
case RCC_UI_MENU_CHARSET:
- list = gtk_menu_new();
language_id = (rcc_language_id)rccUiMenuGet(uictx->language);
charsets = rccGetCharsetList(rccctx, language_id);
+ if (!charsets) return -1;
+ list = gtk_menu_new();
for (i=0;charsets[i];i++) {
item = gtk_menu_item_new_with_label(charsets[i]);
gtk_widget_show(item);
@@ -125,15 +133,17 @@ int rccUiMenuConfigureWidget(rcc_ui_menu_context ctx) {
gtk_option_menu_set_menu(GTK_OPTION_MENU(menu), list);
config = rccGetConfig(rccctx, language_id);
- charset_id = rccConfigGetSelectedCharset(config, (rcc_class_id)ctx->id);
+ charset_id = rccConfigGetSelectedCharset(config, rccUiMenuGetClassId(ctx));
if (charset_id == (rcc_charset_id)-1) charset_id = 0;
gtk_option_menu_set_history(GTK_OPTION_MENU(menu), charset_id);
break;
case RCC_UI_MENU_ENGINE:
- list = gtk_menu_new();
language_id = (rcc_language_id)rccUiMenuGet(uictx->language);
engines = rccGetEngineList(rccctx, language_id);
+ if (!engines) return -1;
+
+ list = gtk_menu_new();
for (i=0;engines[i];i++) {
item = gtk_menu_item_new_with_label(engines[i]->title);
gtk_widget_show(item);
@@ -154,12 +164,44 @@ int rccUiMenuConfigureWidget(rcc_ui_menu_context ctx) {
gtk_option_menu_set_history(GTK_OPTION_MENU(menu), engine_id);
break;
case RCC_UI_MENU_OPTION:
- if (!ctx->widget) {
- item = gtk_check_button_new_with_label(rccUiGetOptionName(uictx, (rcc_option)ctx->id));
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item), rccGetOption(rccctx, (rcc_option)ctx->id));
- ctx->widget = item;
+ switch (rccUiMenuGetRangeType(ctx)) {
+ case RCC_OPTION_RANGE_TYPE_BOOLEAN:
+ if (!ctx->widget) {
+ item = gtk_check_button_new_with_label(rccUiGetOptionName(uictx, rccUiMenuGetOption(ctx)));
+ ctx->widget = item;
+ }
+
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item), rccGetOption(rccctx, rccUiMenuGetOption(ctx)));
+ break;
+ case RCC_OPTION_RANGE_TYPE_MENU:
+ if (!ctx->widget) {
+ option_name = rccUiGetOptionRccName(uictx, rccUiMenuGetOption(ctx));
+ if (!option_name) return -1;
+ optnames = option_name->value_names;
+ if (!optnames) return -1;
+
+ list = gtk_menu_new();
+ for (i=0;optnames[i];i++) {
+ item = gtk_menu_item_new_with_label(optnames[i]);
+ gtk_widget_show(item);
+ gtk_menu_append(GTK_MENU(list), item);
+ }
+
+ menu = gtk_option_menu_new();
+ ctx->widget = menu;
+
+ gtk_option_menu_remove_menu(GTK_OPTION_MENU(menu));
+ gtk_option_menu_set_menu(GTK_OPTION_MENU(menu), list);
+ }
+
+ gtk_option_menu_set_history(GTK_OPTION_MENU(menu), rccGetOption(rccctx, rccUiMenuGetOption(ctx)));
+ break;
+ default:
+ return -1;
}
break;
+ default:
+ return -1;
}
return 0;
@@ -170,7 +212,7 @@ rcc_ui_box rccUiBoxCreate(rcc_ui_menu_context ctx, const char *title) {
GtkWidget *hbox, *label;
hbox = gtk_hbox_new(FALSE, BOX_SPACING);
gtk_container_border_width(GTK_CONTAINER(hbox), BOX_BORDER);
- if (ctx->type != RCC_UI_MENU_OPTION) {
+ if ((ctx->type != RCC_UI_MENU_OPTION)||(rccUiMenuGetRangeType(ctx) != RCC_OPTION_RANGE_TYPE_BOOLEAN)) {
label = gtk_label_new(title);
gtk_widget_set_usize(label, TITLE_WIDTH, TITLE_HEIGHT);
gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
diff --git a/ui/internal.h b/ui/internal.h
index 8448fb5..64ee978 100644
--- a/ui/internal.h
+++ b/ui/internal.h
@@ -1,34 +1,13 @@
#ifndef _RCC_UI_INTERNAL_H
#define _RCC_UI_INTERNAL_H
-#include "../src/librcc.h"
-#include "librccui.h"
+#define RCC_UI_MAX_STRING_CHARS 1024
-typedef unsigned int rcc_ui_id;
-
-typedef void *rcc_ui_menu_internal;
+#include <librcc.h>
-enum rcc_ui_menu_type_t {
- RCC_UI_MENU_LANGUAGE = 0,
- RCC_UI_MENU_CHARSET,
- RCC_UI_MENU_ENGINE,
- RCC_UI_MENU_OPTION,
- RCC_UI_MENU_MAX
-};
-typedef enum rcc_ui_menu_type_t rcc_ui_menu_type;
+#include "rccmenu.h"
-struct rcc_ui_menu_context_t {
- rcc_ui_widget widget;
- rcc_ui_box box;
-
- rcc_ui_context uictx;
- rcc_ui_menu_type type;
- rcc_ui_id id;
-
- rcc_ui_menu_internal internal;
-};
-typedef struct rcc_ui_menu_context_t rcc_ui_menu_context_s;
-typedef struct rcc_ui_menu_context_t *rcc_ui_menu_context;
+typedef unsigned int rcc_ui_id;
typedef void *rcc_ui_frame_internal;
diff --git a/ui/librccui.c b/ui/librccui.c
index 3b8bcdc..9f4dc49 100644
--- a/ui/librccui.c
+++ b/ui/librccui.c
@@ -1,31 +1,272 @@
#include <stdio.h>
-#include "../src/rccconfig.h"
+#include <string.h>
+#include <stdarg.h>
+#include <locale.h>
+
+#include "../config.h"
+
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxml/xpath.h>
+
+#include <librcc.h>
+
#include "internal.h"
#include "rccnames.h"
#define RCC_UI_LOCK_CODE 0x1111
-static rcc_ui_menu_context rccUiMenuCreateContext(rcc_ui_menu_type type, rcc_ui_id id, rcc_ui_context uictx) {
- rcc_ui_menu_context ctx;
- if ((!uictx)||(type>RCC_UI_MENU_MAX)) return NULL;
+#define XPATH_LANGUAGE "//Languages/Language[@name]"
+#define XPATH_OPTION "//Options/Option[@name]"
+#define XPATH_VALUE "//Options/Option[@name=\"%s\"]/Value[@name]"
+#define XPATH_LANGUAGE_REQUEST_LOCALE "//Languages/Language[@name=\"%s\"]/FullName[@locale=\"%s\"]"
+#define XPATH_LANGUAGE_REQUEST "//Languages/Language[@name=\"%s\"]/FullName"
+#define XPATH_OPTION_REQUEST_LOCALE "//Options/Option[@name=\"%s\"]/FullName[@locale=\"%s\"]"
+#define XPATH_OPTION_REQUEST "//Options/Option[@name=\"%s\"]/FullName"
+#define XPATH_VALUE_REQUEST_LOCALE "//Options/Option[@name=\"%s\"]/Value[@name=\"%s\"]/FullName[@locale=\"%s\"]"
+#define XPATH_VALUE_REQUEST "//Options/Option[@name=\"%s\"]/Value[@name=\"%s\"]/FullName"
+
+static const char *rccUiXmlGetText(xmlNodePtr node) {
+ if ((node)&&(node->children)&&(node->children->type == XML_TEXT_NODE)&&(node->children->content)) return node->children->content;
+}
+
+static xmlNodePtr rccUiNodeFind(xmlXPathContextPtr xpathctx, const char *request, ...) {
+ xmlXPathObjectPtr obj;
+ xmlNodeSetPtr node_set;
+ xmlNodePtr res = NULL;
+
+ unsigned int i, args = 0;
+ unsigned int size = 128;
+ va_list ap;
+ char *req;
- ctx = (rcc_ui_menu_context)malloc(sizeof(rcc_ui_menu_context_s));
- if (!ctx) return ctx;
+ if (!xpathctx) return NULL;
+
+ for (req = strstr(request, "%s"); req; req = strstr(req + 1, "%s")) args++;
- ctx->uictx = uictx;
- ctx->type = type;
- ctx->id = id;
+ if (args) {
+ va_start(ap, request);
+ for (i=0;i<args;i++) {
+ req = va_arg(ap, char*);
+ size += strlen(req);
+ }
+ va_end(ap);
+
+ req = (char*)malloc(size*sizeof(char));
+ if (!req) return NULL;
+
+ va_start(ap, request);
+ vsprintf(req,request,ap);
+ va_end(ap);
+ } else req = (char*)request;
+
+ obj = xmlXPathEvalExpression(req, xpathctx);
+ if (obj) {
+ node_set = obj->nodesetval;
+ if ((node_set)&&(node_set->nodeNr > 0)) {
+ res = node_set->nodeTab[0];
+ }
+ xmlXPathFreeObject(obj);
+ }
+
+ if (args) free(req);
+
+ return res;
+}
+
+int rccUiInit() {
+ int err;
+ unsigned long i, j, k, nnodes;
+
+ xmlDocPtr xmlctx;
+ xmlXPathContextPtr xpathctx = NULL;
+ xmlXPathObjectPtr obj;
+ xmlNodeSetPtr node_set;
+
+ xmlNodePtr node, cnode;
+ xmlAttrPtr attr;
+
+ rcc_language_name *lang_name;
+ const char *lang, *fullname;
+ const char *locale;
+ char *lpos;
+ char *search[4];
+
+ rcc_option option;
+ const char *opt, *val;
+ rcc_option_name *option_name;
+ const char *value_name;
+
+ unsigned int npos;
+
+ size_t newsize;
+ char tmpbuf[RCC_UI_MAX_STRING_CHARS+1];
+ char ctype_charset[32];
+ rcc_iconv icnv;
+
+ err = rccInit();
+ if (err) return err;
- ctx->widget = rccUiMenuCreateWidget(ctx);
- ctx->box = NULL;
+ if (rccLocaleGetCharset(ctype_charset, NULL, 32)) icnv = NULL;
+ else {
+ if ((!strcasecmp(ctype_charset, "UTF-8"))||(!strcasecmp(ctype_charset, "UTF8"))) icnv = NULL;
+ else icnv = rccIConvOpen(ctype_charset, "UTF-8");
+ }
- return ctx;
+ locale = setlocale(LC_CTYPE, NULL);
+ if (locale) {
+ search[0] = strdup(locale);
+ if (!search[0]) goto clean;
+ lpos = strrchr(search[0], '@');
+ if (lpos) *lpos = 0;
+
+ lpos = strrchr(search[0], '.');
+ if (lpos) {
+ search[1] = strdup(search[0]);
+ if (!search[1]) goto clean;
+ *strchr(search[1], '.') = 0;
+
+ lpos = strrchr(search[1], '_');
+ if (lpos) {
+ search[2] = strdup(search[1]);
+ if (!search[2]) goto clean;
+ *strchr(search[2],'_') = 0;
+ search[3] = NULL;
+ } else search[2] = NULL;
+ } else search[1] = NULL;
+ } else search[0] = NULL;
+
+ for (npos = 0; rcc_default_language_names[npos].sn; npos++);
+
+ xmlctx = (xmlDocPtr)rccGetConfiguration();
+ if (xmlctx) xpathctx = xmlXPathNewContext(xmlctx);
+ else xpathctx = NULL;
+ if (xpathctx) {
+ obj = xmlXPathEvalExpression(XPATH_LANGUAGE, xpathctx);
+ if (obj) {
+ node_set = obj->nodesetval;
+ if (node_set) nnodes = node_set->nodeNr;
+ else nnodes = 0;
+ } else nnodes = 0;
+
+ for (i=0;i<nnodes;i++) {
+ node = node_set->nodeTab[i];
+ attr = xmlHasProp(node, "name");
+ lang = attr->children->content;
+
+ if ((!lang)||(!lang[0])) continue;
+
+ for (j=0, node = NULL;((search[j])&&(!node));j++)
+ node = rccUiNodeFind(xpathctx, XPATH_LANGUAGE_REQUEST_LOCALE, lang, search[j]);
+ if (!node) {
+ node = rccUiNodeFind(xpathctx, XPATH_LANGUAGE_REQUEST, lang);
+ if (!node) continue;
+ }
+
+ fullname = rccUiXmlGetText(node);
+ if (!fullname) continue;
+
+ if (icnv) {
+ newsize = rccIConvRecode(icnv, tmpbuf, RCC_UI_MAX_STRING_CHARS, fullname, 0);
+ if (newsize != (size_t)-1) {
+ cnode = xmlNewChild(node->parent, NULL, "Recoded", tmpbuf);
+ fullname = rccUiXmlGetText(cnode);
+ if (!fullname) fullname = rccUiXmlGetText(node);
+ }
+ }
+
+ lang_name = rccUiGetLanguageRccName(NULL, lang);
+ if (lang_name) lang_name->name = fullname;
+ else if (npos<RCC_MAX_LANGUAGES) {
+ rcc_default_language_names[npos].sn = lang;
+ rcc_default_language_names[npos].name = fullname;
+ rcc_default_language_names[++npos].sn = NULL;
+ rcc_default_language_names[npos].name = NULL;
+ }
+ }
+
+ if (obj) xmlXPathFreeObject(obj);
+
+ obj = xmlXPathEvalExpression(XPATH_OPTION, xpathctx);
+ if (obj) {
+ node_set = obj->nodesetval;
+ if (node_set) nnodes = node_set->nodeNr;
+ else nnodes = 0;
+ } else nnodes = 0;
+
+ for (i=0;i<nnodes;i++) {
+ node = node_set->nodeTab[i];
+ attr = xmlHasProp(node, "name");
+ opt = attr->children->content;
+
+ if ((!opt)||(!opt[0])) continue;
+ option = rccGetOptionByName(opt);
+ if (option == (rcc_option)-1) continue;
+ option_name = rccUiGetOptionRccName(NULL, option);
+ if (!option_name) continue;
+
+ for (j=0, node = NULL;((search[j])&&(!node));j++)
+ node = rccUiNodeFind(xpathctx, XPATH_OPTION_REQUEST_LOCALE, opt, search[j]);
+ if (!node) {
+ node = rccUiNodeFind(xpathctx, XPATH_OPTION_REQUEST, opt);
+ }
+
+ if (node) {
+ fullname = rccUiXmlGetText(node);
+ if (fullname) {
+ if (icnv) {
+ newsize = rccIConvRecode(icnv, tmpbuf, RCC_UI_MAX_STRING_CHARS, fullname, 0);
+ if (newsize != (size_t)-1) {
+ cnode = xmlNewChild(node->parent, NULL, "Recoded", tmpbuf);
+ fullname = rccUiXmlGetText(cnode);
+ if (!fullname) fullname = rccUiXmlGetText(node);
+ }
+ }
+ option_name->name = fullname;
+ }
+ }
+
+ if (!option_name->value_names) continue;
+
+ for (k=0;option_name->value_names[k];k++) {
+ value_name = rccGetOptionValueName(option, (rcc_option_value)k);
+ if (!value_name) continue;
+
+ for (j=0, node = NULL;((search[j])&&(!node));j++)
+ node = rccUiNodeFind(xpathctx, XPATH_VALUE_REQUEST_LOCALE, opt, value_name, search[j]);
+ if (!node) {
+ node = rccUiNodeFind(xpathctx, XPATH_VALUE_REQUEST, opt, value_name);
+ }
+
+ if (node) {
+ fullname = rccUiXmlGetText(node);
+ if (fullname) {
+ if (icnv) {
+ newsize = rccIConvRecode(icnv, tmpbuf, RCC_UI_MAX_STRING_CHARS, fullname, 0);
+ if (newsize != (size_t)-1) {
+ cnode = xmlNewChild(node->parent, NULL, "Recoded", tmpbuf);
+ fullname = rccUiXmlGetText(cnode);
+ if (!fullname) fullname = rccUiXmlGetText(node);
+ }
+ }
+ option_name->value_names[k] = fullname;
+ }
+ }
+ }
+ }
+ if (obj) xmlXPathFreeObject(obj);
+
+ xmlXPathFreeContext(xpathctx);
+ }
+
+clean:
+ for (j=0;search[j];j++) free(search[j]);
+ if (icnv) rccIConvClose(icnv);
+
+ return 0;
}
-static void rccUiMenuFreeContext(rcc_ui_menu_context ctx) {
- if (!ctx) return;
- rccUiMenuFreeWidget(ctx);
- free(ctx);
+void rccUiFree() {
}
static rcc_ui_frame_context rccUiFrameCreateContext(rcc_ui_frame_type type, rcc_ui_context uictx) {
@@ -57,6 +298,8 @@ rcc_ui_context rccUiCreateContext(rcc_context rccctx) {
rcc_ui_context ctx;
rcc_ui_menu_context *charsets;
rcc_ui_menu_context *options;
+ rcc_option_type otype;
+ rcc_option_range *orange;
if (!rccctx) return NULL;
@@ -85,15 +328,17 @@ rcc_ui_context rccUiCreateContext(rcc_context rccctx) {
ctx->internal = rccUiCreateInternal(ctx);
- ctx->language = rccUiMenuCreateContext(RCC_UI_MENU_LANGUAGE, 0, ctx);
- ctx->engine = rccUiMenuCreateContext(RCC_UI_MENU_ENGINE, 0, ctx);
+ ctx->language = rccUiMenuCreateContext(RCC_UI_MENU_LANGUAGE, ctx);
+ ctx->engine = rccUiMenuCreateContext(RCC_UI_MENU_ENGINE, ctx);
for (i=0; classes[i]; i++) {
- charsets[i] = rccUiMenuCreateContext(RCC_UI_MENU_CHARSET, i, ctx);
+ charsets[i] = rccUiCharsetMenuCreateContext(RCC_UI_MENU_CHARSET, (rcc_charset_id)i, ctx);
if (!charsets[i]) err = 1;
}
charsets[i] = NULL;
for (i=0; i<RCC_MAX_OPTIONS; i++) {
- options[i] = rccUiMenuCreateContext(RCC_UI_MENU_OPTION, i, ctx);
+ otype = rccOptionGetType(rccctx, (rcc_option)i);
+ orange = rccOptionGetRange(rccctx, (rcc_option)i);
+ options[i] = rccUiOptionMenuCreateContext(RCC_UI_MENU_OPTION, (rcc_option)i, otype, orange, ctx);
if (!options[i]) err = 1;
}
@@ -145,17 +390,15 @@ void rccUiFreeContext(rcc_ui_context ctx) {
int rccUiSetLanguageNames(rcc_ui_context ctx, rcc_language_name *names) {
if (!ctx) return -1;
-
- if (names) ctx->language_names = names;
- else ctx->language_names = rcc_default_language_names;
+
+ ctx->language_names = names;
return 0;
}
int rccUiSetOptionNames(rcc_ui_context ctx, rcc_option_name *names) {
if (!ctx) return -1;
- if (names) ctx->option_names = names;
- else ctx->option_names = rcc_default_option_names;
+ ctx->option_names = names;
return 0;
}
@@ -383,7 +626,7 @@ rcc_ui_frame rccUiGetEngineFrame(rcc_ui_context ctx, const char *title) {
rcc_ui_frame frame;
rcc_ui_box engine;
rcc_ui_box opt;
- const char *optname;
+ rcc_option_name *optname;
if (!ctx) return NULL;
@@ -398,10 +641,12 @@ rcc_ui_frame rccUiGetEngineFrame(rcc_ui_context ctx, const char *title) {
rccUiFrameAdd(framectx, engine);
for (i=0; i<RCC_MAX_OPTIONS; i++) {
- optname = rccUiGetOptionName(ctx, i);
+ if (rccUiMenuGetType(ctx->options[i]) == RCC_OPTION_TYPE_INVISIBLE) continue;
+
+ optname = rccUiGetOptionRccName(ctx, i);
if (!optname) continue;
- opt = rccUiGetOptionBox(ctx, (rcc_option)i, optname);
+ opt = rccUiGetOptionBox(ctx, (rcc_option)i, optname->name);
rccUiFrameAdd(framectx, opt);
}
diff --git a/ui/librccui.h b/ui/librccui.h
index 6b114da..5a8d034 100644
--- a/ui/librccui.h
+++ b/ui/librccui.h
@@ -14,10 +14,11 @@ typedef void *rcc_ui_page;
typedef struct rcc_ui_context_t *rcc_ui_context;
+int rccUiInit();
+void rccUiFree();
+
rcc_ui_context rccUiCreateContext(rcc_context rccctx);
void rccUiFreeContext(rcc_ui_context ctx);
-int rccUiSetLanguageNames(rcc_ui_context ctx, rcc_language_name *names);
-int rccUiSetOptionNames(rcc_ui_context ctx, rcc_option_name *names);
int rccUiRestoreLanguage(rcc_ui_context ctx);
int rccUiRestore(rcc_ui_context ctx);
@@ -39,6 +40,29 @@ rcc_ui_frame rccUiGetEngineFrame(rcc_ui_context ctx, const char *title);
rcc_ui_page rccUiGetPage(rcc_ui_context ctx, const char *title, const char *language_title, const char *charset_title, const char *engine_title);
+/*******************************************************************************
+************************************ Names *************************************
+*******************************************************************************/
+
+struct rcc_language_name_t {
+ const char *sn;
+ const char *name;
+};
+typedef struct rcc_language_name_t rcc_language_name;
+
+typedef const char *rcc_option_value_name;
+typedef rcc_option_value_name *rcc_option_value_names;
+
+struct rcc_option_name_t {
+ rcc_option option;
+ const char *name;
+ rcc_option_value_names value_names;
+};
+typedef struct rcc_option_name_t rcc_option_name;
+
+int rccUiSetLanguageNames(rcc_ui_context ctx, rcc_language_name *names);
+int rccUiSetOptionNames(rcc_ui_context ctx, rcc_option_name *names);
+
#ifdef __cplusplus
}
#endif
diff --git a/ui/rccmenu.c b/ui/rccmenu.c
new file mode 100644
index 0000000..da04cbd
--- /dev/null
+++ b/ui/rccmenu.c
@@ -0,0 +1,89 @@
+#include <stdio.h>
+#include <string.h>
+
+#include "internal.h"
+#include "rccmenu.h"
+
+rcc_ui_menu_context rccUiMenuCreateContext(rcc_ui_menu_type type, rcc_ui_context uictx) {
+ rcc_ui_menu_context ctx;
+ if ((!uictx)||(type>=RCC_UI_MENU_MAX)) return NULL;
+
+ ctx = (rcc_ui_menu_context)malloc(sizeof(rcc_ui_menu_context_s));
+ if (!ctx) return ctx;
+
+ ctx->uictx = uictx;
+ ctx->type = type;
+
+ ctx->widget = rccUiMenuCreateWidget(ctx);
+ ctx->box = NULL;
+
+ return ctx;
+}
+
+rcc_ui_menu_context rccUiCharsetMenuCreateContext(rcc_ui_menu_type type, rcc_charset_id id, rcc_ui_context uictx) {
+ rcc_ui_charset_menu_context ctx;
+
+ if ((!uictx)||(type>=RCC_UI_MENU_MAX)) return NULL;
+
+ ctx = (rcc_ui_charset_menu_context)malloc(sizeof(rcc_ui_charset_menu_context_s));
+ if (!ctx) return NULL;
+
+ ctx->ui_menu.uictx = uictx;
+ ctx->ui_menu.type = type;
+ ctx->id = id;
+
+ ctx->ui_menu.widget = rccUiMenuCreateWidget((rcc_ui_menu_context)ctx);
+ ctx->ui_menu.box = NULL;
+
+ return (rcc_ui_menu_context)ctx;
+}
+
+rcc_ui_menu_context rccUiOptionMenuCreateContext(rcc_ui_menu_type type, rcc_option id, rcc_option_type otype, rcc_option_range *range, rcc_ui_context uictx) {
+ rcc_ui_option_menu_context ctx;
+
+ if ((!uictx)||(type>=RCC_UI_MENU_MAX)) return NULL;
+
+ ctx = (rcc_ui_option_menu_context)malloc(sizeof(rcc_ui_option_menu_context_s));
+ if (!ctx) return NULL;
+
+ ctx->ui_menu.uictx = uictx;
+ ctx->ui_menu.type = type;
+ ctx->id = id;
+ ctx->type = otype;
+ ctx->range = range;
+
+ ctx->ui_menu.widget = rccUiMenuCreateWidget((rcc_ui_menu_context)ctx);
+ ctx->ui_menu.box = NULL;
+
+ return (rcc_ui_menu_context)ctx;
+}
+
+
+void rccUiMenuFreeContext(rcc_ui_menu_context ctx) {
+ if (!ctx) return;
+ rccUiMenuFreeWidget(ctx);
+ free(ctx);
+}
+
+
+rcc_class_id rccUiMenuGetClassId(rcc_ui_menu_context ctx) {
+ if (ctx->type != RCC_UI_MENU_CHARSET) return (rcc_class_id)-1;
+ return ((rcc_ui_charset_menu_context)ctx)->id;
+}
+
+rcc_option rccUiMenuGetOption(rcc_ui_menu_context ctx) {
+ if (ctx->type != RCC_UI_MENU_OPTION) return (rcc_option)-1;
+ return ((rcc_ui_option_menu_context)ctx)->id;
+}
+
+
+rcc_option_type rccUiMenuGetType(rcc_ui_menu_context ctx) {
+ if (ctx->type != RCC_UI_MENU_OPTION) return (rcc_option_type)-1;
+ return ((rcc_ui_option_menu_context)ctx)->type;
+}
+
+rcc_option_range_type rccUiMenuGetRangeType(rcc_ui_menu_context ctx) {
+ if (ctx->type != RCC_UI_MENU_OPTION) return (rcc_option_type)-1;
+ return ((rcc_ui_option_menu_context)ctx)->range->type;
+}
+
diff --git a/ui/rccmenu.h b/ui/rccmenu.h
new file mode 100644
index 0000000..5ad14ff
--- /dev/null
+++ b/ui/rccmenu.h
@@ -0,0 +1,55 @@
+#ifndef _RCC_UI_MENU_H
+#define _RCC_UI_MENU_H
+
+#include "librccui.h"
+
+typedef void *rcc_ui_menu_internal;
+
+enum rcc_ui_menu_type_t {
+ RCC_UI_MENU_LANGUAGE = 0,
+ RCC_UI_MENU_CHARSET,
+ RCC_UI_MENU_ENGINE,
+ RCC_UI_MENU_OPTION,
+ RCC_UI_MENU_MAX
+};
+typedef enum rcc_ui_menu_type_t rcc_ui_menu_type;
+
+struct rcc_ui_menu_context_t {
+ rcc_ui_widget widget;
+ rcc_ui_box box;
+
+ rcc_ui_context uictx;
+ rcc_ui_menu_type type;
+
+ rcc_ui_menu_internal internal;
+};
+typedef struct rcc_ui_menu_context_t rcc_ui_menu_context_s;
+typedef struct rcc_ui_menu_context_t *rcc_ui_menu_context;
+
+struct rcc_ui_charset_menu_context_t {
+ rcc_ui_menu_context_s ui_menu;
+ rcc_class_id id;
+};
+typedef struct rcc_ui_charset_menu_context_t rcc_ui_charset_menu_context_s;
+typedef struct rcc_ui_charset_menu_context_t *rcc_ui_charset_menu_context;
+
+struct rcc_ui_option_menu_context_t {
+ rcc_ui_menu_context_s ui_menu;
+ rcc_option id;
+ rcc_option_type type;
+ rcc_option_range *range;
+};
+typedef struct rcc_ui_option_menu_context_t rcc_ui_option_menu_context_s;
+typedef struct rcc_ui_option_menu_context_t *rcc_ui_option_menu_context;
+
+rcc_ui_menu_context rccUiMenuCreateContext(rcc_ui_menu_type type, rcc_ui_context uictx);
+rcc_ui_menu_context rccUiCharsetMenuCreateContext(rcc_ui_menu_type type, rcc_charset_id id, rcc_ui_context uictx);
+rcc_ui_menu_context rccUiOptionMenuCreateContext(rcc_ui_menu_type type, rcc_option id, rcc_option_type otype, rcc_option_range *range, rcc_ui_context uictx);
+void rccUiMenuFreeContext(rcc_ui_menu_context ctx);
+
+rcc_class_id rccUiMenuGetClassId(rcc_ui_menu_context ctx);
+rcc_option rccUiMenuGetOption(rcc_ui_menu_context ctx);
+rcc_option_type rccUiMenuGetType(rcc_ui_menu_context ctx);
+rcc_option_range_type rccUiMenuGetRangeType(rcc_ui_menu_context ctx);
+
+#endif /* _RCC_UI_MENU_H */
diff --git a/ui/rccnames.c b/ui/rccnames.c
index f5bf4d8..9ebaba4 100644
--- a/ui/rccnames.c
+++ b/ui/rccnames.c
@@ -1,44 +1,111 @@
#include <stdio.h>
+#include <librcc.h>
+
#include "internal.h"
-const char *rccUiGetLanguageName(rcc_ui_context ctx, const char *lang) {
+rcc_language_name rcc_default_language_names[RCC_MAX_LANGUAGES+1] = {
+{"default", "Autodetect"},
+{"off", "Dissable"},
+{"ru","Russian"},
+{"uk","Ukrainian"},
+{"be","Belarussian"},
+{"bg","Bulgarian"},
+{"cz","Czech"},
+{"es","Estonian"},
+{"hr","Croatian"},
+{"hu","Hungarian"},
+{"lt","Lithuanian"},
+{"lv","Latvian"},
+{"pl","Polish"},
+{"sk","Slovak"},
+{"sl","Slovenian"},
+{"zh","Chinese"},
+{NULL, NULL}
+};
+
+rcc_option_value_name rcc_default_option_boolean_names[] = { "Off", "On", NULL };
+rcc_option_value_name rcc_default_option_learning_names[] = { "Off", "On", "Relearn", "Learn", NULL };
+rcc_option_value_name rcc_default_option_clo_names[] = { "All Languages", "Configured / AutoEngine", "Configured Only", NULL };
+
+rcc_option_name rcc_default_option_names[RCC_MAX_OPTIONS+1] = {
+ { RCC_LEARNING_MODE, "Recodings Cache", rcc_default_option_learning_names },
+ { RCC_AUTODETECT_FS_NAMES, "Autodetect File Names", rcc_default_option_boolean_names },
+ { RCC_AUTODETECT_FS_TITLES, "Autodetect FS Titles", rcc_default_option_boolean_names },
+ { RCC_CONFIGURED_LANGUAGES_ONLY, "Enabled Languages", rcc_default_option_clo_names },
+ { RCC_MAX_OPTIONS }
+};
+
+
+rcc_language_name *rccUiGetLanguageRccName(rcc_ui_context ctx, const char *lang) {
const char *res;
- unsigned int i;
+ unsigned int i,j;
rcc_language_name *names;
- if ((!ctx)||(!lang)) return NULL;
+ if (!lang) return NULL;
- names = ctx->language_names;
+ for (j=0;j<2;j++) {
+ if (j) names = rcc_default_language_names;
+ else names = ctx?ctx->language_names:NULL;
- if (names) {
- for (i=0;names[i].sn;i++)
- if (!strcmp(lang, names[i].sn)) return names[i].name;
+ if (names) {
+ for (i=0;names[i].sn;i++)
+ if (!strcmp(lang, names[i].sn)) return names+i;
+ }
}
+
+ return NULL;
+}
-
- res = rccGetLanguageFullName(lang);
- if (res) return res;
+const char *rccUiGetLanguageName(rcc_ui_context ctx, const char *lang) {
+ const char *res;
+ unsigned int i,j;
+ rcc_language_name *names;
+
+ names = rccUiGetLanguageRccName(ctx, lang);
+ if ((names)&&(names->name)) return names->name;
return lang;
}
+rcc_option_name *rccUiGetOptionRccName(rcc_ui_context ctx, rcc_option option) {
+ unsigned int i,j;
+ rcc_option_name *names;
+
+ if ((option<0)||(option>=RCC_MAX_OPTIONS)) return NULL;
+
+ for (j=0;j<2;j++) {
+ if (j) names = rcc_default_option_names;
+ else names = ctx?ctx->option_names:NULL;
+
+ if (names) {
+ for (i=0;names[i].option!=RCC_MAX_OPTIONS;i++)
+ if (names[i].option == option) return names+i;
+ }
+ }
+
+ return NULL;
+}
+
const char *rccUiGetOptionName(rcc_ui_context ctx, rcc_option option) {
- const char *res;
unsigned int i;
- rcc_option_name *names;
+ rcc_option_name *name;
- if ((!ctx)||(option<0)||(option>RCC_MAX_OPTIONS)) return NULL;
+ name = rccUiGetOptionRccName(ctx, option);
+ if (name) return name->name;
- names = ctx->option_names;
+ return NULL;
+}
- if (names) {
- for (i=0;((i<RCC_MAX_OPTIONS)&&(names[i].option!=RCC_MAX_OPTIONS));i++)
- if (names[i].option == option) return names[i].name;
+const char *rccUiGetOptionValueName(rcc_ui_context ctx, rcc_option option, rcc_option_value value) {
+ unsigned int i;
+ rcc_option_name *name;
+
+ name = rccUiGetOptionRccName(ctx, option);
+ if (name) {
+ for (i=0;name->value_names[i];i++)
+ if (i == value) return name->value_names[i];
}
-
- res = rccGetOptionFullName(option);
- if (res) return res;
return NULL;
}
diff --git a/ui/rccnames.h b/ui/rccnames.h
index cb23960..f73bd19 100644
--- a/ui/rccnames.h
+++ b/ui/rccnames.h
@@ -1,9 +1,13 @@
#ifndef _RCC_UI_NAMES_C
#define _RCC_UI_NAMES_H
+extern rcc_language_name rcc_default_language_names[];
+extern rcc_option_name rcc_default_option_names[];
+rcc_language_name *rccUiGetLanguageRccName(rcc_ui_context ctx, const char *lang);
const char *rccUiGetLanguageName(rcc_ui_context ctx, const char *lang);
+rcc_option_name *rccUiGetOptionRccName(rcc_ui_context ctx, rcc_option option);
const char *rccUiGetOptionName(rcc_ui_context ctx, rcc_option option);
-
+const char *rccUiGetOptionValueName(rcc_ui_context ctx, rcc_option option, rcc_option_value value);
#endif /* _RCC_UI_NAMES_H */