From 648580f9637a03339220a37d444ddb9ac037dbff Mon Sep 17 00:00:00 2001
From: Frederic Culot <calcurse@culot.org>
Date: Sat, 21 Jul 2007 19:35:14 +0000
Subject: apoint_update_panel(), apoint_add() and apoint_delete() added

---
 src/apoint.c | 214 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/apoint.h |   6 +-
 2 files changed, 218 insertions(+), 2 deletions(-)

(limited to 'src')

diff --git a/src/apoint.c b/src/apoint.c
index 388126a..e7789fd 100755
--- a/src/apoint.c
+++ b/src/apoint.c
@@ -1,4 +1,4 @@
-/*	$calcurse: apoint.c,v 1.11 2007/07/01 17:54:33 culot Exp $	*/
+/*	$calcurse: apoint.c,v 1.12 2007/07/21 19:35:14 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -79,6 +79,171 @@ apoint_new(char *mesg, long start, long dur, char state)
 	return o;
 }
 
+/* 
+ * Add an item in either the appointment or the event list,
+ * depending if the start time is entered or not.
+ */
+void 
+apoint_add(int *hilt_app)
+{
+#define LTIME 6
+	char *mesg_1 = _("Enter start time ([hh:mm] or [h:mm]), leave blank for an all-day event : ");
+	char *mesg_2 = _("Enter end time ([hh:mm] or [h:mm]) or duration (in minutes) : ");
+	char *mesg_3 = _("Enter description :");
+	char *format_message_1 = _("You entered an invalid start time, should be [h:mm] or [hh:mm]");
+	char *format_message_2 = _("You entered an invalid end time, should be [h:mm] or [hh:mm] or [mm]");
+        char *enter_str = _("Press [Enter] to continue");
+	int Id;
+        char item_time[LTIME] = "";
+	char item_mesg[BUFSIZ] = "";
+	long apoint_duration, apoint_start;
+	apoint_llist_node_t *apoint_pointeur;
+        struct event_s *event_pointeur;
+	unsigned heures, minutes;
+	unsigned end_h, end_m;
+        int is_appointment = 1;
+
+	/* Get the starting time */
+	while (check_time(item_time) != 1) {
+                status_mesg(mesg_1, "");
+		if (getstring(swin, item_time, LTIME, 0, 1) != 
+			GETSTRING_ESC) {
+			if (strlen(item_time) == 0){
+				is_appointment = 0;
+				break;	
+			} else if (check_time(item_time) != 1) {
+				status_mesg(format_message_1, enter_str);
+				wgetch(swin);
+			} else
+				sscanf(item_time, "%u:%u", &heures, &minutes);
+		} else
+			return;
+	}
+        /* 
+         * Check if an event or appointment is entered, 
+         * depending on the starting time, and record the 
+         * corresponding item.
+         */
+        if (is_appointment){ /* Get the appointment duration */
+		item_time[0] = '\0';
+                while (check_time(item_time) == 0) {
+                        status_mesg(mesg_2, "");
+                        if (getstring(swin, item_time, LTIME, 0, 1) != 
+				GETSTRING_VALID)
+                                return;	//nothing entered, cancel adding of event
+			else if (check_time(item_time) == 0) {
+                                status_mesg(format_message_2, enter_str);
+                                wgetch(swin);
+                        } else {
+				if (check_time(item_time) == 2)
+                                	apoint_duration = atoi(item_time);
+				else if (check_time(item_time) == 1) {
+					sscanf(item_time, "%u:%u", 
+							&end_h, &end_m);
+					if (end_h < heures){
+						apoint_duration = 
+						    MININSEC - minutes + end_m
+						    + 
+						    (24 + end_h - (heures + 1))
+						    * MININSEC;
+					} else {
+						apoint_duration = 
+							MININSEC - minutes + 
+							end_m + 
+							(end_h - (heures + 1)) * 
+							MININSEC;
+					}
+				}
+			}	
+                }
+        } else  /* Insert the event Id */
+                Id = 1;
+
+        status_mesg(mesg_3, "");
+	if (getstring(swin, item_mesg, BUFSIZ, 0, 1) == 
+		GETSTRING_VALID) {
+                if (is_appointment) {
+			apoint_start = 
+			    date2sec(*calendar_get_slctd_day(), heures, 
+			    minutes);
+			apoint_pointeur = apoint_new(item_mesg, apoint_start,
+			    min2sec(apoint_duration), 0L);
+			if (notify_bar()) 
+				notify_check_added(item_mesg, apoint_start, 0L);
+                } else 
+                        event_pointeur = event_new(item_mesg, 
+			    date2sec(*calendar_get_slctd_day(), 12, 0), Id);
+
+		if (*hilt_app == 0) 
+			(*hilt_app)++;
+	}
+	erase_status_bar();
+}
+
+/* Delete an item from the appointment list. */
+void 
+apoint_delete(conf_t *conf, unsigned *nb_events, unsigned *nb_apoints, 
+    int *hilt_app)
+{
+	char *choices = "[y/n] ";
+	char *del_app_str = _("Do you really want to delete this item ?");
+	long date;
+	int nb_items = *nb_apoints + *nb_events;
+	bool go_for_deletion = false;
+	int to_be_removed;
+	int answer = 0;
+	int deleted_item_type = 0;
+
+	date = calendar_get_slctd_day_sec();
+	
+	if (conf->confirm_delete) {
+		status_mesg(del_app_str, choices);		
+		answer = wgetch(swin);
+		if ( (answer == 'y') && (nb_items != 0) )
+			go_for_deletion = true;
+		else {
+			erase_status_bar();
+			return;
+		}
+	} else 
+		if (nb_items != 0) 
+			go_for_deletion = true;
+	
+	if (go_for_deletion) {
+		if (nb_items != 0) {
+			deleted_item_type = 
+				day_erase_item(date, *hilt_app, 0);
+			if (deleted_item_type == EVNT || 
+			    deleted_item_type == RECUR_EVNT) {
+				(*nb_events)--;
+				to_be_removed = 1;
+			} else if (deleted_item_type == APPT ||
+			    deleted_item_type == RECUR_APPT) {
+				(*nb_apoints)--;
+				to_be_removed = 3;
+			} else if (deleted_item_type == 0) {
+				to_be_removed = 0;		
+			} else {
+				fputs(_("FATAL ERROR in apoint_delete: no such type\n"), 
+				    stderr);
+				exit(EXIT_FAILURE);
+				/* NOTREACHED */
+			}	
+
+			if (*hilt_app > 1) 
+				(*hilt_app)--;
+			if (apad->first_onscreen >= to_be_removed)
+				apad->first_onscreen = 
+					apad->first_onscreen -
+					to_be_removed;
+			if (nb_items == 1) 
+				*hilt_app = 0;
+		}
+	}
+}
+
+
+
 unsigned 
 apoint_inday(apoint_llist_node_t *i, long start)
 {
@@ -381,3 +546,50 @@ apoint_switch_notify(int item_num)
 	    stderr);
 	exit(EXIT_FAILURE);
 }
+
+/* Updates the Appointment panel */
+void 
+apoint_update_panel(window_t *winapp, int hilt_app, int which_pan)
+{
+	int title_xpos;
+	int bordr = 1;
+	int title_lines = 3;
+	int app_width = winapp->w - bordr;
+	int app_length = winapp->h - bordr - title_lines;
+	long date;
+	date_t slctd_date;
+
+	/* variable inits */
+	slctd_date = *calendar_get_slctd_day();
+	title_xpos = winapp->w - (strlen(_(monthnames[slctd_date.mm - 1])) + 11);
+	if (slctd_date.dd < 10) 
+		title_xpos++;
+	date = date2sec(slctd_date, 0, 0);
+	day_write_pad(date, app_width, app_length, hilt_app);
+
+	/* Print current date in the top right window corner. */
+	erase_window_part(awin, 1, title_lines, winapp->w - 2, winapp->h - 2);
+	custom_apply_attr(awin, ATTR_HIGHEST);
+	mvwprintw(awin, title_lines, title_xpos, "%s %d, %d",
+	    _(monthnames[slctd_date.mm - 1]), slctd_date.dd, slctd_date.yyyy);
+	custom_remove_attr(awin, ATTR_HIGHEST);
+	
+	/* Draw the scrollbar if necessary. */
+	if ((apad->length >= app_length)||(apad->first_onscreen > 0)) {
+		float ratio = ((float) app_length) / ((float) apad->length);
+		int sbar_length = (int) (ratio * app_length);
+		int highend = (int) (ratio * apad->first_onscreen);
+		bool hilt_bar = (which_pan == APPOINTMENT) ? true : false;
+		int sbar_top = highend + title_lines + 1;
+		
+		if ((sbar_top + sbar_length) > winapp->h - 1)
+			sbar_length = winapp->h - 1 - sbar_top;
+		draw_scrollbar(awin, sbar_top, winapp->w - 2, sbar_length, 
+				title_lines + 1, winapp->h - 1, hilt_bar);
+	}
+
+	wnoutrefresh(awin);
+	pnoutrefresh(apad->ptrwin, apad->first_onscreen, 0, 
+	    winapp->y + title_lines + 1, winapp->x + bordr, 
+    	    winapp->y + winapp->h - 2*bordr, winapp->x + winapp->w - 3*bordr);
+}
diff --git a/src/apoint.h b/src/apoint.h
index f91a400..69ac520 100755
--- a/src/apoint.h
+++ b/src/apoint.h
@@ -1,4 +1,4 @@
-/*	$calcurse: apoint.h,v 1.6 2007/07/01 17:54:33 culot Exp $	*/
+/*	$calcurse: apoint.h,v 1.7 2007/07/21 19:35:14 culot Exp $	*/
 
 /*
  * Calcurse - text-based organizer
@@ -30,6 +30,7 @@
 #include <ncurses.h>
 
 #include "notify.h"
+#include "recur.h"
 #include "vars.h"
 
 #define HRMIN_SIZE 6
@@ -56,6 +57,8 @@ extern apoint_llist_t *alist_p;
 
 int 			apoint_llist_init(void);
 apoint_llist_node_t    *apoint_new(char *, long, long, char);
+void			apoint_add(int *hilt_app);
+void			apoint_delete(conf_t *, unsigned *, unsigned *, int *);
 unsigned 		apoint_inday(apoint_llist_node_t *, long);
 void 			apoint_sec2str(apoint_llist_node_t *, int, long, 
 			    char *, char *);
@@ -70,5 +73,6 @@ void 			scroll_pad_up(int, int);
 struct notify_app_s    *apoint_check_next(struct notify_app_s *, long);
 apoint_llist_node_t    *apoint_recur_s2apoint_s(recur_apoint_llist_node_t *);
 void 			apoint_switch_notify(int);
+void			apoint_update_panel(window_t *, int, int);
 
 #endif /* CALCURSE_APOINT_H */
-- 
cgit v1.2.3-70-g09d2