#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "GtkDefs.h"

MODULE = Gtk::Editable		PACKAGE = Gtk::Editable		PREFIX = gtk_editable_

#ifdef GTK_EDITABLE

void
gtk_editable_select_region (editable, start=0, end=-1)
	Gtk::Editable editable
	int           start
	int           end

int
gtk_editable_insert_text (editable, new_text, position=-1)
	Gtk::Editable editable
	SV*           new_text
	int           position
	CODE:
	{
		STRLEN len;
		char * c = SvPV(new_text, len);
#if GTK_HVER < 0x010000

		/* FIXME: Do later versions correctly insert text in unrealized text widgets? */

		if (!GTK_WIDGET_REALIZED(GTK_WIDGET(editable)))
			gtk_widget_realize(GTK_WIDGET(editable));
#endif
		if (position < 0) {
			if (GTK_IS_ENTRY(editable))
				position = GTK_ENTRY(editable)->text_length;
			else if (GTK_IS_TEXT(editable))
				position = gtk_text_get_length(GTK_TEXT(editable));
			else
				warn("Expicitly set position in call to insert_text()");
		}
		gtk_editable_insert_text (editable, c, len, &position);
		RETVAL = position;
	}
	OUTPUT:
	RETVAL

void
gtk_editable_delete_text (editable, start=0, end=-1)
	Gtk::Editable editable
	int           start
	int           end

gstring
gtk_editable_get_chars (editable, start=0, end=-1)
	Gtk::Editable editable
	int           start
	int           end

void
gtk_editable_cut_clipboard (editable)
	Gtk::Editable editable
	ALIAS:
		Gtk::Editable::cut_clipboard = 0
		Gtk::Editable::copy_clipboard = 1
		Gtk::Editable::paste_clipboard = 2
		Gtk::Editable::delete_selection = 3
		Gtk::Editable::changed = 4
	CODE:
	switch (ix) {
	case 0: gtk_editable_cut_clipboard (editable); break;
	case 1: gtk_editable_copy_clipboard (editable); break;
	case 2: gtk_editable_paste_clipboard (editable); break;
	case 3: gtk_editable_delete_selection (editable); break;
	case 4: gtk_editable_changed (editable); break;
	}

void
gtk_editable_claim_selection (editable, claim, time=GDK_CURRENT_TIME)
	Gtk::Editable editable
	bool          claim
	int           time

int
gtk_editable_get_position (editable)
	Gtk::Editable editable

void
gtk_editable_set_position (editable, position)
	Gtk::Editable editable
	int           position

void
gtk_editable_set_editable (editable, is_editable=TRUE)
	Gtk::Editable editable
	bool          is_editable

guint
current_pos (editable)
	Gtk::Editable editable
	ALIAS:
		Gtk::Editable::current_pos = 0
		Gtk::Editable::selection_start_pos = 1
		Gtk::Editable::selection_end_pos = 2
		Gtk::Editable::has_selection = 3
	CODE:
	switch (ix) {
	case 0: RETVAL = editable->current_pos; break;
	case 1: RETVAL = editable->selection_start_pos; break;
	case 2: RETVAL = editable->selection_end_pos; break;
	case 3: RETVAL = editable->has_selection; break;
	}
	OUTPUT:
	RETVAL

#endif