/*
 * 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 <johne@bellatlantic.net>
 *          Nat Friedman <nat@nat.org>
 */

#include <config.h>
#include <errno.h>
#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 <johne@bellatlantic.net>";
	authors[1] = "Nat Friedman <nat@nat.org>";
	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();
}

