Switch to the GTK2.4 UI description language.

git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/branches/gnucash-gnome2-dev@9346 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
David Hampton
2003-09-17 00:02:35 +00:00
parent edb6f9fcbd
commit e9681152ba
13 changed files with 427 additions and 417 deletions

View File

@@ -1,3 +1,22 @@
2003-09-16 David Hampton <hampton@employees.org>
* lib/egg/egg-menu-merge.[ch]: Back port the GTK2.4 UI description
language.
* src/business/business-gnome/ui/gnc-plugin-business-ui.xml:
* src/gnome/ui/gnc-main-window-ui.xml:
* src/gnome/ui/gnc-plugin-account-tree-ui.xml:
* src/gnome/ui/gnc-plugin-page-account-tree-ui.xml:
* src/gnome/ui/gnc-plugin-page-register-ui.xml:
* src/gnome/ui/gnc-plugin-register-ui.xml:
* src/import-export/qif-import/gnc-plugin-qif-import-ui.xml:
Switch to the new UI description language.
* src/gnome/gnc-main-window.c:
* src/gnome/gnc-plugin-page-account-tree.c:
* src/gnome/gnc-plugin-page-register.c: Check the error return
value after calling the menu-merge routines.
2003-09-13 David Hampton <hampton@employees.org>
* src/gnome/gnc-main-window.c: Collapse common functions into one.

View File

@@ -114,12 +114,9 @@ egg_menu_merge_init (EggMenuMerge *self)
merge_id = egg_menu_merge_next_merge_id(self);
node = get_child_node(self, NULL, "Root", 4,
node = get_child_node(self, NULL, "ui", 4,
EGG_MENU_MERGE_ROOT, TRUE, FALSE);
egg_menu_merge_node_prepend_ui_reference(NODE_INFO(node), merge_id, 0);
node = get_child_node(self, self->root_node, "popups", 6,
EGG_MENU_MERGE_POPUPS, TRUE, FALSE);
egg_menu_merge_node_prepend_ui_reference(NODE_INFO(node), merge_id, 0);
}
EggMenuMerge *
@@ -337,7 +334,6 @@ typedef enum {
STATE_ROOT,
STATE_MENU,
STATE_TOOLBAR,
STATE_POPUPS,
STATE_MENUITEM,
STATE_TOOLITEM,
STATE_END
@@ -369,18 +365,15 @@ start_element_handler (GMarkupParseContext *context,
gint i;
const gchar *node_name;
GQuark verb_quark;
const gchar *action;
GQuark action_quark;
gboolean top;
gboolean raise_error = TRUE;
gchar *error_attr = NULL;
//g_message("starting element %s", element_name);
/* work out a name for this node. Either the name attribute, or
* element name */
node_name = element_name;
verb_quark = 0;
node_name = NULL;
action = NULL;
action_quark = 0;
top = FALSE;
for (i = 0; attribute_names[i] != NULL; i++)
{
@@ -388,34 +381,56 @@ start_element_handler (GMarkupParseContext *context,
{
node_name = attribute_values[i];
}
else if (!strcmp(attribute_names[i], "verb"))
else if (!strcmp(attribute_names[i], "action"))
{
verb_quark = g_quark_from_string(attribute_values[i]);
action = attribute_values[i];
action_quark = g_quark_from_string(attribute_values[i]);
}
else if (!strcmp(attribute_names[i], "pos"))
else if (!strcmp(attribute_names[i], "position"))
{
top = !strcmp(attribute_values[i], "top");
}
else
{
gint line_number, char_number;
g_markup_parse_context_get_position (context,
&line_number, &char_number);
g_set_error (error,
G_MARKUP_ERROR,
G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE,
_("Unknown attribute '%s' on line %d char %d"),
attribute_names[i],
line_number, char_number);
return;
}
}
/* Work out a name for this node. Either the name attribute, or
* the action, or the element name */
if (node_name == NULL)
{
if (action != NULL)
node_name = action;
else
node_name = element_name;
}
/* if no verb, then set it to the node's name */
if (verb_quark == 0)
verb_quark = g_quark_from_string(node_name);
switch (element_name[0])
{
case 'R':
if (ctx->state == STATE_START && !strcmp(element_name, "Root"))
case 'u':
if (ctx->state == STATE_START && !strcmp(element_name, "ui"))
{
ctx->state = STATE_ROOT;
ctx->current = self->root_node;
raise_error = FALSE;
egg_menu_merge_node_prepend_ui_reference (NODE_INFO (ctx->current),
ctx->merge_id, verb_quark);
ctx->merge_id, action_quark);
}
break;
case 'm':
if (ctx->state == STATE_ROOT && !strcmp(element_name, "menu"))
if (ctx->state == STATE_ROOT && !strcmp(element_name, "menubar"))
{
ctx->state = STATE_MENU;
ctx->current = get_child_node(self, ctx->current,
@@ -423,10 +438,25 @@ start_element_handler (GMarkupParseContext *context,
EGG_MENU_MERGE_MENUBAR,
TRUE, FALSE);
if (NODE_INFO(ctx->current)->action_name == 0)
NODE_INFO(ctx->current)->action_name = verb_quark;
NODE_INFO(ctx->current)->action_name = action_quark;
egg_menu_merge_node_prepend_ui_reference (NODE_INFO (ctx->current),
ctx->merge_id, verb_quark);
ctx->merge_id, action_quark);
NODE_INFO(ctx->current)->dirty = TRUE;
raise_error = FALSE;
}
else if (ctx->state == STATE_MENU && !strcmp(element_name, "menu"))
{
ctx->current = get_child_node(self, ctx->current,
node_name, strlen(node_name),
EGG_MENU_MERGE_MENU,
TRUE, top);
if (NODE_INFO(ctx->current)->action_name == 0)
NODE_INFO(ctx->current)->action_name = action_quark;
egg_menu_merge_node_prepend_ui_reference (NODE_INFO (ctx->current),
ctx->merge_id, action_quark);
NODE_INFO(ctx->current)->dirty = TRUE;
raise_error = FALSE;
@@ -441,60 +471,28 @@ start_element_handler (GMarkupParseContext *context,
EGG_MENU_MERGE_MENUITEM,
TRUE, top);
if (NODE_INFO(node)->action_name == 0)
NODE_INFO(node)->action_name = verb_quark;
NODE_INFO(node)->action_name = action_quark;
egg_menu_merge_node_prepend_ui_reference (NODE_INFO (node),
ctx->merge_id, verb_quark);
ctx->merge_id, action_quark);
NODE_INFO(node)->dirty = TRUE;
raise_error = FALSE;
}
break;
case 'd':
if (ctx->state == STATE_ROOT && !strcmp(element_name, "dockitem"))
{
ctx->state = STATE_TOOLBAR;
ctx->current = get_child_node(self, ctx->current,
node_name, strlen(node_name),
EGG_MENU_MERGE_TOOLBAR,
TRUE, FALSE);
if (NODE_INFO(ctx->current)->action_name == 0)
NODE_INFO(ctx->current)->action_name = verb_quark;
egg_menu_merge_node_prepend_ui_reference (NODE_INFO (ctx->current),
ctx->merge_id, verb_quark);
NODE_INFO(ctx->current)->dirty = TRUE;
raise_error = FALSE;
}
break;
case 'p':
if (ctx->state == STATE_ROOT && !strcmp(element_name, "popups"))
{
ctx->state = STATE_POPUPS;
ctx->current = get_child_node(self, ctx->current,
node_name, strlen(node_name),
EGG_MENU_MERGE_POPUPS,
TRUE, FALSE);
egg_menu_merge_node_prepend_ui_reference (NODE_INFO (ctx->current),
ctx->merge_id, verb_quark);
NODE_INFO(ctx->current)->dirty = TRUE;
raise_error = FALSE;
}
else if (ctx->state == STATE_POPUPS && !strcmp(element_name, "popup"))
if (ctx->state == STATE_ROOT && !strcmp(element_name, "popup"))
{
ctx->state = STATE_MENU;
ctx->current = get_child_node(self, ctx->current,
node_name, strlen(node_name),
EGG_MENU_MERGE_MENU,
EGG_MENU_MERGE_POPUP,
TRUE, FALSE);
if (NODE_INFO(ctx->current)->action_name == 0)
NODE_INFO(ctx->current)->action_name = verb_quark;
NODE_INFO(ctx->current)->action_name = action_quark;
egg_menu_merge_node_prepend_ui_reference (NODE_INFO (ctx->current),
ctx->merge_id, verb_quark);
ctx->merge_id, action_quark);
NODE_INFO(ctx->current)->dirty = TRUE;
raise_error = FALSE;
@@ -502,66 +500,66 @@ start_element_handler (GMarkupParseContext *context,
else if ((ctx->state == STATE_MENU || ctx->state == STATE_TOOLBAR) &&
!strcmp(element_name, "placeholder"))
{
if (ctx->state == STATE_MENU)
ctx->current = get_child_node(self, ctx->current,
node_name, strlen(node_name),
EGG_MENU_MERGE_MENU_PLACEHOLDER,
TRUE, top);
else
if (ctx->state == STATE_TOOLBAR)
ctx->current = get_child_node(self, ctx->current,
node_name, strlen(node_name),
EGG_MENU_MERGE_TOOLBAR_PLACEHOLDER,
TRUE, top);
else
ctx->current = get_child_node(self, ctx->current,
node_name, strlen(node_name),
EGG_MENU_MERGE_MENU_PLACEHOLDER,
TRUE, top);
egg_menu_merge_node_prepend_ui_reference (NODE_INFO (ctx->current),
ctx->merge_id, verb_quark);
ctx->merge_id, action_quark);
NODE_INFO(ctx->current)->dirty = TRUE;
raise_error = FALSE;
}
break;
case 's':
if (ctx->state == STATE_MENU && !strcmp(element_name, "submenu"))
{
ctx->state = STATE_MENU;
ctx->current = get_child_node(self, ctx->current,
node_name, strlen(node_name),
EGG_MENU_MERGE_MENU,
TRUE, top);
if (NODE_INFO(ctx->current)->action_name == 0)
NODE_INFO(ctx->current)->action_name = verb_quark;
egg_menu_merge_node_prepend_ui_reference (NODE_INFO (ctx->current),
ctx->merge_id, verb_quark);
NODE_INFO(ctx->current)->dirty = TRUE;
raise_error = FALSE;
}
else if ((ctx->state == STATE_MENU || ctx->state == STATE_TOOLBAR) &&
if ((ctx->state == STATE_MENU || ctx->state == STATE_TOOLBAR) &&
!strcmp(element_name, "separator"))
{
GNode *node;
if (ctx->state == STATE_MENU)
ctx->state = STATE_MENUITEM;
else
if (ctx->state == STATE_TOOLBAR)
ctx->state = STATE_TOOLITEM;
else
ctx->state = STATE_MENUITEM;
node = get_child_node(self, ctx->current,
node_name, strlen(node_name),
EGG_MENU_MERGE_SEPARATOR,
TRUE, top);
if (NODE_INFO(node)->action_name == 0)
NODE_INFO(node)->action_name = verb_quark;
NODE_INFO(node)->action_name = action_quark;
egg_menu_merge_node_prepend_ui_reference (NODE_INFO (node),
ctx->merge_id, verb_quark);
ctx->merge_id, action_quark);
NODE_INFO(node)->dirty = TRUE;
raise_error = FALSE;
}
break;
case 't':
if (ctx->state == STATE_TOOLBAR && !strcmp(element_name, "toolitem"))
if (ctx->state == STATE_ROOT && !strcmp(element_name, "toolbar"))
{
ctx->state = STATE_TOOLBAR;
ctx->current = get_child_node(self, ctx->current,
node_name, strlen(node_name),
EGG_MENU_MERGE_TOOLBAR,
TRUE, FALSE);
if (NODE_INFO(ctx->current)->action_name == 0)
NODE_INFO(ctx->current)->action_name = action_quark;
egg_menu_merge_node_prepend_ui_reference (NODE_INFO (ctx->current),
ctx->merge_id, action_quark);
NODE_INFO(ctx->current)->dirty = TRUE;
raise_error = FALSE;
}
else if (ctx->state == STATE_TOOLBAR && !strcmp(element_name, "toolitem"))
{
GNode *node;
@@ -571,10 +569,10 @@ start_element_handler (GMarkupParseContext *context,
EGG_MENU_MERGE_TOOLITEM,
TRUE, top);
if (NODE_INFO(node)->action_name == 0)
NODE_INFO(node)->action_name = verb_quark;
NODE_INFO(node)->action_name = action_quark;
egg_menu_merge_node_prepend_ui_reference (NODE_INFO (node),
ctx->merge_id, verb_quark);
ctx->merge_id, action_quark);
NODE_INFO(node)->dirty = TRUE;
raise_error = FALSE;
@@ -589,20 +587,12 @@ start_element_handler (GMarkupParseContext *context,
g_markup_parse_context_get_position (context,
&line_number, &char_number);
if (error_attr)
g_set_error (error,
G_MARKUP_ERROR,
G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE,
_("Unknown attribute '%s' on line %d char %d"),
error_attr,
line_number, char_number);
else
g_set_error (error,
G_MARKUP_ERROR,
G_MARKUP_ERROR_UNKNOWN_ELEMENT,
_("Unknown tag '%s' on line %d char %d"),
element_name,
line_number, char_number);
g_set_error (error,
G_MARKUP_ERROR,
G_MARKUP_ERROR_UNKNOWN_ELEMENT,
_("Unknown tag '%s' on line %d char %d"),
element_name,
line_number, char_number);
}
}
@@ -633,8 +623,6 @@ end_element_handler (GMarkupParseContext *context,
ctx->current = ctx->current->parent;
if (NODE_INFO(ctx->current)->type == EGG_MENU_MERGE_ROOT) /* menubar */
ctx->state = STATE_ROOT;
else if (NODE_INFO(ctx->current)->type == EGG_MENU_MERGE_POPUPS) /* popup */
ctx->state = STATE_POPUPS;
/* else, stay in STATE_MENU state */
break;
case STATE_TOOLBAR:
@@ -645,10 +633,6 @@ end_element_handler (GMarkupParseContext *context,
ctx->state = STATE_ROOT;
/* else, stay in STATE_TOOLBAR state */
break;
case STATE_POPUPS:
ctx->current = ctx->current->parent;
ctx->state = STATE_ROOT;
break;
case STATE_MENUITEM:
ctx->state = STATE_MENU;
break;
@@ -794,6 +778,7 @@ find_menu_position (GNode *node, GtkWidget **menushell_p, gint *pos_p)
g_return_val_if_fail(node != NULL, FALSE);
g_return_val_if_fail(NODE_INFO(node)->type == EGG_MENU_MERGE_MENU ||
NODE_INFO(node)->type == EGG_MENU_MERGE_POPUP ||
NODE_INFO(node)->type == EGG_MENU_MERGE_MENU_PLACEHOLDER ||
NODE_INFO(node)->type == EGG_MENU_MERGE_MENUITEM ||
NODE_INFO(node)->type == EGG_MENU_MERGE_SEPARATOR,
@@ -808,6 +793,7 @@ find_menu_position (GNode *node, GtkWidget **menushell_p, gint *pos_p)
switch (NODE_INFO(parent)->type)
{
case EGG_MENU_MERGE_MENUBAR:
case EGG_MENU_MERGE_POPUP:
menushell = NODE_INFO(parent)->proxy;
pos = 0;
break;
@@ -823,10 +809,6 @@ find_menu_position (GNode *node, GtkWidget **menushell_p, gint *pos_p)
pos = g_list_index(GTK_MENU_SHELL(menushell)->children,
NODE_INFO(parent)->proxy) + 1;
break;
case EGG_MENU_MERGE_POPUPS:
menushell = NULL;
pos = 0;
break;
default:
g_warning("%s: bad parent node type %d", G_STRLOC,
NODE_INFO(parent)->type);
@@ -1005,6 +987,14 @@ update_node (EggMenuMerge *self, GNode *node)
g_signal_emit (self, merge_signals[ADD_WIDGET], 0, info->proxy);
}
break;
case EGG_MENU_MERGE_POPUP:
if (info->proxy == NULL)
{
info->proxy = gtk_menu_new ();
gtk_menu_set_accel_group (GTK_MENU (info->proxy),
self->accel_group);
}
break;
case EGG_MENU_MERGE_MENU:
{
GtkWidget *prev_submenu = NULL;
@@ -1133,8 +1123,6 @@ update_node (EggMenuMerge *self, GNode *node)
}
}
break;
case EGG_MENU_MERGE_POPUPS:
break;
case EGG_MENU_MERGE_MENUITEM:
/* remove the proxy if it is of the wrong type ... */
if (info->proxy && G_OBJECT_TYPE(info->proxy) !=

View File

@@ -26,7 +26,7 @@ typedef enum {
EGG_MENU_MERGE_TOOLBAR,
EGG_MENU_MERGE_MENU_PLACEHOLDER,
EGG_MENU_MERGE_TOOLBAR_PLACEHOLDER,
EGG_MENU_MERGE_POPUPS,
EGG_MENU_MERGE_POPUP,
EGG_MENU_MERGE_MENUITEM,
EGG_MENU_MERGE_TOOLITEM,
EGG_MENU_MERGE_SEPARATOR,

View File

@@ -1,41 +1,39 @@
<Root>
<menu>
<ui>
<menubar>
<placeholder name="AdditionalMenusPlaceholder">
<menu action="BusinessAction">
<menu name="CustomerMenu" action="CustomerMenuAction">
<menuitem name="CustomerNewCustomerOpen" action="CustomerNewCustomerOpenAction"/>
<menuitem name="CustomerFindCustomerOpen" action="CustomerFindCustomerOpenAction"/>
<menuitem name="CustomerNewInvoiceOpen" action="CustomerNewInvoiceOpenAction"/>
<menuitem name="CustomerFindInvoiceOpen" action="CustomerFindInvoiceOpenAction"/>
<menuitem name="CustomerNewJobOpen" action="CustomerNewJobOpenAction"/>
<menuitem name="CustomerFindJobOpen" action="CustomerFindJobOpenAction"/>
<menuitem name="CustomerProcessPayment" action="CustomerProcessPaymentAction"/>
</menu>
<placeholder name="AdditionalMenusPlaceholder">
<submenu verb="BusinessAction">
<submenu name="CustomerMenu" verb="CustomerMenuAction">
<menuitem name="CustomerNewCustomerOpen" verb="CustomerNewCustomerOpenAction"/>
<menuitem name="CustomerFindCustomerOpen" verb="CustomerFindCustomerOpenAction"/>
<menuitem name="CustomerNewInvoiceOpen" verb="CustomerNewInvoiceOpenAction"/>
<menuitem name="CustomerFindInvoiceOpen" verb="CustomerFindInvoiceOpenAction"/>
<menuitem name="CustomerNewJobOpen" verb="CustomerNewJobOpenAction"/>
<menuitem name="CustomerFindJobOpen" verb="CustomerFindJobOpenAction"/>
<menuitem name="CustomerProcessPayment" verb="CustomerProcessPaymentAction"/>
</submenu>
<menu name="VendorMenu" action="VendorMenuAction">
<menuitem name="VendorNewVendorOpen" action="VendorNewVendorOpenAction"/>
<menuitem name="VendorFindVendorOpen" action="VendorFindVendorOpenAction"/>
<menuitem name="VendorNewBillOpen" action="VendorNewBillOpenAction"/>
<menuitem name="VendorFindBillOpen" action="VendorFindBillOpenAction"/>
<menuitem name="VendorNewJobOpen" action="VendorNewJobOpenAction"/>
<menuitem name="VendorFindJobOpen" action="VendorFindJobOpenAction"/>
<menuitem name="VendorProcessPayment" action="VendorProcessPaymentAction"/>
</menu>
<submenu name="VendorMenu" verb="VendorMenuAction">
<menuitem name="VendorNewVendorOpen" verb="VendorNewVendorOpenAction"/>
<menuitem name="VendorFindVendorOpen" verb="VendorFindVendorOpenAction"/>
<menuitem name="VendorNewBillOpen" verb="VendorNewBillOpenAction"/>
<menuitem name="VendorFindBillOpen" verb="VendorFindBillOpenAction"/>
<menuitem name="VendorNewJobOpen" verb="VendorNewJobOpenAction"/>
<menuitem name="VendorFindJobOpen" verb="VendorFindJobOpenAction"/>
<menuitem name="VendorProcessPayment" verb="VendorProcessPaymentAction"/>
</submenu>
<menu name="EmployeeMenu" action="EmployeeMenuAction">
<menuitem name="EmployeeNewEmployeeOpen" action="EmployeeNewEmployeeOpenAction"/>
<menuitem name="EmployeeFindEmployeeOpen" action="EmployeeFindEmployeeOpenAction"/>
<menuitem name="EmployeeNewExpenseOpen" action="EmployeeNewExpenseVoucherOpenAction"/>
<menuitem name="EmployeeFindExpenseOpen" action="EmployeeFindExpenseVoucherOpenAction"/>
<menuitem name="EmployeeProcessPayment" action="EmployeeProcessPaymentAction"/>
</menu>
<submenu name="EmployeeMenu" verb="EmployeeMenuAction">
<menuitem name="EmployeeNewEmployeeOpen" verb="EmployeeNewEmployeeOpenAction"/>
<menuitem name="EmployeeFindEmployeeOpen" verb="EmployeeFindEmployeeOpenAction"/>
<menuitem name="EmployeeNewExpenseOpen" verb="EmployeeNewExpenseVoucherOpenAction"/>
<menuitem name="EmployeeFindExpenseOpen" verb="EmployeeFindExpenseVoucherOpenAction"/>
<menuitem name="EmployeeProcessPayment" verb="EmployeeProcessPaymentAction"/>
</submenu>
<menuitem name="TaxTablesOpen" verb="TaxTablesOpenAction"/>
<menuitem name="BillingTermsOpen" verb="BillingTermsOpenAction"/>
<menuitem name="BillsDueReminderOpen" verb="BillsDueReminderOpenAction"/>
</submenu>
</placeholder>
</menu>
</Root>
<menuitem name="TaxTablesOpen" action="TaxTablesOpenAction"/>
<menuitem name="BillingTermsOpen" action="BillingTermsOpenAction"/>
<menuitem name="BillsDueReminderOpen" action="BillsDueReminderOpenAction"/>
</menu>
</placeholder>
</menubar>
</ui>

View File

@@ -389,6 +389,7 @@ gnc_main_window_merge_actions (GncMainWindow *window,
GncMainWindowActionData *data;
guint i;
MergedActionEntry *entry;
GError *error = NULL;
g_return_if_fail (GNC_IS_MAIN_WINDOW (window));
g_return_if_fail (group_name != NULL);
@@ -408,10 +409,17 @@ gnc_main_window_merge_actions (GncMainWindow *window,
entry->action_group = egg_action_group_new (group_name);
egg_action_group_add_actions (entry->action_group, actions, n_actions);
egg_menu_merge_insert_action_group (window->ui_merge, entry->action_group, 0);
entry->merge_id = egg_menu_merge_add_ui_from_file (window->ui_merge, ui_file, NULL);
egg_menu_merge_ensure_update (window->ui_merge);
g_hash_table_insert (window->priv->merged_actions_table, g_strdup (group_name), entry);
entry->merge_id = egg_menu_merge_add_ui_from_file (window->ui_merge, ui_file, &error);
g_assert(entry->merge_id || error);
if (entry->merge_id) {
egg_menu_merge_ensure_update (window->ui_merge);
g_hash_table_insert (window->priv->merged_actions_table, g_strdup (group_name), entry);
} else {
g_critical("Failed to load ui file.\n Filename %s\n Error %s",
ui_file, error->message);
g_error_free(error);
g_free(entry);
}
}
void
@@ -524,9 +532,10 @@ static void
gnc_main_window_setup_window (GncMainWindow *window)
{
GtkWidget *main_vbox;
guint i;
guint i, merge_id;
GncPluginManager *manager;
GList *plugins;
GError *error = NULL;
/* Create widgets and add them to the window */
main_vbox = gtk_vbox_new (FALSE, 0);
@@ -566,9 +575,19 @@ gnc_main_window_setup_window (GncMainWindow *window)
g_signal_connect (G_OBJECT (window->ui_merge), "add_widget",
G_CALLBACK (gnc_main_window_add_widget), window);
egg_menu_merge_add_ui_from_file (window->ui_merge, GNC_UI_DIR "/gnc-main-window-ui.xml", NULL);
gtk_window_add_accel_group (GTK_WINDOW (window), window->ui_merge->accel_group);
egg_menu_merge_ensure_update (window->ui_merge);
merge_id = egg_menu_merge_add_ui_from_file (window->ui_merge,
GNC_UI_DIR "/gnc-main-window-ui.xml",
&error);
g_assert(merge_id || error);
if (merge_id) {
gtk_window_add_accel_group (GTK_WINDOW (window), window->ui_merge->accel_group);
egg_menu_merge_ensure_update (window->ui_merge);
} else {
g_critical("Failed to load ui file.\n Filename %s\n Error %s",
GNC_UI_DIR "/gnc-main-window-ui.xml", error->message);
g_error_free(error);
g_assert(merge_id != 0);
}
/* GncPluginManager stuff */
manager = gnc_plugin_manager_get ();

View File

@@ -504,6 +504,7 @@ gnc_plugin_page_account_tree_merge_actions (GncPluginPage *plugin_page,
EggMenuMerge *ui_merge)
{
GncPluginPageAccountTree *plugin_page_account_tree = GNC_PLUGIN_PAGE_ACCOUNT_TREE(plugin_page);
GError *error = NULL;
ENTER("page %p, ui_merge %p", plugin_page, ui_merge);
g_return_if_fail (GNC_IS_PLUGIN_PAGE_ACCOUNT_TREE (plugin_page_account_tree));
@@ -514,12 +515,18 @@ gnc_plugin_page_account_tree_merge_actions (GncPluginPage *plugin_page,
plugin_page_account_tree->priv->merge_id =
egg_menu_merge_add_ui_from_file (ui_merge,
GNC_UI_DIR "/gnc-plugin-page-account-tree-ui.xml",
NULL);
&error);
DEBUG("merge_id is %d", plugin_page_account_tree->priv->merge_id);
egg_menu_merge_ensure_update (ui_merge);
plugin_page_account_tree->priv->ui_merge = ui_merge;
g_assert(plugin_page_account_tree->priv->merge_id || error);
if (plugin_page_account_tree->priv->merge_id) {
egg_menu_merge_ensure_update (ui_merge);
plugin_page_account_tree->priv->ui_merge = ui_merge;
} else {
g_critical("Failed to load ui file.\n Filename %s\n Error %s",
"gnc-plugin-page-account-tree-ui.xml", error->message);
g_error_free(error);
}
LEAVE(" ");
}
@@ -581,24 +588,14 @@ gnc_plugin_page_account_tree_button_press_cb (GtkWidget *widget,
GdkEventButton *event,
GncPluginPageAccountTree *page)
{
const gchar *popup;
gchar *path;
GtkWidget *menuitem, *menu;
GtkWidget *menu;
if (event->button == 3 && page->priv->ui_merge != NULL) {
/* Maybe show a different popup menu if no account is selected. */
popup = "AccountPopup";
path = g_strconcat ("/popups/", popup, NULL);
menuitem = egg_menu_merge_get_widget (page->priv->ui_merge, path);
g_free (path);
g_return_val_if_fail (menuitem != NULL, FALSE);
menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem));
g_return_val_if_fail (menu != NULL, FALSE);
gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, event->button, event->time);
menu = egg_menu_merge_get_widget (page->priv->ui_merge, "/AccountPopup");
if (menu)
gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
event->button, event->time);
return TRUE;
}

View File

@@ -332,17 +332,26 @@ gnc_plugin_page_register_merge_actions (GncPluginPage *plugin_page,
EggMenuMerge *ui_merge)
{
GncPluginPageRegister *plugin_page_register = GNC_PLUGIN_PAGE_REGISTER(plugin_page);
GError *error = NULL;
g_return_if_fail (GNC_IS_PLUGIN_PAGE_REGISTER (plugin_page_register));
egg_menu_merge_insert_action_group (ui_merge, plugin_page_register->priv->action_group, 0);
plugin_page_register->priv->merge_id = egg_menu_merge_add_ui_from_file (ui_merge,
GNC_UI_DIR "/gnc-plugin-page-register-ui.xml",
NULL);
egg_menu_merge_ensure_update (ui_merge);
plugin_page_register->priv->merge_id =
egg_menu_merge_add_ui_from_file (ui_merge,
GNC_UI_DIR "/gnc-plugin-page-register-ui.xml",
&error);
plugin_page_register->priv->ui_merge = ui_merge;
g_assert(plugin_page_register->priv->merge_id || error);
if (plugin_page_register->priv->merge_id) {
egg_menu_merge_ensure_update (ui_merge);
plugin_page_register->priv->ui_merge = ui_merge;
} else {
g_critical("Failed to load ui file.\n Filename %s\n Error %s",
"gnc-plugin-page-register-ui.xml", error->message);
g_error_free(error);
}
}
static void

View File

@@ -1,82 +1,83 @@
<Root>
<menu>
<submenu name="File" verb="FileAction">
<menuitem name="FileNew" verb="FileNewAction"/>
<placeholder name="FileNewPlaceholder"/>
<separator name="FileSep1"/>
<menuitem name="FileOpen" verb="FileOpenAction"/>
<placeholder name="FileOpenPlaceholder"/>
<menuitem name="FileOpenNewWindow" verb="FileOpenNewWindowAction"/>
<submenu name="FileOpenRecent" verb="FileOpenRecentAction"/>
<separator name="FileSep2"/>
<menuitem name="FileSave" verb="FileSaveAction"/>
<menuitem name="FileSaveAs" verb="FileSaveAsAction"/>
<placeholder name="FileSavePlaceholder"/>
<separator name="FileSep3"/>
<submenu name="FileImport" verb="FileImportAction">
<placeholder name="FileImportPlaceholder"/>
</submenu>
<submenu name="FileExport" verb="FileExportAction">
<menuitem name="FileExportAccounts" verb="FileExportAccountsAction"/>
<placeholder name="FileExportPlaceholder"/>
</submenu>
<separator name="FileSep4"/>
<menuitem name="FilePrint" verb="FilePrintAction"/>
<separator name="FileSep5"/>
<menuitem name="FileClose" verb="FileCloseAction"/>
<menuitem name="FileQuit" verb="FileQuitAction"/>
</submenu>
<ui>
<menubar>
<menu name="File" action="FileAction">
<menuitem name="FileNew" action="FileNewAction"/>
<placeholder name="FileNewPlaceholder"/>
<separator name="FileSep1"/>
<menuitem name="FileOpen" action="FileOpenAction"/>
<placeholder name="FileOpenPlaceholder"/>
<menuitem name="FileOpenNewWindow" action="FileOpenNewWindowAction"/>
<menu name="FileOpenRecent" action="FileOpenRecentAction"/>
<separator name="FileSep2"/>
<menuitem name="FileSave" action="FileSaveAction"/>
<menuitem name="FileSaveAs" action="FileSaveAsAction"/>
<placeholder name="FileSavePlaceholder"/>
<separator name="FileSep3"/>
<menu name="FileImport" action="FileImportAction">
<placeholder name="FileImportPlaceholder"/>
</menu>
<menu name="FileExport" action="FileExportAction">
<menuitem name="FileExportAccounts" action="FileExportAccountsAction"/>
<placeholder name="FileExportPlaceholder"/>
</menu>
<separator name="FileSep4"/>
<menuitem name="FilePrint" action="FilePrintAction"/>
<separator name="FileSep5"/>
<menuitem name="FileClose" action="FileCloseAction"/>
<menuitem name="FileQuit" action="FileQuitAction"/>
</menu>
<menu name="Edit" action="EditAction">
<menuitem name="EditCut" action="EditCutAction"/>
<menuitem name="EditCopy" action="EditCopyAction"/>
<menuitem name="EditPaste" action="EditPasteAction"/>
<separator name="EditSep1"/>
<placeholder name="EditPlaceholder"/>
<menuitem name="EditPreferences" action="EditPreferencesAction"/>
<placeholder name="EditPreferencesPlaceholder"/>
<menuitem name="EditTaxOptions" action="EditTaxOptionsAction"/>
</menu>
<menu name="View" action="ViewAction">
<menuitem name="ViewRefresh" action="ViewRefreshAction"/>
<separator name="ViewSep1"/>
<menuitem name="ViewToolbar" action="ViewToolbarAction"/>
<menuitem name="ViewSummary" action="ViewSummaryAction"/>
<menuitem name="ViewStatusbar" action="ViewStatusbarAction"/>
</menu>
<menu name="Actions" action="ActionsAction">
<menu name="ActionsScheduledTransactions" action="ActionsScheduledTransactionsAction">
<menuitem name="ActionsScheduledTransactionEditor" action="ActionsScheduledTransactionEditorAction"/>
<menuitem name="ActionsSinceLastRun" action="ActionsSinceLastRunAction"/>
<menuitem name="ActionsMortgageLoan" action="ActionsMortgageLoanAction"/>
</menu>
<placeholder name="ActionsPlaceholder"/>
</menu>
<placeholder name="AdditionalMenusPlaceholder"/>
<menu name="Tools" action="ToolsAction">
<placeholder name="ToolsPlaceholder"/>
<menuitem name="ToolsPriceEditor" action="ToolsPriceEditorAction"/>
<menuitem name="ToolsCommodityEditor" action="ToolsCommodityEditorAction"/>
<menuitem name="ToolsFinancialCalculator" action="ToolsFinancialCalculatorAction"/>
<menuitem name="ToolsFindTransactions" action="ToolsFindTransactionsAction"/>
</menu>
<menu name="Help" action="HelpAction">
<menuitem name="HelpTutorial" action="HelpTutorialAction"/>
<menuitem name="HelpTipsOfTheDay" action="HelpTipsOfTheDayAction"/>
<menuitem name="HelpContents" action="HelpContentsAction"/>
<menuitem name="HelpAbout" action="HelpAboutAction"/>
</menu>
</menubar>
<submenu name="Edit" verb="EditAction">
<menuitem name="EditCut" verb="EditCutAction"/>
<menuitem name="EditCopy" verb="EditCopyAction"/>
<menuitem name="EditPaste" verb="EditPasteAction"/>
<separator name="EditSep1"/>
<placeholder name="EditPlaceholder"/>
<menuitem name="EditPreferences" verb="EditPreferencesAction"/>
<placeholder name="EditPreferencesPlaceholder"/>
<menuitem name="EditTaxOptions" verb="EditTaxOptionsAction"/>
</submenu>
<submenu name="View" verb="ViewAction">
<menuitem name="ViewRefresh" verb="ViewRefreshAction"/>
<separator name="ViewSep1"/>
<menuitem name="ViewToolbar" verb="ViewToolbarAction"/>
<menuitem name="ViewSummary" verb="ViewSummaryAction"/>
<menuitem name="ViewStatusbar" verb="ViewStatusbarAction"/>
</submenu>
<submenu name="Actions" verb="ActionsAction">
<submenu name="ActionsScheduledTransactions" verb="ActionsScheduledTransactionsAction">
<menuitem name="ActionsScheduledTransactionEditor" verb="ActionsScheduledTransactionEditorAction"/>
<menuitem name="ActionsSinceLastRun" verb="ActionsSinceLastRunAction"/>
<menuitem name="ActionsMortgageLoan" verb="ActionsMortgageLoanAction"/>
</submenu>
<placeholder name="ActionsPlaceholder"/>
</submenu>
<placeholder name="AdditionalMenusPlaceholder"/>
<submenu name="Tools" verb="ToolsAction">
<placeholder name="ToolsPlaceholder"/>
<menuitem name="ToolsPriceEditor" verb="ToolsPriceEditorAction"/>
<menuitem name="ToolsCommodityEditor" verb="ToolsCommodityEditorAction"/>
<menuitem name="ToolsFinancialCalculator" verb="ToolsFinancialCalculatorAction"/>
<menuitem name="ToolsFindTransactions" verb="ToolsFindTransactionsAction"/>
</submenu>
<submenu name="Help" verb="HelpAction">
<menuitem name="HelpTutorial" verb="HelpTutorialAction"/>
<menuitem name="HelpTipsOfTheDay" verb="HelpTipsOfTheDayAction"/>
<menuitem name="HelpContents" verb="HelpContentsAction"/>
<menuitem name="HelpAbout" verb="HelpAboutAction"/>
</submenu>
</menu>
<dockitem name="DefaultToolbar">
<toolitem name="ToolbarSave" verb="FileSaveAction"/>
<toolitem name="ToolbarClose" verb="FileCloseAction"/>
<placeholder name="DefaultToolbarPlaceholder"/>
<separator name="ToolbarSep1"/>
<toolitem name="ToolbarQuit" verb="FileQuitAction"/>
</dockitem>
</Root>
<toolbar name="DefaultToolbar">
<toolitem name="ToolbarSave" action="FileSaveAction"/>
<toolitem name="ToolbarClose" action="FileCloseAction"/>
<placeholder name="DefaultToolbarPlaceholder"/>
<separator name="ToolbarSep1"/>
<toolitem name="ToolbarQuit" action="FileQuitAction"/>
</toolbar>
</ui>

View File

@@ -1,9 +1,9 @@
<Root>
<menu>
<submenu name="File" verb="FileAction">
<placeholder name="FileNewPlaceholder">
<menuitem name="FileNewAccountTree" verb="FileNewAccountTreeAction"/>
</placeholder>
</submenu>
</menu>
</Root>
<ui>
<menubar>
<menu name="File" action="FileAction">
<placeholder name="FileNewPlaceholder">
<menuitem name="FileNewAccountTree" action="FileNewAccountTreeAction"/>
</placeholder>
</menu>
</menubar>
</ui>

View File

@@ -1,71 +1,71 @@
<Root>
<menu>
<submenu name="File" verb="FileAction">
<placeholder name="FileNewPlaceholder">
<menuitem name="FileNewAccount" verb="FileNewAccountAction"/>
</placeholder>
<placeholder name="FileOpenPlaceholder">
<menuitem name="FileOpenAccount" verb="FileOpenAccountAction"/>
<menuitem name="FileOpenSubaccounts" verb="FileOpenSubaccountsAction"/>
</placeholder>
</submenu>
<submenu name="Edit" verb="EditAction">
<placeholder name="EditPlaceholder">
<menuitem name="EditEditAccount" verb="EditEditAccountAction"/>
<menuitem name="EditDeleteAccount" verb="EditDeleteAccountAction"/>
<separator name="EditSep2"/>
</placeholder>
<placeholder name="EditPreferencesPlaceholder">
<menuitem name="EditAccountViewOptions" verb="EditAccountViewOptionsAction"/>
</placeholder>
</submenu>
<submenu name="Actions" verb="ActionsAction">
<placeholder name="ActionsPlaceholder">
<separator name="ActionsSep1"/>
<menuitem name="ActionsReconcile" verb="ActionsReconcileAction"/>
<menuitem name="ActionsTransfer" verb="ActionsTransferAction"/>
<menuitem name="ActionsStockSplit" verb="ActionsStockSplitAction"/>
<separator name="ActionsSep2"/>
<submenu name="ScrubMenu" verb="ScrubMenuAction">
<menuitem name="Scrub" verb="ScrubAction"/>
<menuitem name="ScrubSub" verb="ScrubSubAction"/>
<menuitem name="ScrubAll" verb="ScrubAllAction"/>
</submenu>
</placeholder>
</submenu>
</menu>
<popups>
<popup name="AccountPopup" verb="FakeToplevel">
<menuitem name="AccountOpenAccount" verb="FileOpenAccountAction"/>
<menuitem name="AccountOpenSubaccounts" verb="FileOpenSubaccountsAction"/>
<menuitem name="AccountEditAccount" verb="EditEditAccountAction"/>
<separator name="AccountSep1"/>
<menuitem name="AccountReconcile" verb="ActionsReconcileAction"/>
<menuitem name="AccountTransfer" verb="ActionsTransferAction"/>
<menuitem name="AccountStockSplit" verb="ActionsStockSplitAction"/>
<separator name="AccountSep2"/>
<menuitem name="AccountNewAccount" verb="FileNewAccountAction"/>
<menuitem name="AccountDeleteAccount" verb="EditDeleteAccountAction"/>
<separator name="AccountSep3"/>
<submenu name="ScrubMenu" verb="ScrubMenuAction">
<menuitem name="Scrub" verb="ScrubAction"/>
<menuitem name="ScrubSub" verb="ScrubSubAction"/>
<menuitem name="ScrubAll" verb="ScrubAllAction"/>
</submenu>
<separator name="AccountSep4"/>
<menuitem name="AccountViewOptions" verb="EditAccountViewOptionsAction"/>
</popup>
</popups>
<dockitem name="DefaultToolbar">
<placeholder name="DefaultToolbarPlaceholder">
<separator name="ToolbarSep2"/>
<toolitem name="ToolbarOpenAccount" verb="FileOpenAccountAction"/>
<toolitem name="ToolbarEditAccount" verb="EditEditAccountAction"/>
<separator name="ToolbarSep3"/>
<toolitem name="ToolbarAccountViewOptions" verb="EditAccountViewOptionsAction"/>
<separator name="ToolbarSep4"/>
<toolitem name="ToolbarNewAccount" verb="FileNewAccountAction"/>
<toolitem name="ToolbarDeleteAccount" verb="EditDeleteAccountAction"/>
</placeholder>
</dockitem>
</Root>
<ui>
<menubar>
<menu name="File" action="FileAction">
<placeholder name="FileNewPlaceholder">
<menuitem name="FileNewAccount" action="FileNewAccountAction"/>
</placeholder>
<placeholder name="FileOpenPlaceholder">
<menuitem name="FileOpenAccount" action="FileOpenAccountAction"/>
<menuitem name="FileOpenSubaccounts" action="FileOpenSubaccountsAction"/>
</placeholder>
</menu>
<menu name="Edit" action="EditAction">
<placeholder name="EditPlaceholder">
<menuitem name="EditEditAccount" action="EditEditAccountAction"/>
<menuitem name="EditDeleteAccount" action="EditDeleteAccountAction"/>
<separator name="EditSep2"/>
</placeholder>
<placeholder name="EditPreferencesPlaceholder">
<menuitem name="EditAccountViewOptions" action="EditAccountViewOptionsAction"/>
</placeholder>
</menu>
<menu name="Actions" action="ActionsAction">
<placeholder name="ActionsPlaceholder">
<separator name="ActionsSep1"/>
<menuitem name="ActionsReconcile" action="ActionsReconcileAction"/>
<menuitem name="ActionsTransfer" action="ActionsTransferAction"/>
<menuitem name="ActionsStockSplit" action="ActionsStockSplitAction"/>
<separator name="ActionsSep2"/>
<menu name="ScrubMenu" action="ScrubMenuAction">
<menuitem name="Scrub" action="ScrubAction"/>
<menuitem name="ScrubSub" action="ScrubSubAction"/>
<menuitem name="ScrubAll" action="ScrubAllAction"/>
</menu>
</placeholder>
</menu>
</menubar>
<popup name="AccountPopup" action="FakeToplevel">
<menuitem name="AccountOpenAccount" action="FileOpenAccountAction"/>
<menuitem name="AccountOpenSubaccounts" action="FileOpenSubaccountsAction"/>
<menuitem name="AccountEditAccount" action="EditEditAccountAction"/>
<separator name="AccountSep1"/>
<menuitem name="AccountReconcile" action="ActionsReconcileAction"/>
<menuitem name="AccountTransfer" action="ActionsTransferAction"/>
<menuitem name="AccountStockSplit" action="ActionsStockSplitAction"/>
<separator name="AccountSep2"/>
<menuitem name="AccountNewAccount" action="FileNewAccountAction"/>
<menuitem name="AccountDeleteAccount" action="EditDeleteAccountAction"/>
<separator name="AccountSep3"/>
<menu name="ScrubMenu" action="ScrubMenuAction">
<menuitem name="Scrub" action="ScrubAction"/>
<menuitem name="ScrubSub" action="ScrubSubAction"/>
<menuitem name="ScrubAll" action="ScrubAllAction"/>
</menu>
<separator name="AccountSep4"/>
<menuitem name="AccountViewOptions" action="EditAccountViewOptionsAction"/>
</popup>
<toolbar name="DefaultToolbar">
<placeholder name="DefaultToolbarPlaceholder">
<separator name="ToolbarSep2"/>
<toolitem name="ToolbarOpenAccount" action="FileOpenAccountAction"/>
<toolitem name="ToolbarEditAccount" action="EditEditAccountAction"/>
<separator name="ToolbarSep3"/>
<toolitem name="ToolbarAccountViewOptions" action="EditAccountViewOptionsAction"/>
<separator name="ToolbarSep4"/>
<toolitem name="ToolbarNewAccount" action="FileNewAccountAction"/>
<toolitem name="ToolbarDeleteAccount" action="EditDeleteAccountAction"/>
</placeholder>
</toolbar>
</ui>

View File

@@ -1,44 +1,23 @@
<Root>
<menu>
<submenu name="Actions">
<placeholder name="ActionsPlaceholder">
<separator name="ActionsSep3"/>
<menuitem name="RecordTransaction" verb="RecordTransactionAction"/>
<menuitem name="CancelTransaction" verb="CancelTransactionAction"/>
<menuitem name="DeleteTransaction" verb="DeleteTransactionAction"/>
<menuitem name="DuplicateTransaction" verb="DuplicateTransactionAction"/>
</placeholder>
</submenu>
</menu>
<!--popups>
<popup name="AccountPopup" verb="FakeToplevel">
<menuitem name="AccountOpenAccount" verb="FileOpenAccountAction"/>
<menuitem name="AccountOpenSubaccounts" verb="FileOpenSubaccountsAction"/>
<menuitem name="AccountEditAccount" verb="EditEditAccountAction"/>
<separator name="AccountSep1"/>
<menuitem name="AccountReconcile" verb="ActionsReconcileAction"/>
<menuitem name="AccountTransfer" verb="ActionsTransferAction"/>
<menuitem name="AccountStockSplit" verb="ActionsStockSplitAction"/>
<separator name="AccountSep2"/>
<menuitem name="AccountNewAccount" verb="FileNewAccountAction"/>
<menuitem name="AccountDeleteAccount" verb="EditDeleteAccountAction"/>
<separator name="AccountSep3"/>
<submenu name="ScrubMenu" verb="ScrubMenuAction">
<menuitem name="Scrub" verb="ScrubAction"/>
<menuitem name="ScrubSub" verb="ScrubSubAction"/>
<menuitem name="ScrubAll" verb="ScrubAllAction"/>
</submenu>
<separator name="AccountSep4"/>
<menuitem name="AccountViewOptions" verb="EditAccountViewOptionsAction"/>
</popup>
</popups-->
<dockitem name="DefaultToolbar">
<placeholder name="DefaultToolbarPlaceholder">
<separator name="ToolbarSep2"/>
<toolitem name="ToolbarRecordTransaction" verb="RecordTransactionAction"/>
<toolitem name="ToolbarCancelTransaction" verb="CancelTransactionAction"/>
<toolitem name="ToolbarDeleteTransaction" verb="DeleteTransactionAction"/>
<toolitem name="ToolbarDuplicateTransaction" verb="DuplicateTransactionAction"/>
</placeholder>
</dockitem>
</Root>
<ui>
<menubar>
<menu name="Actions">
<placeholder name="ActionsPlaceholder">
<separator name="ActionsSep3"/>
<menuitem name="RecordTransaction" action="RecordTransactionAction"/>
<menuitem name="CancelTransaction" action="CancelTransactionAction"/>
<menuitem name="DeleteTransaction" action="DeleteTransactionAction"/>
<menuitem name="DuplicateTransaction" action="DuplicateTransactionAction"/>
</placeholder>
</menu>
</menubar>
<toolbar name="DefaultToolbar">
<placeholder name="DefaultToolbarPlaceholder">
<separator name="ToolbarSep2"/>
<toolitem name="ToolbarRecordTransaction" action="RecordTransactionAction"/>
<toolitem name="ToolbarCancelTransaction" action="CancelTransactionAction"/>
<toolitem name="ToolbarDeleteTransaction" action="DeleteTransactionAction"/>
<toolitem name="ToolbarDuplicateTransaction" action="DuplicateTransactionAction"/>
</placeholder>
</toolbar>
</ui>

View File

@@ -1,9 +1,9 @@
<Root>
<menu>
<submenu name="Tools" verb="ToolsAction">
<placeholder name="ToolsPlaceholder">
<menuitem name="ToolsGeneralLedger" verb="ToolsGeneralLedgerAction"/>
</placeholder>
</submenu>
</menu>
</Root>
<ui>
<menubar>
<menu name="Tools" action="ToolsAction">
<placeholder name="ToolsPlaceholder">
<menuitem name="ToolsGeneralLedger" action="ToolsGeneralLedgerAction"/>
</placeholder>
</menu>
</menubar>
</ui>

View File

@@ -1,11 +1,11 @@
<Root>
<menu>
<submenu name="File" verb="FileAction">
<submenu name="FileImport" verb="FileImportAction">
<placeholder name="FileImportPlaceholder">
<menuitem name="FileQIFImport" verb="QIFImportAction"/>
</placeholder>
</submenu>
</submenu>
</menu>
</Root>
<ui>
<menubar>
<menu name="File" action="FileAction">
<menu name="FileImport" action="FileImportAction">
<placeholder name="FileImportPlaceholder">
<menuitem name="FileQIFImport" action="QIFImportAction"/>
</placeholder>
</menu>
</menu>
</menubar>
</ui>