Blame gladeui/glade-editor.c

Packit 1e8aac
/*
Packit 1e8aac
 * Copyright (C) 2001 Ximian, Inc.
Packit 1e8aac
 *
Packit 1e8aac
 * This program is free software; you can redistribute it and/or modify
Packit 1e8aac
 * it under the terms of the GNU General Public License as
Packit 1e8aac
 * published by the Free Software Foundation; either version 2 of the
Packit 1e8aac
 * License, or (at your option) any later version.
Packit 1e8aac
 *
Packit 1e8aac
 * This program is distributed in the hope that it will be useful,
Packit 1e8aac
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 1e8aac
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 1e8aac
 * GNU General Public License for more details.
Packit 1e8aac
 *
Packit 1e8aac
 * You should have received a copy of the GNU General Public License
Packit 1e8aac
 * along with this program; if not, write to the Free Software
Packit 1e8aac
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 1e8aac
 *
Packit 1e8aac
 * Authors:
Packit 1e8aac
 *   Chema Celorio <chema@celorio.com>
Packit 1e8aac
 *   Tristan Van Berkom <tvb@gnome.org>
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
#ifdef HAVE_CONFIG_H
Packit 1e8aac
#include <config.h>
Packit 1e8aac
#endif
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * SECTION:glade-editor
Packit 1e8aac
 * @Short_Description: A Widget to edit a #GladeWidget.
Packit 1e8aac
 *
Packit 1e8aac
 * This is the Glade Notebook containing all the controls needed to configure a #GladeWidget.
Packit 1e8aac
 */
Packit 1e8aac
Packit 1e8aac
#include <stdio.h>
Packit 1e8aac
#include <string.h>
Packit 1e8aac
#include <glib/gi18n-lib.h>
Packit 1e8aac
Packit 1e8aac
#include <gtk/gtk.h>
Packit 1e8aac
Packit 1e8aac
#include "glade.h"
Packit 1e8aac
#include "glade-widget.h"
Packit 1e8aac
#include "glade-widget-adaptor.h"
Packit 1e8aac
#include "glade-editor.h"
Packit 1e8aac
#include "glade-signal-editor.h"
Packit 1e8aac
#include "glade-property.h"
Packit 1e8aac
#include "glade-property-class.h"
Packit 1e8aac
#include "glade-command.h"
Packit 1e8aac
#include "glade-debug.h"
Packit 1e8aac
#include "glade-marshallers.h"
Packit 1e8aac
#include "glade-project.h"
Packit 1e8aac
#include "glade-utils.h"
Packit 1e8aac
#include "glade-editor-property.h"
Packit 1e8aac
Packit 1e8aac
static void glade_editor_switch_page (GtkNotebook     *notebook,
Packit 1e8aac
				      GtkWidget       *page,
Packit 1e8aac
				      guint            page_num,
Packit 1e8aac
				      GladeEditor     *editor);
Packit 1e8aac
Packit 1e8aac
enum
Packit 1e8aac
{
Packit 1e8aac
  PROP_0,
Packit 1e8aac
  PROP_SHOW_INFO,
Packit 1e8aac
  PROP_WIDGET,
Packit 1e8aac
  PROP_SHOW_CLASS_FIELD,
Packit 1e8aac
  PROP_CLASS_FIELD,
Packit 1e8aac
  PROP_SHOW_BORDER,
Packit 1e8aac
  N_PROPERTIES
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
#define GLADE_EDITOR_PRIVATE(object) (((GladeEditor*)object)->priv)
Packit 1e8aac
Packit 1e8aac
struct _GladeEditorPrivate
Packit 1e8aac
{
Packit 1e8aac
Packit 1e8aac
  GtkWidget *notebook; /* The notebook widget */
Packit 1e8aac
Packit 1e8aac
  GladeWidget *loaded_widget; /* A handy pointer to the GladeWidget
Packit 1e8aac
			       * that is loaded in the editor. NULL
Packit 1e8aac
			       * if no widgets are selected
Packit 1e8aac
			       */
Packit 1e8aac
Packit 1e8aac
  GladeWidgetAdaptor *loaded_adaptor; /* A pointer to the loaded
Packit 1e8aac
				       * GladeWidgetAdaptor. Note that we can
Packit 1e8aac
				       * have a class loaded without a
Packit 1e8aac
				       * loaded_widget. For this reason we
Packit 1e8aac
				       * can't use loaded_widget->adaptor.
Packit 1e8aac
				       * When a widget is selected we load
Packit 1e8aac
				       * this class in the editor first and
Packit 1e8aac
				       * then fill the values of the inputs
Packit 1e8aac
				       * with the GladeProperty items.
Packit 1e8aac
				       * This is usefull for not having
Packit 1e8aac
				       * to redraw/container_add the widgets
Packit 1e8aac
				       * when we switch from widgets of the
Packit 1e8aac
				       * same class
Packit 1e8aac
				       */
Packit 1e8aac
Packit 1e8aac
  GtkWidget *page_widget;
Packit 1e8aac
  GtkWidget *page_packing;
Packit 1e8aac
  GtkWidget *page_common;
Packit 1e8aac
  GtkWidget *page_atk;
Packit 1e8aac
Packit 1e8aac
  GladeSignalEditor *signal_editor; /* The signal editor packed into vbox_signals
Packit 1e8aac
				     */
Packit 1e8aac
Packit 1e8aac
  GList *editables;     /* A list of GladeEditables. We have a widget
Packit 1e8aac
			 * for each GladeWidgetAdaptor and we only load
Packit 1e8aac
			 * them on demand
Packit 1e8aac
			 */
Packit 1e8aac
	
Packit 1e8aac
  GtkWidget *packing_page; /* Packing pages are dynamicly created each
Packit 1e8aac
			    * selection, this pointer is only to free
Packit 1e8aac
			    * the last packing page.
Packit 1e8aac
			    */
Packit 1e8aac
  
Packit 1e8aac
  gboolean loading; /* Use when loading a GladeWidget into the editor
Packit 1e8aac
		     * we set this flag so that we can ignore the
Packit 1e8aac
		     * "changed" signal of the name entry text since
Packit 1e8aac
		     * the name has not really changed, just a new name
Packit 1e8aac
		     * was loaded.
Packit 1e8aac
		     */
Packit 1e8aac
Packit 1e8aac
  gulong project_closed_signal_id; /* Unload widget when widget's project closes  */
Packit 1e8aac
  gulong project_removed_signal_id; /* Unload widget when its removed from the project. */
Packit 1e8aac
  gulong widget_warning_id; /* Update when widget changes warning messages. */
Packit 1e8aac
  gulong widget_name_id;    /* Update class field when widget name changes  */
Packit 1e8aac
Packit 1e8aac
  GtkWidget *class_field; /* The class header */
Packit 1e8aac
Packit 1e8aac
  GtkWidget *warning;   /* A pointer to an icon we can show in the class
Packit 1e8aac
			 * field to publish tooltips for class related
Packit 1e8aac
			 * versioning errors.
Packit 1e8aac
			 */
Packit 1e8aac
Packit 1e8aac
  GtkWidget *class_icon; /* An image with the current widget's class icon.  */
Packit 1e8aac
  GtkWidget *class_label; /* A label with the current class label. */
Packit 1e8aac
Packit 1e8aac
  gboolean show_class_field; /* Whether or not to show the class field at the top */
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
G_DEFINE_TYPE_WITH_PRIVATE (GladeEditor, glade_editor, GTK_TYPE_BOX);
Packit 1e8aac
Packit 1e8aac
static GParamSpec *properties[N_PROPERTIES];
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_set_property (GObject      *object,
Packit 1e8aac
                           guint         prop_id,
Packit 1e8aac
                           const GValue *value,
Packit 1e8aac
                           GParamSpec   *pspec)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditor *editor = GLADE_EDITOR (object);
Packit 1e8aac
Packit 1e8aac
  switch (prop_id)
Packit 1e8aac
    {
Packit 1e8aac
      case PROP_SHOW_INFO:
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_WIDGET:
Packit 1e8aac
        glade_editor_load_widget (editor,
Packit 1e8aac
                                  GLADE_WIDGET (g_value_get_object (value)));
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_SHOW_CLASS_FIELD:
Packit 1e8aac
        if (g_value_get_boolean (value))
Packit 1e8aac
          glade_editor_show_class_field (editor);
Packit 1e8aac
        else
Packit 1e8aac
          glade_editor_hide_class_field (editor);
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_SHOW_BORDER:
Packit 1e8aac
        gtk_notebook_set_show_border (GTK_NOTEBOOK (editor->priv->notebook),
Packit 1e8aac
                                      g_value_get_boolean (value));
Packit 1e8aac
        break;
Packit 1e8aac
      default:
Packit 1e8aac
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_get_property (GObject    *object,
Packit 1e8aac
                           guint       prop_id,
Packit 1e8aac
                           GValue     *value,
Packit 1e8aac
                           GParamSpec *pspec)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditor *editor = GLADE_EDITOR (object);
Packit 1e8aac
Packit 1e8aac
  switch (prop_id)
Packit 1e8aac
    {
Packit 1e8aac
      case PROP_SHOW_INFO:
Packit 1e8aac
        g_value_set_boolean (value, FALSE);
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_WIDGET:
Packit 1e8aac
        g_value_set_object (value, editor->priv->loaded_widget);
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_SHOW_CLASS_FIELD:
Packit 1e8aac
        g_value_set_boolean (value, editor->priv->show_class_field);
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_CLASS_FIELD:
Packit 1e8aac
        g_value_set_static_string (value, gtk_label_get_label (GTK_LABEL (editor->priv->class_label)));
Packit 1e8aac
        break;
Packit 1e8aac
      case PROP_SHOW_BORDER:
Packit 1e8aac
        g_value_set_boolean (value, gtk_notebook_get_show_border (GTK_NOTEBOOK (editor->priv->notebook)));
Packit 1e8aac
        break;
Packit 1e8aac
      default:
Packit 1e8aac
        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_dispose (GObject *object)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (object);
Packit 1e8aac
  GladeEditor *editor = GLADE_EDITOR (object);
Packit 1e8aac
Packit 1e8aac
  glade_editor_load_widget (editor, NULL);
Packit 1e8aac
Packit 1e8aac
  /* Unref all the cached pages */
Packit 1e8aac
  g_list_foreach (priv->editables, (GFunc) g_object_unref, NULL);
Packit 1e8aac
  priv->editables = (g_list_free (priv->editables), NULL);
Packit 1e8aac
Packit 1e8aac
  G_OBJECT_CLASS (glade_editor_parent_class)->dispose (object);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_class_init (GladeEditorClass *klass)
Packit 1e8aac
{
Packit 1e8aac
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 1e8aac
  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
Packit 1e8aac
Packit 1e8aac
  object_class->dispose      = glade_editor_dispose;
Packit 1e8aac
  object_class->set_property = glade_editor_set_property;
Packit 1e8aac
  object_class->get_property = glade_editor_get_property;
Packit 1e8aac
Packit 1e8aac
  /* Properties */
Packit 1e8aac
  properties[PROP_SHOW_INFO] =
Packit 1e8aac
    g_param_spec_boolean ("show-info",
Packit 1e8aac
                          _("Show info"),
Packit 1e8aac
                          _("Whether to show an informational "
Packit 1e8aac
                            "button for the loaded widget"),
Packit 1e8aac
                          FALSE,
Packit 1e8aac
                          G_PARAM_READABLE | G_PARAM_DEPRECATED);
Packit 1e8aac
Packit 1e8aac
  properties[PROP_WIDGET] =
Packit 1e8aac
    g_param_spec_object ("widget",
Packit 1e8aac
                         _("Widget"),
Packit 1e8aac
                         _("The currently loaded widget in this editor"),
Packit 1e8aac
                         GLADE_TYPE_WIDGET,
Packit 1e8aac
                         G_PARAM_READWRITE);
Packit 1e8aac
Packit 1e8aac
  properties[PROP_SHOW_CLASS_FIELD] =
Packit 1e8aac
    g_param_spec_boolean ("show-class-field",
Packit 1e8aac
                          _("Show Class Field"),
Packit 1e8aac
                          _("Whether to show the class field at the top"),
Packit 1e8aac
                          TRUE,
Packit 1e8aac
                          G_PARAM_READWRITE);
Packit 1e8aac
Packit 1e8aac
  properties[PROP_CLASS_FIELD] =
Packit 1e8aac
    g_param_spec_string ("class-field",
Packit 1e8aac
                         _("Class Field"),
Packit 1e8aac
                         _("The class field string"),
Packit 1e8aac
                         NULL,
Packit 1e8aac
                         G_PARAM_READABLE);
Packit 1e8aac
  properties[PROP_SHOW_BORDER] =
Packit 1e8aac
    g_param_spec_boolean ("show-boder",
Packit 1e8aac
                          _("Show Border"),
Packit 1e8aac
                          _("Whether the border should be shown"),
Packit 1e8aac
                          TRUE,
Packit 1e8aac
                          G_PARAM_READWRITE);
Packit 1e8aac
  
Packit 1e8aac
  /* Install all properties */
Packit 1e8aac
  g_object_class_install_properties (object_class, N_PROPERTIES, properties);
Packit 1e8aac
Packit 1e8aac
  /* Bind to template */
Packit 1e8aac
  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/gladeui/glade-editor.ui");
Packit 1e8aac
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, notebook);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, page_widget);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, page_packing);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, page_common);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, page_atk);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, class_field);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, class_icon);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, class_label);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, warning);
Packit 1e8aac
  gtk_widget_class_bind_template_child_private (widget_class, GladeEditor, signal_editor);
Packit 1e8aac
Packit 1e8aac
  gtk_widget_class_bind_template_callback (widget_class, glade_editor_switch_page);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_update_class_warning_cb (GladeWidget *widget,
Packit 1e8aac
                                      GParamSpec  *pspec,
Packit 1e8aac
                                      GladeEditor *editor)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (editor);
Packit 1e8aac
Packit 1e8aac
  if (glade_widget_support_warning (widget))
Packit 1e8aac
    gtk_widget_show (priv->warning);
Packit 1e8aac
  else
Packit 1e8aac
    gtk_widget_hide (priv->warning);
Packit 1e8aac
Packit 1e8aac
  gtk_widget_set_tooltip_text (priv->warning, glade_widget_support_warning (widget));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_update_class_field (GladeEditor *editor)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (editor);
Packit 1e8aac
Packit 1e8aac
  if (priv->loaded_widget)
Packit 1e8aac
    {
Packit 1e8aac
      GladeWidget *widget = priv->loaded_widget;
Packit 1e8aac
      gchar *text;
Packit 1e8aac
Packit 1e8aac
      gtk_image_set_from_icon_name (GTK_IMAGE (priv->class_icon),
Packit 1e8aac
                                    glade_widget_adaptor_get_icon_name (priv->loaded_adaptor),
Packit 1e8aac
                                    GTK_ICON_SIZE_BUTTON);
Packit 1e8aac
      gtk_widget_show (priv->class_icon);
Packit 1e8aac
Packit 1e8aac
      if (glade_widget_has_name (widget))
Packit 1e8aac
        {
Packit 1e8aac
          /* translators: %s(Class Title) Properties - %s (ClassName) [%s(WidgetName)]
Packit 1e8aac
           * example: Window Properties - GtkWindow [window1]
Packit 1e8aac
           */
Packit 1e8aac
          text = g_strdup_printf (_("%s Properties - %s [%s]"),
Packit 1e8aac
                                  glade_widget_adaptor_get_title (priv->loaded_adaptor),
Packit 1e8aac
                                  glade_widget_adaptor_get_name (priv->loaded_adaptor), 
Packit 1e8aac
		                  glade_widget_get_display_name (widget));
Packit 1e8aac
        }
Packit 1e8aac
      else
Packit 1e8aac
        {
Packit 1e8aac
          /* translators: %s(Class Title) Properties - %s (ClassName)
Packit 1e8aac
           * example: Window Properties - GtkWindow
Packit 1e8aac
           */
Packit 1e8aac
          text = g_strdup_printf (_("%s Properties - %s"),
Packit 1e8aac
                                  glade_widget_adaptor_get_title (priv->loaded_adaptor),
Packit 1e8aac
                                  glade_widget_adaptor_get_name (priv->loaded_adaptor));
Packit 1e8aac
	}
Packit 1e8aac
		 
Packit 1e8aac
      gtk_label_set_text (GTK_LABEL (priv->class_label), text);
Packit 1e8aac
      g_free (text);
Packit 1e8aac
Packit 1e8aac
      glade_editor_update_class_warning_cb (priv->loaded_widget, NULL, editor);
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    {
Packit 1e8aac
      gtk_widget_hide (priv->class_icon);
Packit 1e8aac
      gtk_widget_hide (priv->warning);
Packit 1e8aac
      gtk_label_set_text (GTK_LABEL (priv->class_label), _("Properties"));
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  g_object_notify_by_pspec (G_OBJECT (editor), properties[PROP_CLASS_FIELD]);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_update_widget_name_cb (GladeWidget *widget,
Packit 1e8aac
                                    GParamSpec  *pspec,
Packit 1e8aac
                                    GladeEditor *editor)
Packit 1e8aac
{
Packit 1e8aac
  glade_editor_update_class_field (editor);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_switch_page (GtkNotebook     *notebook,
Packit 1e8aac
			  GtkWidget       *page,
Packit 1e8aac
			  guint            page_num,
Packit 1e8aac
			  GladeEditor     *editor)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (editor);
Packit 1e8aac
Packit 1e8aac
  gtk_widget_hide (priv->page_widget);
Packit 1e8aac
  gtk_widget_hide (priv->page_packing);
Packit 1e8aac
  gtk_widget_hide (priv->page_common);
Packit 1e8aac
  gtk_widget_hide (priv->page_atk);
Packit 1e8aac
Packit 1e8aac
  switch (page_num)
Packit 1e8aac
    {
Packit 1e8aac
    case 0:
Packit 1e8aac
      gtk_widget_show (priv->page_widget);
Packit 1e8aac
      break;
Packit 1e8aac
    case 1:
Packit 1e8aac
      gtk_widget_show (priv->page_packing);
Packit 1e8aac
      break;
Packit 1e8aac
    case 2:
Packit 1e8aac
      gtk_widget_show (priv->page_common);
Packit 1e8aac
      break;
Packit 1e8aac
    case 4:
Packit 1e8aac
      gtk_widget_show (priv->page_atk);
Packit 1e8aac
      break;
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_init (GladeEditor *editor)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPrivate *priv;
Packit 1e8aac
  gint                icon_height;
Packit 1e8aac
Packit 1e8aac
  editor->priv = priv = glade_editor_get_instance_private (editor);
Packit 1e8aac
Packit 1e8aac
  priv->show_class_field = TRUE;
Packit 1e8aac
Packit 1e8aac
  gtk_widget_init_template (GTK_WIDGET (editor));
Packit 1e8aac
Packit 1e8aac
  gtk_icon_size_lookup (GTK_ICON_SIZE_BUTTON, NULL, &icon_height);
Packit 1e8aac
  gtk_widget_set_size_request (priv->class_label, -1, icon_height + 2);
Packit 1e8aac
Packit 1e8aac
  glade_editor_update_class_field (editor);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GtkWidget *
Packit 1e8aac
glade_editor_get_editable_by_adaptor (GladeEditor        *editor,
Packit 1e8aac
                                      GladeWidgetAdaptor *adaptor,
Packit 1e8aac
                                      GladeEditorPageType type)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (editor);
Packit 1e8aac
  GtkWidget *editable;
Packit 1e8aac
  GList *list;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_WIDGET_ADAPTOR (adaptor), NULL);
Packit 1e8aac
Packit 1e8aac
  for (list = priv->editables; list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      editable = list->data;
Packit 1e8aac
      if (type !=
Packit 1e8aac
          GPOINTER_TO_INT (g_object_get_data
Packit 1e8aac
                           (G_OBJECT (editable), "glade-editor-page-type")))
Packit 1e8aac
        continue;
Packit 1e8aac
      if (g_object_get_data (G_OBJECT (editable), "glade-widget-adaptor") ==
Packit 1e8aac
          adaptor)
Packit 1e8aac
        return editable;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  editable = (GtkWidget *) glade_widget_adaptor_create_editable (adaptor, type);
Packit 1e8aac
  g_return_val_if_fail (editable != NULL, NULL);
Packit 1e8aac
Packit 1e8aac
  g_object_set_data (G_OBJECT (editable), "glade-editor-page-type",
Packit 1e8aac
                     GINT_TO_POINTER (type));
Packit 1e8aac
  g_object_set_data (G_OBJECT (editable), "glade-widget-adaptor", adaptor);
Packit 1e8aac
Packit 1e8aac
  if (type != GLADE_PAGE_PACKING)
Packit 1e8aac
    {
Packit 1e8aac
      priv->editables = g_list_prepend (priv->editables, editable);
Packit 1e8aac
      g_object_ref_sink (editable);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return editable;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
hide_or_remove_visible_child (GtkContainer *container, gboolean remove)
Packit 1e8aac
{
Packit 1e8aac
  GList *l, *children = gtk_container_get_children (container);
Packit 1e8aac
  GtkWidget *widget;
Packit 1e8aac
Packit 1e8aac
  for (l = children; l; l = l->next)
Packit 1e8aac
    {
Packit 1e8aac
      widget = l->data;
Packit 1e8aac
Packit 1e8aac
      if (gtk_widget_get_visible (widget))
Packit 1e8aac
	{
Packit 1e8aac
	  gtk_widget_hide (widget);
Packit 1e8aac
Packit 1e8aac
	  if (remove)
Packit 1e8aac
	    gtk_container_remove (container, widget);
Packit 1e8aac
Packit 1e8aac
	  break;
Packit 1e8aac
	}
Packit 1e8aac
    }
Packit 1e8aac
  g_list_free (children);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GtkWidget *
Packit 1e8aac
glade_editor_load_editable_in_page (GladeEditor        *editor,
Packit 1e8aac
                                    GladeWidgetAdaptor *adaptor,
Packit 1e8aac
                                    GladeEditorPageType type)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (editor);
Packit 1e8aac
  GtkContainer *container = NULL;
Packit 1e8aac
  GtkWidget *scrolled_window, *editable;
Packit 1e8aac
  GtkAdjustment *adj;
Packit 1e8aac
Packit 1e8aac
  /* Remove the old table that was in this container */
Packit 1e8aac
  switch (type)
Packit 1e8aac
    {
Packit 1e8aac
      case GLADE_PAGE_GENERAL:
Packit 1e8aac
        container = GTK_CONTAINER (priv->page_widget);
Packit 1e8aac
        break;
Packit 1e8aac
      case GLADE_PAGE_COMMON:
Packit 1e8aac
        container = GTK_CONTAINER (priv->page_common);
Packit 1e8aac
        break;
Packit 1e8aac
      case GLADE_PAGE_PACKING:
Packit 1e8aac
        container = GTK_CONTAINER (priv->page_packing);
Packit 1e8aac
        break;
Packit 1e8aac
      case GLADE_PAGE_ATK:
Packit 1e8aac
        container = GTK_CONTAINER (priv->page_atk);
Packit 1e8aac
        break;
Packit 1e8aac
      case GLADE_PAGE_QUERY:
Packit 1e8aac
      default:
Packit 1e8aac
        g_critical ("Unreachable code reached !");
Packit 1e8aac
        break;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  /* Hide the editable (this will destroy on packing pages) */
Packit 1e8aac
  hide_or_remove_visible_child (container, type == GLADE_PAGE_PACKING);
Packit 1e8aac
Packit 1e8aac
  if (!adaptor)
Packit 1e8aac
    return NULL;
Packit 1e8aac
Packit 1e8aac
  if ((editable =
Packit 1e8aac
       glade_editor_get_editable_by_adaptor (editor, adaptor, type)) == NULL)
Packit 1e8aac
    return NULL;
Packit 1e8aac
Packit 1e8aac
  /* Attach the new page */
Packit 1e8aac
  if (!gtk_widget_get_parent (editable))
Packit 1e8aac
    gtk_container_add (GTK_CONTAINER (container), editable);
Packit 1e8aac
  gtk_widget_show (editable);
Packit 1e8aac
Packit 1e8aac
  if ((scrolled_window = 
Packit 1e8aac
       gtk_widget_get_ancestor (GTK_WIDGET (container), 
Packit 1e8aac
				GTK_TYPE_SCROLLED_WINDOW)) != NULL)
Packit 1e8aac
    {
Packit 1e8aac
      adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (scrolled_window));
Packit 1e8aac
      gtk_container_set_focus_vadjustment (GTK_CONTAINER (editable), adj);
Packit 1e8aac
Packit 1e8aac
      adj = gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (scrolled_window));
Packit 1e8aac
      gtk_container_set_focus_hadjustment (GTK_CONTAINER (editable), adj);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  return editable;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_load_widget_class (GladeEditor *editor,
Packit 1e8aac
                                GladeWidgetAdaptor *adaptor)
Packit 1e8aac
{
Packit 1e8aac
Packit 1e8aac
  glade_editor_load_editable_in_page (editor, adaptor, GLADE_PAGE_GENERAL);
Packit 1e8aac
  glade_editor_load_editable_in_page (editor, adaptor, GLADE_PAGE_COMMON);
Packit 1e8aac
  glade_editor_load_editable_in_page (editor, adaptor, GLADE_PAGE_ATK);
Packit 1e8aac
  glade_editor_load_editable_in_page (editor, NULL, GLADE_PAGE_PACKING);
Packit 1e8aac
Packit 1e8aac
  editor->priv->loaded_adaptor = adaptor;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_close_cb (GladeProject *project, GladeEditor *editor)
Packit 1e8aac
{
Packit 1e8aac
  /* project we are viewing was closed,
Packit 1e8aac
   * detatch from editor.
Packit 1e8aac
   */
Packit 1e8aac
  glade_editor_load_widget (editor, NULL);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_removed_cb (GladeProject *project,
Packit 1e8aac
                         GladeWidget *widget,
Packit 1e8aac
                         GladeEditor *editor)
Packit 1e8aac
{
Packit 1e8aac
  /* Widget we were viewing was removed from project,
Packit 1e8aac
   * detatch from editor.
Packit 1e8aac
   */
Packit 1e8aac
  if (widget == editor->priv->loaded_widget)
Packit 1e8aac
    glade_editor_load_widget (editor, NULL);
Packit 1e8aac
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_load_editable (GladeEditor        *editor,
Packit 1e8aac
                            GladeWidget        *widget,
Packit 1e8aac
                            GladeEditorPageType type)
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget   *editable;
Packit 1e8aac
  GladeWidget *parent = glade_widget_get_parent (widget);
Packit 1e8aac
Packit 1e8aac
  /* Use the parenting adaptor for packing pages... so deffer creating the widgets
Packit 1e8aac
   * until load time.
Packit 1e8aac
   */
Packit 1e8aac
  if (type == GLADE_PAGE_PACKING)
Packit 1e8aac
    {
Packit 1e8aac
      GladeWidgetAdaptor *adaptor;
Packit 1e8aac
Packit 1e8aac
      if (!parent)
Packit 1e8aac
	return;
Packit 1e8aac
Packit 1e8aac
      adaptor = glade_widget_get_adaptor (parent);
Packit 1e8aac
      editable =
Packit 1e8aac
	glade_editor_load_editable_in_page (editor, adaptor,
Packit 1e8aac
					    GLADE_PAGE_PACKING);
Packit 1e8aac
    }
Packit 1e8aac
  else
Packit 1e8aac
    editable = 
Packit 1e8aac
      glade_editor_get_editable_by_adaptor (editor, 
Packit 1e8aac
					    glade_widget_get_adaptor (widget), 
Packit 1e8aac
					    type);
Packit 1e8aac
Packit 1e8aac
  g_assert (editable);
Packit 1e8aac
Packit 1e8aac
  if (!widget)
Packit 1e8aac
    gtk_widget_hide (editable);
Packit 1e8aac
Packit 1e8aac
  glade_editable_load (GLADE_EDITABLE (editable), widget);
Packit 1e8aac
Packit 1e8aac
  if (widget)
Packit 1e8aac
    gtk_widget_show (editable);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
clear_editables (GladeEditor *editor)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditable *editable;
Packit 1e8aac
  GList *l;
Packit 1e8aac
Packit 1e8aac
  for (l = editor->priv->editables; l; l = l->next)
Packit 1e8aac
    {
Packit 1e8aac
      editable = l->data;
Packit 1e8aac
      glade_editable_load (editable, NULL);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_load_widget_real (GladeEditor *editor, GladeWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPrivate *priv = GLADE_EDITOR_PRIVATE (editor);
Packit 1e8aac
  GladeWidgetAdaptor *adaptor;
Packit 1e8aac
  GladeProject *project;
Packit 1e8aac
Packit 1e8aac
  /* Disconnect from last widget */
Packit 1e8aac
  if (priv->loaded_widget != NULL)
Packit 1e8aac
    {
Packit 1e8aac
      /* better pay a small price now and avoid unseen editables
Packit 1e8aac
       * waking up on project metadata changes.
Packit 1e8aac
       */
Packit 1e8aac
      clear_editables (editor);
Packit 1e8aac
Packit 1e8aac
      project = glade_widget_get_project (priv->loaded_widget);
Packit 1e8aac
      g_signal_handler_disconnect (G_OBJECT (project),
Packit 1e8aac
                                   priv->project_closed_signal_id);
Packit 1e8aac
      g_signal_handler_disconnect (G_OBJECT (project),
Packit 1e8aac
                                   priv->project_removed_signal_id);
Packit 1e8aac
      g_signal_handler_disconnect (G_OBJECT (priv->loaded_widget),
Packit 1e8aac
                                   priv->widget_warning_id);
Packit 1e8aac
      g_signal_handler_disconnect (G_OBJECT (priv->loaded_widget),
Packit 1e8aac
                                   priv->widget_name_id);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  /* Load the GladeWidgetClass */
Packit 1e8aac
  adaptor = widget ? glade_widget_get_adaptor (widget) : NULL;
Packit 1e8aac
  if (priv->loaded_adaptor != adaptor || adaptor == NULL)
Packit 1e8aac
    glade_editor_load_widget_class (editor, adaptor);
Packit 1e8aac
Packit 1e8aac
  glade_signal_editor_load_widget (priv->signal_editor, widget);
Packit 1e8aac
Packit 1e8aac
  /* we are just clearing, we are done */
Packit 1e8aac
  if (widget == NULL)
Packit 1e8aac
    {
Packit 1e8aac
      priv->loaded_widget = NULL;
Packit 1e8aac
Packit 1e8aac
      /* Clear class header */
Packit 1e8aac
      glade_editor_update_class_field (editor);
Packit 1e8aac
Packit 1e8aac
      g_object_notify_by_pspec (G_OBJECT (editor), properties[PROP_WIDGET]);
Packit 1e8aac
Packit 1e8aac
      return;
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  priv->loading = TRUE;
Packit 1e8aac
Packit 1e8aac
  /* Load each GladeEditorProperty from 'widget' */
Packit 1e8aac
  glade_editor_load_editable (editor, widget, GLADE_PAGE_GENERAL);
Packit 1e8aac
  glade_editor_load_editable (editor, widget, GLADE_PAGE_COMMON);
Packit 1e8aac
  glade_editor_load_editable (editor, widget, GLADE_PAGE_ATK);
Packit 1e8aac
  glade_editor_load_editable (editor, widget, GLADE_PAGE_PACKING);
Packit 1e8aac
Packit 1e8aac
  priv->loaded_widget = widget;
Packit 1e8aac
  priv->loading = FALSE;
Packit 1e8aac
Packit 1e8aac
  /* Update class header */
Packit 1e8aac
  glade_editor_update_class_field (editor);
Packit 1e8aac
Packit 1e8aac
  /* Connect to new widget */
Packit 1e8aac
  project = glade_widget_get_project (priv->loaded_widget);
Packit 1e8aac
  priv->project_closed_signal_id =
Packit 1e8aac
      g_signal_connect (G_OBJECT (project), "close",
Packit 1e8aac
                        G_CALLBACK (glade_editor_close_cb), editor);
Packit 1e8aac
  priv->project_removed_signal_id =
Packit 1e8aac
      g_signal_connect (G_OBJECT (project), "remove-widget",
Packit 1e8aac
                        G_CALLBACK (glade_editor_removed_cb), editor);
Packit 1e8aac
  priv->widget_warning_id =
Packit 1e8aac
      g_signal_connect (G_OBJECT (widget), "notify::support-warning",
Packit 1e8aac
                        G_CALLBACK (glade_editor_update_class_warning_cb),
Packit 1e8aac
                        editor);
Packit 1e8aac
  priv->widget_name_id =
Packit 1e8aac
      g_signal_connect (G_OBJECT (widget), "notify::name",
Packit 1e8aac
                        G_CALLBACK (glade_editor_update_widget_name_cb),
Packit 1e8aac
                        editor);
Packit 1e8aac
Packit 1e8aac
  g_object_notify_by_pspec (G_OBJECT (editor), properties[PROP_WIDGET]);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_editor_new:
Packit 1e8aac
 *
Packit 1e8aac
 * Returns: a new #GladeEditor
Packit 1e8aac
 */
Packit 1e8aac
GladeEditor *
Packit 1e8aac
glade_editor_new (void)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditor *editor;
Packit 1e8aac
Packit 1e8aac
  editor = g_object_new (GLADE_TYPE_EDITOR, "spacing", 6, NULL);
Packit 1e8aac
Packit 1e8aac
  return editor;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_editor_load_widget:
Packit 1e8aac
 * @editor: a #GladeEditor
Packit 1e8aac
 * @widget: a #GladeWidget
Packit 1e8aac
 *
Packit 1e8aac
 * Load @widget into @editor. If @widget is %NULL, clear the editor.
Packit 1e8aac
 */
Packit 1e8aac
void
Packit 1e8aac
glade_editor_load_widget (GladeEditor *editor, GladeWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  g_return_if_fail (GLADE_IS_EDITOR (editor));
Packit 1e8aac
  g_return_if_fail (widget == NULL || GLADE_IS_WIDGET (widget));
Packit 1e8aac
Packit 1e8aac
  if (editor->priv->loaded_widget == widget)
Packit 1e8aac
    return;
Packit 1e8aac
Packit 1e8aac
  glade_editor_load_widget_real (editor, widget);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
query_dialog_style_set_cb (GtkWidget *dialog,
Packit 1e8aac
                           GtkStyle *previous_style,
Packit 1e8aac
                           gpointer user_data)
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget *content_area, *action_area;
Packit 1e8aac
Packit 1e8aac
  content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
Packit 1e8aac
  gtk_container_set_border_width (GTK_CONTAINER (content_area), 12);
Packit 1e8aac
  gtk_box_set_spacing (GTK_BOX (content_area), 12);
Packit 1e8aac
  action_area = gtk_dialog_get_action_area (GTK_DIALOG (dialog));
Packit 1e8aac
  gtk_container_set_border_width (GTK_CONTAINER (action_area), 0);
Packit 1e8aac
  gtk_box_set_spacing (GTK_BOX (action_area), 6);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
query_dialog_delete_event_cb (GtkDialog *dialog,
Packit 1e8aac
			      GdkEvent  *event,
Packit 1e8aac
			      gpointer   user_data)
Packit 1e8aac
{
Packit 1e8aac
  gtk_dialog_response (dialog, GTK_RESPONSE_CANCEL);
Packit 1e8aac
  return TRUE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
gboolean
Packit 1e8aac
glade_editor_query_dialog (GladeWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  GladeWidgetAdaptor *adaptor;
Packit 1e8aac
  GtkWidget *dialog, *editable, *content_area;
Packit 1e8aac
  GtkWidget *create;
Packit 1e8aac
  gchar *title;
Packit 1e8aac
  gint answer;
Packit 1e8aac
  gboolean retval = TRUE;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_WIDGET (widget), FALSE);
Packit 1e8aac
  
Packit 1e8aac
  adaptor = glade_widget_get_adaptor (widget);
Packit 1e8aac
Packit 1e8aac
  title = g_strdup_printf (_("Create a %s"), glade_widget_adaptor_get_name (adaptor));
Packit 1e8aac
  dialog = gtk_dialog_new_with_buttons (title, NULL,
Packit 1e8aac
                                        GTK_DIALOG_MODAL |
Packit 1e8aac
                                        GTK_DIALOG_DESTROY_WITH_PARENT,
Packit 1e8aac
                                        _("_Cancel"), GTK_RESPONSE_CANCEL,
Packit 1e8aac
                                        NULL);
Packit 1e8aac
  g_free (title);
Packit 1e8aac
Packit 1e8aac
  create = gtk_button_new_with_mnemonic (_("Crea_te"));
Packit 1e8aac
  gtk_widget_show (create);
Packit 1e8aac
  gtk_widget_set_can_default (create, TRUE);
Packit 1e8aac
  gtk_dialog_add_action_widget (GTK_DIALOG (dialog), create, GTK_RESPONSE_OK);
Packit 1e8aac
Packit 1e8aac
  gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
Packit 1e8aac
                                           GTK_RESPONSE_OK,
Packit 1e8aac
                                           GTK_RESPONSE_CANCEL, -1);
Packit 1e8aac
  gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
Packit 1e8aac
Packit 1e8aac
  editable = (GtkWidget *) glade_widget_adaptor_create_editable (adaptor, GLADE_PAGE_QUERY);
Packit 1e8aac
  gtk_widget_show (editable);
Packit 1e8aac
Packit 1e8aac
  content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (content_area), editable, FALSE, FALSE, 6);
Packit 1e8aac
Packit 1e8aac
  glade_editable_load (GLADE_EDITABLE (editable), widget);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (dialog, "style-set",
Packit 1e8aac
                    G_CALLBACK (query_dialog_style_set_cb), NULL);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect (dialog, "delete-event",
Packit 1e8aac
                    G_CALLBACK (query_dialog_delete_event_cb), NULL);
Packit 1e8aac
Packit 1e8aac
  answer = gtk_dialog_run (GTK_DIALOG (dialog));
Packit 1e8aac
Packit 1e8aac
  /*
Packit 1e8aac
   * If user cancel's we cancel the whole "create operation" by
Packit 1e8aac
   * return FALSE. glade_widget_new() will see the FALSE, and
Packit 1e8aac
   * take care of canceling the "create" operation.
Packit 1e8aac
   */
Packit 1e8aac
  if (answer == GTK_RESPONSE_CANCEL)
Packit 1e8aac
    retval = FALSE;
Packit 1e8aac
Packit 1e8aac
  gtk_widget_destroy (dialog);
Packit 1e8aac
  return retval;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
enum
Packit 1e8aac
{
Packit 1e8aac
  COLUMN_ENABLED = 0,
Packit 1e8aac
  COLUMN_PROP_NAME,
Packit 1e8aac
  COLUMN_PROPERTY,
Packit 1e8aac
  COLUMN_WEIGHT,
Packit 1e8aac
  COLUMN_CHILD,
Packit 1e8aac
  COLUMN_DEFAULT,
Packit 1e8aac
  COLUMN_NDEFAULT,
Packit 1e8aac
  COLUMN_DEFSTRING,
Packit 1e8aac
  NUM_COLUMNS
Packit 1e8aac
};
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_reset_toggled (GtkCellRendererToggle *cell,
Packit 1e8aac
                            gchar                 *path_str,
Packit 1e8aac
                            GtkTreeModel          *model)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  gboolean enabled;
Packit 1e8aac
Packit 1e8aac
  /* get toggled iter */
Packit 1e8aac
  gtk_tree_model_get_iter (model, &iter, path);
Packit 1e8aac
  gtk_tree_model_get (model, &iter, COLUMN_ENABLED, &enabled, -1);
Packit 1e8aac
  gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
Packit 1e8aac
                      COLUMN_ENABLED, !enabled, -1);
Packit 1e8aac
  gtk_tree_path_free (path);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GtkWidget *
Packit 1e8aac
glade_editor_reset_view (void)
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget *view_widget;
Packit 1e8aac
  GtkTreeModel *model;
Packit 1e8aac
  GtkCellRenderer *renderer;
Packit 1e8aac
  GtkTreeViewColumn *column;
Packit 1e8aac
Packit 1e8aac
  model = (GtkTreeModel *) gtk_tree_store_new (NUM_COLUMNS, G_TYPE_BOOLEAN,     /* Enabled  value      */
Packit 1e8aac
                                               G_TYPE_STRING,   /* Property name       */
Packit 1e8aac
                                               GLADE_TYPE_PROPERTY,     /* The property        */
Packit 1e8aac
                                               G_TYPE_INT,      /* Parent node ?       */
Packit 1e8aac
                                               G_TYPE_BOOLEAN,  /* Child node ?        */
Packit 1e8aac
                                               G_TYPE_BOOLEAN,  /* Has default value   */
Packit 1e8aac
                                               G_TYPE_BOOLEAN,  /* Doesn't have defaut */
Packit 1e8aac
                                               G_TYPE_STRING);  /* Default string      */
Packit 1e8aac
Packit 1e8aac
  view_widget = gtk_tree_view_new_with_model (model);
Packit 1e8aac
  g_object_set (G_OBJECT (view_widget), "enable-search", FALSE, NULL);
Packit 1e8aac
Packit 1e8aac
  /********************* fake invisible column *********************/
Packit 1e8aac
  renderer = gtk_cell_renderer_text_new ();
Packit 1e8aac
  g_object_set (G_OBJECT (renderer), "editable", FALSE, "visible", FALSE, NULL);
Packit 1e8aac
Packit 1e8aac
  column = gtk_tree_view_column_new_with_attributes (NULL, renderer, NULL);
Packit 1e8aac
  gtk_tree_view_append_column (GTK_TREE_VIEW (view_widget), column);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_view_column_set_visible (column, FALSE);
Packit 1e8aac
  gtk_tree_view_set_expander_column (GTK_TREE_VIEW (view_widget), column);
Packit 1e8aac
Packit 1e8aac
  /************************ enabled column ************************/
Packit 1e8aac
  renderer = gtk_cell_renderer_toggle_new ();
Packit 1e8aac
  g_object_set (G_OBJECT (renderer),
Packit 1e8aac
                "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE,
Packit 1e8aac
                "activatable", TRUE, NULL);
Packit 1e8aac
  g_signal_connect (renderer, "toggled",
Packit 1e8aac
                    G_CALLBACK (glade_editor_reset_toggled), model);
Packit 1e8aac
  gtk_tree_view_insert_column_with_attributes
Packit 1e8aac
      (GTK_TREE_VIEW (view_widget), COLUMN_ENABLED,
Packit 1e8aac
       _("Reset"), renderer,
Packit 1e8aac
       "sensitive", COLUMN_NDEFAULT,
Packit 1e8aac
       "activatable", COLUMN_NDEFAULT,
Packit 1e8aac
       "active", COLUMN_ENABLED, "visible", COLUMN_CHILD, NULL);
Packit 1e8aac
Packit 1e8aac
  /********************* property name column *********************/
Packit 1e8aac
  renderer = gtk_cell_renderer_text_new ();
Packit 1e8aac
  g_object_set (G_OBJECT (renderer), "editable", FALSE, NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_view_insert_column_with_attributes
Packit 1e8aac
      (GTK_TREE_VIEW (view_widget), COLUMN_PROP_NAME,
Packit 1e8aac
       _("Property"), renderer,
Packit 1e8aac
       "text", COLUMN_PROP_NAME, "weight", COLUMN_WEIGHT, NULL);
Packit 1e8aac
Packit 1e8aac
  /******************* default indicator column *******************/
Packit 1e8aac
  renderer = gtk_cell_renderer_text_new ();
Packit 1e8aac
  g_object_set (G_OBJECT (renderer),
Packit 1e8aac
                "editable", FALSE,
Packit 1e8aac
                "style", PANGO_STYLE_ITALIC, "foreground", "Gray", NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_view_insert_column_with_attributes
Packit 1e8aac
      (GTK_TREE_VIEW (view_widget), COLUMN_DEFSTRING,
Packit 1e8aac
       NULL, renderer,
Packit 1e8aac
       "text", COLUMN_DEFSTRING, "visible", COLUMN_DEFAULT, NULL);
Packit 1e8aac
Packit 1e8aac
  return view_widget;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_populate_reset_view (GladeWidget *widget, GtkTreeView *tree_view)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeStore *model = GTK_TREE_STORE (gtk_tree_view_get_model (tree_view));
Packit 1e8aac
  GtkTreeIter property_iter, general_iter, common_iter, atk_iter, *iter;
Packit 1e8aac
  GList *list;
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
  GladePropertyClass *pclass;
Packit 1e8aac
  gboolean def;
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (widget != NULL);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_store_append (model, &general_iter, NULL);
Packit 1e8aac
  gtk_tree_store_set (model, &general_iter,
Packit 1e8aac
                      COLUMN_PROP_NAME, _("General"),
Packit 1e8aac
                      COLUMN_PROPERTY, NULL,
Packit 1e8aac
                      COLUMN_WEIGHT, PANGO_WEIGHT_BOLD,
Packit 1e8aac
                      COLUMN_CHILD, FALSE,
Packit 1e8aac
                      COLUMN_DEFAULT, FALSE, COLUMN_NDEFAULT, FALSE, -1);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_store_append (model, &common_iter, NULL);
Packit 1e8aac
  gtk_tree_store_set (model, &common_iter,
Packit 1e8aac
                      COLUMN_PROP_NAME, _("Common"),
Packit 1e8aac
                      COLUMN_PROPERTY, NULL,
Packit 1e8aac
                      COLUMN_WEIGHT, PANGO_WEIGHT_BOLD,
Packit 1e8aac
                      COLUMN_CHILD, FALSE,
Packit 1e8aac
                      COLUMN_DEFAULT, FALSE, COLUMN_NDEFAULT, FALSE, -1);
Packit 1e8aac
Packit 1e8aac
  gtk_tree_store_append (model, &atk_iter, NULL);
Packit 1e8aac
  gtk_tree_store_set (model, &atk_iter,
Packit 1e8aac
                      COLUMN_PROP_NAME, _("Accessibility"),
Packit 1e8aac
                      COLUMN_PROPERTY, NULL,
Packit 1e8aac
                      COLUMN_WEIGHT, PANGO_WEIGHT_BOLD,
Packit 1e8aac
                      COLUMN_CHILD, FALSE,
Packit 1e8aac
                      COLUMN_DEFAULT, FALSE, COLUMN_NDEFAULT, FALSE, -1);
Packit 1e8aac
Packit 1e8aac
  /* General & Common */
Packit 1e8aac
  for (list = glade_widget_get_properties (widget); list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      property = list->data;
Packit 1e8aac
      pclass   = glade_property_get_class (property);
Packit 1e8aac
Packit 1e8aac
      if (glade_property_class_is_visible (pclass) == FALSE)
Packit 1e8aac
        continue;
Packit 1e8aac
Packit 1e8aac
      if (glade_property_class_atk (pclass))
Packit 1e8aac
        iter = &atk_iter;
Packit 1e8aac
      else if (glade_property_class_common (pclass))
Packit 1e8aac
        iter = &common_iter;
Packit 1e8aac
      else
Packit 1e8aac
        iter = &general_iter;
Packit 1e8aac
Packit 1e8aac
      def = glade_property_default (property);
Packit 1e8aac
Packit 1e8aac
      gtk_tree_store_append (model, &property_iter, iter);
Packit 1e8aac
      gtk_tree_store_set (model, &property_iter,
Packit 1e8aac
                          COLUMN_ENABLED, !def,
Packit 1e8aac
                          COLUMN_PROP_NAME, glade_property_class_get_name (pclass),
Packit 1e8aac
                          COLUMN_PROPERTY, property,
Packit 1e8aac
                          COLUMN_WEIGHT, PANGO_WEIGHT_NORMAL,
Packit 1e8aac
                          COLUMN_CHILD, TRUE,
Packit 1e8aac
                          COLUMN_DEFAULT, def,
Packit 1e8aac
                          COLUMN_NDEFAULT, !def,
Packit 1e8aac
                          COLUMN_DEFSTRING, _("(default)"), -1);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_editor_reset_selection_changed_cb (GtkTreeSelection *selection,
Packit 1e8aac
                                         GtkTextView      *desc_view)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeIter iter;
Packit 1e8aac
  GladeProperty *property = NULL;
Packit 1e8aac
  GtkTreeModel *model = NULL;
Packit 1e8aac
  GtkTextBuffer *text_buffer;
Packit 1e8aac
  GladePropertyClass *pclass = NULL;
Packit 1e8aac
Packit 1e8aac
  const gchar *message =
Packit 1e8aac
      _("Select the properties that you want to reset to their default values");
Packit 1e8aac
Packit 1e8aac
  /* Find selected data and show property blurb here */
Packit 1e8aac
  if (gtk_tree_selection_get_selected (selection, &model, &iter))
Packit 1e8aac
    {
Packit 1e8aac
      text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (desc_view));
Packit 1e8aac
      gtk_tree_model_get (model, &iter, COLUMN_PROPERTY, &property, -1);
Packit 1e8aac
Packit 1e8aac
      if (property)
Packit 1e8aac
	pclass = glade_property_get_class (property);
Packit 1e8aac
Packit 1e8aac
      gtk_text_buffer_set_text (text_buffer,
Packit 1e8aac
                                pclass ? glade_property_class_get_tooltip (pclass) : message,
Packit 1e8aac
                                -1);
Packit 1e8aac
      if (property)
Packit 1e8aac
        g_object_unref (G_OBJECT (property));
Packit 1e8aac
    }
Packit 1e8aac
  return TRUE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_editor_reset_foreach_selection (GtkTreeModel *model,
Packit 1e8aac
                                      GtkTreePath  *path,
Packit 1e8aac
                                      GtkTreeIter  *iter,
Packit 1e8aac
                                      gboolean      select)
Packit 1e8aac
{
Packit 1e8aac
  gboolean def;
Packit 1e8aac
Packit 1e8aac
  gtk_tree_model_get (model, iter, COLUMN_DEFAULT, &def, -1);
Packit 1e8aac
  /* Dont modify rows that are already default */
Packit 1e8aac
  if (def == FALSE)
Packit 1e8aac
    gtk_tree_store_set (GTK_TREE_STORE (model), iter,
Packit 1e8aac
                        COLUMN_ENABLED, select, -1);
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_reset_select_all_clicked (GtkButton   *button,
Packit 1e8aac
                                       GtkTreeView *tree_view)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
Packit 1e8aac
  gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc)
Packit 1e8aac
                          glade_editor_reset_foreach_selection,
Packit 1e8aac
                          GINT_TO_POINTER (TRUE));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_reset_unselect_all_clicked (GtkButton   *button,
Packit 1e8aac
                                         GtkTreeView *tree_view)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
Packit 1e8aac
  gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc)
Packit 1e8aac
                          glade_editor_reset_foreach_selection,
Packit 1e8aac
                          GINT_TO_POINTER (FALSE));
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static gboolean
Packit 1e8aac
glade_editor_reset_accumulate_selected_props (GtkTreeModel *model,
Packit 1e8aac
                                              GtkTreePath  *path,
Packit 1e8aac
                                              GtkTreeIter  *iter,
Packit 1e8aac
                                              GList       **accum)
Packit 1e8aac
{
Packit 1e8aac
  GladeProperty *property;
Packit 1e8aac
  gboolean enabled, def;
Packit 1e8aac
Packit 1e8aac
  gtk_tree_model_get (model, iter,
Packit 1e8aac
                      COLUMN_PROPERTY, &property,
Packit 1e8aac
                      COLUMN_ENABLED, &enabled, COLUMN_DEFAULT, &def, -1);
Packit 1e8aac
Packit 1e8aac
  if (property && enabled && !def)
Packit 1e8aac
    *accum = g_list_prepend (*accum, property);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  if (property)
Packit 1e8aac
    g_object_unref (G_OBJECT (property));
Packit 1e8aac
Packit 1e8aac
  return FALSE;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static GList *
Packit 1e8aac
glade_editor_reset_get_selected_props (GtkTreeModel *model)
Packit 1e8aac
{
Packit 1e8aac
  GList *ret = NULL;
Packit 1e8aac
Packit 1e8aac
  gtk_tree_model_foreach (model, (GtkTreeModelForeachFunc)
Packit 1e8aac
                          glade_editor_reset_accumulate_selected_props, &ret;;
Packit 1e8aac
Packit 1e8aac
  return ret;
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
glade_editor_reset_properties (GList *props)
Packit 1e8aac
{
Packit 1e8aac
  GList *list, *sdata_list = NULL;
Packit 1e8aac
  GCSetPropData *sdata;
Packit 1e8aac
  GladeProperty *prop;
Packit 1e8aac
  GladeWidget   *widget;
Packit 1e8aac
  GladeProject *project = NULL;
Packit 1e8aac
Packit 1e8aac
  for (list = props; list; list = list->next)
Packit 1e8aac
    {
Packit 1e8aac
      prop    = list->data;
Packit 1e8aac
      widget  = glade_property_get_widget (prop);
Packit 1e8aac
      project = glade_widget_get_project (widget);
Packit 1e8aac
Packit 1e8aac
      sdata = g_new (GCSetPropData, 1);
Packit 1e8aac
      sdata->property = prop;
Packit 1e8aac
Packit 1e8aac
      sdata->old_value = g_new0 (GValue, 1);
Packit 1e8aac
      sdata->new_value = g_new0 (GValue, 1);
Packit 1e8aac
Packit 1e8aac
      glade_property_get_value (prop, sdata->old_value);
Packit 1e8aac
      glade_property_get_default (prop, sdata->new_value);
Packit 1e8aac
Packit 1e8aac
      sdata_list = g_list_prepend (sdata_list, sdata);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  if (project)
Packit 1e8aac
    /* GladeCommand takes ownership of allocated list, ugly but practicle */
Packit 1e8aac
    glade_command_set_properties_list (project, sdata_list);
Packit 1e8aac
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_editor_reset_dialog_run (GtkWidget *parent, GladeWidget *gwidget)
Packit 1e8aac
{
Packit 1e8aac
  GtkTreeSelection *selection;
Packit 1e8aac
  GtkWidget *dialog;
Packit 1e8aac
  GtkWidget *vbox, *hbox, *label, *sw, *button;
Packit 1e8aac
  GtkWidget *tree_view, *description_view;
Packit 1e8aac
  gint res;
Packit 1e8aac
  GList *list;
Packit 1e8aac
Packit 1e8aac
  dialog = gtk_dialog_new_with_buttons (_("Reset Widget Properties"),
Packit 1e8aac
                                        parent ? GTK_WINDOW (parent) : NULL,
Packit 1e8aac
                                        GTK_DIALOG_MODAL |
Packit 1e8aac
                                        GTK_DIALOG_DESTROY_WITH_PARENT,
Packit 1e8aac
                                        _("_Cancel"), GTK_RESPONSE_CANCEL,
Packit 1e8aac
                                        _("_OK"), GTK_RESPONSE_OK, NULL);
Packit 1e8aac
Packit 1e8aac
  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
Packit 1e8aac
  gtk_widget_show (vbox);
Packit 1e8aac
Packit 1e8aac
  gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
Packit 1e8aac
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX
Packit 1e8aac
                      (gtk_dialog_get_content_area (GTK_DIALOG (dialog))), vbox,
Packit 1e8aac
                      TRUE, TRUE, 0);
Packit 1e8aac
Packit 1e8aac
  /* Checklist */
Packit 1e8aac
  label = gtk_label_new_with_mnemonic (_("_Properties:"));
Packit 1e8aac
  gtk_widget_show (label);
Packit 1e8aac
  gtk_widget_set_halign (label, GTK_ALIGN_START);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
Packit 1e8aac
Packit 1e8aac
  sw = gtk_scrolled_window_new (NULL, NULL);
Packit 1e8aac
  gtk_widget_show (sw);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
Packit 1e8aac
  gtk_widget_set_size_request (sw, 400, 200);
Packit 1e8aac
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
Packit 1e8aac
                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
Packit 1e8aac
  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  tree_view = glade_editor_reset_view ();
Packit 1e8aac
  if (gwidget)
Packit 1e8aac
    glade_editor_populate_reset_view (gwidget, GTK_TREE_VIEW (tree_view));
Packit 1e8aac
  gtk_tree_view_expand_all (GTK_TREE_VIEW (tree_view));
Packit 1e8aac
Packit 1e8aac
  gtk_widget_show (tree_view);
Packit 1e8aac
  gtk_label_set_mnemonic_widget (GTK_LABEL (label), tree_view);
Packit 1e8aac
  gtk_container_add (GTK_CONTAINER (sw), tree_view);
Packit 1e8aac
Packit 1e8aac
  /* Select all / Unselect all */
Packit 1e8aac
  hbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
Packit 1e8aac
  gtk_button_box_set_layout (GTK_BUTTON_BOX (hbox), GTK_BUTTONBOX_END);
Packit 1e8aac
  gtk_widget_show (hbox);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
Packit 1e8aac
Packit 1e8aac
  button = gtk_button_new_with_mnemonic (_("_Select All"));
Packit 1e8aac
  gtk_widget_show (button);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
Packit 1e8aac
  gtk_container_set_border_width (GTK_CONTAINER (button), 6);
Packit 1e8aac
  g_signal_connect (G_OBJECT (button), "clicked",
Packit 1e8aac
                    G_CALLBACK (glade_editor_reset_select_all_clicked),
Packit 1e8aac
                    tree_view);
Packit 1e8aac
Packit 1e8aac
  button = gtk_button_new_with_mnemonic (_("_Unselect All"));
Packit 1e8aac
  gtk_widget_show (button);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
Packit 1e8aac
  gtk_container_set_border_width (GTK_CONTAINER (button), 6);
Packit 1e8aac
  g_signal_connect (G_OBJECT (button), "clicked",
Packit 1e8aac
                    G_CALLBACK (glade_editor_reset_unselect_all_clicked),
Packit 1e8aac
                    tree_view);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  /* Description */
Packit 1e8aac
  label = gtk_label_new_with_mnemonic (_("Property _Description:"));
Packit 1e8aac
  gtk_widget_show (label);
Packit 1e8aac
  gtk_widget_set_halign (label, GTK_ALIGN_START);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
Packit 1e8aac
Packit 1e8aac
  sw = gtk_scrolled_window_new (NULL, NULL);
Packit 1e8aac
  gtk_widget_show (sw);
Packit 1e8aac
  gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
Packit 1e8aac
  gtk_widget_set_size_request (sw, 400, 80);
Packit 1e8aac
  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
Packit 1e8aac
                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
Packit 1e8aac
  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
Packit 1e8aac
Packit 1e8aac
  description_view = gtk_text_view_new ();
Packit 1e8aac
  gtk_text_view_set_editable (GTK_TEXT_VIEW (description_view), FALSE);
Packit 1e8aac
  gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (description_view), GTK_WRAP_WORD);
Packit 1e8aac
Packit 1e8aac
  gtk_widget_show (description_view);
Packit 1e8aac
  gtk_label_set_mnemonic_widget (GTK_LABEL (label), description_view);
Packit 1e8aac
  gtk_container_add (GTK_CONTAINER (sw), description_view);
Packit 1e8aac
Packit 1e8aac
  /* Update description */
Packit 1e8aac
  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
Packit 1e8aac
  g_signal_connect (G_OBJECT (selection), "changed",
Packit 1e8aac
                    G_CALLBACK (glade_editor_reset_selection_changed_cb),
Packit 1e8aac
                    description_view);
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
Packit 1e8aac
  /* Run the dialog */
Packit 1e8aac
  res = gtk_dialog_run (GTK_DIALOG (dialog));
Packit 1e8aac
  if (res == GTK_RESPONSE_OK)
Packit 1e8aac
    {
Packit 1e8aac
Packit 1e8aac
      /* get all selected properties and reset properties through glade_command */
Packit 1e8aac
      if ((list = glade_editor_reset_get_selected_props
Packit 1e8aac
           (gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)))) != NULL)
Packit 1e8aac
        {
Packit 1e8aac
          glade_editor_reset_properties (list);
Packit 1e8aac
          g_list_free (list);
Packit 1e8aac
        }
Packit 1e8aac
    }
Packit 1e8aac
  gtk_widget_destroy (dialog);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_editor_show_info (GladeEditor *editor)
Packit 1e8aac
{
Packit 1e8aac
  g_warning ("%s function is deprecated and does nothing", __func__);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_editor_hide_info (GladeEditor *editor)
Packit 1e8aac
{
Packit 1e8aac
  g_warning ("%s function is deprecated and does nothing", __func__);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_editor_show_class_field (GladeEditor *editor)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPrivate *priv;
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_EDITOR (editor));
Packit 1e8aac
Packit 1e8aac
  priv = GLADE_EDITOR_PRIVATE (editor);
Packit 1e8aac
Packit 1e8aac
  if (priv->show_class_field != TRUE)
Packit 1e8aac
    {
Packit 1e8aac
      priv->show_class_field = TRUE;
Packit 1e8aac
      gtk_widget_show (priv->class_field);
Packit 1e8aac
Packit 1e8aac
      g_object_notify_by_pspec (G_OBJECT (editor), properties[PROP_SHOW_CLASS_FIELD]);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
void
Packit 1e8aac
glade_editor_hide_class_field (GladeEditor *editor)
Packit 1e8aac
{
Packit 1e8aac
  GladeEditorPrivate *priv;
Packit 1e8aac
Packit 1e8aac
  g_return_if_fail (GLADE_IS_EDITOR (editor));
Packit 1e8aac
Packit 1e8aac
  priv = GLADE_EDITOR_PRIVATE (editor);
Packit 1e8aac
Packit 1e8aac
  if (priv->show_class_field != FALSE)
Packit 1e8aac
    {
Packit 1e8aac
      priv->show_class_field = FALSE;
Packit 1e8aac
      gtk_widget_hide (priv->class_field);
Packit 1e8aac
Packit 1e8aac
      g_object_notify_by_pspec (G_OBJECT (editor), properties[PROP_SHOW_CLASS_FIELD]);
Packit 1e8aac
    }
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
static void
Packit 1e8aac
editor_widget_name_changed (GladeWidget *widget,
Packit 1e8aac
			    GParamSpec  *pspec,
Packit 1e8aac
			    GtkWindow   *window)
Packit 1e8aac
{
Packit 1e8aac
  gchar *title, *prj_name;
Packit 1e8aac
Packit 1e8aac
  prj_name = glade_project_get_name (glade_widget_get_project (widget));
Packit 1e8aac
  /* Translators: first %s is the project name, second is a widget name */
Packit 1e8aac
  title = g_strdup_printf (_("%s - %s Properties"), prj_name,
Packit 1e8aac
                           glade_widget_get_display_name (widget));
Packit 1e8aac
  gtk_window_set_title (window, title);
Packit 1e8aac
  g_free (title);
Packit 1e8aac
  g_free (prj_name);
Packit 1e8aac
}
Packit 1e8aac
Packit 1e8aac
/**
Packit 1e8aac
 * glade_editor_dialog_for_widget:
Packit 1e8aac
 * @widget: a #GladeWidget
Packit 1e8aac
 *
Packit 1e8aac
 * This convenience function creates a new dialog window to edit @widget
Packit 1e8aac
 * specifically.
Packit 1e8aac
 *
Packit 1e8aac
 * Returns: the newly created dialog window
Packit 1e8aac
 */
Packit 1e8aac
GtkWidget *
Packit 1e8aac
glade_editor_dialog_for_widget (GladeWidget *widget)
Packit 1e8aac
{
Packit 1e8aac
  GtkWidget *window, *editor;
Packit 1e8aac
Packit 1e8aac
  g_return_val_if_fail (GLADE_IS_WIDGET (widget), NULL);
Packit 1e8aac
Packit 1e8aac
  /* Window */
Packit 1e8aac
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
Packit 1e8aac
  gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_UTILITY);
Packit 1e8aac
Packit 1e8aac
  /* Keep the title up to date */
Packit 1e8aac
  editor_widget_name_changed (widget, NULL, GTK_WINDOW (window));
Packit 1e8aac
  g_signal_connect_object (G_OBJECT (widget), "notify::name",
Packit 1e8aac
			   G_CALLBACK (editor_widget_name_changed), window, 0);
Packit 1e8aac
Packit 1e8aac
  if (glade_app_get_accel_group ())
Packit 1e8aac
    {
Packit 1e8aac
      gtk_window_add_accel_group (GTK_WINDOW (window),
Packit 1e8aac
                                  glade_app_get_accel_group ());
Packit 1e8aac
      g_signal_connect (G_OBJECT (window), "key-press-event",
Packit 1e8aac
                        G_CALLBACK (glade_utils_hijack_key_press), NULL);
Packit 1e8aac
    }
Packit 1e8aac
Packit 1e8aac
  editor = (GtkWidget *)glade_editor_new ();
Packit 1e8aac
  glade_editor_load_widget (GLADE_EDITOR (editor), widget);
Packit 1e8aac
Packit 1e8aac
  g_signal_connect_swapped (G_OBJECT (editor), "notify::widget",
Packit 1e8aac
                            G_CALLBACK (gtk_widget_destroy), window);
Packit 1e8aac
Packit 1e8aac
  gtk_container_set_border_width (GTK_CONTAINER (editor), 6);
Packit 1e8aac
  gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (editor));
Packit 1e8aac
Packit 1e8aac
  gtk_window_set_default_size (GTK_WINDOW (window), 400, 480);
Packit 1e8aac
Packit 1e8aac
  gtk_widget_show (editor);
Packit 1e8aac
Packit 1e8aac
  return window;
Packit 1e8aac
}