00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
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
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}
00160 } ;
00161
00162
00163
00164
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 ;
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
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) ;
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) ;
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
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
00384 if(GTK_OBJECT_CLASS(parent_class)->destroy)
00385 (*GTK_OBJECT_CLASS(parent_class)->destroy)(a_object) ;
00386 }
00387
00388
00389
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
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
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) ;
00727
00728 if (status == 1) {
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) ;
00770
00771 if (status == 1) {
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) ;
00811
00812 if (status == 1) {
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) ;
00868
00869 if (status == 1) {
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
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
01066
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
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
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
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:
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:
01471 case -1:
01472 default:
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 }