#include "acidlaunch.h"

/* expose event - redraw the image's drawing area */

static void expose(GtkWidget *drawing_area, GdkEventExpose *event, gpointer data)
{
	GdkPixbuf *pixbuf;

	pixbuf = (GdkPixbuf *)gtk_object_get_data(GTK_OBJECT(drawing_area), "pixbuf");
	if (gdk_pixbuf_get_has_alpha (pixbuf)) {
		gdk_draw_rgb_32_image (drawing_area->window,
				       drawing_area->style->black_gc,
				       event->area.x, event->area.y, 
				       event->area.width, 
				       event->area.height,
				       GDK_RGB_DITHER_MAX, 
				       gdk_pixbuf_get_pixels(pixbuf)
				       + (event->area.y * gdk_pixbuf_get_rowstride(pixbuf)) 
				       + (event->area.x * gdk_pixbuf_get_n_channels(pixbuf)),
				       gdk_pixbuf_get_rowstride(pixbuf));
	} else {
		gdk_draw_rgb_image(drawing_area->window,
				    drawing_area->style->white_gc,
				    event->area.x, event->area.y, 
				    event->area.width, 
				    event->area.height,
				    GDK_RGB_DITHER_NORMAL,
				    gdk_pixbuf_get_pixels(pixbuf)
				    + (event->area.y * gdk_pixbuf_get_rowstride(pixbuf))
				    + (event->area.x * gdk_pixbuf_get_n_channels(pixbuf)),
				    gdk_pixbuf_get_rowstride(pixbuf));
	}
}

static void button_clicked(GtkWidget *widget, gpointer data )
{
	ImageButton* button = (ImageButton*) data;
	button->clicked();
}

void ImageButton::clicked()
{
	cout << "default click method\n";
}

/* create a button from an image file */
ImageButton::ImageButton(const char* filename, int xsize, int ysize, int bgcolor)
{
	GdkPixbuf* pic;
	
	/* load the image file */
	if(!(pic = gdk_pixbuf_new_from_file(filename)))
	{
		cerr << "Error loading image file " << filename << endl;
		filename = prefsFileName("default.png");
		pic = gdk_pixbuf_new_from_file(filename);
		delete[] filename;
	}

	/* scale and composite image */
	image = gdk_pixbuf_composite_color_simple(pic,
				xsize, ysize,
				GDK_INTERP_BILINEAR,
				255,
				2,
				bgcolor, bgcolor);
	gdk_pixbuf_unref(pic);

	w = gdk_pixbuf_get_width(image);
	h = gdk_pixbuf_get_height(image);
	
	fixed = gtk_fixed_new();
	drawing_area = gtk_drawing_area_new();
	gtk_object_set_data (GTK_OBJECT(drawing_area), "pixbuf", image);
	gtk_drawing_area_size (GTK_DRAWING_AREA(drawing_area), w, h);
	gtk_signal_connect(GTK_OBJECT(drawing_area), "expose_event",
			    GTK_SIGNAL_FUNC(expose), this);
	gtk_widget_show(drawing_area);
	gtk_widget_set_usize( fixed, w, h );
    gtk_fixed_put( GTK_FIXED(fixed), drawing_area, 0, 0 );
	gtk_widget_show(fixed);

	button = gtk_button_new();
	gtk_object_set_data(GTK_OBJECT(button), "imagebutton", this);	
    gtk_container_add( GTK_CONTAINER(button), fixed );
	gtk_signal_connect( GTK_OBJECT(button), "clicked",
                        GTK_SIGNAL_FUNC(button_clicked), this );

	gtk_widget_show(button);
}

ImageButton::~ImageButton()
{
	gtk_widget_destroy(drawing_area);
	gtk_widget_destroy(fixed);
	gtk_widget_destroy(button);
	gdk_pixbuf_unref(image);
}


syntax highlighted by Code2HTML, v. 0.9.1