aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/gncal-full-day.c
diff options
context:
space:
mode:
authorArturo Espinosa <unammx@src.gnome.org>1998-05-07 09:32:53 +0800
committerArturo Espinosa <unammx@src.gnome.org>1998-05-07 09:32:53 +0800
commitca6dd05c600cfbaf6c9b16059b2377932463ea0d (patch)
treefc0e4a58543e23603dcef43f7e7da381102428cd /calendar/gui/gncal-full-day.c
parente5ce5147f9b4e17bdef88987d714f52d7dab475a (diff)
downloadgsoc2013-evolution-ca6dd05c600cfbaf6c9b16059b2377932463ea0d.tar.gz
gsoc2013-evolution-ca6dd05c600cfbaf6c9b16059b2377932463ea0d.tar.zst
gsoc2013-evolution-ca6dd05c600cfbaf6c9b16059b2377932463ea0d.zip
My attempt at getting the nice pixmaps drawn next to the events.
My attempt at getting the nice pixmaps drawn next to the events. For some wierdo reason it is not drawing them now. svn path=/trunk/; revision=208
Diffstat (limited to 'calendar/gui/gncal-full-day.c')
-rw-r--r--calendar/gui/gncal-full-day.c161
1 files changed, 141 insertions, 20 deletions
diff --git a/calendar/gui/gncal-full-day.c b/calendar/gui/gncal-full-day.c
index 6b30d15a77..723e9430d9 100644
--- a/calendar/gui/gncal-full-day.c
+++ b/calendar/gui/gncal-full-day.c
@@ -8,33 +8,41 @@
#include <config.h>
#include <string.h>
#include <gdk/gdkkeysyms.h>
-#include <gtk/gtkdrawingarea.h>
-#include <gtk/gtktext.h>
-#include <libgnomeui/gtkcalendar.h>
+#include <gnome.h>
#include "eventedit.h"
#include "gncal-full-day.h"
#include "view-utils.h"
#include "main.h"
#include "popup-menu.h"
+/* Images */
+#include "bell.xpm"
+#include "recur.xpm"
#define TEXT_BORDER 2
#define HANDLE_SIZE 8
-#define MIN_WIDTH 300
+#define MIN_WIDTH 200
#define XOR_RECT_WIDTH 2
#define UNSELECT_TIMEOUT 150 /* ms */
+/* Size of the pixmaps */
+#define DECOR_WIDTH 16
+#define DECOR_HEIGHT 16
typedef struct {
iCalObject *ico;
GtkWidget *widget;
GdkWindow *window;
+ GdkWindow *decor_window;
int lower_row; /* zero is first displayed row */
int rows_used;
int x; /* coords of child's window */
int y;
int width;
int height;
+ int decor_width;
+ int decor_height;
+ int items; /* number of decoration bitmaps */
time_t start, end;
} Child;
@@ -109,6 +117,8 @@ static GtkContainerClass *parent_class;
static int fullday_signals[LAST_SIGNAL] = { 0 };
+/* The little images */
+static GdkPixmap *pixmap_bell, *pixmap_recur;
static void
get_tm_range (GncalFullDay *fullday,
@@ -163,6 +173,8 @@ static void
child_map (GncalFullDay *fullday, Child *child)
{
gdk_window_show (child->window);
+ if (child->decor_width)
+ gdk_window_show (child->decor_window);
gtk_widget_show (child->widget); /* OK, not just a map... */
}
@@ -170,7 +182,7 @@ static void
child_unmap (GncalFullDay *fullday, Child *child)
{
gdk_window_hide (child->window);
-
+ gdk_window_hide (child->decor_window);
if (GTK_WIDGET_MAPPED (child->widget))
gtk_widget_unmap (child->widget);
}
@@ -185,7 +197,7 @@ child_set_text_pos (Child *child)
allocation.x = HANDLE_SIZE;
allocation.y = has_focus ? HANDLE_SIZE : 0;
- allocation.width = child->width - HANDLE_SIZE;
+ allocation.width = child->width - HANDLE_SIZE - child->decor_width;
allocation.height = child->height - (has_focus ? (2 * HANDLE_SIZE) : 0);
gtk_widget_size_request (child->widget, &child->widget->requisition); /* FIXME: is this needed? */
@@ -198,13 +210,14 @@ child_realize (GncalFullDay *fullday, Child *child)
GdkWindowAttr attributes;
gint attributes_mask;
GtkWidget *widget;
-
+ GdkColor c;
+
widget = GTK_WIDGET (fullday);
attributes.window_type = GDK_WINDOW_CHILD;
attributes.x = child->x;
attributes.y = child->y;
- attributes.width = child->width;
+ attributes.width = child->width - child->decor_width;;
attributes.height = child->height;
attributes.wclass = GDK_INPUT_OUTPUT;
attributes.visual = gtk_widget_get_visual (widget);
@@ -218,14 +231,46 @@ child_realize (GncalFullDay *fullday, Child *child)
| GDK_KEY_PRESS_MASK);
attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP | GDK_WA_CURSOR;
-
child->window = gdk_window_new (widget->window, &attributes, attributes_mask);
gdk_window_set_user_data (child->window, widget);
-
gtk_style_set_background (widget->style, child->window, GTK_STATE_NORMAL);
-
gtk_widget_set_parent_window (child->widget, child->window);
+ /* Create the decoration window */
+ attributes.x = child->x + child->width - child->decor_width;
+ attributes.width = child->decor_width ? child->decor_width : 1;
+ attributes.height = child->decor_height ? child->decor_height : 1;
+ attributes.visual = gdk_imlib_get_visual ();
+ attributes.colormap = gdk_imlib_get_colormap ();
+ attributes.event_mask = (GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK);
+ attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+ child->decor_window = gdk_window_new (widget->window, &attributes, attributes_mask);
+ gdk_color_white (gdk_imlib_get_colormap (), &c);
+ gdk_window_set_background (child->decor_window, &c);
+ gdk_window_set_user_data (child->decor_window, widget);
+
+ if (!pixmap_bell){
+ GdkImlibImage *imlib_bell, *imlib_recur;
+ GdkPixmap *mask;
+
+ imlib_bell = gdk_imlib_create_image_from_xpm_data (bell_xpm);
+ gdk_imlib_render (imlib_bell, DECOR_WIDTH, DECOR_HEIGHT);
+ pixmap_bell = gdk_imlib_move_image (imlib_bell);
+ mask = gdk_imlib_move_mask (imlib_bell);
+ gdk_imlib_destroy_image (imlib_bell);
+ fullday->bell_gc = gdk_gc_new (child->decor_window);
+ if (mask)
+ gdk_gc_set_clip_mask (fullday->bell_gc, mask);
+
+ imlib_recur = gdk_imlib_create_image_from_xpm_data (recur_xpm);
+ gdk_imlib_render (imlib_recur, DECOR_WIDTH, DECOR_HEIGHT);
+ pixmap_recur = gdk_imlib_move_image (imlib_recur);
+ mask = gdk_imlib_move_mask (imlib_recur);
+ gdk_imlib_destroy_image (imlib_recur);
+ fullday->recur_gc = gdk_gc_new (child->decor_window);
+ if (mask)
+ gdk_gc_set_clip_mask (fullday->recur_gc, mask);
+ }
child_set_text_pos (child);
}
@@ -238,6 +283,40 @@ child_unrealize (GncalFullDay *fullday, Child *child)
}
static void
+child_draw_decor (GncalFullDay *fullday, Child *child, GdkRectangle *area)
+{
+ iCalObject *ico = child->ico;
+ GdkRectangle rect, dest;
+ int ry = 0;
+
+ rect.x = child->width;
+ rect.y = 0;
+ rect.width = child->decor_width;
+ rect.height = child->decor_height;
+
+ if (!gdk_rectangle_intersect (&rect, area, &dest))
+ return;
+
+ if (ico->recur){
+ gdk_window_copy_area (child->decor_window,
+ fullday->recur_gc,
+ 0, ry,
+ pixmap_recur, 0, 0,
+ DECOR_WIDTH, DECOR_HEIGHT);
+ ry += DECOR_HEIGHT;
+ }
+ if (ico->dalarm.enabled || ico->malarm.enabled || ico->palarm.enabled || ico->aalarm.enabled){
+ printf ("PINTANDO ALARMA\n");
+ gdk_window_copy_area (child->decor_window,
+ fullday->bell_gc,
+ 0, ry,
+ pixmap_bell, 0, 0,
+ DECOR_WIDTH, DECOR_HEIGHT);
+ ry += DECOR_HEIGHT;
+ }
+}
+
+static void
child_draw (GncalFullDay *fullday, Child *child, GdkRectangle *area, int draw_child)
{
GdkRectangle arect, rect, dest;
@@ -270,7 +349,7 @@ child_draw (GncalFullDay *fullday, Child *child, GdkRectangle *area, int draw_ch
rect.x = 0;
rect.y = 0;
- rect.width = child->width;
+ rect.width = child->width - child->decor_width;
rect.height = HANDLE_SIZE;
if (gdk_rectangle_intersect (&rect, area, &dest))
@@ -392,6 +471,8 @@ child_realized_setup (GtkWidget *widget, gpointer data)
static void
child_set_pos (GncalFullDay *fullday, Child *child, int x, int y, int width, int height)
{
+ const int decor_width = child->decor_width;
+
child->x = x;
child->y = y;
child->width = width;
@@ -401,7 +482,12 @@ child_set_pos (GncalFullDay *fullday, Child *child, int x, int y, int width, int
return;
child_set_text_pos (child);
- gdk_window_move_resize (child->window, x, y, width, height);
+ gdk_window_move_resize (child->window, x, y, width - decor_width, height);
+
+ if (decor_width){
+ gdk_window_move_resize (child->decor_window, x + width - decor_width, y,
+ decor_width, child->decor_height);
+ }
}
static int
@@ -462,19 +548,19 @@ child_focus_out (GtkWidget *widget, GdkEventFocus *event, gpointer data)
child = data;
+ child_set_size (child);
+
/* Update summary in calendar object */
text = gtk_editable_get_chars (GTK_EDITABLE (widget), 0, -1);
if (child->ico->summary && strcmp (text, child->ico->summary) == 0)
return FALSE;
-
+
if (child->ico->summary)
g_free (child->ico->summary);
child->ico->summary = text;
- child_set_size (child);
-
/* Notify calendar of change */
fullday = GNCAL_FULL_DAY (widget->parent);
@@ -516,6 +602,31 @@ child_button_press (GtkWidget *widget, GdkEventButton *event, gpointer data)
return TRUE;
}
+/*
+ * compute the space required to display the decorations
+ */
+static void
+child_compute_decor (Child *child)
+{
+ iCalObject *ico = child->ico;
+ int rows_used;
+
+ child->items = 0;
+ rows_used = (child->rows_used < 1) ? 1 : child->rows_used;
+ if (ico->recur)
+ child->items++;
+ if (ico->dalarm.enabled || ico->aalarm.enabled || ico->palarm.enabled || ico->malarm.enabled)
+ child->items++;
+
+ if (child->items > rows_used){
+ child->decor_width = DECOR_WIDTH * 2;
+ child->decor_height = DECOR_HEIGHT;
+ } else {
+ child->decor_width = DECOR_WIDTH * (child->items ? 1 : 0);
+ child->decor_height = DECOR_HEIGHT * child->items;
+ }
+}
+
static Child *
child_new (GncalFullDay *fullday, time_t start, time_t end, iCalObject *ico)
{
@@ -530,10 +641,10 @@ child_new (GncalFullDay *fullday, time_t start, time_t end, iCalObject *ico)
child->y = 0;
child->width = 0;
child->height = 0;
- child->start = start;
- child->end = end;
-
+ child->start = start;
+ child->end = end;
child_range_changed (fullday, child);
+ child_compute_decor (child);
/* We set the i-beam cursor and the initial summary text upon realization */
@@ -821,6 +932,8 @@ gncal_full_day_init (GncalFullDay *fullday)
fullday->up_down_cursor = NULL;
fullday->beam_cursor = NULL;
+ fullday->recur_gc = NULL;
+ fullday->bell_gc = NULL;
}
static void
@@ -947,6 +1060,7 @@ gncal_full_day_realize (GtkWidget *widget)
for (children = fullday->children; children; children = children->next)
child_realize (fullday, children->data);
+
}
static void
@@ -969,6 +1083,13 @@ gncal_full_day_unrealize (GtkWidget *widget)
gdk_cursor_destroy (fullday->beam_cursor);
fullday->beam_cursor = NULL;
+ gdk_gc_destroy (fullday->bell_gc);
+ gdk_gc_destroy (fullday->recur_gc);
+ gdk_pixmap_unref (pixmap_bell);
+ gdk_pixmap_unref (pixmap_recur);
+
+ pixmap_bell = NULL;
+
if (GTK_WIDGET_CLASS (parent_class)->unrealize)
(* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
}
@@ -1291,7 +1412,7 @@ find_child_by_window (GncalFullDay *fullday, GdkWindow *window, int *on_text)
for (children = fullday->children; children; children = children->next) {
child = children->data;
- if (child->window == window)
+ if (child->window == window || child->decor_window == window)
return child;
if (child->widget == owner) {