summaryrefslogtreecommitdiffstats
path: root/src/ui/dialog/xml-tree.cpp
diff options
context:
space:
mode:
authorDenis Declara <declara91@gmail.com>2012-04-15 12:29:45 +0000
committerDenis Declara <declara91@gmail.com>2012-04-15 12:29:45 +0000
commit6b5ff661a46ea1779c86f6947006c5ed32926117 (patch)
treea5b170f0830854e99ad065055ee2a3996933e614 /src/ui/dialog/xml-tree.cpp
parentImproved User interface. (diff)
parenti18n. Fix for Bug #980518 (Please use c-format). (diff)
downloadinkscape-6b5ff661a46ea1779c86f6947006c5ed32926117.tar.gz
inkscape-6b5ff661a46ea1779c86f6947006c5ed32926117.zip
Trunk merge
(bzr r11073.1.15)
Diffstat (limited to 'src/ui/dialog/xml-tree.cpp')
-rw-r--r--src/ui/dialog/xml-tree.cpp215
1 files changed, 113 insertions, 102 deletions
diff --git a/src/ui/dialog/xml-tree.cpp b/src/ui/dialog/xml-tree.cpp
index ae1ebf5ca..5c39a2b22 100644
--- a/src/ui/dialog/xml-tree.cpp
+++ b/src/ui/dialog/xml-tree.cpp
@@ -48,6 +48,11 @@
#include "widgets/sp-xmlview-content.h"
#include "widgets/sp-xmlview-tree.h"
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_Escape 0xff1b
+#define GDK_KEY_Return 0xff0d
+#endif
+
namespace Inkscape {
namespace UI {
namespace Dialog {
@@ -65,7 +70,6 @@ XmlTree::XmlTree (void) :
attributes (NULL),
content (NULL),
attr_name (),
- attr_value (),
status (""),
tree_toolbar(),
xml_element_new_button ( _("New element node")),
@@ -167,6 +171,7 @@ XmlTree::XmlTree (void) :
Gtk::ScrolledWindow *tree_scroller = new Gtk::ScrolledWindow();
tree_scroller->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC );
+ tree_scroller->set_shadow_type(Gtk::SHADOW_IN);
tree_scroller->add(*Gtk::manage(Glib::wrap(GTK_WIDGET(tree))));
left_box.pack_start(*tree_scroller);
@@ -227,11 +232,11 @@ XmlTree::XmlTree (void) :
text_container.add(*Gtk::manage(Glib::wrap(GTK_WIDGET(content))));
/* Signal handlers */
- g_signal_connect( G_OBJECT(tree), "tree_select_row", G_CALLBACK(on_tree_select_row), this );
- g_signal_connect( G_OBJECT(tree), "tree_unselect_row", G_CALLBACK(on_tree_unselect_row), this);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(tree));
+ g_signal_connect (G_OBJECT(selection), "changed", G_CALLBACK (on_tree_select_row), this);
g_signal_connect_after( G_OBJECT(tree), "tree_move", G_CALLBACK(after_tree_move), this);
- GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(attributes));
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(attributes));
g_signal_connect (G_OBJECT(selection), "changed", G_CALLBACK (on_attr_select_row), this);
g_signal_connect( G_OBJECT(attributes), "row-value-changed", G_CALLBACK(on_attr_row_changed), this);
@@ -287,8 +292,6 @@ XmlTree::~XmlTree (void)
Inkscape::GC::release(_message_stack);
_message_stack = NULL;
_message_changed_connection.~connection();
-
- //status = "";
}
void XmlTree::setDesktop(SPDesktop *desktop)
@@ -336,7 +339,7 @@ bool XmlTree::sp_xml_tree_key_press(GdkEventKey *event)
/* fixme: if you need to add more xml-tree-specific callbacks, you should probably upgrade
* the sp_shortcut mechanism to take into account windows. */
- if (shortcut == (SP_SHORTCUT_CONTROL_MASK | GDK_Return)) {
+ if (shortcut == (SP_SHORTCUT_CONTROL_MASK | GDK_KEY_Return)) {
cmd_set_attr();
return true;
}
@@ -394,8 +397,6 @@ void XmlTree::set_tree_repr(Inkscape::XML::Node *repr)
return;
}
- gtk_clist_freeze(GTK_CLIST(tree));
-
sp_xmlview_tree_set_repr(tree, repr);
if (repr) {
set_tree_select(get_dt_select());
@@ -403,8 +404,6 @@ void XmlTree::set_tree_repr(Inkscape::XML::Node *repr)
set_tree_select(NULL);
}
- gtk_clist_thaw(GTK_CLIST(tree));
-
propagate_tree_select(selected_repr);
}
@@ -419,26 +418,29 @@ void XmlTree::set_tree_select(Inkscape::XML::Node *repr)
selected_repr = repr;
if (repr) {
- GtkCTreeNode *node;
+ GtkTreeIter node;
Inkscape::GC::anchor(selected_repr);
- node = sp_xmlview_tree_get_repr_node(SP_XMLVIEW_TREE(tree), repr);
- if (node) {
- GtkCTreeNode *parent;
+ if (sp_xmlview_tree_get_repr_node(SP_XMLVIEW_TREE(tree), repr, &node)) {
- gtk_ctree_select(GTK_CTREE(tree), node);
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+ gtk_tree_selection_unselect_all (selection);
- parent = GTK_CTREE_ROW(node)->parent;
- while (parent) {
- gtk_ctree_expand(GTK_CTREE(tree), parent);
- parent = GTK_CTREE_ROW(parent)->parent;
- }
+ GtkTreePath* path = gtk_tree_model_get_path(GTK_TREE_MODEL(tree->store), &node);
+ gtk_tree_view_expand_to_path (GTK_TREE_VIEW(tree), path);
+ gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(tree), path, NULL, TRUE, 0.66, 0.0);
+ gtk_tree_path_free(path);
- gtk_ctree_node_moveto(GTK_CTREE(tree), node, 0, 0.66, 0.0);
+ gtk_tree_selection_select_iter(selection, &node);
+
+ } else {
+ g_message("XmlTree::set_tree_select : Couldnt find repr node");
}
} else {
- gtk_clist_unselect_all(GTK_CLIST(tree));
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+ gtk_tree_selection_unselect_all (selection);
+
on_tree_unselect_row_disable();
on_tree_unselect_row_hide();
}
@@ -508,76 +510,67 @@ void XmlTree::set_dt_select(Inkscape::XML::Node *repr)
} // end of set_dt_select()
-void XmlTree::on_tree_select_row(GtkCTree *tree,
- GtkCTreeNode *node,
- gint column,
- gpointer data)
+/*void XmlTree::on_tree_select_row(GtkCTree *tree,
+ GtkCTreeNode *node,
+ gint column,
+ gpointer data)*/
+void XmlTree::on_tree_select_row(GtkTreeSelection *selection, gpointer data)
{
- XmlTree *self = (XmlTree *)data;
+ XmlTree *self = static_cast<XmlTree *>(data);
- Inkscape::XML::Node *repr = sp_xmlview_tree_node_get_repr(SP_XMLVIEW_TREE(tree), node);
- g_assert(repr != NULL);
+ GtkTreeIter iter;
+ GtkTreeModel *model;
if (self->selected_repr) {
Inkscape::GC::release(self->selected_repr);
self->selected_repr = NULL;
}
- self->selected_repr = repr;
- Inkscape::GC::anchor(self->selected_repr);
- self->propagate_tree_select(self->selected_repr);
- self->set_dt_select(self->selected_repr);
-
- self->tree_reset_context();
+ if (!gtk_tree_selection_get_selected (selection, &model, &iter)) {
+ // Nothing selected, update widgets
+ self->propagate_tree_select(NULL);
+ self->set_dt_select(NULL);
+ self->on_tree_unselect_row_disable();
+ self->on_tree_unselect_row_hide();
+ self->on_attr_unselect_row_clear_text();
+ return;
+ }
- self->on_tree_select_row_enable(node);
-}
+ Inkscape::XML::Node *repr = sp_xmlview_tree_node_get_repr(GTK_TREE_VIEW(self->tree), &iter);
+ g_assert(repr != NULL);
-void XmlTree::on_tree_unselect_row(GtkCTree *tree,
- GtkCTreeNode *node,
- gint column,
- gpointer data)
-{
- XmlTree *self = (XmlTree *)data;
- if (self->blocked) {
- return;
- }
+ self->selected_repr = repr;
+ Inkscape::GC::anchor(self->selected_repr);
+ self->propagate_tree_select(self->selected_repr);
- Inkscape::XML::Node *repr = sp_xmlview_tree_node_get_repr(SP_XMLVIEW_TREE(tree), node);
- self->propagate_tree_select(NULL);
- self->set_dt_select(NULL);
+ self->set_dt_select(self->selected_repr);
- if (self->selected_repr && (self->selected_repr == repr)) {
- Inkscape::GC::release(self->selected_repr);
- self->selected_repr = NULL;
- self->selected_attr = 0;
- }
+ self->tree_reset_context();
- self->on_tree_unselect_row_disable();
- self->on_tree_unselect_row_hide();
- self->on_attr_unselect_row_clear_text();
+ self->on_tree_select_row_enable(&iter);
}
-
-void XmlTree::after_tree_move(GtkCTree */*tree*/,
- GtkCTreeNode *node,
- GtkCTreeNode *new_parent,
- GtkCTreeNode *new_sibling,
- gpointer data)
+void XmlTree::after_tree_move(SPXMLViewTree * /*attributes*/, gpointer value, gpointer data)
{
- XmlTree *self = (XmlTree *)data;
+ XmlTree *self = static_cast<XmlTree *>(data);
+ guint val = GPOINTER_TO_UINT(value);
- if (GTK_CTREE_ROW(node)->parent == new_parent &&
- GTK_CTREE_ROW(node)->sibling == new_sibling)
- {
+ if (val) {
DocumentUndo::done(self->current_document, SP_VERB_DIALOG_XML_EDITOR,
- _("Drag XML subtree"));
+ _("Drag XML subtree"));
} else {
- DocumentUndo::cancel(self->current_document);
+ //DocumentUndo::cancel(self->current_document);
+ /*
+ * There was a problem with drag & drop,
+ * data is probably not synchronized, so reload the tree
+ */
+ SPDocument *document = self->current_document;
+ self->set_tree_document(NULL);
+ self->set_tree_document(document);
}
}
@@ -588,13 +581,13 @@ void XmlTree::_set_status_message(Inkscape::MessageType /*type*/, const gchar *m
}
}
-void XmlTree::on_tree_select_row_enable(GtkCTreeNode *node)
+void XmlTree::on_tree_select_row_enable(GtkTreeIter *node)
{
if (!node) {
return;
}
- Inkscape::XML::Node *repr = sp_xmlview_tree_node_get_repr(SP_XMLVIEW_TREE(tree), node);
+ Inkscape::XML::Node *repr = sp_xmlview_tree_node_get_repr(GTK_TREE_VIEW(tree), node);
Inkscape::XML::Node *parent=repr->parent();
//on_tree_select_row_enable_if_mutable
@@ -613,11 +606,10 @@ void XmlTree::on_tree_select_row_enable(GtkCTreeNode *node)
//on_tree_select_row_enable_if_has_grandparent
{
- GtkCTreeNode *parent = GTK_CTREE_ROW(node)->parent;
-
- if (parent) {
- GtkCTreeNode *grandparent = GTK_CTREE_ROW(parent)->parent;
- if (grandparent) {
+ GtkTreeIter parent;
+ if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(tree->store), &parent, node)) {
+ GtkTreeIter grandparent;
+ if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(tree->store), &grandparent, &parent)) {
unindent_node_button.set_sensitive(true);
} else {
unindent_node_button.set_sensitive(false);
@@ -683,20 +675,23 @@ void XmlTree::on_tree_select_row_enable(GtkCTreeNode *node)
}
-gboolean XmlTree::xml_tree_node_mutable(GtkCTreeNode *node)
+gboolean XmlTree::xml_tree_node_mutable(GtkTreeIter *node)
{
// top-level is immutable, obviously
- if (!GTK_CTREE_ROW(node)->parent) {
+ GtkTreeIter parent;
+ if (!gtk_tree_model_iter_parent(GTK_TREE_MODEL(tree->store), &parent, node)) {
return false;
}
+
// if not in base level (where namedview, defs, etc go), we're mutable
- if (GTK_CTREE_ROW(GTK_CTREE_ROW(node)->parent)->parent) {
+ GtkTreeIter child;
+ if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(tree->store), &child, &parent)) {
return true;
}
Inkscape::XML::Node *repr;
- repr = sp_xmlview_tree_node_get_repr(SP_XMLVIEW_TREE(tree), node);
+ repr = sp_xmlview_tree_node_get_repr(GTK_TREE_VIEW(tree), node);
g_assert(repr);
// don't let "defs" or "namedview" disappear
@@ -732,7 +727,7 @@ void XmlTree::on_tree_unselect_row_hide()
void XmlTree::on_attr_select_row(GtkTreeSelection *selection, gpointer data)
{
- XmlTree *self = (XmlTree *)data;
+ XmlTree *self = static_cast<XmlTree *>(data);
GtkTreeIter iter;
GtkTreeModel *model;
@@ -747,37 +742,50 @@ void XmlTree::on_attr_select_row(GtkTreeSelection *selection, gpointer data)
return;
}
- self->attr_value.grab_focus ();
-
- self->xml_attribute_delete_button.set_sensitive(true);
-
- const gchar *name;
- const gchar *value;
- gint attr;
- gtk_tree_model_get (model, &iter, 0, &name, 1, &value, 2, &attr, -1);
+ gchar *name = 0;
+ gchar *value = 0;
+ guint attr = 0;
+ gtk_tree_model_get (model, &iter, ATTR_COL_NAME, &name, ATTR_COL_VALUE, &value, ATTR_COL_ATTR, &attr, -1);
self->attr_name.set_text(name);
self->attr_value.get_buffer()->set_text(value);
- self->selected_attr = attr;
+ self->attr_value.grab_focus ();
+ self->xml_attribute_delete_button.set_sensitive(true);
+
+ self->selected_attr = attr;
self->attr_reset_context(self->selected_attr);
+ if (name) {
+ g_free(name);
+ }
+
+ if (value) {
+ g_free(value);
+ }
}
-void XmlTree::on_attr_row_changed(SPXMLViewAttrList *attributes, const gchar * name, gpointer data)
+void XmlTree::on_attr_row_changed(SPXMLViewAttrList *attributes, const gchar * name, gpointer /*data*/)
{
// Reselect the selected row if the data changes to refresh the attribute and value edit boxes.
GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(attributes));
GtkTreeIter iter;
GtkTreeModel *model;
- const gchar *attr_name;
+ gchar *attr_name = 0;
if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
gtk_tree_model_get (model, &iter, 0, &attr_name, -1);
- if (!strcmp(name, attr_name)) {
- gtk_tree_selection_unselect_all(selection);
- gtk_tree_selection_select_iter(selection, &iter);
+ if (gtk_list_store_iter_is_valid(GTK_LIST_STORE(model), &iter) ) {
+ if (!strcmp(name, attr_name)) {
+ gtk_tree_selection_unselect_all(selection);
+ gtk_tree_selection_select_iter(selection, &iter);
+ }
}
}
+
+ if (attr_name) {
+ g_free(attr_name);
+ attr_name = 0;
+ }
}
void XmlTree::on_attr_unselect_row_clear_text()
@@ -821,7 +829,7 @@ void XmlTree::on_document_replaced(SPDesktop *dt, SPDocument *doc)
set_tree_document(doc);
}
-void XmlTree::on_document_uri_set(gchar const */*uri*/, SPDocument *document)
+void XmlTree::on_document_uri_set(gchar const * /*uri*/, SPDocument * /*document*/)
{
/*
* Seems to be no way to set the title on a docked dialog
@@ -836,7 +844,7 @@ void XmlTree::on_document_uri_set(gchar const */*uri*/, SPDocument *document)
gboolean XmlTree::quit_on_esc (GtkWidget *w, GdkEventKey *event, GObject */*tbl*/)
{
switch (get_group0_keyval (event)) {
- case GDK_Escape: // defocus
+ case GDK_KEY_Escape: // defocus
gtk_widget_destroy(w);
return TRUE;
}
@@ -899,7 +907,7 @@ void XmlTree::cmd_new_element_node()
gchar *new_name = g_strdup(name_entry->get_text().c_str());
- if (selected_repr != NULL && new_name) {
+ if (new_name) {
Inkscape::XML::Document *xml_doc = current_document->getReprDoc();
Inkscape::XML::Node *new_repr;
new_repr = xml_doc->createElement(new_name);
@@ -946,10 +954,13 @@ void XmlTree::cmd_duplicate_node()
DocumentUndo::done(current_document, SP_VERB_DIALOG_XML_EDITOR,
_("Duplicate node"));
- GtkCTreeNode *node = sp_xmlview_tree_get_repr_node(SP_XMLVIEW_TREE(tree), dup);
+ GtkTreeIter node;
+
+ if (sp_xmlview_tree_get_repr_node(SP_XMLVIEW_TREE(tree), dup, &node)) {
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+ gtk_tree_selection_select_iter(selection, &node);
+ } else {
- if (node) {
- gtk_ctree_select(GTK_CTREE(tree), node);
}
}