diary r74 - in trunk: . src



Author: pwithnall
Date: Tue Aug 26 01:13:00 2008
New Revision: 74
URL: http://svn.gnome.org/viewvc/diary?rev=74&view=rev

Log:
2008-08-26  Philip Withnall  <philip tecnocode co uk>

	* src/main-window.c: (mw_calendar_day_selected_cb):
	* src/storage-manager.c: (diary_storage_manager_entry_exists),
	(diary_storage_manager_entry_is_editable),
	(diary_storage_manager_set_entry):
	* src/storage-manager.h: Tidy up handling past and future diary
	entries. Past entries can now be edited, but the user is warned 
if the
	entries are older than a certain age.
	* src/printing.c: (print_entry): Fix printing some Pango markup.



Modified:
   trunk/ChangeLog
   trunk/src/main-window.c
   trunk/src/printing.c
   trunk/src/storage-manager.c
   trunk/src/storage-manager.h

Modified: trunk/src/main-window.c
==============================================================================
--- trunk/src/main-window.c	(original)
+++ trunk/src/main-window.c	Tue Aug 26 01:13:00 2008
@@ -351,7 +351,7 @@
 
 	/* Update the entry */
 	entry_text = diary_storage_manager_get_entry (diary->storage_manager, year, month, day);
-	gtk_text_view_set_editable (diary->entry_view, diary_storage_manager_entry_is_editable (diary->storage_manager, year, month, day));
+	gtk_text_view_set_editable (diary->entry_view, diary_storage_manager_entry_is_editable (diary->storage_manager, year, month, day) != DIARY_ENTRY_FUTURE ? TRUE : FALSE);
 	gtk_text_buffer_set_modified (diary->entry_buffer, FALSE);
 
 	if (entry_text != NULL) {

Modified: trunk/src/printing.c
==============================================================================
--- trunk/src/printing.c	(original)
+++ trunk/src/printing.c	Tue Aug 26 01:13:00 2008
@@ -78,10 +78,12 @@
 	pango_layout_set_width (entry_layout, gtk_print_context_get_width (context) * PANGO_SCALE);
 	pango_layout_set_ellipsize (entry_layout, PANGO_ELLIPSIZE_NONE);
 
-	if (entry == NULL)
+	if (entry == NULL) {
 		entry = g_strdup_printf ("<i>%s</i>", _("No entry for this date."));
-
-	pango_layout_set_text (entry_layout, entry, -1);
+		pango_layout_set_markup (entry_layout, entry, -1);
+	} else {
+		pango_layout_set_text (entry_layout, entry, -1);
+	}
 
 	/* Check we're not orphaning things */
 	entry_line = pango_layout_get_line_readonly (entry_layout, MIN (pango_layout_get_line_count (entry_layout), diary_operation->current_line + MAX_ORPHANS) - 1);

Modified: trunk/src/storage-manager.c
==============================================================================
--- trunk/src/storage-manager.c	(original)
+++ trunk/src/storage-manager.c	Tue Aug 26 01:13:00 2008
@@ -610,6 +610,21 @@
 }
 
 gboolean
+diary_storage_manager_entry_exists (DiaryStorageManager *self, GDateYear year, GDateMonth month, GDateDay day)
+{
+	DiaryQueryResults *results;
+	gboolean exists = FALSE;
+
+	results = diary_storage_manager_query (self, "SELECT day FROM entries WHERE year = %u AND month = %u AND day = %u LIMIT 1", year, month, day);
+
+	if (results->rows == 1)
+		exists = TRUE;
+
+	diary_storage_manager_free_results (results);
+	return exists;
+}
+
+DiaryEntryEditable
 diary_storage_manager_entry_is_editable (DiaryStorageManager *self, GDateYear year, GDateMonth month, GDateDay day)
 {
 	GDate current_date, entry_date;
@@ -618,13 +633,15 @@
 	g_date_set_time_t (&current_date, time (NULL));
 	g_date_set_dmy (&entry_date, day, month, year);
 
-	/* Entries can't be edited before they've happened, or after 14 days after they've happened */
+	/* Entries can't be edited before they've happened */
 	days_between = g_date_days_between (&entry_date, &current_date);
 
-	if (days_between < 0 || days_between > 14)
-		return FALSE;
+	if (days_between < 0)
+		return DIARY_ENTRY_FUTURE;
+	else if (days_between > DIARY_ENTRY_CUTOFF_AGE)
+		return DIARY_ENTRY_PAST;
 	else
-		return TRUE;
+		return DIARY_ENTRY_EDITABLE;
 }
 
 /* NOTE: Free results with g_free */
@@ -666,12 +683,43 @@
 gboolean
 diary_storage_manager_set_entry (DiaryStorageManager *self, GDateYear year, GDateMonth month, GDateDay day, const gchar *content)
 {
-	/* Make sure they're editable */
-	if (diary_storage_manager_entry_is_editable (self, year, month, day) == FALSE)
+	gboolean entry_exists = diary_storage_manager_entry_exists (self, year, month, day);
+	DiaryEntryEditable editability = diary_storage_manager_entry_is_editable (self, year, month, day);
+
+	/* Make sure they're editable: don't allow entries in the future to be edited,
+	 * but allow entries in the past to be added or edited, as long as permission is given.
+	 * If an entry is being deleted, permission must be given for that as a priority. */
+	if (editability == DIARY_ENTRY_FUTURE) {
 		return TRUE;
+	} else if (editability == DIARY_ENTRY_PAST &&
+		   content != NULL && content[0] != '\0') {
+		GDate date;
+		gchar date_string[100];
+		GtkWidget *dialog;
+
+		g_date_set_dmy (&date, day, month, year);
+		g_date_strftime (date_string, sizeof (date_string), "%A, %e %B %Y", &date);
 
-	/* Can't nullify entries without permission */
-	if (content == NULL || content[0] == '\0') {
+		dialog = gtk_message_dialog_new (GTK_WINDOW (diary->main_window),
+							    GTK_DIALOG_MODAL,
+							    GTK_MESSAGE_QUESTION,
+							    GTK_BUTTONS_NONE,
+							    _("Are you sure you want to edit this diary entry for %s?"),
+							    date_string);
+		gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+					GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+					GTK_STOCK_EDIT, GTK_RESPONSE_ACCEPT,
+					NULL);
+
+		gtk_widget_show_all (dialog);
+		if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_ACCEPT) {
+			gtk_widget_destroy (dialog);
+			return FALSE;
+		}
+
+		gtk_widget_destroy (dialog);
+	} else if (entry_exists == TRUE &&
+		   (content == NULL || content[0] == '\0')) {
 		GDate date;
 		gchar date_string[100];
 		GtkWidget *dialog;
@@ -700,6 +748,9 @@
 		gtk_widget_destroy (dialog);
 
 		return FALSE;
+	} else if (entry_exists == FALSE &&
+		   (content == NULL || content[0] == '\0')) {
+		return FALSE;
 	}
 
 	diary_storage_manager_query_async (self, "REPLACE INTO entries (year, month, day, content) VALUES (%u, %u, %u, '%q')", NULL, NULL, year, month, day, content);

Modified: trunk/src/storage-manager.h
==============================================================================
--- trunk/src/storage-manager.h	(original)
+++ trunk/src/storage-manager.h	Tue Aug 26 01:13:00 2008
@@ -55,6 +55,15 @@
 	DIARY_STORAGE_MANAGER_ERROR_GETTING_KEY
 } DiaryStorageManagerError;
 
+typedef enum {
+	DIARY_ENTRY_EDITABLE = 1,
+	DIARY_ENTRY_FUTURE = 2,
+	DIARY_ENTRY_PAST = 0
+} DiaryEntryEditable;
+
+/* The number of days after which a diary entry requires confirmation to be edited */
+#define DIARY_ENTRY_CUTOFF_AGE 14
+
 typedef gint (*DiaryQueryCallback) (gpointer user_data, gint columns, gchar **data, gchar **column_names);
 
 typedef struct {
@@ -77,7 +86,8 @@
 /* TODO: Surely just passing in GDates to these functions would be easier? */
 gboolean diary_storage_manager_get_statistics (DiaryStorageManager *self, guint *entry_count, guint *link_count, guint *character_count);
 
-gboolean diary_storage_manager_entry_is_editable (DiaryStorageManager *self, GDateYear year, GDateMonth month, GDateDay day);
+gboolean diary_storage_manager_entry_exists (DiaryStorageManager *self, GDateYear year, GDateMonth month, GDateDay day);
+DiaryEntryEditable diary_storage_manager_entry_is_editable (DiaryStorageManager *self, GDateYear year, GDateMonth month, GDateDay day);
 gchar *diary_storage_manager_get_entry (DiaryStorageManager *self, GDateYear year, GDateMonth month, GDateDay day);
 gboolean diary_storage_manager_set_entry (DiaryStorageManager *self, GDateYear year, GDateMonth month, GDateDay day, const gchar *content);
 guint diary_storage_manager_search_entries (DiaryStorageManager *self, const gchar *search_string, GDate *matches[]);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]