/*
 * e-attachment-view.h
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) version 3.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with the program; if not, see <http://www.gnu.org/licenses/>
 *
 *
 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
 *
 */

#ifndef E_ATTACHMENT_VIEW_H
#define E_ATTACHMENT_VIEW_H

#include <gtk/gtk.h>
#include <misc/e-attachment-store.h>

/* Standard GObject macros */
#define E_TYPE_ATTACHMENT_VIEW \
	(e_attachment_view_get_type ())
#define E_ATTACHMENT_VIEW(obj) \
	(G_TYPE_CHECK_INSTANCE_CAST \
	((obj), E_TYPE_ATTACHMENT_VIEW, EAttachmentView))
#define E_ATTACHMENT_VIEW_INTERFACE(cls) \
	(G_TYPE_CHECK_CLASS_CAST \
	((cls), E_TYPE_ATTACHMENT_VIEW, EAttachmentViewInterface))
#define E_IS_ATTACHMENT_VIEW(obj) \
	(G_TYPE_CHECK_INSTANCE_TYPE \
	((obj), E_TYPE_ATTACHMENT_VIEW))
#define E_IS_ATTACHMENT_VIEW_INTERFACE(cls) \
	(G_TYPE_CHECK_CLASS_TYPE \
	((cls), E_TYPE_ATTACHMENT_VIEW))
#define E_ATTACHMENT_VIEW_GET_INTERFACE(obj) \
	(G_TYPE_INSTANCE_GET_INTERFACE \
	((obj), E_TYPE_ATTACHMENT_VIEW, EAttachmentViewInterface))

G_BEGIN_DECLS

typedef struct _EAttachmentView EAttachmentView;
typedef struct _EAttachmentViewInterface EAttachmentViewInterface;
typedef struct _EAttachmentViewPrivate EAttachmentViewPrivate;

struct _EAttachmentViewInterface {
	GTypeInterface parent_interface;

	/* General Methods */
	EAttachmentViewPrivate *
			(*get_private)		(EAttachmentView *view);
	EAttachmentStore *
			(*get_store)		(EAttachmentView *view);

	/* Selection Methods */
	GtkTreePath *	(*get_path_at_pos)	(EAttachmentView *view,
						 gint x,
						 gint y);
	GList *		(*get_selected_paths)	(EAttachmentView *view);
	gboolean	(*path_is_selected)	(EAttachmentView *view,
						 GtkTreePath *path);
	void		(*select_path)		(EAttachmentView *view,
						 GtkTreePath *path);
	void		(*unselect_path)	(EAttachmentView *view,
						 GtkTreePath *path);
	void		(*select_all)		(EAttachmentView *view);
	void		(*unselect_all)		(EAttachmentView *view);

	/* Drag and Drop Methods */
	void		(*drag_source_set)	(EAttachmentView *view,
						 GdkModifierType start_button_mask,
						 const GtkTargetEntry *targets,
						 gint n_targets,
						 GdkDragAction actions);
	void		(*drag_dest_set)	(EAttachmentView *view,
						 const GtkTargetEntry *targets,
						 gint n_targets,
						 GdkDragAction actions);
	void		(*drag_source_unset)	(EAttachmentView *view);
	void		(*drag_dest_unset)	(EAttachmentView *view);

	/* Signals */
	void		(*update_actions)	(EAttachmentView *view);
};

struct _EAttachmentViewPrivate {

	/* Drag Destination */
	GtkTargetList *target_list;
	GdkDragAction drag_actions;

	/* Popup Menu Management */
	GtkUIManager *ui_manager;
	guint merge_id;

	/* Multi-DnD State */
	GList *event_list;
	GList *selected;
	gint start_x;
	gint start_y;

	guint dragging : 1;
	guint editable : 1;
};

GType		e_attachment_view_get_type	(void);

void		e_attachment_view_init		(EAttachmentView *view);
void		e_attachment_view_dispose	(EAttachmentView *view);
void		e_attachment_view_finalize	(EAttachmentView *view);

EAttachmentViewPrivate *
		e_attachment_view_get_private	(EAttachmentView *view);
EAttachmentStore *
		e_attachment_view_get_store	(EAttachmentView *view);
gboolean	e_attachment_view_get_dragging	(EAttachmentView *view);
void		e_attachment_view_set_dragging	(EAttachmentView *view,
						 gboolean dragging);
gboolean	e_attachment_view_get_editable	(EAttachmentView *view);
void		e_attachment_view_set_editable	(EAttachmentView *view,
						 gboolean editable);
GtkTargetList *	e_attachment_view_get_target_list
						(EAttachmentView *view);
GdkDragAction	e_attachment_view_get_drag_actions
						(EAttachmentView *view);
void		e_attachment_view_add_drag_actions
						(EAttachmentView *view,
						 GdkDragAction drag_actions);
GList *		e_attachment_view_get_selected_attachments
						(EAttachmentView *view);
void		e_attachment_view_open_path	(EAttachmentView *view,
						 GtkTreePath *path,
						 GAppInfo *app_info);
void		e_attachment_view_remove_selected
						(EAttachmentView *view,
						 gboolean select_next);

/* Event Support */
gboolean	e_attachment_view_button_press_event
						(EAttachmentView *view,
						 GdkEventButton *event);
gboolean	e_attachment_view_button_release_event
						(EAttachmentView *view,
						 GdkEventButton *event);
gboolean	e_attachment_view_motion_notify_event
						(EAttachmentView *view,
						 GdkEventMotion *event);
gboolean	e_attachment_view_key_press_event
						(EAttachmentView *view,
						 GdkEventKey *event);

/* Selection Management */
GtkTreePath *	e_attachment_view_get_path_at_pos
						(EAttachmentView *view,
						 gint x,
						 gint y);
GList *		e_attachment_view_get_selected_paths
						(EAttachmentView *view);
gboolean	e_attachment_view_path_is_selected
						(EAttachmentView *view,
						 GtkTreePath *path);
void		e_attachment_view_select_path	(EAttachmentView *view,
						 GtkTreePath *path);
void		e_attachment_view_unselect_path	(EAttachmentView *view,
						 GtkTreePath *path);
void		e_attachment_view_select_all	(EAttachmentView *view);
void		e_attachment_view_unselect_all	(EAttachmentView *view);
void		e_attachment_view_sync_selection
						(EAttachmentView *view,
						 EAttachmentView *target);

/* Drag Source Support */
void		e_attachment_view_drag_source_set
						(EAttachmentView *view);
void		e_attachment_view_drag_source_unset
						(EAttachmentView *view);
void		e_attachment_view_drag_begin	(EAttachmentView *view,
						 GdkDragContext *context);
void		e_attachment_view_drag_end	(EAttachmentView *view,
						 GdkDragContext *context);
void		e_attachment_view_drag_data_get	(EAttachmentView *view,
						 GdkDragContext *context,
						 GtkSelectionData *selection,
						 guint info,
						 guint time);

/* Drag Destination Support */
void		e_attachment_view_drag_dest_set	(EAttachmentView *view);
void		e_attachment_view_drag_dest_unset
						(EAttachmentView *view);
gboolean	e_attachment_view_drag_motion	(EAttachmentView *view,
						 GdkDragContext *context,
						 gint x,
						 gint y,
						 guint time);
gboolean	e_attachment_view_drag_drop	(EAttachmentView *view,
						 GdkDragContext *context,
						 gint x,
						 gint y,
						 guint time);
void		e_attachment_view_drag_data_received
						(EAttachmentView *view,
						 GdkDragContext *context,
						 gint x,
						 gint y,
						 GtkSelectionData *selection,
						 guint info,
						 guint time);

/* Popup Menu Management */
GtkAction *	e_attachment_view_get_action	(EAttachmentView *view,
						 const gchar *action_name);
GtkActionGroup *e_attachment_view_add_action_group
						(EAttachmentView *view,
						 const gchar *group_name);
GtkActionGroup *e_attachment_view_get_action_group
						(EAttachmentView *view,
						 const gchar *group_name);
GtkWidget *	e_attachment_view_get_popup_menu
						(EAttachmentView *view);
GtkUIManager *	e_attachment_view_get_ui_manager
						(EAttachmentView *view);
GtkAction *	e_attachment_view_recent_action_new
						(EAttachmentView *view,
						 const gchar *action_name,
						 const gchar *action_label);
void		e_attachment_view_show_popup_menu
						(EAttachmentView *view,
						 GdkEventButton *event,
						 GtkMenuPositionFunc func,
						 gpointer user_data);
void		e_attachment_view_update_actions
						(EAttachmentView *view);

G_END_DECLS

#endif /* E_ATTACHMENT_VIEW_H */
