/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ /* e-summary-titlebar.c * * Authors: Iain Holmes * * Copyright (C) 2000 Helix Code, Inc. * * This program 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 2 of the * License, or (at your option) any later version. * * This program 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, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include "e-summary-titlebar.h" #include "e-summary-title-button.h" /* XPMS */ #include "edit.xpm" #include "x.xpm" #include "shade.xpm" #define PARENT_TYPE (gnome_canvas_group_get_type ()) #define TITLEBAR_BORDER_WIDTH 2 enum { ARG_0, ARG_TEXT, ARG_WIDTH, ARG_HEIGHT }; enum { EDIT, SHADE, CLOSE, LAST_SIGNAL }; static void e_summary_titlebar_destroy (GtkObject *object); static void e_summary_titlebar_class_init (GtkObjectClass *object_class); static void e_summary_titlebar_init (GtkObject *object); static GnomeCanvasGroupClass *parent_class; static guint titlebar_signals[LAST_SIGNAL] = { 0 }; struct _ESummaryTitlebarPrivate { GnomeCanvasItem *rect; GnomeCanvasItem *titletext; GnomeCanvasItem *edit; GnomeCanvasItem *shade; GnomeCanvasItem *close; char *text; double width, height; }; static void e_summary_titlebar_destroy (GtkObject *object) { ESummaryTitlebar *titlebar; ESummaryTitlebarPrivate *priv; titlebar = E_SUMMARY_TITLEBAR (object); priv = titlebar->private; if (priv == NULL) return; g_free (priv); titlebar->private = NULL; if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); } static void edit_cb (GnomeCanvasItem *item, ESummaryTitlebar *titlebar) { gtk_signal_emit (GTK_OBJECT (titlebar), titlebar_signals[EDIT]); } static void shade_cb (GnomeCanvasItem *item, ESummaryTitlebar *titlebar) { gtk_signal_emit (GTK_OBJECT (titlebar), titlebar_signals[SHADE]); } static void close_cb (GnomeCanvasItem *item, ESummaryTitlebar *titlebar) { gtk_signal_emit (GTK_OBJECT (titlebar), titlebar_signals[CLOSE]); } static void e_summary_titlebar_realize (GnomeCanvasItem *item) { GnomeCanvasGroup *group; ESummaryTitlebar *titlebar; ESummaryTitlebarPrivate *priv; GdkPixbuf *pb; EFont *font; int font_height; group = GNOME_CANVAS_GROUP (item); titlebar = E_SUMMARY_TITLEBAR (item); priv = titlebar->private; font = e_font_from_gdk_font (GTK_WIDGET (item->canvas)->style->font); font_height = e_font_height (font); priv->height = 18 + 2 * TITLEBAR_BORDER_WIDTH; /* FIXME: Not hardcoded */ priv->rect = gnome_canvas_item_new (group, gnome_canvas_rect_get_type (), "x1", 0.0, "y1", 0.0, "y2", (double) priv->height, "x2", priv->width, "fill_color_rgba", 0x88AAFFFF, NULL); pb = gdk_pixbuf_new_from_xpm_data ((const char**) x_xpm); priv->close = gnome_canvas_item_new (group, e_summary_title_button_get_type (), "x", (double) priv->width - TITLEBAR_BORDER_WIDTH - 18, "y", (double) TITLEBAR_BORDER_WIDTH, "pixbuf", pb, NULL); gdk_pixbuf_unref (pb); gtk_signal_connect (GTK_OBJECT (priv->close), "clicked", GTK_SIGNAL_FUNC (close_cb), titlebar); pb = gdk_pixbuf_new_from_xpm_data ((const char**) shade_xpm); priv->shade = gnome_canvas_item_new (group, e_summary_title_button_get_type (), "x", (double) priv->width - (TITLEBAR_BORDER_WIDTH * 2) - 36, "y", (double) TITLEBAR_BORDER_WIDTH, "pixbuf", pb, NULL); gdk_pixbuf_unref (pb); gtk_signal_connect (GTK_OBJECT (priv->shade), "clicked", GTK_SIGNAL_FUNC (shade_cb), titlebar); pb = gdk_pixbuf_new_from_xpm_data ((const char**) edit_xpm); priv->edit = gnome_canvas_item_new (group, e_summary_title_button_get_type (), "x", (double) priv->width - (TITLEBAR_BORDER_WIDTH * 3) - 54, "y", (double) TITLEBAR_BORDER_WIDTH, "pixbuf", pb, NULL); gdk_pixbuf_unref (pb); gtk_signal_connect (GTK_OBJECT (priv->edit), "clicked", GTK_SIGNAL_FUNC (edit_cb), titlebar); priv->titletext = gnome_canvas_item_new (group, e_text_get_type (), "text", priv->text, "font_gdk", GTK_WIDGET (item->canvas)->style->font, "clip_width", (double) priv->width - (TITLEBAR_BORDER_WIDTH*4)- 50, "clip_height", (double) e_font_height (font), "clip", TRUE, "use_ellipsis", TRUE, "fill_color", "black", "anchor", GTK_ANCHOR_NW, "draw_background", FALSE, NULL); gnome_canvas_item_move (priv->titletext, TITLEBAR_BORDER_WIDTH, (priv->height - font_height) / 2); if (GNOME_CANVAS_ITEM_CLASS (parent_class)->realize) (* GNOME_CANVAS_ITEM_CLASS (parent_class)->realize) (item); } static void e_summary_titlebar_unrealize (GnomeCanvasItem *item) { if (GNOME_CANVAS_ITEM_CLASS (parent_class)->unrealize) (* GNOME_CANVAS_ITEM_CLASS (parent_class)->unrealize) (item); } static void e_summary_titlebar_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) { ESummaryTitlebar *titlebar; ESummaryTitlebarPrivate *priv; titlebar = E_SUMMARY_TITLEBAR (object); priv = titlebar->private; switch (arg_id) { case ARG_TEXT: if (priv->text) g_free (priv->text); priv->text = g_strdup (GTK_VALUE_STRING (*arg)); if (priv->titletext) gnome_canvas_item_set (priv->titletext, "text", priv->text, NULL); break; case ARG_WIDTH: priv->width = GTK_VALUE_DOUBLE (*arg); if (priv->rect) gnome_canvas_item_set (priv->rect, "x2", priv->width, NULL); if (priv->titletext) gnome_canvas_item_set (priv->titletext, "clip_width", priv->width - (TITLEBAR_BORDER_WIDTH* 4) - 42, NULL); break; default: break; } } static void e_summary_titlebar_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) { ESummaryTitlebar *titlebar; ESummaryTitlebarPrivate *priv; titlebar = E_SUMMARY_TITLEBAR (object); priv = titlebar->private; switch (arg_id) { case ARG_TEXT: GTK_VALUE_STRING (*arg) = priv->text; break; case ARG_WIDTH: GTK_VALUE_DOUBLE (*arg) = priv->width; break; case ARG_HEIGHT: GTK_VALUE_DOUBLE (*arg) = priv->height; break; default: arg->type = GTK_TYPE_INVALID; break; } } static gint e_summary_titlebar_event (GnomeCanvasItem *item, GdkEvent *event) { if (event->type == GDK_2BUTTON_PRESS && event->button.button == 1) { gtk_signal_emit (GTK_OBJECT (item), titlebar_signals[SHADE]); return FALSE; } else { return TRUE; } } static double e_summary_titlebar_point (GnomeCanvasItem *item, double x, double y, int cx, int cy, GnomeCanvasItem **actual_item) { ESummaryTitlebar *est; ESummaryTitlebarPrivate *priv; GnomeCanvasItem *ret_item; double d; est = E_SUMMARY_TITLEBAR (item); priv = est->private; d = (* GNOME_CANVAS_ITEM_CLASS (GTK_OBJECT (priv->edit)->klass)->point) (priv->edit, x, y, cx, cy, &ret_item); if (d == 0.0) { *actual_item = ret_item; return 0.0; } d = (* GNOME_CANVAS_ITEM_CLASS (GTK_OBJECT (priv->shade)->klass)->point) (priv->shade, x, y, cx, cy, &ret_item); if (d == 0.0) { *actual_item = ret_item; return 0.0; } d = (* GNOME_CANVAS_ITEM_CLASS (GTK_OBJECT (priv->close)->klass)->point) (priv->close, x, y, cx, cy, &ret_item); if (d == 0.0) { *actual_item = ret_item; return 0.0; } *actual_item = item; return 0.0; } static void e_summary_titlebar_class_init (GtkObjectClass *object_class) { GnomeCanvasItemClass *item_class; item_class = (GnomeCanvasItemClass *) object_class; object_class->destroy = e_summary_titlebar_destroy; object_class->set_arg = e_summary_titlebar_set_arg; object_class->get_arg = e_summary_titlebar_get_arg; item_class->realize = e_summary_titlebar_realize; item_class->unrealize = e_summary_titlebar_unrealize; item_class->event = e_summary_titlebar_event; item_class->point = e_summary_titlebar_point; gtk_object_add_arg_type ("ESummaryTitlebar::text", GTK_TYPE_STRING, GTK_ARG_READWRITE, ARG_TEXT); gtk_object_add_arg_type ("ESummaryTitlebar::width", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_WIDTH); gtk_object_add_arg_type ("ESummaryTitlebar::height", GTK_TYPE_DOUBLE, GTK_ARG_READABLE, ARG_HEIGHT); titlebar_signals[EDIT] = gtk_signal_new ("edit", GTK_RUN_LAST, object_class->type, GTK_SIGNAL_OFFSET (ESummaryTitlebarClass, edit), gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); titlebar_signals[SHADE] = gtk_signal_new ("shade", GTK_RUN_LAST, object_class->type, GTK_SIGNAL_OFFSET (ESummaryTitlebarClass, shade), gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); titlebar_signals[CLOSE] = gtk_signal_new ("close", GTK_RUN_LAST, object_class->type, GTK_SIGNAL_OFFSET (ESummaryTitlebarClass, close), gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0); gtk_object_class_add_signals (object_class, titlebar_signals, LAST_SIGNAL); parent_class = gtk_type_class (PARENT_TYPE); } static void e_summary_titlebar_init (GtkObject *object) { ESummaryTitlebar *titlebar; ESummaryTitlebarPrivate *priv; titlebar = E_SUMMARY_TITLEBAR (object); titlebar->private = g_new0 (ESummaryTitlebarPrivate, 1); priv = titlebar->private; priv->width = 100.0; priv->text = NULL; gdk_rgb_init (); } E_MAKE_TYPE (e_summary_titlebar, "ESummaryTitlebar", ESummaryTitlebar, e_summary_titlebar_class_init, e_summary_titlebar_init, PARENT_TYPE);