cheese r624 - in trunk: . data src



Author: dgsiegel
Date: Wed Apr  2 03:59:49 2008
New Revision: 624
URL: http://svn.gnome.org/viewvc/cheese?rev=624&view=rev

Log:
add the gedit warning box when no camera is found, fixes bug #511945, courtesy of sebastian keller


Added:
   trunk/src/cheese-no-camera.c
   trunk/src/cheese-no-camera.h
   trunk/src/gedit-message-area.c
   trunk/src/gedit-message-area.h
Modified:
   trunk/AUTHORS
   trunk/ChangeLog
   trunk/data/cheese.glade
   trunk/data/cheese.ui
   trunk/src/Makefile.am
   trunk/src/cheese-window.c

Modified: trunk/AUTHORS
==============================================================================
--- trunk/AUTHORS	(original)
+++ trunk/AUTHORS	Wed Apr  2 03:59:49 2008
@@ -2,13 +2,14 @@
 
 the following people contributed to cheese:
   - Diego Escalante Urrelo <dieguito gmail com>
-  - Patryk Zawadzki <patrys pld-linux org>
-  - Tim Philipp MÃller <tim centricular net>
-  - Mirco "MacSlow" MÃller <macslow bangang de>
+  - Gintautas Miliauskas <gintas akl lt>
   - Luca Ferretti <elle uca libero it>
+  - Mirco "MacSlow" MÃller <macslow bangang de>
+  - Patryk Zawadzki <patrys pld-linux org>
+  - Sebastian Keller <sebastian-keller gmx de>
   - Steve Magoun <steve magoun canonical com>
+  - Tim Philipp MÃller <tim centricular net>
   - Tommi Vainikainen <thv iki fi>
-  - Gintautas Miliauskas <gintas akl lt>
 
 icon-work
   - cheese icons by Andreas Nilsson <andreas andreasn se>

Modified: trunk/data/cheese.glade
==============================================================================
--- trunk/data/cheese.glade	(original)
+++ trunk/data/cheese.glade	Wed Apr  2 03:59:49 2008
@@ -26,18 +26,37 @@
                 <property name="show_tabs">False</property>
                 <property name="show_border">False</property>
                 <child>
-                  <widget class="GtkAspectFrame" id="video_frame">
+                  <widget class="GtkVBox" id="video_frame_vbox">
                     <property name="visible">True</property>
-                    <property name="label_xalign">0</property>
-                    <property name="shadow_type">GTK_SHADOW_NONE</property>
-                    <property name="ratio">1.3300000429153442</property>
-                    <property name="obey_child">False</property>
                     <child>
-                      <widget class="GtkDrawingArea" id="video_screen">
-                        <property name="width_request">320</property>
-                        <property name="height_request">240</property>
+                      <widget class="GtkAlignment" id="message_area_frame">
+                        <property name="visible">True</property>
+                        <child>
+                          <placeholder/>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="GtkAspectFrame" id="video_frame">
                         <property name="visible">True</property>
+                        <property name="label_xalign">0</property>
+                        <property name="shadow_type">GTK_SHADOW_NONE</property>
+                        <property name="ratio">1.3300000429153442</property>
+                        <property name="obey_child">False</property>
+                        <child>
+                          <widget class="GtkDrawingArea" id="video_screen">
+                            <property name="width_request">320</property>
+                            <property name="height_request">240</property>
+                            <property name="visible">True</property>
+                          </widget>
+                        </child>
                       </widget>
+                      <packing>
+                        <property name="position">1</property>
+                      </packing>
                     </child>
                   </widget>
                   <packing>
@@ -67,6 +86,12 @@
                   </packing>
                 </child>
                 <child>
+                  <placeholder/>
+                  <packing>
+                    <property name="type">tab</property>
+                  </packing>
+                </child>
+                <child>
                   <widget class="GtkAspectFrame" id="throbber_frame">
                     <property name="visible">True</property>
                     <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
@@ -82,6 +107,12 @@
                     <property name="position">2</property>
                   </packing>
                 </child>
+                <child>
+                  <placeholder/>
+                  <packing>
+                    <property name="type">tab</property>
+                  </packing>
+                </child>
               </widget>
             </child>
             <child>

Modified: trunk/data/cheese.ui
==============================================================================
--- trunk/data/cheese.ui	(original)
+++ trunk/data/cheese.ui	Wed Apr  2 03:59:49 2008
@@ -25,18 +25,37 @@
                 <property name="show_tabs">False</property>
                 <property name="show_border">False</property>
                 <child>
-                  <object class="GtkAspectFrame" id="video_frame">
+                  <object class="GtkVBox" id="video_frame_vbox">
                     <property name="visible">True</property>
-                    <property name="label_xalign">0</property>
-                    <property name="shadow_type">GTK_SHADOW_NONE</property>
-                    <property name="ratio">1.3300000429153442</property>
-                    <property name="obey_child">False</property>
                     <child>
-                      <object class="GtkDrawingArea" id="video_screen">
-                        <property name="width_request">320</property>
-                        <property name="height_request">240</property>
+                      <object class="GtkAlignment" id="message_area_frame">
+                        <property name="visible">True</property>
+                        <child>
+                          <placeholder/>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkAspectFrame" id="video_frame">
                         <property name="visible">True</property>
+                        <property name="label_xalign">0</property>
+                        <property name="shadow_type">GTK_SHADOW_NONE</property>
+                        <property name="ratio">1.3300000429153442</property>
+                        <property name="obey_child">False</property>
+                        <child>
+                          <object class="GtkDrawingArea" id="video_screen">
+                            <property name="width_request">320</property>
+                            <property name="height_request">240</property>
+                            <property name="visible">True</property>
+                          </object>
+                        </child>
                       </object>
+                      <packing>
+                        <property name="position">1</property>
+                      </packing>
                     </child>
                   </object>
                 </child>
@@ -56,6 +75,9 @@
                     </child>
                   </object>
                 </child>
+                <child type="tab">
+                  <placeholder/>
+                </child>
                 <child>
                   <object class="GtkAspectFrame" id="throbber_frame">
                     <property name="visible">True</property>
@@ -69,6 +91,9 @@
                     </child>
                   </object>
                 </child>
+                <child type="tab">
+                  <placeholder/>
+                </child>
               </object>
             </child>
             <child>

Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am	(original)
+++ trunk/src/Makefile.am	Wed Apr  2 03:59:49 2008
@@ -31,7 +31,11 @@
 	ephy-spinner.c \
 	ephy-spinner.h \
 	gst-audio-play.c \
-	gst-audio-play.h 
+	gst-audio-play.h \
+  gedit-message-area.c \
+  gedit-message-area.h \
+  no-camera.c \
+  no-camera.h
 
 cheese_LDADD = \
 	$(CHEESE_LIBS)

Added: trunk/src/cheese-no-camera.c
==============================================================================
--- (empty file)
+++ trunk/src/cheese-no-camera.c	Wed Apr  2 03:59:49 2008
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2005 Paolo Maggi
+ * Copyright (C) 2008 Sebastian Keller <sebastian-keller gmx de>
+ * Copyright (C) 2008 daniel g. siegel <dgsiegel gmail com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ *
+ *---------
+ *
+ * Based on gedit-io-error-message-area.c by Paolo Maggi
+ */
+
+#include <gtk/gtk.h>
+#include <glib/gi18n.h>
+
+#include "gedit-message-area.h"
+#include "cheese-no-camera.h"
+
+static void
+cheese_no_camera_set_message_area_text_and_icon (GeditMessageArea *message_area,
+                                                 const gchar      *icon_stock_id,
+                                                 const gchar      *primary_text,
+                                                 const gchar      *secondary_text)
+{
+  GtkWidget *hbox_content;
+  GtkWidget *image;
+  GtkWidget *vbox;
+  gchar *primary_markup;
+  gchar *secondary_markup;
+  GtkWidget *primary_label;
+  GtkWidget *secondary_label;
+
+  hbox_content = gtk_hbox_new (FALSE, 8);
+  gtk_widget_show (hbox_content);
+
+  image = gtk_image_new_from_stock (icon_stock_id, GTK_ICON_SIZE_DIALOG);
+  gtk_widget_show (image);
+  gtk_box_pack_start (GTK_BOX (hbox_content), image, FALSE, FALSE, 0);
+  gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0);
+
+  vbox = gtk_vbox_new (FALSE, 6);
+  gtk_widget_show (vbox);
+  gtk_box_pack_start (GTK_BOX (hbox_content), vbox, TRUE, TRUE, 0);
+
+  primary_markup = g_strdup_printf ("<b>%s</b>", primary_text);
+  primary_label = gtk_label_new (primary_markup);
+  g_free (primary_markup);
+  gtk_widget_show (primary_label);
+  gtk_box_pack_start (GTK_BOX (vbox), primary_label, TRUE, TRUE, 0);
+  gtk_label_set_use_markup (GTK_LABEL (primary_label), TRUE);
+  gtk_label_set_line_wrap (GTK_LABEL (primary_label), TRUE);
+  gtk_misc_set_alignment (GTK_MISC (primary_label), 0, 0.5);
+  GTK_WIDGET_SET_FLAGS (primary_label, GTK_CAN_FOCUS);
+  gtk_label_set_selectable (GTK_LABEL (primary_label), TRUE);
+
+  if (secondary_text != NULL)
+  {
+    secondary_markup = g_strdup_printf ("<small>%s</small>",
+                                        secondary_text);
+    secondary_label = gtk_label_new (secondary_markup);
+    g_free (secondary_markup);
+    gtk_widget_show (secondary_label);
+    gtk_box_pack_start (GTK_BOX (vbox), secondary_label, TRUE, TRUE, 0);
+    GTK_WIDGET_SET_FLAGS (secondary_label, GTK_CAN_FOCUS);
+    gtk_label_set_use_markup (GTK_LABEL (secondary_label), TRUE);
+    gtk_label_set_line_wrap (GTK_LABEL (secondary_label), TRUE);
+    gtk_label_set_selectable (GTK_LABEL (secondary_label), TRUE);
+    gtk_misc_set_alignment (GTK_MISC (secondary_label), 0, 0.5);
+  }
+
+  gedit_message_area_set_contents (GEDIT_MESSAGE_AREA (message_area),
+                                   hbox_content);
+}
+
+GtkWidget *
+cheese_no_camera_message_area ()
+{
+  GtkWidget *message_area;
+
+  message_area = gedit_message_area_new ();
+  cheese_no_camera_set_message_area_text_and_icon (GEDIT_MESSAGE_AREA (message_area),
+                                                   "gtk-dialog-error",
+                                                   _("No camera found!"),
+                                                   _("Please refer to the help for further information."));
+
+  gedit_message_area_add_stock_button_with_text (GEDIT_MESSAGE_AREA (message_area),
+                                                 _("Help"),
+                                                 GTK_STOCK_HELP, GTK_RESPONSE_HELP);
+
+  return message_area;
+}

Added: trunk/src/cheese-no-camera.h
==============================================================================
--- (empty file)
+++ trunk/src/cheese-no-camera.h	Wed Apr  2 03:59:49 2008
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2008 Sebastian Keller <sebastian-keller gmx de>
+ * Copyright (C) 2008 daniel g. siegel <dgsiegel gmail com>
+ *
+ * Licensed under the GNU General Public License Version 2
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __CHEESE_NO_CAMERA_H__
+#define __CHEESE_NO_CAMERA_H__
+
+G_BEGIN_DECLS
+
+GtkWidget* cheese_no_camera_message_area (void);
+
+G_END_DECLS
+
+#endif  /* __CHEESE_NO_CAMERA_H__  */

Modified: trunk/src/cheese-window.c
==============================================================================
--- trunk/src/cheese-window.c	(original)
+++ trunk/src/cheese-window.c	Wed Apr  2 03:59:49 2008
@@ -47,6 +47,8 @@
 #include "cheese-window.h"
 #include "ephy-spinner.h"
 #include "gst-audio-play.h"
+#include "gedit-message-area.h"
+#include "cheese-no-camera.h"
 
 #define SHUTTER_SOUNDS 5
 
@@ -83,6 +85,8 @@
   GtkWidget *throbber;
   GtkWidget *countdown_frame;
   GtkWidget *countdown;
+  GtkWidget *message_area_frame;
+  GtkWidget *message_area;
 
   GtkWidget *button_effects;
   GtkWidget *button_photo;
@@ -821,6 +825,30 @@
 }
 
 static void
+cheese_window_no_camera_message_area_response (GtkWidget *widget, gint response_id, GtkWidget *cheese_window)
+{
+  GError *error = NULL;
+  gboolean ret;
+
+  if (response_id == GTK_RESPONSE_HELP)
+  {
+    ret = g_app_info_launch_default_for_uri ("ghelp:cheese?faq", NULL, &error);
+
+    if (ret == FALSE) 
+    {
+      GtkWidget *d;
+      d = gtk_message_dialog_new (GTK_WINDOW (cheese_window->window), 
+                                  GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                  GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, 
+                                  _("Unable to open help file for Cheese"));
+      gtk_dialog_run(GTK_DIALOG(d));
+      gtk_widget_destroy(d);
+      g_error_free(error);
+    }
+  }
+}
+
+static void
 cheese_window_stop_recording (CheeseWindow *cheese_window)
 {
   if (cheese_window->recording)
@@ -1027,6 +1055,25 @@
 }
 
 static void
+cheese_window_set_message_area (CheeseWindow *cheese_window,
+                                GtkWidget *message_area)
+{
+  if (cheese_window->message_area == message_area)
+    return;
+
+  if (cheese_window->message_area != NULL)
+    gtk_widget_destroy (cheese_window->message_area);
+
+  cheese_window->message_area = message_area;
+
+  if (message_area == NULL)
+    return;
+
+  gtk_container_add (GTK_CONTAINER (cheese_window->message_area_frame), cheese_window->message_area);
+  gtk_widget_show (GTK_WIDGET(cheese_window->message_area));
+}
+
+static void
 cheese_window_create_window (CheeseWindow *cheese_window)
 {
   GError *error=NULL;
@@ -1041,6 +1088,8 @@
   GtkWidget *menubar;
 #endif
 
+  cheese_window->message_area = NULL;
+
   builder = gtk_builder_new ();
   gtk_builder_add_from_file (builder, PACKAGE_DATADIR"/cheese.ui", &error);
 
@@ -1069,6 +1118,7 @@
   cheese_window->throbber_frame     = GTK_WIDGET (gtk_builder_get_object (builder, "throbber_frame"));
   cheese_window->countdown_frame    = GTK_WIDGET (gtk_builder_get_object (builder, "countdown_frame"));
   cheese_window->effect_frame       = GTK_WIDGET (gtk_builder_get_object (builder, "effect_frame"));
+  cheese_window->message_area_frame = GTK_WIDGET (gtk_builder_get_object (builder, "message_area_frame"));
 
 #ifdef HILDON
   /* Reparent widgets in case we use hildon. This saves us maintaining two
@@ -1252,6 +1302,7 @@
 setup_camera (CheeseWindow *cheese_window)
 {
   char *webcam_device = NULL;
+  GtkWidget *message_area;
 
   g_object_get (cheese_window->gconf, "gconf_prop_webcam", &webcam_device, NULL);
 
@@ -1272,6 +1323,17 @@
   gdk_threads_enter ();
   gtk_notebook_set_current_page (GTK_NOTEBOOK(cheese_window->notebook), 0);
   ephy_spinner_stop (EPHY_SPINNER (cheese_window->throbber));
+  if (cheese_webcam_get_num_webcam_devices (cheese_window->webcam) == 0)
+  {
+    message_area = cheese_no_camera_message_area();
+
+    g_signal_connect (message_area,
+                      "response",
+                      G_CALLBACK (cheese_window_no_camera_message_area_response),
+                      cheese_window);
+
+    cheese_window_set_message_area (cheese_window, message_area);
+  }
   gdk_threads_leave ();
   gtk_widget_set_sensitive (GTK_WIDGET (cheese_window->take_picture), TRUE);
 }

Added: trunk/src/gedit-message-area.c
==============================================================================
--- (empty file)
+++ trunk/src/gedit-message-area.c	Wed Apr  2 03:59:49 2008
@@ -0,0 +1,537 @@
+/*
+ * gedit-message-area.c
+ * This file is part of gedit
+ *
+ * Copyright (C) 2005 - Paolo Maggi
+ *
+ * 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.
+ */
+
+/*
+ * Modified by the gedit Team, 2005. See the AUTHORS file for a
+ * list of people on the gedit Team.
+ * See the ChangeLog files for a list of changes.
+ *
+ * $Id: gedit-message-area.c 5887 2007-09-07 07:20:19Z pborelli $
+ */
+
+/* TODO: Style properties */
+
+
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
+
+#include "gedit-message-area.h"
+
+#define GEDIT_MESSAGE_AREA_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), \
+                                                                            GEDIT_TYPE_MESSAGE_AREA, \
+                                                                            GeditMessageAreaPrivate))
+
+struct _GeditMessageAreaPrivate
+{
+  GtkWidget *main_hbox;
+
+  GtkWidget *contents;
+  GtkWidget *action_area;
+
+  gboolean changing_style;
+};
+
+typedef struct _ResponseData ResponseData;
+
+struct _ResponseData
+{
+  gint response_id;
+};
+
+enum {
+  RESPONSE,
+  CLOSE,
+  LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
+
+G_DEFINE_TYPE(GeditMessageArea, gedit_message_area, GTK_TYPE_HBOX)
+
+
+static void
+gedit_message_area_finalize (GObject *object)
+{
+  /*
+     GeditMessageArea *message_area = GEDIT_MESSAGE_AREA (object);
+     */
+
+  G_OBJECT_CLASS (gedit_message_area_parent_class)->finalize (object);
+}
+
+static ResponseData *
+get_response_data (GtkWidget *widget,
+                   gboolean   create)
+{
+  ResponseData *ad = g_object_get_data (G_OBJECT (widget),
+                                        "gedit-message-area-response-data");
+
+  if (ad == NULL && create)
+  {
+    ad = g_new (ResponseData, 1);
+
+    g_object_set_data_full (G_OBJECT (widget),
+                            "gedit-message-area-response-data",
+                            ad,
+                            g_free);
+  }
+
+  return ad;
+}
+
+static GtkWidget *
+find_button (GeditMessageArea *message_area,
+             gint              response_id)
+{
+  GList *children, *tmp_list;
+  GtkWidget *child = NULL;
+
+  children = gtk_container_get_children (
+                                         GTK_CONTAINER (message_area->priv->action_area));
+
+  for (tmp_list = children; tmp_list; tmp_list = tmp_list->next)
+  {
+    ResponseData *rd = get_response_data (tmp_list->data, FALSE);
+
+    if (rd && rd->response_id == response_id)
+    {
+      child = tmp_list->data;
+      break;
+    }
+  }
+
+  g_list_free (children);
+
+  return child;
+}
+
+static void
+gedit_message_area_close (GeditMessageArea *message_area)
+{
+  if (!find_button (message_area, GTK_RESPONSE_CANCEL))
+    return;
+
+  /* emit response signal */
+  gedit_message_area_response (GEDIT_MESSAGE_AREA (message_area),
+                               GTK_RESPONSE_CANCEL);
+}
+
+static gboolean
+paint_message_area (GtkWidget      *widget,
+                    GdkEventExpose *event,
+                    gpointer        user_data)
+{
+  gtk_paint_flat_box (widget->style,
+                      widget->window,
+                      GTK_STATE_NORMAL,
+                      GTK_SHADOW_OUT,
+                      NULL,
+                      widget,
+                      "tooltip",
+                      widget->allocation.x + 1,
+                      widget->allocation.y + 1,
+                      widget->allocation.width - 2,
+                      widget->allocation.height - 2);
+
+  return FALSE;
+}
+
+static void
+gedit_message_area_class_init (GeditMessageAreaClass *klass)
+{
+  GObjectClass *object_class;
+  GtkBindingSet *binding_set;
+
+  object_class = G_OBJECT_CLASS (klass);
+  object_class->finalize = gedit_message_area_finalize;
+
+  klass->close = gedit_message_area_close;
+
+  g_type_class_add_private (object_class, sizeof(GeditMessageAreaPrivate));
+
+  signals[RESPONSE] = g_signal_new ("response",
+                                    G_OBJECT_CLASS_TYPE (klass),
+                                    G_SIGNAL_RUN_LAST,
+                                    G_STRUCT_OFFSET (GeditMessageAreaClass, response),
+                                    NULL, NULL,
+                                    g_cclosure_marshal_VOID__INT,
+                                    G_TYPE_NONE, 1,
+                                    G_TYPE_INT);
+
+  signals[CLOSE] =  g_signal_new ("close",
+                                  G_OBJECT_CLASS_TYPE (klass),
+                                  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                                  G_STRUCT_OFFSET (GeditMessageAreaClass, close),
+                                  NULL, NULL,
+                                  g_cclosure_marshal_VOID__VOID,
+                                  G_TYPE_NONE, 0);
+
+  binding_set = gtk_binding_set_by_class (klass);
+
+  gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0, "close", 0);
+}
+
+static void
+style_set (GtkWidget        *widget,
+           GtkStyle         *prev_style,
+           GeditMessageArea *message_area)
+{
+  GtkWidget *window;
+  GtkStyle *style;
+
+  if (message_area->priv->changing_style)
+    return;
+
+  /* This is a hack needed to use the tooltip background color */
+  window = gtk_window_new (GTK_WINDOW_POPUP);
+  gtk_widget_set_name (window, "gtk-tooltip");
+  gtk_widget_ensure_style (window);
+  style = gtk_widget_get_style (window);
+
+  message_area->priv->changing_style = TRUE;
+  gtk_widget_set_style (GTK_WIDGET (message_area), style);
+  message_area->priv->changing_style = FALSE;
+
+  gtk_widget_destroy (window);
+
+  gtk_widget_queue_draw (GTK_WIDGET (message_area));
+}
+
+static void
+gedit_message_area_init (GeditMessageArea *message_area)
+{
+  message_area->priv = GEDIT_MESSAGE_AREA_GET_PRIVATE (message_area);
+
+  message_area->priv->main_hbox = gtk_hbox_new (FALSE, 16); /* FIXME: use style properties */
+  gtk_widget_show (message_area->priv->main_hbox);
+  gtk_container_set_border_width (GTK_CONTAINER (message_area->priv->main_hbox),
+                                  8); /* FIXME: use style properties */
+
+  message_area->priv->action_area = gtk_vbox_new (TRUE, 10); /* FIXME: use style properties */
+  gtk_widget_show (message_area->priv->action_area);
+  gtk_box_pack_end (GTK_BOX (message_area->priv->main_hbox),
+                    message_area->priv->action_area,
+                    FALSE,
+                    TRUE,
+                    0);
+
+  gtk_box_pack_start (GTK_BOX (message_area),
+                      message_area->priv->main_hbox,
+                      TRUE,
+                      TRUE,
+                      0);
+
+  gtk_widget_set_app_paintable (GTK_WIDGET (message_area), TRUE);
+
+  g_signal_connect (message_area,
+                    "expose-event",
+                    G_CALLBACK (paint_message_area),
+                    NULL);
+
+  /* Note that we connect to style-set on one of the internal
+   * widgets, not on the message area itself, since gtk does
+   * not deliver any further style-set signals for a widget on
+   * which the style has been forced with gtk_widget_set_style() */
+  g_signal_connect (message_area->priv->main_hbox,
+                    "style-set",
+                    G_CALLBACK (style_set),
+                    message_area);
+}
+
+static gint
+get_response_for_widget (GeditMessageArea *message_area,
+                         GtkWidget        *widget)
+{
+  ResponseData *rd;
+
+  rd = get_response_data (widget, FALSE);
+  if (!rd)
+    return GTK_RESPONSE_NONE;
+  else
+    return rd->response_id;
+}
+
+static void
+action_widget_activated (GtkWidget *widget, GeditMessageArea *message_area)
+{
+  gint response_id;
+
+  response_id = get_response_for_widget (message_area, widget);
+
+  gedit_message_area_response (message_area, response_id);
+}
+
+void
+gedit_message_area_add_action_widget (GeditMessageArea *message_area,
+                                      GtkWidget        *child,
+                                      gint              response_id)
+{
+  ResponseData *ad;
+  guint signal_id;
+
+  g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
+  g_return_if_fail (GTK_IS_WIDGET (child));
+
+  ad = get_response_data (child, TRUE);
+
+  ad->response_id = response_id;
+
+  if (GTK_IS_BUTTON (child))
+    signal_id = g_signal_lookup ("clicked", GTK_TYPE_BUTTON);
+  else
+    signal_id = GTK_WIDGET_GET_CLASS (child)->activate_signal;
+
+  if (signal_id)
+  {
+    GClosure *closure;
+
+    closure = g_cclosure_new_object (G_CALLBACK (action_widget_activated),
+                                     G_OBJECT (message_area));
+
+    g_signal_connect_closure_by_id (child,
+                                    signal_id,
+                                    0,
+                                    closure,
+                                    FALSE);
+  }
+  else
+    g_warning ("Only 'activatable' widgets can be packed into the action area of a GeditMessageArea");
+
+  if (response_id != GTK_RESPONSE_HELP)
+    gtk_box_pack_start (GTK_BOX (message_area->priv->action_area),
+                        child,
+                        FALSE,
+                        FALSE,
+                        0);
+  else
+    gtk_box_pack_end (GTK_BOX (message_area->priv->action_area),
+                      child,
+                      FALSE,
+                      FALSE,
+                      0);
+}
+
+void
+gedit_message_area_set_contents	(GeditMessageArea *message_area,
+                                 GtkWidget        *contents)
+{
+  g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
+  g_return_if_fail (GTK_IS_WIDGET (contents));
+
+  message_area->priv->contents = contents;
+  gtk_box_pack_start (GTK_BOX (message_area->priv->main_hbox),
+                      message_area->priv->contents,
+                      TRUE,
+                      TRUE,
+                      0);
+}
+
+GtkWidget*
+gedit_message_area_add_button (GeditMessageArea *message_area,
+                               const gchar      *button_text,
+                               gint              response_id)
+{
+  GtkWidget *button;
+
+  g_return_val_if_fail (GEDIT_IS_MESSAGE_AREA (message_area), NULL);
+  g_return_val_if_fail (button_text != NULL, NULL);
+
+  button = gtk_button_new_from_stock (button_text);
+
+  GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+
+  gtk_widget_show (button);
+
+  gedit_message_area_add_action_widget (message_area,
+                                        button,
+                                        response_id);
+
+  return button;
+}
+
+static void
+add_buttons_valist (GeditMessageArea *message_area,
+                    const gchar      *first_button_text,
+                    va_list           args)
+{
+  const gchar* text;
+  gint response_id;
+
+  g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
+
+  if (first_button_text == NULL)
+    return;
+
+  text = first_button_text;
+  response_id = va_arg (args, gint);
+
+  while (text != NULL)
+  {
+    gedit_message_area_add_button (message_area,
+                                   text,
+                                   response_id);
+
+    text = va_arg (args, gchar*);
+    if (text == NULL)
+      break;
+
+    response_id = va_arg (args, int);
+  }
+}
+
+void
+gedit_message_area_add_buttons (GeditMessageArea *message_area,
+                                const gchar      *first_button_text,
+                                ...)
+{
+  va_list args;
+
+  va_start (args, first_button_text);
+
+  add_buttons_valist (message_area,
+                      first_button_text,
+                      args);
+
+  va_end (args);
+}
+
+GtkWidget *
+gedit_message_area_new (void)
+{
+  return g_object_new (GEDIT_TYPE_MESSAGE_AREA, NULL);
+}
+
+GtkWidget *
+gedit_message_area_new_with_buttons (const gchar *first_button_text,
+                                     ...)
+{
+  GeditMessageArea *message_area;
+  va_list args;
+
+  message_area = GEDIT_MESSAGE_AREA (gedit_message_area_new ());
+
+  va_start (args, first_button_text);
+
+  add_buttons_valist (message_area,
+                      first_button_text,
+                      args);
+
+  va_end (args);
+
+  return GTK_WIDGET (message_area);
+}
+
+void
+gedit_message_area_set_response_sensitive (GeditMessageArea *message_area,
+                                           gint              response_id,
+                                           gboolean          setting)
+{
+  GList *children;
+  GList *tmp_list;
+
+  g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
+
+  children = gtk_container_get_children (GTK_CONTAINER (message_area->priv->action_area));
+
+  tmp_list = children;
+  while (tmp_list != NULL)
+  {
+    GtkWidget *widget = tmp_list->data;
+    ResponseData *rd = get_response_data (widget, FALSE);
+
+    if (rd && rd->response_id == response_id)
+      gtk_widget_set_sensitive (widget, setting);
+
+    tmp_list = g_list_next (tmp_list);
+  }
+
+  g_list_free (children);
+}
+
+void
+gedit_message_area_set_default_response (GeditMessageArea *message_area,
+                                         gint              response_id)
+{
+  GList *children;
+  GList *tmp_list;
+
+  g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
+
+  children = gtk_container_get_children (GTK_CONTAINER (message_area->priv->action_area));
+
+  tmp_list = children;
+  while (tmp_list != NULL)
+  {
+    GtkWidget *widget = tmp_list->data;
+    ResponseData *rd = get_response_data (widget, FALSE);
+
+    if (rd && rd->response_id == response_id)
+      gtk_widget_grab_default (widget);
+
+    tmp_list = g_list_next (tmp_list);
+  }
+
+  g_list_free (children);
+}
+
+void
+gedit_message_area_response (GeditMessageArea *message_area,
+                             gint              response_id)
+{
+  g_return_if_fail (GEDIT_IS_MESSAGE_AREA (message_area));
+
+  g_signal_emit (message_area,
+                 signals[RESPONSE],
+                 0,
+                 response_id);
+}
+
+GtkWidget *
+gedit_message_area_add_stock_button_with_text (GeditMessageArea *message_area,
+                                               const gchar      *text,
+                                               const gchar      *stock_id,
+                                               gint              response_id)
+{
+  GtkWidget *button;
+
+  g_return_val_if_fail (GEDIT_IS_MESSAGE_AREA (message_area), NULL);
+  g_return_val_if_fail (text != NULL, NULL);
+  g_return_val_if_fail (stock_id != NULL, NULL);
+
+  button = gtk_button_new_with_mnemonic (text);
+  gtk_button_set_image (GTK_BUTTON (button),
+                        gtk_image_new_from_stock (stock_id,
+                                                  GTK_ICON_SIZE_BUTTON));
+
+  GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+
+  gtk_widget_show (button);
+
+  gedit_message_area_add_action_widget (message_area,
+                                        button,
+                                        response_id);
+
+  return button;
+}
+

Added: trunk/src/gedit-message-area.h
==============================================================================
--- (empty file)
+++ trunk/src/gedit-message-area.h	Wed Apr  2 03:59:49 2008
@@ -0,0 +1,129 @@
+/*
+ * gedit-message-area.h
+ * This file is part of gedit
+ *
+ * Copyright (C) 2005 - Paolo Maggi 
+ *
+ * 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.
+ */
+ 
+/*
+ * Modified by the gedit Team, 2005. See the AUTHORS file for a 
+ * list of people on the gedit Team.  
+ * See the ChangeLog files for a list of changes. 
+ *
+ * $Id: gedit-message-area.h 6138 2008-02-01 14:32:22Z icq $
+ */
+
+#ifndef __GEDIT_MESSAGE_AREA_H__
+#define __GEDIT_MESSAGE_AREA_H__
+
+#include <gtk/gtkhbox.h>
+
+G_BEGIN_DECLS
+
+/*
+ * Type checking and casting macros
+ */
+#define GEDIT_TYPE_MESSAGE_AREA              (gedit_message_area_get_type())
+#define GEDIT_MESSAGE_AREA(obj)              (G_TYPE_CHECK_INSTANCE_CAST((obj), GEDIT_TYPE_MESSAGE_AREA, GeditMessageArea))
+#define GEDIT_MESSAGE_AREA_CLASS(klass)      (G_TYPE_CHECK_CLASS_CAST((klass), GEDIT_TYPE_MESSAGE_AREA, GeditMessageAreaClass))
+#define GEDIT_IS_MESSAGE_AREA(obj)           (G_TYPE_CHECK_INSTANCE_TYPE((obj), GEDIT_TYPE_MESSAGE_AREA))
+#define GEDIT_IS_MESSAGE_AREA_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), GEDIT_TYPE_MESSAGE_AREA))
+#define GEDIT_MESSAGE_AREA_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS((obj), GEDIT_TYPE_MESSAGE_AREA, GeditMessageAreaClass))
+
+/* Private structure type */
+typedef struct _GeditMessageAreaPrivate GeditMessageAreaPrivate;
+
+/*
+ * Main object structure
+ */
+typedef struct _GeditMessageArea GeditMessageArea;
+
+struct _GeditMessageArea 
+{
+	GtkHBox parent;
+
+	/*< private > */
+	GeditMessageAreaPrivate *priv;
+};
+
+/*
+ * Class definition
+ */
+typedef struct _GeditMessageAreaClass GeditMessageAreaClass;
+
+struct _GeditMessageAreaClass 
+{
+	GtkHBoxClass parent_class;
+
+	/* Signals */
+	void (* response) (GeditMessageArea *message_area, gint response_id);
+
+	/* Keybinding signals */
+	void (* close)    (GeditMessageArea *message_area);
+
+	/* Padding for future expansion */
+	void (*_gedit_reserved1) (void);
+	void (*_gedit_reserved2) (void);	
+};
+
+/*
+ * Public methods
+ */
+GType 		 gedit_message_area_get_type 		(void) G_GNUC_CONST;
+
+GtkWidget	*gedit_message_area_new      		(void);
+
+GtkWidget	*gedit_message_area_new_with_buttons	(const gchar      *first_button_text,
+                                        		 ...);
+
+void		 gedit_message_area_set_contents	(GeditMessageArea *message_area,
+                                             		 GtkWidget        *contents);
+                              		 
+void		 gedit_message_area_add_action_widget	(GeditMessageArea *message_area,
+                                         		 GtkWidget        *child,
+                                         		 gint              response_id);
+                                         		 
+GtkWidget	*gedit_message_area_add_button        	(GeditMessageArea *message_area,
+                                         		 const gchar      *button_text,
+                                         		 gint              response_id);
+             		 
+GtkWidget	*gedit_message_area_add_stock_button_with_text 
+							(GeditMessageArea *message_area, 
+				    			 const gchar      *text, 
+				    			 const gchar      *stock_id, 
+				    			 gint              response_id);
+
+void       	 gedit_message_area_add_buttons 	(GeditMessageArea *message_area,
+                                         		 const gchar      *first_button_text,
+                                         		 ...);
+
+void		 gedit_message_area_set_response_sensitive 
+							(GeditMessageArea *message_area,
+                                        		 gint              response_id,
+                                        		 gboolean          setting);
+void 		 gedit_message_area_set_default_response 
+							(GeditMessageArea *message_area,
+                                        		 gint              response_id);
+
+/* Emit response signal */
+void		 gedit_message_area_response           	(GeditMessageArea *message_area,
+                                    			 gint              response_id);
+
+G_END_DECLS
+
+#endif  /* __GEDIT_MESSAGE_AREA_H__  */



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