/*
 * Evolution calendar - Main calendar view widget
 *
 * 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/>
 *
 *
 * Authors:
 *		Miguel de Icaza <miguel@ximian.com>
 *      Federico Mena-Quintero <federico@ximian.com>
 *      Seth Alves <alves@hungry.com>
 *
 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
 *
 */

#ifndef GNOME_CALENDAR_H
#define GNOME_CALENDAR_H

#include <time.h>
#include <gtk/gtk.h>
#include <misc/e-calendar.h>
#include <libecal/e-cal.h>

#include "e-cal-model.h"

/* Standard GObject macros */
#define GNOME_TYPE_CALENDAR \
	(gnome_calendar_get_type ())
#define GNOME_CALENDAR(obj) \
	(G_TYPE_CHECK_INSTANCE_CAST \
	((obj), GNOME_TYPE_CALENDAR, GnomeCalendar))
#define GNOME_CALENDAR_CLASS(cls) \
	(G_TYPE_CHECK_INSTANCE_CAST_CLASS \
	((cls), GNOME_TYPE_CALENDAR, GnomeCalendarClass))
#define GNOME_IS_CALENDAR(obj) \
	(G_TYPE_CHECK_INSTANCE_TYPE \
	((obj), GNOME_TYPE_CALENDAR))
#define GNOME_IS_CALENDAR_CLASS(cls) \
	(G_TYPE_CHECK_CLASS_TYPE \
	((cls), GNOME_TYPE_CALENDAR))
#define GNOME_CALENDAR_GET_CLASS(obj) \
	(G_TYPE_INSTANCE_GET_CLASS \
	((obj), GNOME_TYPE_CALENDAR, GnomeCalendarClass))

G_BEGIN_DECLS

/* Avoid circular inclusion. */
struct _ECalendarView;

typedef struct _GnomeCalendar GnomeCalendar;
typedef struct _GnomeCalendarClass GnomeCalendarClass;
typedef struct _GnomeCalendarPrivate GnomeCalendarPrivate;

/* View types */
typedef enum {
	GNOME_CAL_DAY_VIEW,
	GNOME_CAL_WORK_WEEK_VIEW,
	GNOME_CAL_WEEK_VIEW,
	GNOME_CAL_MONTH_VIEW,
	GNOME_CAL_LIST_VIEW,
	GNOME_CAL_LAST_VIEW
} GnomeCalendarViewType;

typedef enum {
	GNOME_CAL_GOTO_TODAY,
	GNOME_CAL_GOTO_DATE,
	GNOME_CAL_GOTO_FIRST_DAY_OF_MONTH,
	GNOME_CAL_GOTO_LAST_DAY_OF_MONTH,
	GNOME_CAL_GOTO_FIRST_DAY_OF_WEEK,
	GNOME_CAL_GOTO_LAST_DAY_OF_WEEK,
	GNOME_CAL_GOTO_SAME_DAY_OF_PREVIOUS_WEEK,
	GNOME_CAL_GOTO_SAME_DAY_OF_NEXT_WEEK
} GnomeCalendarGotoDateType;

struct _GnomeCalendar {
	GObject parent;
	GnomeCalendarPrivate *priv;
};

struct _GnomeCalendarClass {
	GObjectClass parent_class;

	/* Notification signals */
	void	(*dates_shown_changed)		(GnomeCalendar *gcal);

	void	(*calendar_selection_changed)	(GnomeCalendar *gcal);

	void	(*calendar_focus_change)	(GnomeCalendar *gcal,
						 gboolean in);
	void	(*change_view)			(GnomeCalendar *gcal,
						 GnomeCalendarViewType view_type);

	void	(*source_added)			(GnomeCalendar *gcal,
						 ESource *source);
	void	(*source_removed)		(GnomeCalendar *gcal,
						 ESource *source);

	/* Action signals */
        void	(*goto_date)			(GnomeCalendar *gcal,
						 GnomeCalendarGotoDateType date);
};

GType		gnome_calendar_get_type		(void);
GtkWidget *	gnome_calendar_new		(void);
void		gnome_calendar_dispose          (GnomeCalendar *gcal);
ECalendar *	gnome_calendar_get_date_navigator
						(GnomeCalendar *gcal);
void		gnome_calendar_set_date_navigator
						(GnomeCalendar *gcal,
						 ECalendar *date_navigator);
GtkWidget *	gnome_calendar_get_memo_table	(GnomeCalendar *gcal);
void		gnome_calendar_set_memo_table	(GnomeCalendar *gcal, GtkWidget *memo_table);
GtkWidget *	gnome_calendar_get_task_table	(GnomeCalendar *gcal);
void		gnome_calendar_set_task_table	(GnomeCalendar *gcal, GtkWidget *task_table);
ECalModel *	gnome_calendar_get_model	(GnomeCalendar *gcal);
void		gnome_calendar_update_query	(GnomeCalendar *gcal);
void		gnome_calendar_set_search_query	(GnomeCalendar *gcal,
						 const gchar *sexp,
						 gboolean range_search,
						 time_t start_range,
						 time_t end_range);

void		gnome_calendar_next		(GnomeCalendar *gcal);
void		gnome_calendar_previous		(GnomeCalendar *gcal);
void		gnome_calendar_goto		(GnomeCalendar *gcal,
						 time_t new_time);
void		gnome_calendar_update_view_times(GnomeCalendar *gcal,
						 time_t start_time);
void		gnome_calendar_dayjump		(GnomeCalendar *gcal,
						 time_t time);
void		gnome_calendar_goto_today	(GnomeCalendar *gcal);

GnomeCalendarViewType
		gnome_calendar_get_view		(GnomeCalendar *gcal);
void		gnome_calendar_set_view		(GnomeCalendar *gcal,
						 GnomeCalendarViewType view_type);
void		gnome_calendar_display_view	(GnomeCalendar *gcal,
						 GnomeCalendarViewType view_type);

struct _ECalendarView *
		gnome_calendar_get_calendar_view(GnomeCalendar *gcal,
						 GnomeCalendarViewType view_type);

gboolean	gnome_calendar_get_range_selected
						(GnomeCalendar *gcal);
void		gnome_calendar_set_range_selected
						(GnomeCalendar *gcal,
						 gboolean range_selected);
void		gnome_calendar_set_selected_time_range
						(GnomeCalendar *gcal,
						 time_t start_time);
void		gnome_calendar_new_task		(GnomeCalendar *gcal,
						 time_t *dtstart,
						 time_t *dtend);

/* Returns the selected time range for the current view. Note that this may be
   different from the fields in the GnomeCalendar, since the view may clip
   this or choose a more appropriate time. */
void		gnome_calendar_get_current_time_range
						(GnomeCalendar *gcal,
						 time_t *start_time,
						 time_t *end_time);

void		gnome_calendar_notify_dates_shown_changed
						(GnomeCalendar *gcal);

/* Returns the number of selected events (0 or 1 at present). */
gint		gnome_calendar_get_num_events_selected
						(GnomeCalendar *gcal);

void		gnome_calendar_purge		(GnomeCalendar  *gcal,
						 time_t older_than);

G_END_DECLS

#endif
