diff options
Diffstat (limited to 'executive-summary/widgets/e-summary-subwindow.c')
-rw-r--r-- | executive-summary/widgets/e-summary-subwindow.c | 299 |
1 files changed, 299 insertions, 0 deletions
diff --git a/executive-summary/widgets/e-summary-subwindow.c b/executive-summary/widgets/e-summary-subwindow.c new file mode 100644 index 0000000000..bf5bcb1eba --- /dev/null +++ b/executive-summary/widgets/e-summary-subwindow.c @@ -0,0 +1,299 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ +/* e-summary.c + * + * Authors: Iain Holmes <iain@helixcode.com> + * + * 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 <config.h> +#endif + +#include <gnome.h> +#include <gal/util/e-util.h> +#include <gal/widgets/e-font.h> + +#include <gal/e-text/e-text.h> + +#include "e-summary-subwindow.h" + +#define PARENT_TYPE (gnome_canvas_group_get_type ()) +#define TITLEBAR_BORDER_WIDTH 2 + +static void e_summary_subwindow_destroy (GtkObject *object); +static void e_summary_subwindow_class_init (GtkObjectClass *object_class); +static void e_summary_subwindow_init (GtkObject *object); + +static GnomeCanvasGroupClass *parent_class; + +struct _ESummarySubwindowPrivate { + GnomeCanvasItem *titlebar; + GnomeCanvasItem *contents; + + GtkWidget *container; + + char *title; +}; + +enum { + ARG_0, + ARG_X, + ARG_Y, + ARG_WIDTH, + ARG_HEIGHT, + ARG_STATE +}; + +enum { + CLOSE_CLICKED, + SHADE_CLICKED, + EDIT_CLICKED, + LAST_SIGNAL +}; + +static guint32 e_summary_subwindow_signals[LAST_SIGNAL] = { 0 }; + +static void +e_summary_subwindow_destroy (GtkObject *object) +{ + ESummarySubwindow *subwindow = E_SUMMARY_SUBWINDOW (object); + ESummarySubwindowPrivate *priv; + + priv = subwindow->private; + + if (priv == NULL) + return; + + if (priv->container) { + gtk_widget_destroy (priv->container); + priv->container = NULL; + } + + if (priv->title) { + g_free (priv->title); + priv->title = NULL; + } + + g_free (subwindow->private); + subwindow->private = NULL; + + if (GTK_OBJECT_CLASS (parent_class)->destroy) + (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); +} + +static void +e_summary_subwindow_realize (GnomeCanvasItem *item) +{ + if (GNOME_CANVAS_ITEM_CLASS (parent_class)->realize) + (* GNOME_CANVAS_ITEM_CLASS (parent_class)->realize) (item); +} + +static void +e_summary_subwindow_unrealize (GnomeCanvasItem *item) +{ + if (GNOME_CANVAS_ITEM_CLASS (parent_class)->unrealize) + (* GNOME_CANVAS_ITEM_CLASS (parent_class)->unrealize) (item); +} + +static void +e_summary_subwindow_class_init (GtkObjectClass *object_class) +{ + GnomeCanvasItemClass *item_class; + + item_class = (GnomeCanvasItemClass *) object_class; + + object_class->destroy = e_summary_subwindow_destroy; + + item_class->realize = e_summary_subwindow_realize; + item_class->unrealize = e_summary_subwindow_unrealize; + + parent_class = gtk_type_class (PARENT_TYPE); +} + +static void +e_summary_subwindow_init (GtkObject *object) +{ + ESummarySubwindow *subwindow = E_SUMMARY_SUBWINDOW (object); + ESummarySubwindowPrivate *priv; + + subwindow->private = g_new0 (ESummarySubwindowPrivate, 1); + priv = subwindow->private; + + priv->title = NULL; +} + +E_MAKE_TYPE (e_summary_subwindow, "ESummarySubwindow", ESummarySubwindow, + e_summary_subwindow_class_init, e_summary_subwindow_init, + PARENT_TYPE); + +static void +container_size_allocate (GtkWidget *widget, + GtkAllocation *allocation, + ESummarySubwindow *subwindow) +{ + ESummarySubwindowPrivate *priv; + + g_return_if_fail (subwindow != NULL); + g_return_if_fail (IS_E_SUMMARY_SUBWINDOW (subwindow)); + + priv = subwindow->private; + + gnome_canvas_item_set (priv->titlebar, + "width", (double) allocation->width - 1, + NULL); + +} + +static void +edit_cb (GnomeCanvasItem *item, + ESummarySubwindow *subwindow) +{ + g_print ("EDIT!\n"); +} + +static void +shade_cb (GnomeCanvasItem *item, + ESummarySubwindow *subwindow) +{ + g_print ("SHADE!\n"); +} + +static void +close_cb (GnomeCanvasItem *item, + ESummarySubwindow *subwindow) +{ + g_print ("CLOSE!\n"); + gtk_object_destroy (GTK_OBJECT (subwindow)); +} + +void +e_summary_subwindow_construct (GnomeCanvasItem *item) +{ + GnomeCanvasGroup *group; + ESummarySubwindow *subwindow; + ESummarySubwindowPrivate *priv; + EFont *font; + int titlebar_height; + + g_return_if_fail (item != NULL); + g_return_if_fail (IS_E_SUMMARY_SUBWINDOW (item)); + + subwindow = E_SUMMARY_SUBWINDOW (item); + priv = subwindow->private; + + group = GNOME_CANVAS_GROUP (item); + + font = e_font_from_gdk_font ( ((GtkWidget *) item->canvas)->style->font); + + titlebar_height = 18 + 2 * TITLEBAR_BORDER_WIDTH; /* FIXME: Not hardcoded */ + + priv->titlebar = gnome_canvas_item_new (group, + e_summary_titlebar_get_type (), + "text", "Titlebar", + "width", 100.0, + NULL); + gtk_signal_connect (GTK_OBJECT (priv->titlebar), "edit", + GTK_SIGNAL_FUNC (edit_cb), subwindow); + gtk_signal_connect (GTK_OBJECT (priv->titlebar), "shade", + GTK_SIGNAL_FUNC (shade_cb), subwindow); + gtk_signal_connect (GTK_OBJECT (priv->titlebar), "close", + GTK_SIGNAL_FUNC (close_cb), subwindow); + + priv->container = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (priv->container), GTK_SHADOW_ETCHED_IN); + gtk_widget_show (priv->container); + + priv->contents = gnome_canvas_item_new (group, + gnome_canvas_widget_get_type (), + "x", (double) 0, + "y", (double) titlebar_height + 1, + "widget", priv->container, + NULL); + gtk_signal_connect (GTK_OBJECT (priv->container), "size_allocate", + GTK_SIGNAL_FUNC (container_size_allocate), subwindow); + +} + +GnomeCanvasItem * +e_summary_subwindow_new (GnomeCanvasGroup *parent, + double x, + double y) +{ + GnomeCanvasItem *item; + + item = gnome_canvas_item_new (parent, e_summary_subwindow_get_type (), + "x", x, + "y", y, + NULL); + e_summary_subwindow_construct (item); + + return item; +} + +/* These functions mimic the GtkContainer methods */ + +void +e_summary_subwindow_add (ESummarySubwindow *subwindow, + GtkWidget *widget) +{ + ESummarySubwindowPrivate *priv; + + g_return_if_fail (subwindow != NULL); + g_return_if_fail (IS_E_SUMMARY_SUBWINDOW (subwindow)); + g_return_if_fail (widget != NULL); + g_return_if_fail (GTK_IS_WIDGET (widget)); + + priv = subwindow->private; + + gtk_container_add (GTK_CONTAINER (priv->container), widget); + +} + +void +e_summary_subwindow_remove (ESummarySubwindow *subwindow, + GtkWidget *widget) +{ + ESummarySubwindowPrivate *priv; + + g_return_if_fail (subwindow != NULL); + g_return_if_fail (IS_E_SUMMARY_SUBWINDOW (subwindow)); + g_return_if_fail (widget != NULL); + g_return_if_fail (GTK_IS_WIDGET (widget)); + + priv = subwindow->private; + + gtk_container_remove (GTK_CONTAINER (priv->container), widget); +} + +void +e_summary_subwindow_set_title (ESummarySubwindow *subwindow, + const char *title) +{ + ESummarySubwindowPrivate *priv; + + g_return_if_fail (subwindow != NULL); + g_return_if_fail (IS_E_SUMMARY_SUBWINDOW (subwindow)); + g_return_if_fail (title != NULL); + + priv = subwindow->private; + if (priv->title) + g_free (priv->title); + + priv->title = g_strdup (title); +} |