/* * This file is a part of gmenu, the GNOME panel menu editor. * * File: gmenu.c * * This file contains main() for gmenu. It handles creating the gmenu * window and widgets, and the 'sort menu' toolbar callbacks are here * too. * * Authors: John Ellis * Nat Friedman */ #include #include #include "gmenu.h" gchar *SYSTEM_APPS; gchar *SYSTEM_PIXMAPS; gchar *USER_APPS; gchar *USER_PIXMAPS; GtkWidget *app; GtkWidget *menu_tree_ctree; GtkWidget *infolabel; GtkWidget *infopixmap; GtkWidget *pathlabel; GtkObject *edit_area; GtkCTreeNode *topnode; GtkCTreeNode *usernode; GtkCTreeNode *systemnode; GtkCTreeNode *current_node = NULL; Desktop_Data *current_desktop = NULL; gchar *current_path; Desktop_Data *edit_area_orig_data = NULL; static void sort_single_pressed(GtkWidget *w, gpointer data); static void sort_recurse_cb(GtkCTree *ctree, GtkCTreeNode *node, gpointer data); static void sort_recursive_pressed(GtkWidget *w, gpointer data); static void about_cb(GtkWidget *w, gpointer data); static void destroy_cb(GtkWidget *w, gpointer data); int main (int argc, char *argv[]); /* menu bar */ GnomeUIInfo file_menu[] = { GNOMEUIINFO_MENU_NEW_ITEM(N_("_New Submenu..."), N_("Create a new submenu"), create_folder_pressed_cb, NULL), GNOMEUIINFO_MENU_NEW_ITEM(N_("New _Item..."), N_("Create a new menu item"), new_item_pressed_cb, NULL), { GNOME_APP_UI_ITEM, N_("_Delete..."), NULL, delete_pressed_cb, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_CUT, 'D', GDK_CONTROL_MASK, NULL }, GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_MENU_EXIT_ITEM(destroy_cb, NULL), GNOMEUIINFO_END }; GnomeUIInfo sort_menu[] = { { GNOME_APP_UI_ITEM, N_("_Sort Submenu"), NULL, sort_single_pressed, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_SPELLCHECK, 'S', GDK_CONTROL_MASK, NULL }, { GNOME_APP_UI_ITEM, N_("Sort Submenu _Recursive"), NULL, sort_recursive_pressed, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_SPELLCHECK, 'R', GDK_CONTROL_MASK, NULL }, { GNOME_APP_UI_ENDOFINFO } }; GnomeUIInfo help_menu[] = { /* { GNOME_APP_UI_HELP, NULL, NULL, NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, 0, NULL },*/ GNOMEUIINFO_MENU_ABOUT_ITEM(about_cb, NULL), { GNOME_APP_UI_ENDOFINFO } }; GnomeUIInfo main_menu[] = { { GNOME_APP_UI_SUBTREE, N_("_File"), NULL, file_menu, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 'F', GDK_MODIFIER_MASK, NULL }, { GNOME_APP_UI_SUBTREE, N_("_Sort"), NULL, sort_menu, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 'S', GDK_MODIFIER_MASK, NULL }, { GNOME_APP_UI_SUBTREE, N_("_Help"), NULL, help_menu, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 'H', GDK_MODIFIER_MASK, NULL }, { GNOME_APP_UI_ENDOFINFO } }; /* toolbar */ GnomeUIInfo toolbar[] = { { GNOME_APP_UI_ITEM, N_("New Submenu"), N_("Create a new submenu"), create_folder_pressed_cb, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_NEW, 0, 0, NULL }, { GNOME_APP_UI_ITEM, N_("New Item"), N_("Create a new item"), new_item_pressed_cb, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_NEW, 0, 0, NULL }, { GNOME_APP_UI_ITEM, N_("Delete"), N_("Delete selected menu item"), delete_pressed_cb, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_CUT, 0, 0, NULL }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Move up"), N_("Move selected menu up"), move_up_cb, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_UP, 0, 0, NULL }, { GNOME_APP_UI_ITEM, N_("Move down"), N_("Move selected menu down"), move_down_cb, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_DOWN, 0, 0, NULL }, GNOMEUIINFO_SEPARATOR, #if 0 { GNOME_APP_UI_ITEM, N_("Properties"), N_("Edit selected menu item properties"), edit_pressed_cb, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_PROPERTIES, 0, 0, NULL }, GNOMEUIINFO_SEPARATOR, #endif { GNOME_APP_UI_ITEM, N_("Sort Submenu"), N_("Sort selected submenu"), sort_single_pressed, NULL, NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_PIXMAP_SPELLCHECK, 0, 0, NULL }, GNOMEUIINFO_END }; int main (int argc, char *argv[]) { GtkWidget *mainbox; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *frame; GtkWidget *button; GtkWidget *scrolled; GtkTooltips *tooltips; bindtextdomain(PACKAGE, GNOMELOCALEDIR); textdomain(PACKAGE); gnome_init ("GNOME menu editor", VERSION, argc, argv); SYSTEM_APPS = gnome_unconditional_datadir_file("gnome/apps"); SYSTEM_PIXMAPS = gnome_unconditional_datadir_file("pixmaps"); if (!g_file_exists(SYSTEM_APPS) || !g_file_exists(SYSTEM_PIXMAPS)) { g_print("unable to retrieve GNOME installation directory\n"); return 1; } USER_APPS = check_for_dir(gnome_util_home_file("apps")); USER_PIXMAPS = check_for_dir(gnome_util_home_file("pixmaps")); app = gnome_app_new ("gmenu",_("GNOME menu editor")); gtk_widget_set_usize (app, 600, 460); gtk_signal_connect(GTK_OBJECT(app), "delete_event", GTK_SIGNAL_FUNC(destroy_cb), NULL); gnome_app_create_menus_with_data (GNOME_APP(app), main_menu, app); /* gtk_menu_item_right_justify(GTK_MENU_ITEM(main_menu[2].widget)); */ gnome_app_create_toolbar (GNOME_APP(app), toolbar); /* gtk_toolbar_set_style (GTK_TOOLBAR (GNOME_APP(app)->toolbar), GTK_TOOLBAR_ICONS); */ tooltips = gtk_tooltips_new(); mainbox = gtk_hpaned_new(); gnome_app_set_contents(GNOME_APP(app),mainbox); gtk_widget_show (mainbox); vbox = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox), 5); gtk_paned_add1(GTK_PANED (mainbox), vbox); /* gtk_box_pack_start(GTK_BOX(mainbox),vbox,TRUE,TRUE,0); */ gtk_widget_show(vbox); scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_box_pack_start(GTK_BOX(vbox),scrolled,TRUE,TRUE,0); gtk_widget_show(scrolled); gtk_widget_push_visual (gdk_imlib_get_visual ()); gtk_widget_push_colormap (gdk_imlib_get_colormap ()); /* * The GtkCTree... */ menu_tree_ctree = gtk_ctree_new(1, 0); gtk_clist_set_column_auto_resize (GTK_CLIST (menu_tree_ctree), 0, TRUE); gtk_widget_pop_visual (); gtk_widget_pop_colormap (); gtk_clist_set_row_height(GTK_CLIST(menu_tree_ctree),22); gtk_ctree_set_indent (GTK_CTREE (menu_tree_ctree), 10); gtk_ctree_set_line_style (GTK_CTREE (menu_tree_ctree), GTK_CTREE_LINES_DOTTED); /*gtk_clist_set_column_width(GTK_CLIST(menu_tree_ctree),0,300);*/ gtk_clist_set_selection_mode(GTK_CLIST(menu_tree_ctree), GTK_SELECTION_BROWSE); gtk_signal_connect_after(GTK_OBJECT(menu_tree_ctree), "button_release_event", GTK_SIGNAL_FUNC(tree_item_selected), NULL); gtk_signal_connect_after(GTK_OBJECT(menu_tree_ctree), "tree_collapse", GTK_SIGNAL_FUNC(tree_item_collapsed), NULL); /* * Initialize drag and drop */ gmenu_init_dnd(GTK_CTREE(menu_tree_ctree)); gtk_container_add (GTK_CONTAINER (scrolled), menu_tree_ctree); gtk_widget_show(menu_tree_ctree); /* tree info area */ hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0); gtk_widget_show (hbox); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_IN); gtk_box_pack_start(GTK_BOX(hbox),frame,FALSE,FALSE,0); gtk_widget_show(frame); infopixmap = gnome_stock_pixmap_widget_new(app, GNOME_STOCK_MENU_BLANK ); gtk_container_add(GTK_CONTAINER(frame),infopixmap); gtk_widget_show(infopixmap); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_IN); gtk_box_pack_end(GTK_BOX(hbox),frame,TRUE,TRUE,0); gtk_widget_show(frame); infolabel = gtk_label_new(_("GNOME menu editor")); gtk_container_add(GTK_CONTAINER(frame),infolabel); gtk_widget_show(infolabel); /* edit area */ vbox = create_edit_area(); gtk_paned_add2(GTK_PANED(mainbox), vbox); gtk_widget_show(vbox); add_main_tree_node(); /* * We don't connect this until here so that we don't get signals * while the tree is being setup. */ gtk_signal_connect_after(GTK_OBJECT(menu_tree_ctree), "tree_select_row", GTK_SIGNAL_FUNC(tree_row_selected), NULL); gtk_widget_show(app); new_edit_area(); gtk_main(); return 0; } static void sort_single_pressed(GtkWidget *w, gpointer data) { tree_sort_node(current_node); } static void sort_recurse_cb(GtkCTree *ctree, GtkCTreeNode *node, gpointer data) { Desktop_Data *d; if (!node) return; d = gtk_ctree_node_get_row_data(GTK_CTREE(menu_tree_ctree),node); if (d->isfolder) tree_sort_node (node); } static void sort_recursive_pressed(GtkWidget *w, gpointer data) { Desktop_Data *d; GtkCTreeNode *node = current_node; if (!node || node == topnode) return; d = gtk_ctree_node_get_row_data(GTK_CTREE(menu_tree_ctree),node); if (!d->isfolder) node = GTK_CTREE_ROW(node)->parent; gtk_ctree_post_recursive(GTK_CTREE(menu_tree_ctree), node, sort_recurse_cb, NULL); } static void about_cb(GtkWidget *w, gpointer data) { GtkWidget *about; const gchar *authors[3]; gchar version[32]; sprintf(version,"%d.%d.%d",GMENU_VERSION_MAJOR, GMENU_VERSION_MINOR, GMENU_VERSION_REV); authors[0] = "John Ellis "; authors[1] = "Nat Friedman "; authors[2] = NULL; about = gnome_about_new ( _("GNOME menu editor"), version, "(C) 1999", authors, _("Released under the terms of the GNU Public License.\n" "GNOME menu editor."), NULL); gtk_widget_show (about); } static void destroy_cb(GtkWidget *w, gpointer data) { gtk_main_quit(); }