26 #include <glib/gi18n.h> 29 #include "gnc-guile-utils.h" 31 #include "gnc-menu-extensions.h" 46 static QofLogModule log_module = GNC_MOD_GUI;
48 static GSList *extension_list = NULL;
49 static Getters getters = {0, 0, 0, 0, 0, 0};
52 gnc_extensions_get_menu_list (
void)
54 return g_slist_copy(extension_list);
60 static gboolean getters_initialized = FALSE;
62 if (getters_initialized)
65 getters.type = scm_c_eval_string(
"gnc:extension-type");
66 getters.name = scm_c_eval_string(
"gnc:extension-name");
67 getters.guid = scm_c_eval_string(
"gnc:extension-guid");
68 getters.documentation = scm_c_eval_string(
"gnc:extension-documentation");
69 getters.path = scm_c_eval_string(
"gnc:extension-path");
70 getters.script = scm_c_eval_string(
"gnc:extension-script");
72 getters_initialized = TRUE;
77 gnc_extension_type (SCM extension, GNCMenuItemTypes *type)
83 string = gnc_scm_call_1_symbol_to_string(getters.type, extension);
90 if (g_strcmp0(
string,
"menu-item") == 0)
92 *type = GNC_MENU_ITEM;
94 else if (g_strcmp0(
string,
"menu") == 0)
96 *type = GNC_SUB_MENU_ITEM;
98 else if (g_strcmp0(
string,
"separator") == 0)
100 *type = GNC_SEPARATOR_ITEM;
115 gnc_extension_name (SCM extension)
117 initialize_getters();
119 return gnc_scm_call_1_to_string(getters.name, extension);
125 gnc_extension_guid (SCM extension)
127 initialize_getters();
129 return gnc_scm_call_1_to_string(getters.guid, extension);
135 gnc_extension_documentation (SCM extension)
137 initialize_getters();
139 return gnc_scm_call_1_to_string(getters.documentation, extension);
144 gnc_extension_path (SCM extension,
char **fullpath)
151 initialize_getters();
153 path = gnc_scm_call_1_to_list(getters.path, extension);
154 if ((path == SCM_UNDEFINED) || scm_is_null(path))
156 *fullpath = g_strdup(
"");
160 num_strings = scm_ilength(path) + 2;
161 strings = g_new0(gchar *, num_strings);
162 strings[0] =
"/menubar";
165 while (!scm_is_null(path))
169 item = SCM_CAR(path);
170 path = SCM_CDR(path);
172 if (scm_is_string(item))
175 s = gnc_scm_to_utf8_string(item);
178 strings[i] = g_strdup(s);
180 strings[i] = g_strdup(gettext(s));
188 PERR(
"not a string");
190 *fullpath = g_strdup(
"");
197 *fullpath = g_strjoinv(
"/", strings);
199 for (i = 1; i < num_strings; i++)
201 if (strings[i] != NULL)
213 gnc_ext_gen_action_name (
const gchar *name)
216 const gchar *extChar;
219 actionName = g_string_sized_new( strlen( name ) + 7 );
222 for ( extChar = name; *extChar !=
'\0'; extChar++ )
224 if ( ! isalnum( *extChar ) )
225 g_string_append_c( actionName,
'_' );
226 g_string_append_c( actionName, *extChar );
230 g_string_append_printf( actionName,
"Action" );
232 return g_string_free(actionName, FALSE);
238 gnc_extension_invoke_cb (SCM extension, SCM window)
242 initialize_getters();
244 script = gnc_scm_call_1_to_procedure(getters.script, extension);
245 if (script == SCM_UNDEFINED)
247 PERR(
"not a procedure.");
251 scm_call_1(script, window);
257 gnc_create_extension_info (SCM extension)
260 gchar *typeStr, *tmp;
265 ext_info->extension = extension;
266 gnc_extension_path (extension, &ext_info->path);
267 if (!gnc_extension_type (extension, &ext_info->type))
275 name = gnc_extension_name (extension);
276 guid = gnc_extension_guid (extension);
277 ext_info->action_label = g_strdup (gettext (name));
278 ext_info->action_name = gnc_ext_gen_action_name (guid);
279 ext_info->action_tooltip = gnc_extension_documentation (extension);
283 tmp = g_strdup_printf (
"%s/%s", ext_info->path, ext_info->action_label);
284 ext_info->sort_key = g_utf8_collate_key (tmp, -1);
287 switch (ext_info->type)
289 case GNC_SUB_MENU_ITEM:
293 typeStr =
"menuitem";
295 case GNC_SEPARATOR_ITEM:
302 ext_info->typeStr = typeStr;
304 DEBUG(
"extension: %s/%s [%s] tip [%s] type %s\n",
305 ext_info->path, ext_info->action_label, ext_info->action_name,
306 ext_info->action_tooltip, ext_info->typeStr );
308 scm_gc_protect_object (extension);
311 extension_list = g_slist_append (extension_list, ext_info);
317 cleanup_extension_info (gpointer extension_info, gpointer not_used)
321 if (ext_info->extension)
322 scm_gc_unprotect_object (ext_info->extension);
324 g_free (ext_info->sort_key);
325 g_free ((gchar *)ext_info->action_name);
326 g_free ((gchar *)ext_info->action_label);
327 g_free ((gchar *)ext_info->action_tooltip);
328 g_free (ext_info->path);
334 gnc_add_scm_extension (SCM extension)
336 if (!gnc_create_extension_info(extension))
338 PERR(
"bad extension");
346 gnc_extensions_shutdown (
void)
348 g_slist_foreach(extension_list, cleanup_extension_info, NULL);
350 g_slist_free(extension_list);
352 extension_list = NULL;
#define DEBUG(format, args...)
Print a debugging message.
#define PERR(format, args...)
Log a serious error.
All type declarations for the whole Gnucash engine.