Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals  

mlview-xml-doc-tree-view.c

Go to the documentation of this file.
00001 /*
00002  *This file is part of MlView
00003  *
00004  *MlView is free software; you can redistribute it and/or modify it under the terms of 
00005  *the GNU General Public License as published by the Free Software Foundation; either version 2, 
00006  *or (at your option) any later version.
00007  *
00008  *MlView is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
00009  *without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00010  *See the GNU General Public License for more details.
00011  *
00012  *You should have received a copy of the GNU General Public License along with MlView; 
00013  *see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00014  *
00015  *
00016  *Copyright 2001-2002 Dodji Seketeli.
00017  */
00018 
00019 #include "mlview-xml-doc-tree-view.h"
00020 #include "mlview-tree-editor.h"
00021 
00022 struct _MlViewXMLDocTreeViewPrivate
00023 {
00024         MlViewTreeEditor *tree_editor ;
00025         MlViewNodeEditor *node_editor ;
00026         MlViewAppContext *app_context ;
00027         GnomeDialog * expand_tree_dialog ;
00028 
00029         /*The main paned that divides the view in two main parts*/
00030         GtkPaned *main_paned ;
00031 
00032         GtkPaned *upper_paned1 ;
00033         
00034         GtkCList *feasible_children ;
00035         GtkCList *feasible_prev_siblings ;
00036         GtkCList *feasible_next_siblings ;
00037         GtkCList *feasible_attributes ;
00038 
00039         guint main_paned_percentage ;
00040 };
00041 
00042 enum {
00043         DOCUMENT_CHANGED,
00044         SIGNAL_NUM
00045 } ;
00046 
00047 #define PRIVATE(tree_view) (tree_view->private)
00048 
00049 static void 
00050 visual_node_selected_cb (MlViewTreeEditor *a_editor,
00051                          GtkCTreeNode *a_visual_node, 
00052                          gpointer a_user_data) ;
00053 
00054 static void 
00055 xml_node_changed_cb (MlViewNodeEditor* a_editor, 
00056                      gpointer a_data) ;
00057 
00058 static void 
00059 toggle_expand_to_leaves_cb (GtkToggleButton * a_toggle_button, 
00060                             gpointer *a_depth_entry) ;
00061 
00062 static void 
00063 update_feasible_attributes_list_cb (MlViewTreeEditor *a_editor,
00064                                     GtkCTreeNode *a_visual_node,
00065                                     gpointer a_user_data) ;
00066 
00067 static void 
00068 update_feasible_next_siblings_list_cb (MlViewTreeEditor *a_editor,
00069                                        GtkCTreeNode *a_visual_node,
00070                                        gpointer a_user_data) ;
00071 
00072 static void 
00073 update_feasible_prev_siblings_list_cb (MlViewTreeEditor *a_editor,
00074                                        GtkCTreeNode *a_visual_node,
00075                                        gpointer a_user_data) ;
00076 
00077 static void 
00078 update_feasible_children_list_cb (MlViewTreeEditor *a_editor,
00079                                   GtkCTreeNode *a_visual_node,
00080                                   gpointer a_user_data) ;
00081 
00082 static void 
00083 selected_a_possible_child_cb (GtkCList *a_possible_children,
00084                               gint a_row, gint a_column,
00085                               GdkEventButton *event, 
00086                               gpointer a_user_data) ;
00087 
00088 static void 
00089 selected_a_possible_next_sibling_cb (GtkCList *a_possible_next_siblings,
00090                                      gint a_row, gint a_column,
00091                                      GdkEventButton *event, 
00092                                      gpointer a_user_data) ;
00093 
00094 static void 
00095 selected_a_possible_prev_sibling_cb (GtkCList *a_possible_prev_siblings,
00096                                      gint a_row, gint a_column,
00097                                      GdkEventButton *event, 
00098                                      gpointer a_user_data) ;
00099 
00100 static void 
00101 mlview_xml_doc_tree_view_document_changed_cb (MlViewXMLDocument * a_xml_doc,
00102                                               gpointer a_xml_doc_tree_view) ;
00103 
00104 static void 
00105 mlview_xml_doc_tree_view_node_cut_cb (MlViewXMLDocument *a_xml_doc,
00106                                       xmlNode * a_parent_node, xmlNode * a_node,
00107                                       gpointer a_xml_doc_tree_view) ;
00108 
00109 static void 
00110 mlview_xml_doc_tree_view_child_node_added_cb (MlViewXMLDocument *a_xml_doc,
00111                                               xmlNode * a_parent_node, 
00112                                               xmlNode * a_node,
00113                                               gpointer a_xml_doc_tree_view) ;
00114 
00115 static void 
00116 mlview_xml_doc_tree_view_prev_sibling_node_inserted_cb (MlViewXMLDocument *a_xml_doc,
00117                                                         xmlNode * a_sibling_node, 
00118                                                         xmlNode *a_inserted_node,
00119                                                         gpointer a_user_data) ;
00120 
00121 static void 
00122 mlview_xml_doc_tree_view_next_sibling_node_inserted_cb (MlViewXMLDocument *a_xml_doc,
00123                                                         xmlNode * a_sibling_node,
00124                                                         xmlNode *a_added_node,
00125                                                         gpointer a_user_data) ;
00126 static void
00127 mlview_xml_doc_tree_view_node_changed_cb (MlViewXMLDocument *a_xml_doc,
00128                                           xmlNode *a_node,
00129                                           gpointer a_xml_doc_tree_view) ;
00130 
00131 static void
00132 mlview_xml_doc_tree_view_doc_path_changed_cb (MlViewXMLDocument *a_xml_doc,
00133                                            gpointer a_xml_doc_tree_view) ;
00134 
00135 static GnomeDialog *
00136 mlview_xml_doc_tree_view_get_expand_tree_dialog (MlViewXMLDocTreeView * a_view) ;
00137 
00138 static void
00139 mlview_xml_doc_tree_view_init (MlViewXMLDocTreeView *a_tree_view) ;
00140 
00141 static void
00142 mlview_xml_doc_tree_view_class_init (MlViewXMLDocTreeViewClass * a_class) ;
00143 
00144 static void
00145 mlview_xml_doc_tree_view_destroy (GtkObject *a_object) ;
00146 
00147 static MlViewXMLDocumentViewClass *parent_class = NULL ;
00148 static guint p_signals [SIGNAL_NUM] = {0} ;
00149 
00150 /*This table lists the callbacks of the xml document signals*/
00151 static SignalCallbackDescriptor gv_signals_fired_by_document [] = {
00152 
00153         {"document-changed", mlview_xml_doc_tree_view_document_changed_cb},
00154         {"child-node-added", mlview_xml_doc_tree_view_child_node_added_cb},
00155         {"node-cut", mlview_xml_doc_tree_view_node_cut_cb},
00156         {"prev-sibling-node-inserted", mlview_xml_doc_tree_view_prev_sibling_node_inserted_cb},
00157         {"next-sibling-node-inserted", mlview_xml_doc_tree_view_next_sibling_node_inserted_cb},
00158         {"node-changed", mlview_xml_doc_tree_view_node_changed_cb},
00159         {NULL}  /*MUST BE THE LAST element of the table*/
00160 } ;
00161 
00162 
00163 /*========================================
00164  *private (static) gtk framework functions
00165  *========================================*/
00166 
00167 static void
00168 mlview_xml_doc_tree_view_init (MlViewXMLDocTreeView *a_tree_view)
00169 {
00170         
00171         g_return_if_fail (a_tree_view != NULL) ;
00172         
00173         if (PRIVATE (a_tree_view) == NULL) {
00174                 PRIVATE (a_tree_view) =
00175                         g_malloc0 (sizeof (MlViewXMLDocTreeViewPrivate)) ;
00176         }
00177 }
00178 
00179 
00185 static void
00186 mlview_xml_doc_tree_view_class_init (MlViewXMLDocTreeViewClass *a_class)
00187 {
00188         GtkObjectClass *object_class = GTK_OBJECT_CLASS (a_class) ;
00189 
00190         g_return_if_fail (a_class != NULL) ;
00191 
00192         parent_class = gtk_type_class (MLVIEW_TYPE_XML_DOCUMENT_VIEW) ;
00193 
00194         object_class->destroy = mlview_xml_doc_tree_view_destroy ; /*define the virtual destroy method of GtkObject*/
00195 
00196         p_signals[DOCUMENT_CHANGED] = gtk_signal_new ("document-changed",
00197                                                       GTK_RUN_FIRST,
00198                                                       object_class->type,
00199                                                       GTK_SIGNAL_OFFSET (MlViewXMLDocTreeViewClass,
00200                                                                          document_changed),
00201                                                       gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0) ;
00202         gtk_object_class_add_signals (object_class, p_signals,
00203                                       SIGNAL_NUM) ;
00204 
00205         a_class->document_changed = NULL ;
00206 }
00207 
00208 
00209 /**********************************************************
00210  *private helper function and other private methods.
00211  *********************************************************/
00212 
00213 static void 
00214 mlview_xml_doc_tree_view_child_node_added_cb (MlViewXMLDocument *a_xml_doc,
00215                                               xmlNode *a_parent_node,
00216                                               xmlNode * a_node,
00217                                               gpointer a_xml_doc_tree_view)
00218 {
00219         MlViewXMLDocTreeView * doc_tree_view = NULL ;
00220 
00221         g_return_if_fail (a_xml_doc != NULL) ;
00222         g_return_if_fail (MLVIEW_IS_XML_DOCUMENT (a_xml_doc) ) ;
00223         g_return_if_fail (a_node != NULL) ;
00224         g_return_if_fail (a_xml_doc_tree_view != NULL) ;
00225         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_xml_doc_tree_view)) ;
00226 
00227         doc_tree_view = MLVIEW_XML_DOC_TREE_VIEW (a_xml_doc_tree_view) ;
00228         g_return_if_fail (PRIVATE (doc_tree_view) != NULL) ;
00229         g_return_if_fail (PRIVATE (doc_tree_view)->tree_editor != NULL) ;
00230 
00231         mlview_tree_editor_update_child_node_added (PRIVATE (doc_tree_view)->tree_editor,
00232                                                     a_parent_node, a_node) ;
00233 }
00234 
00235 
00236 static void 
00237 mlview_xml_doc_tree_view_prev_sibling_node_inserted_cb (MlViewXMLDocument *a_xml_doc,
00238                                                         xmlNode * a_sibling_node, xmlNode *a_inserted_node,
00239                                                         gpointer a_xml_doc_tree_view)
00240 {
00241         MlViewXMLDocTreeView * doc_tree_view = NULL ;
00242 
00243         g_return_if_fail (a_xml_doc != NULL) ;
00244         g_return_if_fail (MLVIEW_IS_XML_DOCUMENT (a_xml_doc)) ;
00245         g_return_if_fail (PRIVATE (a_xml_doc) != NULL) ;
00246         g_return_if_fail (a_xml_doc_tree_view != NULL) ;
00247         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_xml_doc_tree_view)) ;
00248         g_return_if_fail (a_sibling_node != NULL) ;
00249         g_return_if_fail (a_inserted_node != NULL) ;
00250 
00251         doc_tree_view = MLVIEW_XML_DOC_TREE_VIEW (a_xml_doc_tree_view) ;
00252         g_return_if_fail (PRIVATE (doc_tree_view) != NULL) ;
00253         g_return_if_fail (PRIVATE (doc_tree_view)->tree_editor != NULL) ;
00254 
00255         mlview_tree_editor_update_sibling_node_inserted (PRIVATE (doc_tree_view)->tree_editor,
00256                                                          a_sibling_node, a_inserted_node, TRUE/*previous=TRUE*/) ;
00257 }
00258 
00259 static void 
00260 mlview_xml_doc_tree_view_next_sibling_node_inserted_cb (MlViewXMLDocument *a_xml_doc,
00261                                                         xmlNode * a_sibling_node, xmlNode *a_inserted_node,
00262                                                         gpointer a_xml_doc_tree_view)
00263 {
00264         MlViewXMLDocTreeView * doc_tree_view = NULL ;
00265 
00266         g_return_if_fail (a_xml_doc != NULL) ;
00267         g_return_if_fail (MLVIEW_IS_XML_DOCUMENT (a_xml_doc)) ;
00268         g_return_if_fail (PRIVATE (a_xml_doc) != NULL) ;
00269         g_return_if_fail (a_xml_doc_tree_view != NULL) ;
00270         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_xml_doc_tree_view)) ;
00271         g_return_if_fail (a_sibling_node != NULL) ;
00272         g_return_if_fail (a_inserted_node != NULL) ;
00273 
00274         doc_tree_view = MLVIEW_XML_DOC_TREE_VIEW (a_xml_doc_tree_view) ;
00275         g_return_if_fail (PRIVATE (doc_tree_view) != NULL) ;
00276         g_return_if_fail (PRIVATE (doc_tree_view)->tree_editor != NULL) ;
00277 
00278         mlview_tree_editor_update_sibling_node_inserted (PRIVATE (doc_tree_view)->tree_editor,
00279                                                          a_sibling_node, a_inserted_node, FALSE/*previous=FALSE*/) ;
00280 }
00281 
00282 static void
00283 mlview_xml_doc_tree_view_node_cut_cb (MlViewXMLDocument *a_xml_doc,
00284                                       xmlNode * a_parent_node,
00285                                       xmlNode * a_node,
00286                                       gpointer a_xml_doc_tree_view)
00287 {
00288         MlViewXMLDocTreeView * doc_tree_view = NULL ;
00289 
00290         g_return_if_fail (a_xml_doc != NULL) ;
00291         g_return_if_fail (MLVIEW_IS_XML_DOCUMENT (a_xml_doc)) ;
00292         g_return_if_fail (PRIVATE (a_xml_doc) != NULL) ;
00293         g_return_if_fail (a_node != NULL) ;
00294         g_return_if_fail (a_xml_doc_tree_view != NULL) ;
00295 
00296         doc_tree_view = MLVIEW_XML_DOC_TREE_VIEW (a_xml_doc_tree_view) ;
00297         g_return_if_fail (PRIVATE (doc_tree_view) != NULL) ;
00298         g_return_if_fail (PRIVATE (doc_tree_view)->tree_editor != NULL) ;
00299 
00300         mlview_tree_editor_update_node_cut (PRIVATE (doc_tree_view)->tree_editor,
00301                                             a_parent_node, a_node) ;
00302 }
00303 
00304 
00305 static void
00306 mlview_xml_doc_tree_view_node_changed_cb (MlViewXMLDocument *a_xml_doc, 
00307                                           xmlNode *a_node,
00308                                           gpointer a_xml_doc_tree_view)
00309 {
00310         MlViewXMLDocTreeView * doc_tree_view = NULL ;
00311 
00312         g_return_if_fail (a_xml_doc != NULL) ;
00313         g_return_if_fail (MLVIEW_IS_XML_DOCUMENT (a_xml_doc)) ;
00314         g_return_if_fail (a_node != NULL) ;
00315         g_return_if_fail (a_xml_doc_tree_view != NULL) ;
00316         
00317         doc_tree_view = MLVIEW_XML_DOC_TREE_VIEW (a_xml_doc_tree_view) ;
00318         g_return_if_fail (PRIVATE (doc_tree_view) != NULL) ;
00319         g_return_if_fail (PRIVATE (doc_tree_view)->tree_editor != NULL) ;
00320 
00321         mlview_tree_editor_update_visual_xml_node (PRIVATE (doc_tree_view)->tree_editor,
00322                                                    a_node) ;
00323 }
00324 
00325 
00326 static void
00327 mlview_xml_doc_tree_view_doc_path_changed_cb (MlViewXMLDocument *a_xml_doc,
00328                                            gpointer a_xml_doc_tree_view)
00329 {
00330         MlViewFileDescriptor * file_desc = NULL ;
00331         MlViewXMLDocTreeView * tree_view = NULL ;
00332         gchar * path = NULL ;
00333 
00334         g_return_if_fail (a_xml_doc != NULL) ;
00335         g_return_if_fail (MLVIEW_IS_XML_DOCUMENT (a_xml_doc)) ;
00336         g_return_if_fail (a_xml_doc_tree_view != NULL) ;
00337         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_xml_doc_tree_view)) ;
00338 
00339         tree_view =
00340                 MLVIEW_XML_DOC_TREE_VIEW (a_xml_doc_tree_view) ;
00341 
00342         file_desc =
00343                 mlview_xml_document_get_file_descriptor (a_xml_doc) ;
00344 
00345         g_return_if_fail (file_desc != NULL) ;
00346 
00347         path = mlview_file_descriptor_get_file_path (file_desc) ;
00348 
00349         g_return_if_fail (path != NULL) ;
00350 
00351         mlview_xml_doc_tree_view_set_xml_document_path (tree_view, path) ;
00352 }
00353 
00354 
00358 static void
00359 mlview_xml_doc_tree_view_destroy (GtkObject *a_object)
00360 {
00361         MlViewXMLDocTreeView *tree_view ;
00362 
00363         g_return_if_fail(a_object != NULL) ;
00364         g_return_if_fail(MLVIEW_IS_XML_DOC_TREE_VIEW (a_object));
00365 
00366         tree_view = MLVIEW_XML_DOC_TREE_VIEW (a_object) ;
00367         if (PRIVATE (tree_view) == NULL)
00368                 return ;
00369 
00370         /*destroy the allocated widgets and other objects*/
00371         if(PRIVATE (tree_view)->tree_editor){
00372                 gtk_widget_destroy (GTK_WIDGET (PRIVATE (tree_view)->tree_editor)) ;
00373                 PRIVATE (tree_view)->tree_editor = NULL ;
00374         }
00375         if (PRIVATE (tree_view)->node_editor) {
00376                 gtk_widget_destroy (GTK_WIDGET (PRIVATE (tree_view)->node_editor)) ;
00377                 PRIVATE (tree_view)->node_editor=NULL ;
00378         }
00379         if (PRIVATE (tree_view)->expand_tree_dialog) {
00380                 gtk_widget_destroy (GTK_WIDGET (PRIVATE (tree_view)->expand_tree_dialog)) ;
00381                 PRIVATE (tree_view)->expand_tree_dialog = NULL ;
00382         }
00383         /*call the destroy method of the parent*/
00384         if(GTK_OBJECT_CLASS(parent_class)->destroy)
00385                 (*GTK_OBJECT_CLASS(parent_class)->destroy)(a_object) ;
00386 }
00387 
00388 /*========================================
00389  *private (static) helper functions
00390  *========================================*/
00396 static void
00397 visual_node_selected_cb (MlViewTreeEditor *a_editor, 
00398                          GtkCTreeNode *a_visual_node, 
00399                          gpointer a_user_data)
00400 {
00401         MlViewXMLDocTreeView * view = NULL ;
00402         xmlNode * xml_node = NULL ;
00403         MlViewXMLDocument * mlview_xml_doc = NULL ;
00404 
00405         g_return_if_fail (a_editor != NULL ) ; 
00406         g_return_if_fail (MLVIEW_IS_TREE_EDITOR (a_editor)) ;
00407         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
00408         g_return_if_fail (mlview_tree_editor_get_visual_tree(a_editor) != NULL ) ;
00409         g_return_if_fail (GTK_IS_CTREE (mlview_tree_editor_get_visual_tree(a_editor))) ;
00410         g_return_if_fail (a_visual_node != NULL ) ; 
00411         g_return_if_fail (a_user_data != NULL ) ;
00412         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW(a_user_data)) ;
00413 
00414         view = 
00415                 MLVIEW_XML_DOC_TREE_VIEW (a_user_data) ;
00416         xml_node = 
00417                 (xmlNodePtr) gtk_ctree_node_get_row_data (mlview_tree_editor_get_visual_tree (a_editor),
00418                                                           a_visual_node) ;
00419         mlview_xml_doc = 
00420                 mlview_xml_document_view_get_document (MLVIEW_XML_DOCUMENT_VIEW (view)) ;
00421 
00422         g_return_if_fail (mlview_xml_doc != NULL) ;
00423         g_return_if_fail (xml_node != NULL) ;
00424         g_return_if_fail (PRIVATE (view) != NULL) ;
00425         g_return_if_fail (PRIVATE (view)->node_editor != NULL) ;
00426         g_return_if_fail (MLVIEW_IS_NODE_EDITOR (PRIVATE (view)->node_editor)) ;
00427 
00428         gtk_object_set_data (GTK_OBJECT (PRIVATE (view)->node_editor), 
00429                             _("Visual node"), a_visual_node) ;
00430 
00431         mlview_node_editor_edit_xml_node (PRIVATE (view)->node_editor,
00432                                           mlview_xml_doc ,xml_node) ;
00433         gtk_widget_show_all (GTK_WIDGET (PRIVATE (view)->node_editor)) ;
00434 }
00435 
00440 static void
00441 xml_node_changed_cb (MlViewNodeEditor* a_node_editor, gpointer a_data)
00442 {
00443         GtkCTreeNode *visual_node ;
00444         GtkCTree *visual_tree ;
00445         xmlNodePtr xml_node ;
00446         MlViewXMLDocTreeView *view ;
00447         
00448         g_return_if_fail (a_node_editor != NULL) ;
00449         g_return_if_fail (MLVIEW_IS_NODE_EDITOR (a_node_editor)) ;
00450         g_return_if_fail (a_data != NULL) ;
00451         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_data)) ;
00452         
00453         xml_node = mlview_node_editor_get_current_xml_node (a_node_editor) ;
00454         g_return_if_fail (xml_node != NULL) ;
00455                 
00456         /*get the visual tree*/
00457         view = MLVIEW_XML_DOC_TREE_VIEW (a_data) ;
00458 
00459         g_return_if_fail (PRIVATE (view) != NULL) ;
00460         g_return_if_fail (PRIVATE (view)->tree_editor != NULL) ;
00461         g_return_if_fail (MLVIEW_IS_TREE_EDITOR (PRIVATE (view)->tree_editor)) ;
00462 
00463         visual_tree = mlview_tree_editor_get_visual_tree (PRIVATE (view)->tree_editor) ;
00464         g_return_if_fail (visual_tree != NULL) ;
00465         g_return_if_fail (GTK_IS_CTREE (visual_tree)) ;
00466 
00467         /*get the visual node to modify*/
00468         visual_node = GTK_CTREE_NODE (gtk_object_get_data (GTK_OBJECT (a_node_editor),
00469                                                            _("Visual node"))) ;
00470         g_return_if_fail (visual_node) ;
00471         mlview_tree_editor_update_visual_node (PRIVATE (view)->tree_editor, 
00472                                                visual_node) ;
00473 }
00474 
00475 
00479 static void
00480 toggle_expand_to_leaves_cb (GtkToggleButton * a_toggle_button,
00481                             gpointer *a_depth_entry)
00482 {
00483         g_return_if_fail (a_toggle_button != NULL) ;            
00484         g_return_if_fail (GTK_IS_TOGGLE_BUTTON (a_toggle_button)) ;
00485         g_return_if_fail (a_depth_entry != NULL) ;
00486         g_return_if_fail (GTK_IS_WIDGET (a_depth_entry)) ;
00487 
00488         if (gtk_toggle_button_get_active (a_toggle_button) == TRUE)
00489                 gtk_widget_set_sensitive (GTK_WIDGET (a_depth_entry), FALSE) ;
00490         else
00491                 gtk_widget_set_sensitive (GTK_WIDGET (a_depth_entry), TRUE) ;
00492 }
00493 
00498 static void
00499 update_feasible_children_list_cb (MlViewTreeEditor *a_editor,
00500                                   GtkCTreeNode *a_visual_node,
00501                                   gpointer a_user_data)
00502 {
00503         MlViewXMLDocTreeView * view = NULL ;
00504         xmlNode* xml_node = NULL ;
00505         GList * children_name_list = NULL ;
00506         gint nb_of_names = 0 ;  
00507 
00508         g_return_if_fail (a_editor != NULL) ;
00509         g_return_if_fail (MLVIEW_IS_TREE_EDITOR (a_editor)) ;
00510         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
00511         g_return_if_fail (mlview_tree_editor_get_visual_tree(a_editor) != NULL ) ;
00512         g_return_if_fail (GTK_IS_CTREE (mlview_tree_editor_get_visual_tree(a_editor))) ;
00513         g_return_if_fail (a_visual_node != NULL) ;
00514         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_user_data)) ;
00515 
00516         
00517         view = MLVIEW_XML_DOC_TREE_VIEW (a_user_data) ;
00518         g_return_if_fail (PRIVATE (view) != NULL) ;
00519 
00520         gtk_clist_clear (PRIVATE (view)->feasible_children) ;
00521 
00522         xml_node = 
00523                 (xmlNodePtr) gtk_ctree_node_get_row_data (mlview_tree_editor_get_visual_tree (a_editor),
00524                                                           a_visual_node) ;
00525         g_return_if_fail (xml_node != NULL) ;
00526 
00527         nb_of_names =
00528                 mlview_parsing_utils_build_element_name_completion_list (PRIVATE (view)->app_context,
00529                                                                          ADD_CHILD,
00530                                                                          xml_node,
00531                                                                          &children_name_list) ;
00532 
00533         if (nb_of_names > 0) {
00534                 gchar *clist_text [1] = {NULL} ;
00535                 gchar *cur_name = (gchar*)children_name_list->data ;
00536                 GList *cur = children_name_list ;
00537 
00538                 while (cur_name) {
00539                         clist_text[0] = cur_name ;
00540                         gtk_clist_append (PRIVATE (view)->feasible_children,
00541                                           clist_text) ;
00542                         
00543                         cur = (cur->next)? cur->next : NULL ;
00544                         cur_name = (cur)? (gchar*)cur->data : NULL ;
00545                 }
00546         }
00547 }
00548 
00553 static void
00554 update_feasible_prev_siblings_list_cb (MlViewTreeEditor *a_editor,
00555                                        GtkCTreeNode *a_visual_node,
00556                                        gpointer a_user_data)
00557 {
00558         MlViewXMLDocTreeView * view = NULL ;
00559         xmlNode* xml_node = NULL ;
00560         GList * children_name_list = NULL ;
00561         gint nb_of_names = 0 ;  
00562 
00563         g_return_if_fail (a_editor != NULL) ;
00564         g_return_if_fail (MLVIEW_IS_TREE_EDITOR (a_editor)) ;
00565         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
00566         g_return_if_fail (mlview_tree_editor_get_visual_tree(a_editor) != NULL ) ;
00567         g_return_if_fail (a_visual_node != NULL) ;
00568         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_user_data)) ;
00569         
00570         view = MLVIEW_XML_DOC_TREE_VIEW (a_user_data) ;
00571         g_return_if_fail (PRIVATE (view) != NULL) ;
00572 
00573         gtk_clist_clear (PRIVATE (view)->feasible_prev_siblings) ;
00574 
00575         xml_node = 
00576                 (xmlNodePtr) gtk_ctree_node_get_row_data (mlview_tree_editor_get_visual_tree (a_editor),
00577                                                           a_visual_node) ;
00578         g_return_if_fail (xml_node != NULL) ;
00579 
00580         nb_of_names =
00581                 mlview_parsing_utils_build_element_name_completion_list (PRIVATE (view)->app_context,
00582                                                                          INSERT_BEFORE,
00583                                                                          xml_node,
00584                                                                          &children_name_list) ;
00585         if (nb_of_names > 0) {
00586                 gchar *clist_text [1] = {NULL} ;
00587                 gchar *cur_name = (gchar*)children_name_list->data ;
00588                 GList *cur = children_name_list ;
00589 
00590                 while (cur_name) {
00591                         clist_text[0] = cur_name ;
00592                         gtk_clist_append (PRIVATE (view)->feasible_prev_siblings,
00593                                           clist_text) ;
00594                         cur = (cur->next)? cur->next : NULL ;
00595                         cur_name = (cur)? (gchar*)cur->data : NULL ;
00596                 }
00597         }
00598 }
00599 
00604 static void
00605 update_feasible_next_siblings_list_cb (MlViewTreeEditor *a_editor,
00606                                        GtkCTreeNode *a_visual_node,
00607                                        gpointer a_user_data)
00608 {
00609         MlViewXMLDocTreeView * view = NULL ;
00610         xmlNode* xml_node = NULL ;
00611         GList * children_name_list = NULL ;
00612         gint nb_of_names = 0 ;  
00613 
00614         g_return_if_fail (a_editor != NULL) ;
00615         g_return_if_fail (MLVIEW_IS_TREE_EDITOR (a_editor)) ;
00616         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
00617         g_return_if_fail (mlview_tree_editor_get_visual_tree(a_editor) != NULL ) ;
00618         g_return_if_fail (a_visual_node != NULL) ;
00619         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_user_data)) ;
00620         
00621         view = MLVIEW_XML_DOC_TREE_VIEW (a_user_data) ;
00622         g_return_if_fail (PRIVATE (view) != NULL) ;
00623 
00624         gtk_clist_clear (PRIVATE (view)->feasible_next_siblings) ;
00625 
00626         xml_node =
00627                 (xmlNodePtr) gtk_ctree_node_get_row_data (mlview_tree_editor_get_visual_tree (a_editor),
00628                                                           a_visual_node) ;
00629         g_return_if_fail (xml_node != NULL) ;
00630 
00631         nb_of_names =
00632                 mlview_parsing_utils_build_element_name_completion_list (PRIVATE (view)->app_context,
00633                                                                          INSERT_AFTER, xml_node,
00634                                                                          &children_name_list) ;
00635         if (nb_of_names > 0) {
00636                 gchar *clist_text [1] = {NULL} ;
00637                 gchar *cur_name = (gchar*)children_name_list->data ;
00638                 GList *cur = children_name_list ;
00639 
00640                 while (cur_name) {
00641                         clist_text[0] = cur_name ;
00642                         gtk_clist_append (PRIVATE (view)->feasible_next_siblings,
00643                                           clist_text) ;
00644                         cur = (cur->next)? cur->next : NULL ;
00645                         cur_name = (cur)? (gchar*)cur->data : NULL ;
00646                 }
00647         }
00648 }
00649 
00654 static void
00655 update_feasible_attributes_list_cb (MlViewTreeEditor *a_editor,
00656                                     GtkCTreeNode *a_visual_node,
00657                                     gpointer a_user_data)
00658 {
00659         MlViewXMLDocTreeView * view = NULL ;
00660         xmlNode* xml_node = NULL ;
00661         GList * children_name_list = NULL ;
00662         gint nb_of_names = 0 ;  
00663 
00664         g_return_if_fail (a_editor != NULL) ;
00665         g_return_if_fail (MLVIEW_IS_TREE_EDITOR (a_editor)) ;
00666         g_return_if_fail (PRIVATE (a_editor) != NULL) ;
00667         g_return_if_fail (mlview_tree_editor_get_visual_tree(a_editor) != NULL ) ;
00668         g_return_if_fail (a_visual_node != NULL) ;
00669         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_user_data)) ;
00670         
00671         view = MLVIEW_XML_DOC_TREE_VIEW (a_user_data) ;
00672         g_return_if_fail (PRIVATE (view) != NULL) ;
00673 
00674         gtk_clist_clear (PRIVATE (view)->feasible_attributes) ;
00675         xml_node = 
00676                 (xmlNodePtr) gtk_ctree_node_get_row_data (mlview_tree_editor_get_visual_tree (a_editor),
00677                                                           a_visual_node) ;
00678         g_return_if_fail (xml_node != NULL) ;
00679 
00680         nb_of_names =
00681                 mlview_parsing_utils_build_attribute_name_completion_list (PRIVATE (view)->app_context, xml_node,
00682                                                                            &children_name_list, FALSE) ;
00683         if (nb_of_names > 0) {
00684                 gchar *clist_text [1] = {NULL} ;
00685                 gchar *cur_name = (gchar*)children_name_list->data ;
00686                 GList *cur = children_name_list ;
00687 
00688                 while (cur_name) {
00689                         clist_text[0] = cur_name ;
00690                         gtk_clist_append (PRIVATE (view)->feasible_attributes,
00691                                           clist_text) ;
00692                         cur = (cur->next)? cur->next : NULL ;
00693                         cur_name = (cur)? (gchar*)cur->data : NULL ;
00694                 }
00695         }
00696 }
00697 
00698 
00699 static void
00700 selected_a_possible_child_cb (GtkCList *a_possible_children,
00701                               gint a_row, gint a_column,
00702                               GdkEventButton *event, 
00703                               gpointer a_user_data)
00704 {
00705         MlViewXMLDocTreeView * doc_tree_view = NULL ;
00706         GtkCTreeNode * current_selected_node = NULL ;   
00707         gchar * element_name = NULL ;
00708         gint status = 0 ;
00709 
00710         g_return_if_fail (a_possible_children != NULL) ;
00711         g_return_if_fail (GTK_IS_CLIST (a_possible_children)) ;
00712         g_return_if_fail (a_user_data != NULL) ;
00713         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_user_data)) ;
00714 
00715 
00716         doc_tree_view = 
00717                 MLVIEW_XML_DOC_TREE_VIEW (a_user_data) ;
00718         g_return_if_fail (PRIVATE (doc_tree_view) != NULL) ;
00719         g_return_if_fail (PRIVATE (doc_tree_view)->tree_editor != NULL) ;
00720 
00721         current_selected_node = 
00722                 mlview_tree_editor_get_current_selected_node (PRIVATE (doc_tree_view)->tree_editor) ;
00723         g_return_if_fail (current_selected_node != NULL) ;
00724 
00725         status = gtk_clist_get_text (a_possible_children,
00726                                      a_row, a_column, &element_name) ;/*do not free element_name!!*/
00727 
00728         if (status == 1) {/*text retrieved !*/
00729                 xmlNode * new_node = NULL ;
00730                 if (strcmp (element_name, "#PCDATA") == 0){
00731                         new_node = xmlNewNode (NULL, "text") ;
00732                         new_node->type = XML_TEXT_NODE ;
00733                 } else {
00734                         new_node = xmlNewNode (NULL, element_name) ;
00735                 }
00736                 mlview_tree_editor_add_child_node (PRIVATE (doc_tree_view)->tree_editor,
00737                                                    current_selected_node, new_node) ;
00738         }
00739         
00740         
00741 }
00742 
00743 static void
00744 selected_a_possible_prev_sibling_cb (GtkCList *a_possible_prev_siblings,
00745                                      gint a_row, gint a_column,
00746                                      GdkEventButton *event, 
00747                                      gpointer a_user_data)
00748 {
00749         MlViewXMLDocTreeView * doc_tree_view = NULL ;
00750         GtkCTreeNode * current_selected_node = NULL ;   
00751         gchar * element_name = NULL ;
00752         gint status = 0 ;
00753 
00754         g_return_if_fail (a_possible_prev_siblings != NULL) ;
00755         g_return_if_fail (GTK_IS_CLIST (a_possible_prev_siblings)) ;
00756         g_return_if_fail (a_user_data != NULL) ;
00757         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_user_data)) ;
00758 
00759         doc_tree_view = 
00760                 MLVIEW_XML_DOC_TREE_VIEW (a_user_data) ;
00761         g_return_if_fail (PRIVATE (doc_tree_view) != NULL) ;
00762         g_return_if_fail (PRIVATE (doc_tree_view)->tree_editor != NULL) ;
00763 
00764         current_selected_node = 
00765                 mlview_tree_editor_get_current_selected_node (PRIVATE (doc_tree_view)->tree_editor) ;
00766         g_return_if_fail (current_selected_node != NULL) ;
00767 
00768         status = gtk_clist_get_text (a_possible_prev_siblings,
00769                                      a_row, a_column, &element_name) ;/*do not free element_name!!*/
00770 
00771         if (status == 1) {/*text retrieved !*/
00772                 xmlNode * new_node = NULL ;
00773                 if (strcmp (element_name, "#PCDATA") == 0){
00774                         new_node = xmlNewNode (NULL, "text") ;
00775                         new_node->type = XML_TEXT_NODE ;
00776                 } else {
00777                         new_node = xmlNewNode (NULL, element_name) ;
00778                 }
00779                 mlview_tree_editor_insert_sibling_node (PRIVATE (doc_tree_view)->tree_editor,
00780                                                         current_selected_node, new_node, TRUE) ;
00781         }               
00782 }
00783 
00784 static void
00785 selected_a_possible_next_sibling_cb (GtkCList *a_possible_next_siblings,
00786                                      gint a_row, gint a_column,
00787                                      GdkEventButton *event, 
00788                                      gpointer a_user_data)
00789 {
00790         MlViewXMLDocTreeView * doc_tree_view = NULL ;
00791         GtkCTreeNode * current_selected_node = NULL ;   
00792         gchar * element_name = NULL ;
00793         gint status = 0 ;
00794 
00795         g_return_if_fail (a_possible_next_siblings != NULL) ;
00796         g_return_if_fail (GTK_IS_CLIST (a_possible_next_siblings)) ;
00797         g_return_if_fail (a_user_data != NULL) ;
00798         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_user_data)) ;
00799 
00800         doc_tree_view = 
00801                 MLVIEW_XML_DOC_TREE_VIEW (a_user_data) ;
00802         g_return_if_fail (PRIVATE (doc_tree_view) != NULL) ;
00803         g_return_if_fail (PRIVATE (doc_tree_view)->tree_editor != NULL) ;
00804 
00805         current_selected_node = 
00806                 mlview_tree_editor_get_current_selected_node (PRIVATE (doc_tree_view)->tree_editor) ;
00807         g_return_if_fail (current_selected_node != NULL) ;
00808 
00809         status = gtk_clist_get_text (a_possible_next_siblings,
00810                                      a_row, a_column, &element_name) ;/*do not free element_name!!*/
00811 
00812         if (status == 1) {/*text retrieved !*/
00813                 xmlNode * new_node = NULL ;
00814                 if (strcmp (element_name, "#PCDATA") == 0){
00815                         new_node = xmlNewNode (NULL, "text") ;
00816                         new_node->type = XML_TEXT_NODE ;
00817                 } else {
00818                         new_node = xmlNewNode (NULL, element_name) ;
00819                 }
00820                 mlview_tree_editor_insert_sibling_node (PRIVATE (doc_tree_view)->tree_editor,
00821                                                         current_selected_node, new_node, FALSE) ;
00822         }               
00823 }
00824 
00825 
00829 static void
00830 selected_a_possible_attribute_cb (GtkCList *a_possible_attributes,
00831                                   gint a_row, gint a_column,
00832                                   GdkEventButton *a_event, 
00833                                   gpointer a_user_data)
00834 {
00835         MlViewXMLDocTreeView * doc_tree_view = NULL ;
00836         MlViewXMLDocument * mlview_xml_doc = NULL ;
00837         GtkCTreeNode * current_selected_node = NULL ;
00838         GtkCTree * visual_tree = NULL ;
00839         gchar * attribute_name = NULL ;
00840         gint status = 0 ;
00841 
00842         g_return_if_fail (a_possible_attributes != NULL) ;
00843         g_return_if_fail (GTK_IS_CLIST (a_possible_attributes)) ;
00844         g_return_if_fail (a_user_data != NULL) ;
00845         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_user_data)) ;
00846 
00847         doc_tree_view = 
00848                 MLVIEW_XML_DOC_TREE_VIEW (a_user_data) ;
00849 
00850         g_return_if_fail (PRIVATE (doc_tree_view) != NULL) ;
00851         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (doc_tree_view)) ;
00852         g_return_if_fail (PRIVATE (doc_tree_view)->tree_editor != NULL) ;
00853         g_return_if_fail (PRIVATE (doc_tree_view)->node_editor != NULL) ;
00854 
00855         mlview_xml_doc = 
00856                 mlview_xml_document_view_get_document (MLVIEW_XML_DOCUMENT_VIEW (doc_tree_view)) ;
00857         g_return_if_fail (mlview_xml_doc != NULL) ;
00858 
00859         current_selected_node = 
00860                 mlview_tree_editor_get_current_selected_node (PRIVATE (doc_tree_view)->tree_editor) ;
00861         g_return_if_fail (current_selected_node != NULL) ;
00862 
00863         visual_tree = mlview_tree_editor_get_visual_tree (PRIVATE (doc_tree_view)->tree_editor) ;
00864         g_return_if_fail (visual_tree != NULL) ;
00865 
00866         status = gtk_clist_get_text (a_possible_attributes,
00867                                      a_row, a_column, &attribute_name) ;/*do not free attribute_name!!*/
00868 
00869         if (status == 1) {/*text retrieved !*/
00870                 xmlNode * xml_node = NULL ;
00871                 xmlAttr *attr = NULL ;
00872                 xml_node = 
00873                         (xmlNode*) gtk_ctree_node_get_row_data (visual_tree,
00874                                                                 current_selected_node) ;
00875                 g_return_if_fail (xml_node != NULL) ;
00876 
00877                 attr = xmlNewProp (xml_node, attribute_name, "value" ) ;
00878                 mlview_tree_editor_update_visual_node (PRIVATE (doc_tree_view)->tree_editor,
00879                                                        current_selected_node) ;
00880 
00881                 mlview_node_editor_edit_xml_node (PRIVATE (doc_tree_view)->node_editor,
00882                                                   mlview_xml_doc,
00883                                                   xml_node) ;
00884         }
00885 }
00886 
00887 static void
00888 mlview_xml_doc_tree_view_document_changed_cb (MlViewXMLDocument * a_xml_doc,
00889                                               gpointer a_xml_doc_tree_view)
00890 {
00891 
00892         
00893 }
00894 
00908 static GnomeDialog *
00909 mlview_xml_doc_tree_view_get_expand_tree_dialog (MlViewXMLDocTreeView * a_view)
00910 {
00911         GtkWidget *table = NULL, *label = NULL, *depth_entry = NULL ;
00912         GtkWidget  *expand_to_leaves = NULL ;
00913 
00914         g_return_val_if_fail (a_view != NULL, NULL) ;
00915         g_return_val_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_view), NULL) ;
00916         g_return_val_if_fail (PRIVATE (a_view) != NULL,NULL) ;
00917         
00918         if (PRIVATE (a_view)->expand_tree_dialog == NULL) {
00919                 PRIVATE (a_view)->expand_tree_dialog = GNOME_DIALOG (gnome_dialog_new (_("Choose the depth of the tree expansion"),
00920                                                          GNOME_STOCK_BUTTON_OK, GNOME_STOCK_BUTTON_CANCEL, NULL)) ;
00921                 mlview_app_context_set_window_icon (PRIVATE (a_view)->app_context, GTK_WIDGET (PRIVATE (a_view)->expand_tree_dialog)) ;
00922                 gtk_window_set_wmclass (GTK_WINDOW (PRIVATE (a_view)->expand_tree_dialog), "choose-depth-dialog", "MlView") ;
00923 
00924                 gnome_dialog_close_hides (PRIVATE (a_view)->expand_tree_dialog, TRUE) ;
00925 
00926                 expand_to_leaves = gtk_check_button_new_with_label (_("expand to leaves")) ;
00927 
00928                 gtk_box_pack_start_defaults (GTK_BOX (PRIVATE (a_view)->expand_tree_dialog->vbox),expand_to_leaves) ;
00929 
00930                 label = gtk_label_new (_("absolute expansion depth: ")) ;
00931                 depth_entry = gtk_entry_new () ;
00932                 gtk_entry_set_text (GTK_ENTRY (depth_entry), "2") ;
00933 
00934                 table = gtk_table_new (1,2,FALSE) ;
00935                 gtk_table_attach_defaults (GTK_TABLE (table), label,
00936                                            0, 1, 0, 1) ;
00937                 gtk_table_attach_defaults (GTK_TABLE (table), depth_entry,
00938                                            1, 2, 0, 1) ;
00939                 gtk_box_pack_start_defaults (GTK_BOX (PRIVATE (a_view)->expand_tree_dialog->vbox), table) ;
00940 
00941                 gtk_signal_connect (GTK_OBJECT (expand_to_leaves),
00942                                     "toggled",
00943                                     GTK_SIGNAL_FUNC (toggle_expand_to_leaves_cb),
00944                                     depth_entry) ;
00945 
00946                 gtk_widget_show_all (PRIVATE (a_view)->expand_tree_dialog->vbox) ;
00947                 
00948                 gtk_object_set_data (GTK_OBJECT (PRIVATE (a_view)->expand_tree_dialog),
00949                                      "expand-to-leaves", expand_to_leaves) ;
00950 
00951                 gtk_object_set_data (GTK_OBJECT (PRIVATE (a_view)->expand_tree_dialog),
00952                                      "depth-entry", depth_entry) ;
00953         }
00954         return PRIVATE (a_view)->expand_tree_dialog ;
00955 }
00956 
00957 
00958 /*========================================
00959  *public gtk framework functions
00960  *========================================*/
00961 guint mlview_xml_doc_tree_view_get_type (void)
00962 {
00963         static guint mlview_xml_doc_tree_view_type = 0 ;
00964 
00965         if (mlview_xml_doc_tree_view_type == 0){
00966                 static const GtkTypeInfo type_info = {
00967                         "MlViewXMLDocTreeView",
00968                         sizeof (MlViewXMLDocTreeView),
00969                         sizeof (MlViewXMLDocTreeViewClass),
00970                         (GtkClassInitFunc) mlview_xml_doc_tree_view_class_init,
00971                         (GtkObjectInitFunc) mlview_xml_doc_tree_view_init,
00972                         NULL, NULL, NULL
00973                 } ;
00974                 mlview_xml_doc_tree_view_type = gtk_type_unique (mlview_xml_document_view_get_type (), 
00975                                                                  &type_info);
00976         }
00977         return mlview_xml_doc_tree_view_type ;
00978 }
00979 
00980 
00984 MlViewTreeEditor *
00985 mlview_xml_doc_tree_view_get_tree_editor(MlViewXMLDocTreeView *a_tree_view)
00986 {
00987         g_return_val_if_fail (a_tree_view != NULL, NULL) ;
00988         g_return_val_if_fail (PRIVATE (a_tree_view) != NULL, NULL) ;
00989         return PRIVATE (a_tree_view)->tree_editor ;
00990 }
00991 
00995 MlViewNodeEditor *
00996 mlview_xml_doc_tree_view_get_node_editor(MlViewXMLDocTreeView *a_tree_view)
00997 {
00998         g_return_val_if_fail(a_tree_view != NULL, NULL) ;
00999         g_return_val_if_fail(PRIVATE(a_tree_view) != NULL, NULL) ;
01000         return PRIVATE(a_tree_view)->node_editor ;
01001 }
01002 
01003 
01007 GtkWidget *
01008 mlview_xml_doc_tree_view_new (MlViewXMLDocument *a_mlview_xml_doc,
01009                               gchar *a_name, MlViewAppContext *a_app_context)
01010 {
01011         MlViewXMLDocTreeView * tree_view ;
01012 
01013         g_return_val_if_fail (a_mlview_xml_doc != NULL, NULL) ;
01014         g_return_val_if_fail (PRIVATE (a_mlview_xml_doc) != NULL, NULL) ;
01015 
01016         tree_view = gtk_type_new (MLVIEW_TYPE_XML_DOC_TREE_VIEW) ;      
01017         mlview_xml_doc_tree_view_construct (tree_view, a_mlview_xml_doc, a_name, a_app_context) ;
01018 
01019         return GTK_WIDGET (tree_view) ;
01020 }
01021 
01022 
01023 void
01024 mlview_xml_doc_tree_view_set_app_context (MlViewXMLDocTreeView *a_tree_view,
01025                                           MlViewAppContext *a_app_context)
01026 {
01027         g_return_if_fail (a_tree_view != NULL) ;
01028         g_return_if_fail (PRIVATE (a_tree_view) != NULL) ;
01029 
01030         PRIVATE (a_tree_view)->app_context = a_app_context ;
01031         if (PRIVATE (a_tree_view)->tree_editor)
01032                 mlview_tree_editor_set_application_context (PRIVATE (a_tree_view)->tree_editor,
01033                                                             a_app_context) ;
01034         if (PRIVATE (a_tree_view)->node_editor)
01035                 mlview_node_editor_set_application_context (PRIVATE (a_tree_view)->node_editor,
01036                                                             a_app_context) ;
01037 }
01038 
01042 void 
01043 mlview_xml_doc_tree_view_construct (MlViewXMLDocTreeView *a_tree_view, 
01044                                     MlViewXMLDocument * a_mlview_xml_doc,
01045                                    gchar *a_name, MlViewAppContext *a_app_context)
01046 {
01047         GtkWidget * table = NULL, *scrolled = NULL ;
01048         enum MLVIEW_XML_DOCUMENT_VIEW_STATUS status = NOK ;
01049 
01050         gchar * feasible_children_titles[1] = {_("Possible Children")} ;
01051         gchar * feasible_prev_siblings_titles[1] = {_("Possible previous siblings")} ;
01052         gchar * feasible_next_siblings_titles[1] = {_("Possible next siblings")} ;
01053         gchar * feasible_attributes_titles[1] = {_("Possible attributes")} ;
01054 
01055         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_tree_view)) ;
01056         g_return_if_fail (a_mlview_xml_doc != NULL) ;
01057 
01058         mlview_xml_document_view_set_document_signal_handlers (gv_signals_fired_by_document) ;
01059 
01060         status =
01061                 mlview_xml_document_view_construct (MLVIEW_XML_DOCUMENT_VIEW (a_tree_view),
01062                                                     a_mlview_xml_doc) ;
01063         g_return_if_fail (status == MLVIEW_XML_DOCUMENT_VIEW_OK) ;
01064 
01065         /*view_private = PRIVATE (a_tree_view) ;*/
01066         /*The main vpaned of the view*/
01067         PRIVATE (a_tree_view)->main_paned = GTK_PANED (gtk_vpaned_new()) ;
01068         gtk_box_pack_start (GTK_BOX (a_tree_view),
01069                             GTK_WIDGET (PRIVATE (a_tree_view)->main_paned),
01070                             TRUE, TRUE, 0) ;
01071 
01072         gtk_widget_show (GTK_WIDGET (PRIVATE (a_tree_view)->main_paned)) ;
01073   
01074         /*The tree editor*/
01075         PRIVATE (a_tree_view)->tree_editor = MLVIEW_TREE_EDITOR (mlview_tree_editor_new (a_app_context)) ;
01076 
01077         gtk_signal_connect (GTK_OBJECT (PRIVATE (a_tree_view)->tree_editor),
01078                             "node-selected",
01079                             GTK_SIGNAL_FUNC (visual_node_selected_cb),
01080                             a_tree_view) ;
01081 
01082         PRIVATE (a_tree_view)->upper_paned1 = 
01083                 GTK_PANED (gtk_hpaned_new ()) ;
01084 
01085         gtk_paned_add1 (GTK_PANED (PRIVATE (a_tree_view)->main_paned),
01086                         GTK_WIDGET (PRIVATE (a_tree_view)->upper_paned1)) ;
01087 
01088         gtk_paned_add1 (GTK_PANED (PRIVATE (a_tree_view)->upper_paned1),
01089                         GTK_WIDGET (PRIVATE (a_tree_view)->tree_editor)) ;
01090 
01091         /*the table with the feasible children, siblings and attributes*/
01092         PRIVATE (a_tree_view)->feasible_children =
01093                 GTK_CLIST (gtk_clist_new_with_titles (1, feasible_children_titles)) ;
01094 
01095         gtk_signal_connect (GTK_OBJECT (PRIVATE (a_tree_view)->feasible_children),
01096                             "select-row",
01097                             GTK_SIGNAL_FUNC (selected_a_possible_child_cb),
01098                             a_tree_view) ;
01099         gtk_signal_connect (GTK_OBJECT (PRIVATE (a_tree_view)->tree_editor),
01100                             "node-selected",
01101                             GTK_SIGNAL_FUNC (update_feasible_children_list_cb),
01102                             a_tree_view) ;
01103 
01104         PRIVATE (a_tree_view)->feasible_prev_siblings = 
01105                 GTK_CLIST (gtk_clist_new_with_titles (1,feasible_prev_siblings_titles)) ;
01106         gtk_signal_connect (GTK_OBJECT (PRIVATE (a_tree_view)->feasible_prev_siblings),
01107                             "select-row",
01108                             GTK_SIGNAL_FUNC (selected_a_possible_prev_sibling_cb),
01109                             a_tree_view) ;
01110         gtk_signal_connect (GTK_OBJECT (PRIVATE (a_tree_view)->tree_editor),
01111                             "node-selected",
01112                             GTK_SIGNAL_FUNC (update_feasible_prev_siblings_list_cb),
01113                             a_tree_view) ;
01114 
01115         PRIVATE (a_tree_view)->feasible_next_siblings = 
01116                 GTK_CLIST (gtk_clist_new_with_titles (1, feasible_next_siblings_titles)) ;
01117         gtk_signal_connect (GTK_OBJECT (PRIVATE (a_tree_view)->feasible_next_siblings),
01118                             "select-row",
01119                             GTK_SIGNAL_FUNC (selected_a_possible_next_sibling_cb),
01120                             a_tree_view) ;
01121 
01122         gtk_signal_connect (GTK_OBJECT (PRIVATE (a_tree_view)->tree_editor),
01123                             "node-selected",
01124                             GTK_SIGNAL_FUNC (update_feasible_next_siblings_list_cb),
01125                             a_tree_view) ;
01126 
01127         PRIVATE (a_tree_view)->feasible_attributes = 
01128                   GTK_CLIST (gtk_clist_new_with_titles (1, feasible_attributes_titles)) ;
01129 
01130         gtk_signal_connect (GTK_OBJECT (PRIVATE (a_tree_view)->feasible_attributes),
01131                             "select-row",
01132                             GTK_SIGNAL_FUNC (selected_a_possible_attribute_cb),
01133                             a_tree_view) ;
01134         gtk_signal_connect (GTK_OBJECT (PRIVATE (a_tree_view)->tree_editor),
01135                             "node-selected",
01136                             GTK_SIGNAL_FUNC (update_feasible_attributes_list_cb),
01137                             a_tree_view) ;
01138 
01139         table = gtk_table_new (2, 2, TRUE) ;
01140 
01141         scrolled = gtk_scrolled_window_new (NULL, NULL) ;
01142         gtk_container_add (GTK_CONTAINER (scrolled), GTK_WIDGET (PRIVATE (a_tree_view)->feasible_children)) ;
01143         gtk_table_attach_defaults (GTK_TABLE (table), scrolled,
01144                                     0, 1, 0, 1) ;
01145 
01146         scrolled = gtk_scrolled_window_new (NULL, NULL) ;
01147         gtk_container_add (GTK_CONTAINER (scrolled), 
01148                              GTK_WIDGET (PRIVATE (a_tree_view)->feasible_prev_siblings)) ;
01149         gtk_table_attach_defaults (GTK_TABLE (table), scrolled,
01150                                     1, 2, 0, 1) ;
01151 
01152         scrolled = gtk_scrolled_window_new (NULL, NULL) ;
01153         gtk_container_add (GTK_CONTAINER (scrolled), GTK_WIDGET (PRIVATE (a_tree_view)->feasible_next_siblings)) ;
01154         gtk_table_attach_defaults (GTK_TABLE (table), scrolled,
01155                                     1, 2, 1, 2) ;
01156 
01157         scrolled = 
01158                 gtk_scrolled_window_new (NULL, NULL) ;
01159 
01160         gtk_container_add (GTK_CONTAINER (scrolled),
01161                            GTK_WIDGET (PRIVATE (a_tree_view)->feasible_attributes)) ;
01162         gtk_table_attach_defaults (GTK_TABLE (table), scrolled,
01163                                    0, 1, 1, 2) ;
01164         
01165         gtk_paned_add2 (GTK_PANED (PRIVATE (a_tree_view)->upper_paned1),
01166                         table) ;
01167 
01168         /*The node editor*/
01169         PRIVATE (a_tree_view)->node_editor = 
01170                 MLVIEW_NODE_EDITOR (mlview_node_editor_new (a_app_context)) ;
01171 
01172         gtk_signal_connect (GTK_OBJECT (PRIVATE (a_tree_view)->node_editor),
01173                             "element-changed",
01174                             GTK_SIGNAL_FUNC (xml_node_changed_cb),
01175                             a_tree_view) ;
01176         gtk_paned_add2 (GTK_PANED (PRIVATE (a_tree_view)->main_paned), 
01177                         GTK_WIDGET (PRIVATE (a_tree_view)->node_editor)) ;
01178 
01179         gtk_widget_show_all (GTK_WIDGET (PRIVATE (a_tree_view)->node_editor)) ;
01180 
01181         gtk_widget_show_all (GTK_WIDGET (PRIVATE (a_tree_view)->main_paned)) ;
01182         PRIVATE (a_tree_view)->app_context = a_app_context ;
01183 
01184         mlview_tree_editor_edit_xml_doc (PRIVATE (a_tree_view)->tree_editor,
01185                                          a_mlview_xml_doc, NULL) ;
01186         gtk_signal_connect (GTK_OBJECT (a_mlview_xml_doc),
01187                             "file-path-changed",
01188                             GTK_SIGNAL_FUNC (mlview_xml_doc_tree_view_doc_path_changed_cb),
01189                             a_tree_view) ;
01190 }
01191 
01192 
01196 void 
01197 mlview_xml_doc_tree_view_add_child_node_interactive (MlViewXMLDocTreeView * a_tree_view)
01198 {
01199         MlViewTreeEditor *tree_editor = NULL ;
01200         tree_editor = mlview_xml_doc_tree_view_get_tree_editor (a_tree_view) ;
01201         if (tree_editor)
01202                 mlview_tree_editor_add_child_node_interactive (tree_editor) ;
01203 }
01204 
01205 
01209 void 
01210 mlview_xml_doc_tree_view_insert_prev_sibling_node_interactive (MlViewXMLDocTreeView * a_tree_view)
01211 {
01212         MlViewTreeEditor *tree_editor = NULL ;
01213 
01214         tree_editor = 
01215                 mlview_xml_doc_tree_view_get_tree_editor(a_tree_view) ;
01216 
01217         if(tree_editor)
01218                 mlview_tree_editor_insert_prev_sibling_node_interactive(tree_editor) ;
01219 }
01220 
01221 
01225 void 
01226 mlview_xml_doc_tree_view_insert_next_sibling_node_interactive (MlViewXMLDocTreeView * a_tree_view)
01227 {
01228         MlViewTreeEditor *tree_editor = NULL ;
01229         tree_editor = mlview_xml_doc_tree_view_get_tree_editor(a_tree_view) ;
01230 
01231         if(tree_editor)
01232                 mlview_tree_editor_insert_next_sibling_node_interactive(tree_editor) ;
01233 }
01234 
01235 
01239 void
01240 mlview_xml_doc_tree_view_cut_node (MlViewXMLDocTreeView * a_tree_view)
01241 {
01242         MlViewTreeEditor *tree_editor = NULL ;
01243         GtkCTreeNode *current_selected_node = NULL ;
01244 
01245         tree_editor = mlview_xml_doc_tree_view_get_tree_editor (a_tree_view) ;
01246 
01247         if (tree_editor == NULL)
01248                 return ;
01249         current_selected_node = mlview_tree_editor_get_current_selected_node (tree_editor) ;
01250 
01251         if (current_selected_node == NULL)
01252                 return ;
01253         mlview_tree_editor_cut_node (tree_editor, current_selected_node) ;
01254 }
01255 
01256 
01260 void
01261 mlview_xml_doc_tree_view_copy_node (MlViewXMLDocTreeView * a_tree_view)
01262 {
01263         
01264         MlViewTreeEditor * tree_editor= NULL ;
01265         GtkCTreeNode *current_selected_node = NULL ;
01266 
01267         g_return_if_fail (a_tree_view != NULL) ;
01268 
01269         tree_editor = 
01270                 mlview_xml_doc_tree_view_get_tree_editor (a_tree_view) ;
01271 
01272         if(tree_editor == NULL)
01273                 return ;
01274 
01275         current_selected_node = 
01276                 mlview_tree_editor_get_current_selected_node(tree_editor) ;
01277 
01278         if (current_selected_node == NULL)
01279                 return ;
01280 
01281         mlview_tree_editor_copy_node (tree_editor,
01282                                       current_selected_node, TRUE) ;
01283 }
01284 
01285 
01289 void 
01290 mlview_xml_doc_tree_view_paste_node_as_child(MlViewXMLDocTreeView * a_tree_view)
01291 {
01292         g_return_if_fail(a_tree_view != NULL) ;
01293         g_return_if_fail(PRIVATE(a_tree_view) != NULL) ;
01294         mlview_tree_editor_paste_node_as_child(PRIVATE(a_tree_view)->tree_editor, 
01295                                                mlview_tree_editor_get_current_selected_node(PRIVATE(a_tree_view)->tree_editor)) ;
01296 }
01297 
01301 void 
01302 mlview_xml_doc_tree_view_paste_node_as_prev_sibling(MlViewXMLDocTreeView * a_tree_view)
01303 {
01304         g_return_if_fail(a_tree_view != NULL) ;
01305         g_return_if_fail(PRIVATE(a_tree_view) != NULL) ;
01306         mlview_tree_editor_paste_node_as_sibling(PRIVATE(a_tree_view)->tree_editor, 
01307                                                  mlview_tree_editor_get_current_selected_node(PRIVATE(a_tree_view)->tree_editor), TRUE) ;
01308 }
01309 
01313 void 
01314 mlview_xml_doc_tree_view_paste_node_as_next_sibling(MlViewXMLDocTreeView * a_tree_view)
01315 {
01316         g_return_if_fail(a_tree_view != NULL) ;
01317         g_return_if_fail(PRIVATE(a_tree_view) != NULL) ;
01318         mlview_tree_editor_paste_node_as_sibling(PRIVATE(a_tree_view)->tree_editor, 
01319                                                  mlview_tree_editor_get_current_selected_node(PRIVATE(a_tree_view)->tree_editor), FALSE) ;
01320 }
01321 
01322 
01326 GtkCTreeNode * 
01327 mlview_xml_doc_tree_view_find_xml_node_that_contains_str_interactive(MlViewXMLDocTreeView * a_tree_view)
01328 {
01329         MlViewTreeEditor * tree_editor ;
01330         g_return_val_if_fail(a_tree_view != NULL, NULL) ;
01331 
01332         tree_editor = mlview_xml_doc_tree_view_get_tree_editor(a_tree_view) ;
01333         g_return_val_if_fail(tree_editor != NULL, NULL) ;
01334         return mlview_tree_editor_find_xml_node_that_contains_str_interactive(tree_editor) ;
01335 }
01336 
01340 void
01341 mlview_xml_doc_tree_view_set_upper_paned1_proportions (MlViewXMLDocTreeView *a_tree_view, 
01342                                                        const guint a_percentage)
01343 {
01344         gint separator_position = 0 ;
01345         GtkWidget * top_level_widget = NULL ;
01346 
01347         g_return_if_fail (a_tree_view != NULL) ;
01348         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_tree_view)) ;
01349         g_return_if_fail (PRIVATE (a_tree_view) != NULL) ;
01350         
01351         top_level_widget = gtk_widget_get_toplevel(GTK_WIDGET(a_tree_view)) ;
01352         g_return_if_fail(top_level_widget != NULL) ;
01353 
01354         separator_position = top_level_widget->allocation.width * a_percentage / 100 ;
01355         gtk_paned_set_position(PRIVATE(a_tree_view)->upper_paned1, separator_position) ;
01356 
01357         gtk_widget_show_all(GTK_WIDGET(a_tree_view)) ;
01358 }
01359 
01360 
01368 void
01369 mlview_xml_doc_tree_view_set_main_paned_proportions (MlViewXMLDocTreeView *a_tree_view,
01370                                                      const guint a_percentage)
01371 {
01372         guint separator_position ;
01373         GtkWidget * top_level_widget = NULL ;
01374 
01375         g_return_if_fail(a_tree_view != NULL) ;
01376         g_return_if_fail(PRIVATE(a_tree_view) != NULL) ;
01377         top_level_widget = gtk_widget_get_toplevel(GTK_WIDGET(a_tree_view)) ;
01378         g_return_if_fail(top_level_widget != NULL) ;
01379 
01380         PRIVATE (a_tree_view)->main_paned_percentage = a_percentage ;
01381         
01382         separator_position = top_level_widget->allocation.height * a_percentage / 100 ;
01383         gtk_paned_set_position(PRIVATE(a_tree_view)->main_paned,separator_position) ;
01384 
01385         gtk_widget_show_all(GTK_WIDGET(a_tree_view)) ;
01386 }
01387 
01388 
01392 void 
01393 mlview_xml_doc_tree_view_set_all_paned_proportions(MlViewXMLDocTreeView *a_tree_view, const guint a_main_paned_percentage,
01394                                                    const guint a_node_editor_paned_percentage)
01395 {
01396         g_return_if_fail (a_tree_view != NULL) ;
01397         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_tree_view)) ;
01398         g_return_if_fail (PRIVATE (a_tree_view) != NULL) ;
01399         g_return_if_fail (PRIVATE (a_tree_view)->node_editor != NULL) ;
01400 
01401 
01402         mlview_node_editor_set_left_right_percentage (PRIVATE(a_tree_view)->node_editor, a_node_editor_paned_percentage) ;
01403         mlview_xml_doc_tree_view_set_upper_paned1_proportions (a_tree_view, 70) ;
01404         mlview_xml_doc_tree_view_set_main_paned_proportions (a_tree_view, a_main_paned_percentage) ;
01405 }
01406 
01407 
01414 void
01415 mlview_xml_doc_tree_view_set_xml_document_path (MlViewXMLDocTreeView *a_view, gchar * a_file_path)
01416 {
01417         g_return_if_fail (a_file_path != NULL) ;
01418         g_return_if_fail (a_view != NULL) ;
01419         g_return_if_fail (PRIVATE (a_view) != NULL) ;
01420 
01421         if ( PRIVATE (a_view)->tree_editor )
01422                 mlview_tree_editor_set_xml_document_path (PRIVATE (a_view)->tree_editor, 
01423                                                           a_file_path) ;
01424 }
01425 
01426 
01432 void 
01433 mlview_xml_doc_tree_view_expand_tree_to_depth_interactive (MlViewXMLDocTreeView *a_view)
01434 {
01435         GnomeDialog * dialog = NULL ;
01436         GtkWidget * expand_to_leaves = NULL, *depth_entry = NULL ;
01437         gint button = 0, depth = 0 ;
01438         gchar *depth_str = NULL ;
01439 
01440         g_return_if_fail (a_view != NULL) ;
01441         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_view)) ;
01442         g_return_if_fail (PRIVATE (a_view) != NULL) ;
01443 
01444         dialog = mlview_xml_doc_tree_view_get_expand_tree_dialog (a_view) ;
01445         g_return_if_fail (dialog != NULL) ;
01446 
01447         button = gnome_dialog_run_and_close (dialog) ;
01448 
01449         expand_to_leaves = gtk_object_get_data (GTK_OBJECT (dialog),
01450                                                 "expand-to-leaves") ;
01451         g_return_if_fail (expand_to_leaves != NULL) ;
01452 
01453         depth_entry = gtk_object_get_data (GTK_OBJECT (dialog),
01454                                            "depth-entry") ;
01455         g_return_if_fail (depth_entry != NULL) ;
01456         
01457         switch (button) {
01458         case 0:/*user clicked OK*/
01459                 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (expand_to_leaves)) == TRUE)
01460                         mlview_tree_editor_expand_tree_to_depth (PRIVATE (a_view)->tree_editor, -1) ;
01461                 else {
01462                         depth_str = gtk_entry_get_text (GTK_ENTRY (depth_entry)) ;
01463                         if (depth_str) {
01464                                 depth = atoi (depth_str) ;
01465                                 mlview_tree_editor_expand_tree_to_depth (PRIVATE (a_view)->tree_editor, 
01466                                                                          depth) ;
01467                         }
01468                 }
01469                 break ;
01470         case 1:/*user clicked CANCEL*/
01471         case -1:/*closed the dialog box*/
01472         default:/*the sky falls on our heads*/
01473                 break ;
01474         }
01475 
01476         gnome_dialog_close (dialog) ;
01477 }
01478 
01479 void
01480 mlview_xml_doc_tree_view_update_contextual_menu (MlViewXMLDocTreeView *a_view,
01481                                                  GtkMenu **a_menu_ptr) {
01482         g_return_if_fail (a_view != NULL) ;
01483         g_return_if_fail (MLVIEW_IS_XML_DOC_TREE_VIEW (a_view)) ;
01484         g_return_if_fail (PRIVATE (a_view) != NULL) ;
01485         g_return_if_fail (a_menu_ptr != NULL) ;
01486         g_return_if_fail (*a_menu_ptr != NULL) ;
01487         g_return_if_fail (GTK_IS_MENU (*a_menu_ptr)) ;
01488 
01489         if (PRIVATE (a_view)->tree_editor) {
01490                 mlview_tree_editor_update_contextual_menu (PRIVATE (a_view)->tree_editor,
01491                                                            a_menu_ptr) ;
01492         }
01493         
01494 }

Generated on Sat Jul 6 09:57:37 2002 for Gnome-MlView by doxygen1.2.16