[gnome-calendar] Reworked details view of an event.



commit 7581e8bad085f5ba349f1dfc0bcd147735e1a112
Author: Erick PÃrez Castellanos <erick red gmail com>
Date:   Thu Aug 23 00:23:02 2012 -0400

    Reworked details view of an event.
    
    Removed editable-widgets.
    Added GcalEditDialog
    Reworked delete-event trigger
    Moved method from GcalEventOverlay to utils to use it on GcalEditDialog

 src/Makefile.am              |   16 +--
 src/gcal-edit-dialog.c       |  530 ++++++++++++++++++++++++++++++++++++++++++
 src/gcal-edit-dialog.h       |   69 ++++++
 src/gcal-editable-combo.c    |  242 -------------------
 src/gcal-editable-combo.h    |   64 -----
 src/gcal-editable-date.c     |  275 ----------------------
 src/gcal-editable-date.h     |   61 -----
 src/gcal-editable-entry.c    |  202 ----------------
 src/gcal-editable-entry.h    |   62 -----
 src/gcal-editable-reminder.c |  465 ------------------------------------
 src/gcal-editable-reminder.h |   61 -----
 src/gcal-editable-text.c     |  190 ---------------
 src/gcal-editable-text.h     |   61 -----
 src/gcal-editable.c          |  190 ---------------
 src/gcal-editable.h          |   80 -------
 src/gcal-event-overlay.c     |   33 +---
 src/gcal-event-view.c        |  493 ---------------------------------------
 src/gcal-event-view.h        |   70 ------
 src/gcal-utils.c             |   27 +++
 src/gcal-utils.h             |    2 +
 src/gcal-window.c            |  159 +++++--------
 21 files changed, 689 insertions(+), 2663 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index b9a7886..d4cc577 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -41,22 +41,10 @@ gnome_calendar_SOURCES =                                  \
     gcal-week-view.h                                      \
     gcal-event-widget.c                                   \
     gcal-event-widget.h                                   \
-    gcal-event-view.c                                     \
-    gcal-event-view.h                                     \
     gcal-event-overlay.c                                  \
     gcal-event-overlay.h                                  \
-    gcal-editable.c                                       \
-    gcal-editable.h                                       \
-    gcal-editable-entry.c                                 \
-    gcal-editable-entry.h                                 \
-    gcal-editable-text.c                                  \
-    gcal-editable-text.h                                  \
-    gcal-editable-date.c                                  \
-    gcal-editable-date.h                                  \
-    gcal-editable-combo.c                                 \
-    gcal-editable-combo.h                                 \
-    gcal-editable-reminder.c                              \
-    gcal-editable-reminder.h                              \
+    gcal-edit-dialog.c                                    \
+    gcal-edit-dialog.h                                    \
     gcal-manager.c                                        \
     gcal-manager.h                                        \
     gcal-utils.c                                          \
diff --git a/src/gcal-edit-dialog.c b/src/gcal-edit-dialog.c
new file mode 100644
index 0000000..6fdfd7f
--- /dev/null
+++ b/src/gcal-edit-dialog.c
@@ -0,0 +1,530 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 2 -*- */
+/*
+ * gcal-ediat-dialog.c
+ * Copyright (C) 2012 Erick PÃrez Castellanos <erickpc gnome org>
+ *
+ * gnome-calendar is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * gnome-calendar 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "gcal-edit-dialog.h"
+#include "gcal-utils.h"
+
+#include <glib/gi18n.h>
+
+struct _GcalEditDialogPrivate
+{
+  gchar       *source_uid;
+  gchar       *event_uid;
+
+  GcalManager *manager;
+  GtkTreeIter *active_iter;
+
+  GtkWidget   *summary_entry;
+  GtkWidget   *calendar_button;
+  GtkWidget   *start_date_entry;
+  GtkWidget   *end_date_entry;
+  GtkWidget   *all_day_check;
+  GtkWidget   *start_time_entry;
+  GtkWidget   *end_time_entry;
+  GtkWidget   *location_entry;
+  GtkWidget   *notes_text;
+};
+
+static void        gcal_edit_dialog_constructed           (GObject           *object);
+
+static void        gcal_edit_dialog_finalize              (GObject           *object);
+
+static void        gcal_edit_dialog_calendar_selected     (GtkWidget         *menu_item,
+                                                           gpointer           user_data);
+
+static void        gcal_edit_dialog_set_writable          (GcalEditDialog    *dialog,
+                                                           gboolean           writable);
+
+static void        gcal_edit_dialog_clear_data            (GcalEditDialog    *dialog);
+
+static void        gcal_edit_dialog_action_button_clicked (GtkWidget         *widget,
+                                                           gpointer           user_data);
+
+G_DEFINE_TYPE(GcalEditDialog, gcal_edit_dialog, GTK_TYPE_DIALOG)
+
+static void
+gcal_edit_dialog_class_init (GcalEditDialogClass *klass)
+{
+  GObjectClass *object_class;
+
+  object_class = G_OBJECT_CLASS (klass);
+  object_class->constructed = gcal_edit_dialog_constructed;
+  object_class->finalize = gcal_edit_dialog_finalize;
+
+  g_type_class_add_private ((gpointer)klass, sizeof(GcalEditDialogPrivate));
+}
+
+static void
+gcal_edit_dialog_init (GcalEditDialog *self)
+{
+  GcalEditDialogPrivate *priv;
+
+  self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
+                                            GCAL_TYPE_EDIT_DIALOG,
+                                            GcalEditDialogPrivate);
+  priv = self->priv;
+
+  priv->source_uid = NULL;
+  priv->event_uid = NULL;
+}
+
+static void
+gcal_edit_dialog_constructed (GObject* object)
+{
+  GcalEditDialogPrivate *priv;
+  GtkWidget *content_area;
+  GtkWidget *grid;
+  GtkWidget *child;
+  GtkWidget *action_area;
+  GtkWidget *button;
+
+  priv = GCAL_EDIT_DIALOG (object)->priv;
+
+  /* chaining up */
+  G_OBJECT_CLASS (gcal_edit_dialog_parent_class)->constructed (object);
+
+  gtk_window_set_title (GTK_WINDOW (object), _("Edit Event"));
+  gtk_window_set_modal (GTK_WINDOW (object), TRUE);
+  gtk_window_set_destroy_with_parent (GTK_WINDOW (object), TRUE);
+  gtk_window_set_resizable (GTK_WINDOW (object), FALSE);
+
+  gtk_container_set_border_width (GTK_CONTAINER (object), 6);
+
+  content_area = gtk_dialog_get_content_area (GTK_DIALOG (object));
+
+  /* edit area, grid */
+  grid = gtk_grid_new ();
+  g_object_set (grid,
+                "row-spacing", 12,
+                "column-spacing", 12,
+                "border-width", 6,
+                NULL);
+
+  /* Summary, title */
+  child = gtk_label_new (_("Title"));
+  gtk_widget_set_halign (child, GTK_ALIGN_END);
+  gtk_grid_attach (GTK_GRID (grid), child, 0, 0, 1, 1);
+
+  priv->summary_entry = gtk_entry_new ();
+  gtk_widget_set_hexpand (priv->summary_entry, TRUE);
+  gtk_grid_attach (GTK_GRID (grid), priv->summary_entry, 1, 0, 1, 1);
+
+  /* Calendar, source */
+  priv->calendar_button = gtk_menu_button_new ();
+  child = gtk_image_new_from_icon_name ("x-office-calendar-symbolic",
+                                        GTK_ICON_SIZE_MENU);
+  g_object_set (priv->calendar_button,
+                "vexpand", TRUE,
+                "always-show-image", TRUE,
+                "image", child,
+                "menu", gtk_menu_new (),
+                NULL);
+  gtk_grid_attach (GTK_GRID (grid), priv->calendar_button, 2, 0, 1, 1);
+
+  /* Start date and time  */
+  child = gtk_label_new (_("Starts"));
+  gtk_widget_set_halign (child, GTK_ALIGN_END);
+  gtk_grid_attach (GTK_GRID (grid), child, 0, 2, 1, 1);
+
+  child = gtk_grid_new ();
+  g_object_set (child,
+                "orientation", GTK_ORIENTATION_HORIZONTAL,
+                "column-spacing", 12,
+                NULL);
+  priv->start_date_entry = gtk_entry_new ();
+  gtk_entry_set_icon_from_icon_name (GTK_ENTRY (priv->start_date_entry),
+                                     GTK_ENTRY_ICON_SECONDARY,
+                                     "x-office-calendar-symbolic");
+  gtk_container_add (GTK_CONTAINER (child), priv->start_date_entry);
+
+  priv->start_time_entry = gtk_entry_new ();
+  gtk_entry_set_icon_from_icon_name (GTK_ENTRY (priv->start_time_entry),
+                                     GTK_ENTRY_ICON_SECONDARY,
+                                     "preferences-system-time-symbolic");
+  gtk_container_add (GTK_CONTAINER (child), priv->start_time_entry);
+
+  priv->all_day_check = gtk_check_button_new_with_label (_("All day"));
+  gtk_container_add (GTK_CONTAINER (child), priv->all_day_check);
+  gtk_grid_attach (GTK_GRID (grid), child, 1, 2, 2, 1);
+
+  /* End date and time  */
+  child = gtk_label_new (_("Ends"));
+  gtk_widget_set_halign (child, GTK_ALIGN_END);
+  gtk_grid_attach (GTK_GRID (grid), child, 0, 3, 1, 1);
+
+  child = gtk_grid_new ();
+  g_object_set (child,
+                "orientation", GTK_ORIENTATION_HORIZONTAL,
+                "column-spacing", 12,
+                NULL);
+  priv->end_date_entry = gtk_entry_new ();
+  gtk_entry_set_icon_from_icon_name (GTK_ENTRY (priv->end_date_entry),
+                                     GTK_ENTRY_ICON_SECONDARY,
+                                     "x-office-calendar-symbolic");
+  gtk_container_add (GTK_CONTAINER (child), priv->end_date_entry);
+
+  priv->end_time_entry = gtk_entry_new ();
+  gtk_entry_set_icon_from_icon_name (GTK_ENTRY (priv->end_time_entry),
+                                     GTK_ENTRY_ICON_SECONDARY,
+                                     "preferences-system-time-symbolic");
+  gtk_container_add (GTK_CONTAINER (child), priv->end_time_entry);
+  gtk_grid_attach (GTK_GRID (grid), child, 1, 3, 2, 1);
+
+  /* Location, location, location */
+  child = gtk_label_new (_("Location"));
+  gtk_widget_set_halign (child, GTK_ALIGN_END);
+  gtk_grid_attach (GTK_GRID (grid), child, 0, 4, 1, 1);
+
+  priv->location_entry = gtk_entry_new ();
+  gtk_widget_set_hexpand (priv->location_entry, TRUE);
+  gtk_entry_set_icon_from_icon_name (GTK_ENTRY (priv->location_entry),
+                                     GTK_ENTRY_ICON_SECONDARY,
+                                     "find-location-symbolic");
+  gtk_grid_attach (GTK_GRID (grid), priv->location_entry, 1, 4, 2, 1);
+
+  /* Notes, description */
+  child = gtk_label_new (_("Notes"));
+  gtk_widget_set_halign (child, GTK_ALIGN_END);
+  gtk_grid_attach (GTK_GRID (grid), child, 0, 5, 1, 1);
+
+  child = gtk_frame_new (NULL);
+  priv->notes_text = gtk_text_view_new ();
+  gtk_container_add (GTK_CONTAINER (child), priv->notes_text);
+  gtk_widget_set_hexpand (child, TRUE);
+  gtk_widget_set_size_request (
+      gtk_bin_get_child (GTK_BIN (child)),
+      -1, 80);
+  gtk_grid_attach (GTK_GRID (grid), child, 1, 5, 2, 1);
+
+  gtk_container_add (GTK_CONTAINER (content_area), grid);
+  gtk_widget_show_all (content_area);
+
+  /* action area, buttons */
+  action_area = gtk_dialog_get_action_area (GTK_DIALOG (object));
+  gtk_box_set_spacing (GTK_BOX (action_area), 6);
+
+  button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
+  gtk_widget_set_can_default (button, TRUE);
+  g_object_set_data (G_OBJECT (button),
+                     "response",
+                     GINT_TO_POINTER (GTK_RESPONSE_CANCEL));
+  g_signal_connect (button,
+                    "clicked",
+                    G_CALLBACK (gcal_edit_dialog_action_button_clicked),
+                    object);
+  gtk_box_pack_end (GTK_BOX (action_area), button, FALSE, TRUE, 0);
+  gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (action_area),
+                                      button,
+                                      TRUE);
+
+  button = gtk_button_new ();
+  gtk_container_add (
+      GTK_CONTAINER (button),
+      gtk_image_new_from_icon_name ("user-trash-symbolic",
+                                    GTK_ICON_SIZE_MENU));
+  gtk_widget_set_can_default (button, TRUE);
+  g_object_set_data (G_OBJECT (button),
+                     "response",
+                     GINT_TO_POINTER (GCAL_RESPONSE_DELETE_EVENT));
+  g_signal_connect (button,
+                    "clicked",
+                    G_CALLBACK (gcal_edit_dialog_action_button_clicked),
+                    object);
+  gtk_box_pack_end (GTK_BOX (action_area), button, TRUE, TRUE, 0);
+  gtk_button_box_set_child_non_homogeneous (GTK_BUTTON_BOX (action_area),
+                                            button,
+                                            TRUE);
+
+  /* done button */
+  button = gtk_button_new_with_label (_("Done"));
+  gtk_widget_set_can_default (button, TRUE);
+  g_object_set_data (G_OBJECT (button),
+                     "response",
+                     GINT_TO_POINTER (GTK_RESPONSE_ACCEPT));
+  g_signal_connect (button,
+                    "clicked",
+                    G_CALLBACK (gcal_edit_dialog_action_button_clicked),
+                    object);
+  gtk_style_context_add_class (
+      gtk_widget_get_style_context (button),
+      "suggested-action");
+  gtk_box_pack_end (GTK_BOX (action_area), button, TRUE, TRUE, 0);
+
+  gtk_widget_show_all (action_area);
+
+  /* signals handlers */
+}
+
+static void
+gcal_edit_dialog_finalize (GObject *object)
+{
+  GcalEditDialogPrivate *priv;
+
+  priv = GCAL_EDIT_DIALOG (object)->priv;
+
+  if (priv->source_uid != NULL)
+    g_free (priv->source_uid);
+
+  if (priv->event_uid != NULL)
+    g_free (priv->event_uid);
+
+  G_OBJECT_CLASS (gcal_edit_dialog_parent_class)->finalize (object);
+}
+
+static void
+gcal_edit_dialog_calendar_selected (GtkWidget *menu_item,
+                                    gpointer   user_data)
+{
+  GcalEditDialogPrivate *priv;
+
+  GtkListStore *sources_model;
+  GtkTreeIter *iter;
+  GdkColor *color;
+
+  GdkPixbuf *pix;
+  GtkWidget *cal_image;
+
+  priv = GCAL_EDIT_DIALOG (user_data)->priv;
+  iter = g_object_get_data (G_OBJECT (menu_item), "sources-iter");
+
+  sources_model = gcal_manager_get_sources_model (priv->manager);
+  gtk_tree_model_get (GTK_TREE_MODEL (sources_model), iter,
+                      3, &color,
+                      -1);
+
+  if (priv->active_iter != NULL)
+    gtk_tree_iter_free (priv->active_iter);
+  priv->active_iter = gtk_tree_iter_copy (iter);
+
+  pix = gcal_get_pixbuf_from_color (color);
+  cal_image = gtk_image_new_from_pixbuf (pix);
+  gtk_button_set_image (GTK_BUTTON (priv->calendar_button), cal_image);
+
+  gdk_color_free (color);
+  g_object_unref (pix);
+}
+
+static void
+gcal_edit_dialog_set_writable (GcalEditDialog *dialog,
+                               gboolean        writable)
+{
+  GcalEditDialogPrivate *priv;
+
+  priv = dialog->priv;
+
+  gtk_widget_set_sensitive (priv->summary_entry, writable);
+  gtk_widget_set_sensitive (priv->calendar_button, writable);
+  gtk_widget_set_sensitive (priv->start_date_entry, writable);
+  gtk_widget_set_sensitive (priv->start_time_entry, writable);
+  gtk_widget_set_sensitive (priv->all_day_check, writable);
+  gtk_widget_set_sensitive (priv->end_date_entry, writable);
+  gtk_widget_set_sensitive (priv->end_time_entry, writable);
+  gtk_widget_set_sensitive (priv->location_entry, writable);
+  gtk_widget_set_sensitive (priv->notes_text, writable);
+}
+
+static void
+gcal_edit_dialog_clear_data (GcalEditDialog *dialog)
+{
+  GcalEditDialogPrivate *priv;
+
+  priv = dialog->priv;
+
+  /* FIXME: add clear for the rest of the fields when I define loading code for
+   * those below */
+  gtk_entry_set_text (GTK_ENTRY (priv->summary_entry), "");
+  gtk_entry_set_text (GTK_ENTRY (priv->location_entry), "");
+
+  gtk_text_buffer_set_text (
+      gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->notes_text)),
+      "",
+      -1);
+}
+
+static void
+gcal_edit_dialog_action_button_clicked (GtkWidget *widget,
+                                        gpointer   user_data)
+{
+  gint response;
+
+  response = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (widget),
+                                                  "response"));
+
+  gtk_dialog_response (GTK_DIALOG (user_data), response);
+}
+
+/* Public API */
+GtkWidget*
+gcal_edit_dialog_new (void)
+{
+  return g_object_new (GCAL_TYPE_EDIT_DIALOG, NULL);
+}
+
+void
+gcal_edit_dialog_set_event (GcalEditDialog *dialog,
+                            const gchar    *source_uid,
+                            const gchar    *event_uid)
+{
+  GcalEditDialogPrivate *priv;
+
+  gchar *text;
+  const gchar *const_text;
+  gboolean all_day;
+
+  priv = dialog->priv;
+  all_day = FALSE;
+
+  if (priv->source_uid != NULL)
+    g_free (priv->source_uid);
+  priv->source_uid = g_strdup (source_uid);
+
+  if (priv->event_uid != NULL)
+    g_free (priv->event_uid);
+  priv->event_uid = g_strdup (event_uid);
+
+  /* Load event data */
+  gcal_edit_dialog_clear_data (dialog);
+
+  /* summary */
+  text = gcal_manager_get_event_summary (priv->manager,
+                                         priv->source_uid,
+                                         priv->event_uid);
+  gtk_entry_set_text (GTK_ENTRY (priv->summary_entry),
+                      text != NULL ? text : "");
+  g_free (text);
+
+  /* start date */
+
+  /* all_day  */
+  all_day = gcal_manager_get_event_all_day (priv->manager,
+                                            priv->source_uid,
+                                            priv->event_uid);
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->all_day_check),
+                                all_day);
+
+  /* start time */
+  if (all_day)
+    {
+      /* FIXME: set time to 00:00 */
+    }
+
+  /* end date */
+
+  /* end time */
+  if (all_day)
+    {
+      /* FIXME: set time to 00:00 */
+    }
+
+  /* location */
+  const_text = gcal_manager_get_event_location (priv->manager,
+                                          priv->source_uid,
+                                          priv->event_uid);
+  gtk_entry_set_text (GTK_ENTRY (priv->location_entry),
+                      const_text != NULL ? const_text : "");
+
+  /* notes */
+  text = gcal_manager_get_event_description (priv->manager,
+                                             priv->source_uid,
+                                             priv->event_uid);
+  gtk_text_buffer_set_text (
+      gtk_text_view_get_buffer (GTK_TEXT_VIEW (priv->notes_text)),
+      text != NULL ? text : "",
+      -1);
+  g_free (text);
+
+  /* FIXME: this is for now, I will have to ask GcalManager */
+  gcal_edit_dialog_set_writable (dialog, FALSE);
+}
+
+void
+gcal_edit_dialog_set_manager (GcalEditDialog *dialog,
+                              GcalManager    *manager)
+{
+  GcalEditDialogPrivate *priv;
+
+  GtkMenu *menu;
+  GtkWidget *item;
+  GList *children;
+  GtkListStore *sources_model;
+  gboolean valid;
+  GtkTreeIter iter;
+
+  g_return_if_fail (GCAL_IS_MANAGER (manager));
+  priv = dialog->priv;
+
+  priv->manager = manager;
+
+  /* Loading calendars */
+
+
+  sources_model = gcal_manager_get_sources_model (priv->manager);
+  valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (sources_model),
+                                         &iter);
+  if (! valid)
+    return;
+
+  menu = gtk_menu_button_get_popup (GTK_MENU_BUTTON (priv->calendar_button));
+  children = gtk_container_get_children (GTK_CONTAINER (menu));
+  g_list_foreach (children, (GFunc) gtk_widget_destroy, NULL);
+
+  while (valid)
+    {
+      /* Walk through the list, reading each row */
+      gchar *name;
+      GdkColor *color;
+      GtkWidget *cal_image;
+      GdkPixbuf *pix;
+
+      gtk_tree_model_get (GTK_TREE_MODEL (sources_model), &iter,
+                          1, &name,
+                          3, &color,
+                          -1);
+
+      item = gtk_image_menu_item_new ();
+      g_object_set_data_full (G_OBJECT (item),
+                              "sources-iter",
+                              gtk_tree_iter_copy (&iter),
+                              (GDestroyNotify) gtk_tree_iter_free);
+      g_signal_connect (item,
+                        "activate",
+                        G_CALLBACK (gcal_edit_dialog_calendar_selected),
+                        dialog);
+
+      pix = gcal_get_pixbuf_from_color (color);
+
+      cal_image = gtk_image_new_from_pixbuf (pix);
+      g_object_set (item,
+                    "always-show-image", TRUE,
+                    "image", cal_image,
+                    "label", name,
+                    NULL);
+
+      gtk_container_add (GTK_CONTAINER (menu), item);
+
+      g_object_unref (pix);
+      g_free (name);
+      gdk_color_free (color);
+
+      valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (sources_model),
+                                        &iter);
+    }
+
+  gtk_widget_show_all (GTK_WIDGET (menu));
+}
diff --git a/src/gcal-edit-dialog.h b/src/gcal-edit-dialog.h
new file mode 100644
index 0000000..63dd28d
--- /dev/null
+++ b/src/gcal-edit-dialog.h
@@ -0,0 +1,69 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 2 -*- */
+/*
+ * gcal-edit-dialog.h
+ * Copyright (C) 2012 Erick PÃrez Castellanos <erickpc gnome org>
+ *
+ * gnome-calendar is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * gnome-calendar 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __GCAL_EDIT_DIALOG_H__
+#define __GCAL_EDIT_DIALOG_H__
+
+#include "gcal-manager.h"
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GCAL_RESPONSE_DELETE_EVENT 2
+
+
+#define GCAL_TYPE_EDIT_DIALOG                (gcal_edit_dialog_get_type ())
+#define GCAL_EDIT_DIALOG(obj)                (G_TYPE_CHECK_INSTANCE_CAST((obj), GCAL_TYPE_EDIT_DIALOG, GcalEditDialog))
+#define GCAL_EDIT_DIALOG_CLASS(klass)        (G_TYPE_CHECK_CLASS_CAST((klass), GCAL_TYPE_EDIT_DIALOG, GcalEditDialogClass))
+#define GCAL_IS_EDIT_DIALOG(obj)             (G_TYPE_CHECK_INSTANCE_TYPE((obj), GCAL_TYPE_EDIT_DIALOG))
+#define GCAL_IS_EDIT_DIALOG_CLASS(klass)     (G_TYPE_CHECK_CLASS_TYPE((klass), GCAL_TYPE_EDIT_DIALOG))
+#define GCAL_EDIT_DIALOG_GET_CLASS(obj)      (G_TYPE_INSTANCE_GET_CLASS((obj), GCAL_TYPE_EDIT_DIALOG, GcalEditDialogClass))
+
+typedef struct _GcalEditDialog                GcalEditDialog;
+typedef struct _GcalEditDialogClass           GcalEditDialogClass;
+typedef struct _GcalEditDialogPrivate         GcalEditDialogPrivate;
+
+struct _GcalEditDialog
+{
+  GtkDialog parent;
+
+  GcalEditDialogPrivate *priv;
+};
+
+struct _GcalEditDialogClass
+{
+  GtkDialogClass parent_class;
+};
+
+
+GType           gcal_edit_dialog_get_type          (void);
+
+GtkWidget*      gcal_edit_dialog_new               (void);
+
+void            gcal_edit_dialog_set_event         (GcalEditDialog *dialog,
+                                                    const gchar    *source_uid,
+                                                    const gchar    *event_uid);
+
+void            gcal_edit_dialog_set_manager       (GcalEditDialog *dialog,
+                                                    GcalManager    *manager);
+
+G_END_DECLS
+
+#endif /* __GCAL_EDIT_DIALOG_H__ */
diff --git a/src/gcal-event-overlay.c b/src/gcal-event-overlay.c
index 86bf360..51bf200 100644
--- a/src/gcal-event-overlay.c
+++ b/src/gcal-event-overlay.c
@@ -67,8 +67,6 @@ static void        gcal_event_overlay_close_button_clicked  (GtkWidget         *
 static void        gcal_event_overlay_calendar_selected     (GtkWidget         *menu_item,
                                                              gpointer           user_data);
 
-static GdkPixbuf*  gcal_event_overlay_get_pixbuf_for_color  (GdkColor          *color);
-
 G_DEFINE_TYPE(GcalEventOverlay, gcal_event_overlay, GTK_CLUTTER_TYPE_ACTOR)
 
 static void
@@ -294,7 +292,7 @@ gcal_event_overlay_set_calendars_menu (GcalEventOverlay *widget)
                         G_CALLBACK (gcal_event_overlay_calendar_selected),
                         widget);
 
-      pix = gcal_event_overlay_get_pixbuf_for_color (color);
+      pix = gcal_get_pixbuf_from_color (color);
 
       cal_image = gtk_image_new_from_pixbuf (pix);
       g_object_set (item,
@@ -409,7 +407,7 @@ gcal_event_overlay_calendar_selected (GtkWidget *menu_item,
     gtk_tree_iter_free (priv->active_iter);
   priv->active_iter = gtk_tree_iter_copy (iter);
 
-  pix = gcal_event_overlay_get_pixbuf_for_color (color);
+  pix = gcal_get_pixbuf_from_color (color);
   cal_image = gtk_image_new_from_pixbuf (pix);
   gtk_button_set_image (GTK_BUTTON (priv->calendar_button), cal_image);
 
@@ -417,33 +415,6 @@ gcal_event_overlay_calendar_selected (GtkWidget *menu_item,
   g_object_unref (pix);
 }
 
-static GdkPixbuf*
-gcal_event_overlay_get_pixbuf_for_color (GdkColor *color)
-{
-  cairo_surface_t *surface;
-  cairo_t *cr;
-  gint width, height;
-  GdkPixbuf *pix;
-
-  /* TODO: review size here, maybe not hardcoded */
-  width = height = 10;
-  surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
-  cr = cairo_create (surface);
-
-  cairo_set_source_rgb (cr,
-                         color->red / 65535.0,
-                         color->green / 65535.0,
-                         color->blue / 65535.0);
-  cairo_rectangle (cr, 0, 0, width, height);
-  cairo_fill (cr);
-  cairo_destroy (cr);
-  pix = gdk_pixbuf_get_from_surface (surface,
-                                     0, 0,
-                                     width, height);
-  cairo_surface_destroy (surface);
-  return pix;
-}
-
 /* Public API */
 
 ClutterActor*
diff --git a/src/gcal-utils.c b/src/gcal-utils.c
index 151d916..189be6b 100644
--- a/src/gcal-utils.c
+++ b/src/gcal-utils.c
@@ -204,6 +204,33 @@ gcal_get_weekday (gint i)
   return _(weekdays[i]);
 }
 
+GdkPixbuf*
+gcal_get_pixbuf_from_color (GdkColor *color)
+{
+  cairo_surface_t *surface;
+  cairo_t *cr;
+  gint width, height;
+  GdkPixbuf *pix;
+
+  /* TODO: review size here, maybe not hardcoded */
+  width = height = 10;
+  surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
+  cr = cairo_create (surface);
+
+  cairo_set_source_rgb (cr,
+                         color->red / 65535.0,
+                         color->green / 65535.0,
+                         color->blue / 65535.0);
+  cairo_rectangle (cr, 0, 0, width, height);
+  cairo_fill (cr);
+  cairo_destroy (cr);
+  pix = gdk_pixbuf_get_from_surface (surface,
+                                     0, 0,
+                                     width, height);
+  cairo_surface_destroy (surface);
+  return pix;
+}
+
 /* Function to do a last minute fixup of the AM/PM stuff if the locale
  * and gettext haven't done it right. Most English speaking countries
  * except the USA use the 24 hour clock (UK, Australia etc). However
diff --git a/src/gcal-utils.h b/src/gcal-utils.h
index 12b8df7..05e1fd9 100644
--- a/src/gcal-utils.h
+++ b/src/gcal-utils.h
@@ -67,6 +67,8 @@ gchar*          gcal_get_source_uid                             (GtkTreeModel
 
 const gchar*    gcal_get_weekday                                (gint                   i);
 
+GdkPixbuf*      gcal_get_pixbuf_from_color                      (GdkColor              *color);
+
 /* code brought from evolution */
 gsize           e_strftime_fix_am_pm                            (gchar                 *str,
                                                                  gsize                  max,
diff --git a/src/gcal-window.c b/src/gcal-window.c
index edff73d..5825fcc 100644
--- a/src/gcal-window.c
+++ b/src/gcal-window.c
@@ -25,7 +25,7 @@
 #include "gcal-week-view.h"
 #include "gcal-view.h"
 #include "gcal-event-widget.h"
-#include "gcal-event-view.h"
+#include "gcal-edit-dialog.h"
 #include "gcal-enum-types.h"
 #include "gtk-notification.h"
 #include "gcal-event-overlay.h"
@@ -121,10 +121,6 @@ static void           gcal_window_events_removed         (GcalManager         *m
 static void           gcal_window_event_activated        (GcalEventWidget     *event_widget,
                                                           gpointer             user_data);
 
-static void           gcal_window_will_remove_event      (GcalEventView       *view,
-                                                          gchar               *event_uuid,
-                                                          gpointer             user_data);
-
 static void           gcal_window_remove_event           (GtkNotification     *notification,
                                                           gpointer             user_data);
 
@@ -628,43 +624,13 @@ static void
 gcal_window_init_edit_dialog (GcalWindow *window)
 {
   GcalWindowPrivate *priv;
-  GcalManager *manager;
-
-  GtkWidget *content_area;
-  GtkWidget *action_area;
 
   g_return_if_fail (GCAL_IS_WINDOW (window));
   priv = window->priv;
 
-  priv->edit_dialog = gtk_dialog_new ();
-  gtk_window_set_title (GTK_WINDOW (priv->edit_dialog), _("Edit Event"));
-  gtk_window_set_modal (GTK_WINDOW (priv->edit_dialog), TRUE);
-  gtk_window_set_destroy_with_parent (GTK_WINDOW (priv->edit_dialog), TRUE);
-  gtk_window_set_resizable (GTK_WINDOW (priv->edit_dialog), FALSE);
-
-  content_area = gtk_dialog_get_content_area (GTK_DIALOG (priv->edit_dialog));
-  manager = gcal_window_get_manager (window);
-
-  priv->edit_widget = gcal_event_view_new_with_manager (manager);
-  gtk_container_add (GTK_CONTAINER (content_area),
-                     priv->edit_widget);
-
-  gtk_widget_show_all (content_area);
-
-  gtk_dialog_add_button (GTK_DIALOG (priv->edit_dialog),
-                         GTK_STOCK_CANCEL,
-                         GTK_RESPONSE_REJECT);
-  gtk_dialog_add_button (GTK_DIALOG (priv->edit_dialog),
-                         _("Done"),
-                         GTK_RESPONSE_ACCEPT);
-  action_area = gtk_dialog_get_action_area (GTK_DIALOG (priv->edit_dialog));
-  gtk_button_box_set_layout (GTK_BUTTON_BOX (action_area), GTK_BUTTONBOX_EDGE);
-  gtk_widget_show_all (action_area);
-  /* FIXME: hook delete signal
-  g_signal_connect (priv->add_view,
-                    "will-delete",
-                    G_CALLBACK (gcal_window_will_remove_event),
-                    window);*/
+  priv->edit_dialog = gcal_edit_dialog_new ();
+  gcal_edit_dialog_set_manager (GCAL_EDIT_DIALOG (priv->edit_dialog),
+                                gcal_window_get_manager (window));
 }
 
 static void
@@ -892,6 +858,12 @@ gcal_window_event_activated (GcalEventWidget *event_widget,
                              gpointer         user_data)
 {
   GcalWindowPrivate *priv;
+  gchar **tokens;
+  gint response;
+
+  GtkWidget *noty;
+  GtkWidget *grid;
+  GtkWidget *undo_button;
 
   g_return_if_fail (GCAL_IS_WINDOW (user_data));
   priv = GCAL_WINDOW (user_data)->priv;
@@ -899,73 +871,58 @@ gcal_window_event_activated (GcalEventWidget *event_widget,
   if (priv->edit_dialog == NULL)
     gcal_window_init_edit_dialog (GCAL_WINDOW (user_data));
 
-  gcal_event_view_load_event (GCAL_EVENT_VIEW (priv->edit_widget),
-                              gcal_event_widget_peek_uuid (event_widget));
+  tokens = g_strsplit (gcal_event_widget_peek_uuid (event_widget), ":", -1);
+  gcal_edit_dialog_set_event (GCAL_EDIT_DIALOG (priv->edit_dialog),
+                              tokens[0],
+                              tokens[1]);
+  g_strfreev (tokens);
 
-  gtk_dialog_run (GTK_DIALOG (priv->edit_dialog));
+  response = gtk_dialog_run (GTK_DIALOG (priv->edit_dialog));
   gtk_widget_hide (priv->edit_dialog);
-}
-
-static void
-gcal_window_will_remove_event (GcalEventView *view,
-                               gchar         *event_uuid,
-                               gpointer      user_data)
-{
-  GcalWindowPrivate *priv;
-  gint activated_page;
 
-  GtkWidget *noty;
-  GtkWidget *grid;
-  GtkWidget *undo_button;
-
-  GtkWidget *event_widget;
-
-  priv = GCAL_WINDOW (user_data)->priv;
-
-  gcal_toolbar_set_mode (GCAL_TOOLBAR (priv->main_toolbar),
-                         GCAL_TOOLBAR_OVERVIEW);
-
-  if ((activated_page = gtk_notebook_page_num (GTK_NOTEBOOK (priv->notebook),
-                                               priv->views[priv->active_view]))
-      != -1)
-    {
-      gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->notebook),
-                                     activated_page);
-    }
-  else
+  switch (response)
     {
-      /* FIXME: there's something that needs to be done here. */
-      g_warning ("Your app has gone crazy");
+      case GTK_RESPONSE_CANCEL:
+        /* do nothing, nor edit, nor nothing */
+        break;
+      case GTK_RESPONSE_ACCEPT:
+        /* save changes if editable */
+        break;
+      case GCAL_RESPONSE_DELETE_EVENT:
+        /* delete the event */
+        noty = gtk_notification_new ();
+        grid = gtk_grid_new ();
+        gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
+        gtk_container_add (GTK_CONTAINER (grid),
+                           gtk_label_new (_("Event deleted")));
+
+        undo_button = gtk_button_new_from_stock (GTK_STOCK_UNDO);
+        gtk_container_add (GTK_CONTAINER (grid), undo_button);
+
+        gtk_container_add (GTK_CONTAINER (noty), grid);
+        gtk_widget_show_all (noty);
+        gcal_window_show_notification (GCAL_WINDOW (user_data), noty);
+
+        g_signal_connect (noty,
+                          "dismissed",
+                          G_CALLBACK (gcal_window_remove_event),
+                          user_data);
+        g_signal_connect (undo_button,
+                          "clicked",
+                          G_CALLBACK (gcal_window_undo_remove_event),
+                          user_data);
+
+        priv->event_to_delete =
+          g_strdup (gcal_event_widget_peek_uuid (event_widget));
+
+        /* hide widget of the event */
+        gtk_widget_hide (GTK_WIDGET (event_widget));
+        break;
+
+      default:
+        /* do nothing */
+        break;
     }
-
-  noty = gtk_notification_new ();
-  grid = gtk_grid_new ();
-  gtk_grid_set_column_spacing (GTK_GRID (grid), 12);
-  gtk_container_add (GTK_CONTAINER (grid), gtk_label_new (_("Event deleted")));
-
-  undo_button = gtk_button_new_from_stock (GTK_STOCK_UNDO);
-  gtk_container_add (GTK_CONTAINER (grid), undo_button);
-
-  gtk_container_add (GTK_CONTAINER (noty), grid);
-  gtk_widget_show_all (noty);
-  gcal_window_show_notification (GCAL_WINDOW (user_data), noty);
-
-  g_signal_connect (noty,
-                    "dismissed",
-                    G_CALLBACK (gcal_window_remove_event),
-                    user_data);
-  g_signal_connect (undo_button,
-                    "clicked",
-                    G_CALLBACK (gcal_window_undo_remove_event),
-                    user_data);
-
-  priv->event_to_delete = g_strdup (event_uuid);
-
-  /* hide widget of the event */
-  event_widget =
-    gcal_view_get_by_uuid (GCAL_VIEW (priv->views[priv->active_view]),
-                           priv->event_to_delete);
-  gtk_widget_hide (event_widget);
 }
 
 static void
@@ -1134,13 +1091,11 @@ gcal_window_create_event (GcalEventOverlay    *widget,
                              new_data->start_date,
                              new_data->end_date);
 
-  g_debug ("NOW CREATE THE EVENT");
   if (open_details)
     g_debug ("Opening details window NOW");
 
   /* reset and hide */
   gcal_window_event_overlay_closed (widget, user_data);
-
 }
 
 static void



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