2014-05-03 01:48:33 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2013 Intel Corporation
|
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
|
|
* to deal in the Software without restriction, including without limitation
|
|
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be included
|
|
|
|
* in all copies or substantial portions of the Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
* THE SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
2014-07-12 03:14:04 +00:00
|
|
|
#include "config.h"
|
|
|
|
#include <glib/gi18n-lib.h>
|
|
|
|
|
2014-05-03 01:48:33 +00:00
|
|
|
#include "object-hierarchy.h"
|
|
|
|
|
2014-07-12 03:45:18 +00:00
|
|
|
#include "gtktreeselection.h"
|
2014-07-12 03:14:04 +00:00
|
|
|
#include "gtktreestore.h"
|
2014-07-12 03:45:18 +00:00
|
|
|
#include "gtktreeview.h"
|
2014-11-22 18:54:16 +00:00
|
|
|
#include "gtklabel.h"
|
2014-07-12 03:14:04 +00:00
|
|
|
|
|
|
|
|
2014-05-03 01:48:33 +00:00
|
|
|
enum
|
|
|
|
{
|
2014-05-04 16:06:06 +00:00
|
|
|
COLUMN_OBJECT_NAME
|
2014-05-03 01:48:33 +00:00
|
|
|
};
|
|
|
|
|
2014-05-07 03:24:20 +00:00
|
|
|
struct _GtkInspectorObjectHierarchyPrivate
|
2014-05-03 01:48:33 +00:00
|
|
|
{
|
|
|
|
GtkTreeStore *model;
|
|
|
|
GtkTreeView *tree;
|
|
|
|
};
|
|
|
|
|
2014-05-07 03:24:20 +00:00
|
|
|
G_DEFINE_TYPE_WITH_PRIVATE (GtkInspectorObjectHierarchy, gtk_inspector_object_hierarchy, GTK_TYPE_BOX)
|
2014-05-03 01:48:33 +00:00
|
|
|
|
|
|
|
static void
|
2014-05-07 03:24:20 +00:00
|
|
|
gtk_inspector_object_hierarchy_init (GtkInspectorObjectHierarchy *oh)
|
2014-05-03 01:48:33 +00:00
|
|
|
{
|
2014-05-07 03:24:20 +00:00
|
|
|
oh->priv = gtk_inspector_object_hierarchy_get_instance_private (oh);
|
2014-05-04 16:06:06 +00:00
|
|
|
gtk_widget_init_template (GTK_WIDGET (oh));
|
2014-05-03 01:48:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2014-05-07 03:24:20 +00:00
|
|
|
gtk_inspector_object_hierarchy_class_init (GtkInspectorObjectHierarchyClass *klass)
|
2014-05-03 01:48:33 +00:00
|
|
|
{
|
2014-05-04 16:06:06 +00:00
|
|
|
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
2014-05-03 01:48:33 +00:00
|
|
|
|
2014-11-30 20:59:53 +00:00
|
|
|
gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/inspector/object-hierarchy.ui");
|
2014-05-07 03:24:20 +00:00
|
|
|
gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorObjectHierarchy, model);
|
|
|
|
gtk_widget_class_bind_template_child_private (widget_class, GtkInspectorObjectHierarchy, tree);
|
2014-05-03 01:48:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2014-05-07 03:24:20 +00:00
|
|
|
gtk_inspector_object_hierarchy_set_object (GtkInspectorObjectHierarchy *oh,
|
|
|
|
GObject *object)
|
2014-05-03 01:48:33 +00:00
|
|
|
{
|
2014-05-08 05:59:37 +00:00
|
|
|
GType type;
|
2014-05-03 01:48:33 +00:00
|
|
|
const gchar *class_name;
|
|
|
|
GtkTreeIter iter, parent;
|
2014-05-08 05:59:37 +00:00
|
|
|
GList *list = NULL, *l;
|
|
|
|
GHashTable *interfaces;
|
|
|
|
GHashTableIter hit;
|
|
|
|
GType *ifaces;
|
|
|
|
gint i;
|
2014-05-03 01:48:33 +00:00
|
|
|
|
|
|
|
gtk_tree_store_clear (oh->priv->model);
|
|
|
|
|
2014-05-10 16:26:22 +00:00
|
|
|
if (object == NULL)
|
|
|
|
return;
|
|
|
|
|
2014-05-08 05:59:37 +00:00
|
|
|
interfaces = g_hash_table_new (g_str_hash, g_str_equal);
|
|
|
|
type = ((GTypeInstance*)object)->g_class->g_type;
|
2014-11-22 18:54:16 +00:00
|
|
|
|
2014-05-03 01:48:33 +00:00
|
|
|
do
|
|
|
|
{
|
2014-05-08 05:59:37 +00:00
|
|
|
class_name = g_type_name (type);
|
|
|
|
list = g_list_append (list, (gpointer)class_name);
|
|
|
|
ifaces = g_type_interfaces (type, NULL);
|
|
|
|
for (i = 0; ifaces[i]; i++)
|
|
|
|
g_hash_table_add (interfaces, (gchar *)g_type_name (ifaces[i]));
|
|
|
|
g_free (ifaces);
|
2014-05-03 01:48:33 +00:00
|
|
|
}
|
2014-05-08 05:59:37 +00:00
|
|
|
while ((type = g_type_parent (type)));
|
2014-05-03 01:48:33 +00:00
|
|
|
|
2015-10-28 04:41:13 +00:00
|
|
|
if (g_hash_table_size (interfaces) > 0)
|
|
|
|
{
|
|
|
|
gtk_tree_store_append (oh->priv->model, &iter, NULL);
|
|
|
|
gtk_tree_store_set (oh->priv->model, &iter,
|
|
|
|
COLUMN_OBJECT_NAME, "GInterface",
|
|
|
|
-1);
|
|
|
|
parent = iter;
|
|
|
|
}
|
2014-05-08 05:59:37 +00:00
|
|
|
g_hash_table_iter_init (&hit, interfaces);
|
|
|
|
while (g_hash_table_iter_next (&hit, (gpointer *)&class_name, NULL))
|
|
|
|
{
|
2015-10-28 04:41:13 +00:00
|
|
|
gtk_tree_store_append (oh->priv->model, &iter, &parent);
|
2014-05-08 05:59:37 +00:00
|
|
|
gtk_tree_store_set (oh->priv->model, &iter,
|
|
|
|
COLUMN_OBJECT_NAME, class_name,
|
|
|
|
-1);
|
|
|
|
}
|
|
|
|
g_hash_table_unref (interfaces);
|
|
|
|
|
|
|
|
list = g_list_reverse (list);
|
2014-05-03 01:48:33 +00:00
|
|
|
for (l = list; l; l = l->next)
|
|
|
|
{
|
|
|
|
gtk_tree_store_append (oh->priv->model, &iter, l == list ? NULL : &parent);
|
|
|
|
gtk_tree_store_set (oh->priv->model, &iter,
|
|
|
|
COLUMN_OBJECT_NAME, l->data,
|
|
|
|
-1);
|
|
|
|
parent = iter;
|
|
|
|
}
|
|
|
|
|
2014-05-08 05:59:37 +00:00
|
|
|
g_list_free (list);
|
2014-05-03 01:48:33 +00:00
|
|
|
|
|
|
|
gtk_tree_view_expand_all (oh->priv->tree);
|
2014-05-04 16:06:06 +00:00
|
|
|
gtk_tree_selection_select_iter (gtk_tree_view_get_selection (oh->priv->tree), &iter);
|
2014-05-03 01:48:33 +00:00
|
|
|
}
|
|
|
|
|
2014-05-04 16:06:06 +00:00
|
|
|
// vim: set et sw=2 ts=2:
|