#ifndef __SELECTION_H__
#define __SELECTION_H__

#include "dw_ext_iterator.h"

#define SELECTION_EOW (1 << 30)

typedef struct
{
   /* selection */
   enum {
      SELECTION_NONE,
      SELECTION_SELECTING,
      SELECTION_SELECTED
   } selection_state;
   DwExtIterator *from, *to;
   gint from_char, to_char;

   /* link handling */
   enum {
      SELECTION_LINK_NONE,
      SELECTION_LINK_PRESSED
   } link_state;
   guint link_button;
   DwExtIterator *link;
   gint link_char, link_number;

   /* "full screen" feature */
   void (*dclick_callback) (gpointer data);
   gpointer callback_data;

   /* widget that owns this selection */
   gpointer owner;
  
} Selection;

Selection* a_Selection_new                 (void);
void       a_Selection_free                (Selection *selection);
void       a_Selection_reset               (Selection *selection);
void       a_Selection_set_dclick_callback (Selection *selection,
                                            void (*fn) (gpointer data),
                                            gpointer callback_data);
void       a_Selection_set_owner           (Selection *selection,
                                            gpointer owner);
gint       a_Selection_button_press        (Selection *selection,
                                            DwIterator *it,
                                            gint char_pos,
                                            gint link,
                                            GdkEventButton *event,
                                            gboolean within_content);
gint       a_Selection_button_release      (Selection *selection,
                                            DwIterator *it,
                                            gint char_pos,
                                            gint link,
                                            GdkEventButton *event,
                                            gboolean within_content);
gint       a_Selection_button_motion       (Selection *selection,
                                            DwIterator *it,
                                            gint char_pos,
                                            gint link,
                                            GdkEventButton *event,
                                            gboolean within_content);

void       a_Selection_init_selection           (GtkWidget *widget);
void       a_Selection_set_selection            (GtkWidget *widget,
                                                 gchar* str);
void       a_Selection_give_selection_callback  (GtkWidget *widget,
                                                 GtkSelectionData *data,
                                                 guint info,
                                                 guint time);
gint       a_Selection_clear_selection_callback (GtkWidget *,
                                                 GdkEventSelection *);


#endif /* __SELECTION_H__ */
