/*
 * Hardware Information, version 0.3.2
 * Copyright (C) 2003 Leandro Pereira <leandro@linuxmag.com.br>
 *
 * May be modified and/or distributed under the terms of GNU GPL version 2.
 *
 */

#include "details.h"
#include "hardinfo.h"

gboolean
detail_window_close(GtkWidget *widget, gpointer data)
{
	DetailWindow *dw = (DetailWindow *) data;
	
	gtk_widget_destroy(dw->window);
	
	return FALSE;
}

void
detail_window_set_title(DetailWindow *dw, const gchar *title)
{
	if (!dw) return;
	
	gtk_window_set_title(GTK_WINDOW(dw->window), title);
}

void
detail_window_update_names(DetailWindow *dw)
{
	gchar *buf;
	
	if (dw->device_name && strstr(dw->device_name, "&")) {
		gchar *temp, *temp2;
		
		temp = (gchar *) malloc (strlen (dw->device_name) * 2);
		
		temp2 = temp;
		
		while (*(dw->device_name)) {
			if (*(dw->device_name) == '&') {
				*(temp++) = '&';
				*(temp++) = 'a';
				*(temp++) = 'm';
				*(temp++) = 'p';
				*(temp++) = ';';
			} else {
				*(temp++) = *(dw->device_name);
			}
			dw->device_name++;
		}
		
		*(temp++) = 0;
		
		temp = temp2;
		
		g_free(dw->device_name);
		dw->device_name = g_strdup(temp);
		
		g_free(temp);
	}
	
	if (!dw->device_type)
		dw->device_type = "";
	
	buf = g_strdup_printf("<big><b>%s</b></big>\n%s",
			      dw->device_name, dw->device_type);

	gtk_label_set_markup(GTK_LABEL(dw->name_label), buf);
	
	g_free(buf);
}

void 
detail_window_append_separator(DetailWindow *dw)
{
	GtkWidget *sep;
	
	sep = gtk_hseparator_new();
	gtk_widget_show(sep);

	gtk_table_attach_defaults(GTK_TABLE(dw->info_table), sep, 0, 2, dw->last_info,
		                  dw->last_info + 1);
	
	dw->last_info++;	
}

void
detail_window_set_dev_type(DetailWindow *dw, const gchar *type)
{
	dw->device_type = g_strdup(type);
	
	detail_window_update_names(dw);
}

void
detail_window_set_dev_name(DetailWindow *dw, const gchar *name)
{
	dw->device_name = g_strdup(name);
	
	detail_window_update_names(dw);
}

void
detail_window_append_info_int(DetailWindow *dw, const gchar *name, gint val,
			      gboolean hex)
{
	gchar *buf;
	
	buf = g_strdup_printf(hex ? "0x%X" : "%d", val);
	detail_window_append_info(dw, name, buf);
	g_free(buf);
}

void
detail_window_append_info(DetailWindow *dw, const gchar *name, gchar *val)
{
	GtkWidget *label;
	gchar *buf;
	
	if (dw->last_info == 0) 
		dw->last_info = 1;

	buf = g_strdup_printf("<b>%s:</b>", name);
	label = gtk_label_new(buf);
	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
	gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
	gtk_widget_show(label);
	gtk_table_attach_defaults(GTK_TABLE(dw->info_table), label, 0, 1, dw->last_info,
		                  dw->last_info + 1);
	g_free(buf);

	label = gtk_label_new(val);
	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
	gtk_widget_show(label);
	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
	gtk_label_set_selectable(GTK_LABEL(label), TRUE);
	gtk_table_attach(GTK_TABLE(dw->info_table), label, 1, 2, dw->last_info,
			 dw->last_info + 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
				  
	dw->last_info++;				  
		
}

static gboolean
notebook_hide_tabs(GtkWidget *widget, gpointer data)
{
	if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(widget)) == 1) {
		gtk_notebook_set_show_tabs(GTK_NOTEBOOK(widget), FALSE);
		gtk_notebook_set_show_border(GTK_NOTEBOOK(widget), FALSE);
	} else {
		gtk_notebook_set_show_tabs(GTK_NOTEBOOK(widget), TRUE);
		gtk_notebook_set_show_border(GTK_NOTEBOOK(widget), TRUE);
	}
	
	return FALSE;
}

void 
detail_window_set_icon(DetailWindow *dw, const gchar *path)
{
	if (!dw || !dw->icon) return;

	gtk_image_set_from_file(GTK_IMAGE(dw->icon), path);
}

DetailWindow *
detail_window_new(void)
{
	DetailWindow *dw;
	GtkWidget *window, *vbox, *btn, *hbbox, *notebook, *table,
		  *label, *info_table;
	GtkWidget *icon, *vb, *hb;
	
	dw = g_new0(DetailWindow, 1);
	
	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_container_set_border_width(GTK_CONTAINER(window), 5);
	gtk_window_set_title(GTK_WINDOW(window), "Hardware Details");
	gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_UTILITY);
	gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
	gtk_widget_realize(window);
	
	dw->window = window;
		
	vbox = gtk_vbox_new(FALSE, 0);
	gtk_widget_show(vbox);
	gtk_container_add(GTK_CONTAINER(window), vbox);
	
	dw->vbox = vbox;

	notebook = gtk_notebook_new();
	gtk_widget_show(notebook);
	gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
	gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), FALSE);
	gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
	dw->notebook = notebook;

	g_signal_connect(G_OBJECT(notebook), "expose-event",
			 G_CALLBACK(notebook_hide_tabs), notebook);

	table = gtk_table_new(1, 2, FALSE);
	gtk_container_set_border_width(GTK_CONTAINER(table), 8);
	gtk_table_set_row_spacings(GTK_TABLE(table), 4);
	gtk_table_set_col_spacings(GTK_TABLE(table), 16);
	gtk_widget_show(table);
		
	label = gtk_label_new(_("Information"));
	gtk_widget_show(label);
	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), table, 
				 label);

	hb = gtk_hbox_new(FALSE, 5);
	gtk_widget_show(hb);
	gtk_table_attach_defaults(GTK_TABLE(table), hb, 0, 1, 0, 1);

	icon = gtk_image_new();
	gtk_misc_set_alignment(GTK_MISC(icon), 0.5, 0.0);
	gtk_widget_show(icon);
	dw->icon = icon;

	gtk_table_attach_defaults(GTK_TABLE(table), icon, 0, 1, 0, 1);

	vb = gtk_vbox_new(FALSE, 5);
	gtk_widget_show(vb);
	gtk_box_pack_start(GTK_BOX(hb), vb, TRUE, TRUE, 0);

	label = gtk_label_new(_("No device selected."));
	gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
	gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
	gtk_widget_show(label);
	gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1,
			 GTK_FILL | GTK_EXPAND, 0, 0, 0);
	dw->name_label = label;	
	
	info_table = gtk_table_new(0, 0, FALSE);
	gtk_widget_show(info_table);
	gtk_table_attach(GTK_TABLE(table), info_table, 1, 2, 2, 3,
			 GTK_EXPAND | GTK_FILL, 0, 0, 0);
	gtk_table_set_col_spacings(GTK_TABLE(info_table), 4);
	gtk_table_set_row_spacings(GTK_TABLE(info_table), 2);
	dw->info_table = info_table;
	
	hbbox = gtk_hbutton_box_new();
	gtk_container_set_border_width(GTK_CONTAINER(hbbox), 4);
	gtk_widget_show(hbbox);
	gtk_box_pack_start(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
	gtk_button_box_set_spacing(GTK_BUTTON_BOX(hbbox), 6);
	gtk_button_box_set_layout(GTK_BUTTON_BOX(hbbox), GTK_BUTTONBOX_END);

	btn = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
	g_signal_connect(G_OBJECT(btn), "clicked", G_CALLBACK(detail_window_close), dw);
	gtk_widget_show(btn);
	gtk_box_pack_end(GTK_BOX(hbbox), btn, FALSE, FALSE, 0);

	detail_window_set_icon(dw, IMG_PREFIX "logo.png");

	return dw;
}

void
detail_window_show(GtkWidget *widget, gpointer data)
{
	MainWindow *mainwindow = (MainWindow *) data;
	GenericDevice *dev;
	
	mainwindow->det_window = detail_window_new();

	dev = (GenericDevice *) gtk_ctree_node_get_row_data
	    (GTK_CTREE(mainwindow->ctree), GTK_CLIST(mainwindow->ctree)->
	     selection->data);

	hi_show_device_info_real(mainwindow, dev);

	gtk_window_set_modal(GTK_WINDOW(mainwindow->det_window->window), TRUE);	
	gtk_window_set_position(GTK_WINDOW(mainwindow->det_window->window), GTK_WIN_POS_CENTER_ON_PARENT);
	gtk_window_set_transient_for(GTK_WINDOW(mainwindow->det_window->window),
				     GTK_WINDOW(mainwindow->window));
	gtk_widget_show(mainwindow->det_window->window);
}