diff options
| author | MenTaLguY <mental@rydia.net> | 2006-01-16 02:36:01 +0000 |
|---|---|---|
| committer | mental <mental@users.sourceforge.net> | 2006-01-16 02:36:01 +0000 |
| commit | 179fa413b047bede6e32109e2ce82437c5fb8d34 (patch) | |
| tree | a5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/widgets/sp-xmlview-content.cpp | |
| download | inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.tar.gz inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.zip | |
moving trunk for module inkscape
(bzr r1)
Diffstat (limited to 'src/widgets/sp-xmlview-content.cpp')
| -rw-r--r-- | src/widgets/sp-xmlview-content.cpp | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/src/widgets/sp-xmlview-content.cpp b/src/widgets/sp-xmlview-content.cpp new file mode 100644 index 000000000..0d8878436 --- /dev/null +++ b/src/widgets/sp-xmlview-content.cpp @@ -0,0 +1,165 @@ +#define __SP_XMLVIEW_CONTENT_C__ + +/* + * Specialization of GtkTextView for the XML tree view + * + * Authors: + * MenTaLguY <mental@rydia.net> + * + * Copyright (C) 2002 MenTaLguY + * + * Released under the GNU GPL; see COPYING for details + */ + + +#include "xml/node-event-vector.h" +#include "sp-xmlview-content.h" +#include "desktop-handles.h" +#include "document-private.h" +#include "inkscape.h" + +static void sp_xmlview_content_class_init (SPXMLViewContentClass * klass); +static void sp_xmlview_content_init (SPXMLViewContent * text); +static void sp_xmlview_content_destroy (GtkObject * object); + +void sp_xmlview_content_changed (GtkTextBuffer *tb, SPXMLViewContent *text); + +static void event_content_changed (Inkscape::XML::Node * repr, const gchar * old_content, const gchar * new_content, gpointer data); + +static GtkTextViewClass * parent_class = NULL; + +static Inkscape::XML::NodeEventVector repr_events = { + NULL, /* child_added */ + NULL, /* child_removed */ + NULL, /* attr_changed */ + event_content_changed, + NULL /* order_changed */ +}; + +GtkWidget * +sp_xmlview_content_new (Inkscape::XML::Node * repr) +{ + GtkTextBuffer *tb; + SPXMLViewContent *text; + + tb = gtk_text_buffer_new (NULL); + text = (SPXMLViewContent*)gtk_type_new (SP_TYPE_XMLVIEW_CONTENT); + gtk_text_view_set_buffer (GTK_TEXT_VIEW (text), tb); + gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (text), GTK_WRAP_CHAR); + + g_signal_connect (G_OBJECT (tb), "changed", G_CALLBACK (sp_xmlview_content_changed), text); + + /* should we alter the scrolling adjustments here? */ + + sp_xmlview_content_set_repr (text, repr); + + return (GtkWidget *) text; +} + +void +sp_xmlview_content_set_repr (SPXMLViewContent * text, Inkscape::XML::Node * repr) +{ + if ( repr == text->repr ) return; + if (text->repr) { + sp_repr_remove_listener_by_data (text->repr, text); + Inkscape::GC::release(text->repr); + } + text->repr = repr; + if (repr) { + Inkscape::GC::anchor(repr); + sp_repr_add_listener (repr, &repr_events, text); + sp_repr_synthesize_events (repr, &repr_events, text); + } else { + gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (text)), "", 0); + gtk_text_view_set_editable (GTK_TEXT_VIEW (text), FALSE); + } +} + +GtkType +sp_xmlview_content_get_type (void) +{ + static GtkType type = 0; + + if (!type) { + static const GtkTypeInfo info = { + "SPXMLViewContent", + sizeof (SPXMLViewContent), + sizeof (SPXMLViewContentClass), + (GtkClassInitFunc) sp_xmlview_content_class_init, + (GtkObjectInitFunc) sp_xmlview_content_init, + NULL, NULL, NULL + }; + type = gtk_type_unique (GTK_TYPE_TEXT_VIEW, &info); + } + + return type; +} + +void +sp_xmlview_content_class_init (SPXMLViewContentClass * klass) +{ + GtkObjectClass * object_class; + + object_class = (GtkObjectClass *) klass; + + parent_class = (GtkTextViewClass*)gtk_type_class (GTK_TYPE_TEXT_VIEW); + + object_class->destroy = sp_xmlview_content_destroy; +} + +void +sp_xmlview_content_init (SPXMLViewContent *text) +{ + text->repr = NULL; + text->blocked = FALSE; +} + +void +sp_xmlview_content_destroy (GtkObject * object) +{ + SPXMLViewContent * text; + + text = SP_XMLVIEW_CONTENT (object); + + sp_xmlview_content_set_repr (text, NULL); + + GTK_OBJECT_CLASS (parent_class)->destroy (object); +} + +void +event_content_changed (Inkscape::XML::Node * repr, const gchar * old_content, const gchar * new_content, gpointer data) +{ + SPXMLViewContent * text; + text = SP_XMLVIEW_CONTENT (data); + + if (text->blocked) return; + + text->blocked = TRUE; + + if (new_content) { + gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (text)), new_content, strlen (new_content)); + } else { + gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (text)), "", 0); + } + gtk_text_view_set_editable (GTK_TEXT_VIEW (text), new_content != NULL); + + text->blocked = FALSE; +} + +void +sp_xmlview_content_changed (GtkTextBuffer *tb, SPXMLViewContent *text) +{ + if (text->blocked) return; + + if (text->repr) { + GtkTextIter start, end; + gchar *data; + text->blocked = TRUE; + gtk_text_buffer_get_bounds (tb, &start, &end); + data = gtk_text_buffer_get_text (tb, &start, &end, TRUE); + text->repr->setContent(data); + g_free (data); + text->blocked = FALSE; + sp_document_done (SP_DT_DOCUMENT (SP_ACTIVE_DESKTOP)); + } +} |
