diff options
Diffstat (limited to 'calendar/gncal-full-day.c')
-rw-r--r-- | calendar/gncal-full-day.c | 161 |
1 files changed, 141 insertions, 20 deletions
diff --git a/calendar/gncal-full-day.c b/calendar/gncal-full-day.c index 6b30d15a77..723e9430d9 100644 --- a/calendar/gncal-full-day.c +++ b/calendar/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) { |