/*
 * e-shell-shortcut.c: Handles events from the shortcut bar widget on the
 * e-shell-view
 *
 * Authors:
 *   Damon Chaplin (damon@gtk.org)
 *   Miguel de Icaza (miguel@kernel.org)
 *
 * (C) 1999, 2000 Helix Code, Inc.
 */
#include <config.h>
#include <gnome.h>
#include "shortcut-bar/e-shortcut-bar.h"
#include "e-shell-shortcut.h"
#include "e-shell-view.h"

#define SMALL_ICONS 1
#define LARGE_ICONS 2

typedef struct {
	EShellView *eshell_view;
	EShortcutGroup *sg;
} closure_group_t;

static void
set_large_icons (GtkMenuItem *menu_item, closure_group_t *closure)
{
	e_shortcut_group_set_view_type (closure->sg, E_ICON_BAR_LARGE_ICONS);
}

static void
set_small_icons (GtkMenu *menu_item, closure_group_t *closure)
{
	e_shortcut_group_set_view_type (closure->sg, E_ICON_BAR_SMALL_ICONS);
}

static void
add_group (GtkMenu *menu, closure_group_t *closure)
{
	int group_num;
	GtkWidget *entry;
	
	group_num = e_shortcut_bar_model_add_group (closure->eshell_view->eshell->shortcut_bar);

	/*
	 * FIXME: Figure out why this does not quite work
	 */
	entry = gtk_entry_new ();
	gtk_widget_show (entry);

	e_group_bar_set_group_button_label (
		E_GROUP_BAR (closure->eshell_view->shortcut_bar),
		group_num,
		entry);
}

static void
remove_group (GtkMenuItem *menu_item, closure_group_t *closure)
{
	e_shortcut_bar_model_remove_group (closure->eshell_view->eshell->shortcut_bar, closure->sg);
}

static void
do_rename (GtkEntry *entry, EShortcutGroup *sg)
{
	e_shortcut_group_rename (sg, gtk_entry_get_text (entry));
}

static void
rename_group (GtkMenuItem *menu_item, closure_group_t *closure)
{
	GtkWidget *entry;
	int item;
	
	item = e_group_num_from_group_ptr (closure->eshell_view->eshell->shortcut_bar, closure->sg);
	e_shortcut_group_rename (closure->sg, "Ren Test");

	return;
	
	entry = gtk_entry_new ();
	gtk_widget_show (entry);
	gtk_widget_grab_focus (entry);

	gtk_signal_connect (GTK_OBJECT (entry), "activate", GTK_SIGNAL_FUNC (do_rename), closure->sg);
		
	e_group_bar_set_group_button_label (E_GROUP_BAR (closure->eshell_view->shortcut_bar), item, entry);
}

static void
add_shortcut (GtkMenu *menu, closure_group_t *closure)
{
}

static struct {
	char          *label;
	int            flags;
	GtkSignalFunc  callback;
} shortcut_menu [] = {
	{ N_("Large Icons"),   SMALL_ICONS, GTK_SIGNAL_FUNC (set_large_icons) },
	{ N_("Small Icons"),   LARGE_ICONS, GTK_SIGNAL_FUNC (set_small_icons) },
	{ NULL, 0, NULL },
	{ N_("Add New Group"), 0,           GTK_SIGNAL_FUNC (add_group) },
	{ N_("Remove Group"),  0,           GTK_SIGNAL_FUNC (remove_group) },
	{ N_("Rename Group"),  0,           GTK_SIGNAL_FUNC (rename_group) },
	{ NULL, 0, NULL },
	{ N_("Add Shortcut"),  0,           GTK_SIGNAL_FUNC (add_shortcut) },
};

#define ELEMENTS(x) (sizeof (x) / sizeof (x[0]))

static void
shortcut_bar_show_standard_popup (EShellView *eshell_view, GdkEvent *event, EShortcutGroup *shortcut_group)
{
	GtkWidget *menu, *menuitem;
	int i;
	closure_group_t closure;
	
	menu = gtk_menu_new ();

	closure.sg = shortcut_group;
	closure.eshell_view = eshell_view;
	
	for (i = 0; i < ELEMENTS (shortcut_menu); i++){
		gboolean disable = FALSE;
		
		if (shortcut_menu [i].flags & SMALL_ICONS)
			if (shortcut_group->type != E_ICON_BAR_SMALL_ICONS)
				disable = TRUE;

		if (shortcut_menu [i].flags & LARGE_ICONS)
			if (shortcut_group->type != E_ICON_BAR_LARGE_ICONS)
				disable = TRUE;
		
		if (shortcut_menu [i].label == NULL){
			menuitem = gtk_menu_item_new ();
			gtk_widget_set_sensitive (menuitem, FALSE);
		} else 
			menuitem = gtk_menu_item_new_with_label (_(shortcut_menu [i].label));

		if (disable)
			gtk_widget_set_sensitive (menuitem, FALSE);
		
		gtk_widget_show (menuitem);
		gtk_menu_append (GTK_MENU (menu), menuitem);

		gtk_signal_connect (
			GTK_OBJECT (menuitem), "activate",
			shortcut_menu [i].callback, &closure);
	}

	gtk_signal_connect (GTK_OBJECT (menu), "deactivate",
			    GTK_SIGNAL_FUNC (gtk_main_quit), NULL);

	gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
			event->button.button, event->button.time);

	gtk_main ();

	gtk_object_destroy (GTK_OBJECT (menu));
}

typedef struct {
	EShellView     *eshell_view;
	EShortcutGroup *sg;
	EShortcut      *shortcut;
} closure_context_t;

static void
shortcut_open (GtkMenuItem *menuitem, closure_context_t *closure)
{
	e_shell_view_set_view (closure->eshell_view, closure->shortcut->efolder);
}

static void
shortcut_open_new_window (GtkMenuItem *menuitem, closure_context_t *closure)
{
	GtkWidget *toplevel;

	toplevel = e_shell_view_new (closure->eshell_view->eshell, closure->shortcut->efolder, FALSE);
	gtk_widget_show (toplevel);
}

static void
shortcut_remove (GtkMenuItem *menuitem, closure_context_t *closure)
{
	e_shortcut_group_remove (closure->sg, closure->shortcut);
}

static void
shortcut_rename (GtkMenuItem *menuitem, closure_context_t *closure)
{
	printf ("Implement: %s %s\n", __FILE__, __FUNCTION__);
}

static void
shortcut_properties (GtkMenuItem *menuitem, closure_context_t *closure)
{
	printf ("Implement: %s %s\n", __FILE__, __FUNCTION__);
}

#define NOT_IMPLEMENTED 1
static struct {
	char          *label;
	char          *stock_id;
	int            flags;
	GtkSignalFunc  callback;
} context_shortcut_menu [] = {
	{ N_("Open Folder"),        GNOME_STOCK_MENU_OPEN, 0, GTK_SIGNAL_FUNC (shortcut_open) },
	{ N_("Open in New Window"), NULL,                  0, GTK_SIGNAL_FUNC (shortcut_open_new_window) },
	{ N_("Advanced Find"),      NULL, NOT_IMPLEMENTED, NULL },
	{ NULL, },
	{ N_("Remove From Shortcut Bar"), NULL, 0, GTK_SIGNAL_FUNC (shortcut_remove) },
	{ N_("Rename Shortcut"),          NULL, 0, GTK_SIGNAL_FUNC (shortcut_rename) },
	{ NULL, },
	{ N_("Properties"),          NULL, 0, GTK_SIGNAL_FUNC (shortcut_properties) },
};

static void
shortcut_bar_show_context_popup (EShellView *eshell_view, GdkEvent *event,
				 EShortcutGroup *shortcut_group, EShortcut *shortcut)
{
	closure_context_t closure;
	GtkWidget *menu, *menuitem;
	int i;
	gboolean disable;
	
	menu = gtk_menu_new ();

	closure.eshell_view = eshell_view;
	closure.sg = shortcut_group;
	closure.shortcut = shortcut;
	
	for (i = 0; i < ELEMENTS (context_shortcut_menu); i++){
		disable = FALSE;
		
		if (context_shortcut_menu [i].flags & NOT_IMPLEMENTED)
			disable = TRUE;
			
		if (context_shortcut_menu [i].label == NULL){
			menuitem = gtk_menu_item_new ();
			gtk_widget_set_sensitive (menuitem, FALSE);
		} else {
			GtkWidget *label;
			
			if (context_shortcut_menu [i].stock_id){
				GtkWidget *stock;
				
				menuitem = gtk_pixmap_menu_item_new ();
				stock = gnome_stock_pixmap_widget (
					menu, 
					context_shortcut_menu [i].stock_id);
				if (stock){
					gtk_widget_show (stock);
					gtk_pixmap_menu_item_set_pixmap (
						GTK_PIXMAP_MENU_ITEM (menuitem), stock);
				}
			} else
				menuitem = gtk_menu_item_new ();
			
			label = gtk_label_new (_(context_shortcut_menu [i].label));
			gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
			gtk_widget_show (label);
			gtk_container_add (GTK_CONTAINER (menuitem), label);
		}

		if (disable)
			gtk_widget_set_sensitive (menuitem, FALSE);
		
		gtk_widget_show (menuitem);
		gtk_menu_append (GTK_MENU (menu), menuitem);

		gtk_signal_connect (
			GTK_OBJECT (menuitem), "activate",
			context_shortcut_menu [i].callback, &closure);
	}

	gtk_signal_connect (GTK_OBJECT (menu), "deactivate",
			    GTK_SIGNAL_FUNC (gtk_main_quit), NULL);

	gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,
			event->button.button, event->button.time);

	gtk_main ();

	gtk_object_destroy (GTK_OBJECT (menu));
}

void
shortcut_bar_item_selected (EShortcutBar *e_shortcut_bar,
			    GdkEvent *event, gint group_num, gint item_num,
			    EShellView *eshell_view)
{
	EShortcut *shortcut;
	EShortcutGroup *shortcut_group;
	EShortcutBarModel *shortcut_bar = eshell_view->eshell->shortcut_bar;
		
	shortcut_group = e_shortcut_group_from_pos (shortcut_bar, group_num);
	if (shortcut_group == NULL)
		return;
			
	shortcut = e_shortcut_from_pos (shortcut_group, item_num);
	
	
	if (event->button.button == 1) {
		e_shell_view_set_view (eshell_view, shortcut->efolder);
	} else if (event->button.button == 3) {
		
		if (shortcut == NULL)
			shortcut_bar_show_standard_popup (
				eshell_view, event, shortcut_group);
		else
			shortcut_bar_show_context_popup (
				eshell_view, event, shortcut_group, shortcut);
	}
}

6539c63d63cb5f424c8d01'>linuxthreads' shlib major is 3 on FreeBSD 5 or later.</a></td><td>knu</td><td><span title='2003-01-11 16:37:29 +0800'>2003-01-11</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+7</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=0ad4619d9e994b0e1a229c07c81dcd9658e4069d'>Prefer generic nasm instead of nasm-0.98 as BUILD_DEPENDS in</a></td><td>lioux</td><td><span title='2002-06-08 00:16:32 +0800'>2002-06-08</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=2da9a7e795c5f1eabfa3c899c734c9eb33c809ae'>Add NOPORTDOCS support to pkg-plist</a></td><td>ijliao</td><td><span title='2001-07-08 15:25:57 +0800'>2001-07-08</span></td><td>1</td><td><span class='deletions'>-3</span>/<span class='insertions'>+3</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=3ce8fdbb85dd162cc0ca01310f1c7aba7a401ed6'>Update to the new version of the same filename on the mastersite.</a></td><td>nakai</td><td><span title='2001-01-07 05:14:42 +0800'>2001-01-07</span></td><td>2</td><td><span class='deletions'>-17</span>/<span class='insertions'>+9</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=5537d20c216d70de70173eb529011d5384cbe5df'>Update to 2.39b</a></td><td>nakai</td><td><span title='2001-01-06 18:21:12 +0800'>2001-01-06</span></td><td>3</td><td><span class='deletions'>-10</span>/<span class='insertions'>+10</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=acd16e31986c05e864c5891411ef81a55e5a2b81'>Update to 2.39a</a></td><td>nakai</td><td><span title='2000-12-24 12:57:11 +0800'>2000-12-24</span></td><td>3</td><td><span class='deletions'>-5</span>/<span class='insertions'>+23</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=6ee2d7ca3e5dfc2df6e170847765d7c9ceb9ecf2'>Update to 2.36.</a></td><td>nakai</td><td><span title='2000-11-02 05:56:06 +0800'>2000-11-02</span></td><td>2</td><td><span class='deletions'>-3</span>/<span class='insertions'>+3</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=7c8707c1a275545a353aa35e626edd8a8ec31417'>USE_MT fix again.</a></td><td>nakai</td><td><span title='2000-07-20 18:41:37 +0800'>2000-07-20</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=04277d02161cbe23ca3a1becce79a29fb3a6e683'>Use WITH_THREADS instead of USE_MT.</a></td><td>nakai</td><td><span title='2000-07-19 13:48:10 +0800'>2000-07-19</span></td><td>1</td><td><span class='deletions'>-3</span>/<span class='insertions'>+3</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=f15e2126fc9073022c0ea920559761f006f0b98b'>Update for more simple.</a></td><td>nakai</td><td><span title='2000-07-05 15:52:12 +0800'>2000-07-05</span></td><td>2</td><td><span class='deletions'>-6</span>/<span class='insertions'>+30</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=855f5c88c68f11b40c5dae0d4c6c20d311b3791d'>Use simple MAKE_ENV</a></td><td>nakai</td><td><span title='2000-06-22 12:52:38 +0800'>2000-06-22</span></td><td>1</td><td><span class='deletions'>-3</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=aef6dcc485b5ca927e9bc7cff8d114a85ba72804'>Update to 2.35 Final.</a></td><td>nakai</td><td><span title='2000-06-05 18:19:39 +0800'>2000-06-05</span></td><td>6</td><td><span class='deletions'>-31</span>/<span class='insertions'>+52</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=47c3e00c5c9d02a6fbf8b031f1dca12df939aac8'>Gogo has some IA-32 assembler code, so don't try to build it on anything</a></td><td>will</td><td><span title='2000-06-01 23:46:56 +0800'>2000-06-01</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=c39b08889ea29a20f58d064caed0fc3f2cfbec42'>Update to 2.30 (2.31?) final version</a></td><td>nakai</td><td><span title='2000-04-19 12:46:05 +0800'>2000-04-19</span></td><td>2</td><td><span class='deletions'>-3</span>/<span class='insertions'>+5</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=ff937aa62d305b29ccf01992d537477ef5b3b89d'>update with the new PORTNAME/PORTVERSION variables</a></td><td>mharo</td><td><span title='2000-04-09 05:25:03 +0800'>2000-04-09</span></td><td>1</td><td><span class='deletions'>-3</span>/<span class='insertions'>+3</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=7e79e7159f3308cf95811855c5b327df6b78188d'>Update to 2.26a</a></td><td>nakai</td><td><span title='2000-03-08 20:08:10 +0800'>2000-03-08</span></td><td>2</td><td><span class='deletions'>-4</span>/<span class='insertions'>+4</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=977cf003aae74f41e3717ed2843b6f08119f572e'>Update to 2.25</a></td><td>nakai</td><td><span title='2000-02-03 13:57:57 +0800'>2000-02-03</span></td><td>2</td><td><span class='deletions'>-4</span>/<span class='insertions'>+4</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=428f1b71d23ebc7bf2b552d9d311308ae063ed7b'>PLIST fix.</a></td><td>nakai</td><td><span title='2000-01-27 18:55:58 +0800'>2000-01-27</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+4</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=3c6d8821e83230186cfa9dae6b7a540617506285'>Add cdda2wav feature.</a></td><td>nakai</td><td><span title='2000-01-26 19:28:06 +0800'>2000-01-26</span></td><td>2</td><td><span class='deletions'>-4</span>/<span class='insertions'>+23</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=eed019ff6ee04111e6c2eaa58c282db96ae88b88'>Update to 2.24c</a></td><td>nakai</td><td><span title='2000-01-25 18:54:47 +0800'>2000-01-25</span></td><td>2</td><td><span class='deletions'>-6</span>/<span class='insertions'>+6</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=8685f0c0ad8dd7da52c103d75a2188b2a88a38a5'>Add a symlink nasm-0.98 -&gt; nasm to distinguish the latest version.</a></td><td>asami</td><td><span title='1999-12-11 07:10:51 +0800'>1999-12-11</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=90fca425a01c2184e0db3e8689c1bd32b03090b0'>Update to 2.23</a></td><td>nakai</td><td><span title='1999-11-24 14:32:32 +0800'>1999-11-24</span></td><td>2</td><td><span class='deletions'>-4</span>/<span class='insertions'>+4</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=cab610400f3da9fba468aed47845b73983ff9e68'>Update to 2.22c.</a></td><td>nakai</td><td><span title='1999-11-15 14:35:29 +0800'>1999-11-15</span></td><td>2</td><td><span class='deletions'>-4</span>/<span class='insertions'>+4</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=fb5b24c1532205eed3fbca6156f11bfd08eeb39e'>Update to 2.22</a></td><td>nakai</td><td><span title='1999-11-08 11:30:04 +0800'>1999-11-08</span></td><td>2</td><td><span class='deletions'>-4</span>/<span class='insertions'>+4</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=facf5931dbe5a313796c446384661a98417bceb4'>Update to 2.20.</a></td><td>nakai</td><td><span title='1999-10-22 15:38:39 +0800'>1999-10-22</span></td><td>2</td><td><span class='deletions'>-6</span>/<span class='insertions'>+5</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/audio/gogo?id=ae1d9ea14dac6f273100623d2054e48e83761fc8'>Update to 2.11</a></td><td>nakai</td><td><span title='1999-10-06 15:54:03 +0800'>1999-10-06</span></td><td>2</td><td><span class='deletions'>-5</span>/<span class='insertions'>+6</span></td></tr>