diff options
Diffstat (limited to 'src/ui/dialog/xml-tree.cpp')
| -rw-r--r-- | src/ui/dialog/xml-tree.cpp | 215 |
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); } } |
