00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mlview-namespace-editor.h"
00019 #include "mlview-app-context.h"
00020
00021 #include "utils.h"
00022
00023 struct _MlViewNamespaceEditorPrivate {
00024 GtkCList *namespaces ;
00025 GtkEntry *ns_prefix_edit_entry ;
00026 GtkEntry *ns_uri_edit_entry ;
00027 GtkButton *add_ns_button ;
00028 GtkButton *remove_ns_button ;
00029 gint current_selected_row ;
00030 gboolean editable ;
00031 gint ns_prefix_edit_entry_changed_handler_id ;
00032 gint ns_uri_edit_entry_changed_handler_id ;
00033 xmlNodePtr current_xml_node ;
00034 MlViewAppContext *app_context ;
00035 } ;
00036
00037
00038 typedef struct _MlViewNamespaceDesc MlViewNamespaceDesc ;
00039 struct _MlViewNamespaceDesc{
00040 xmlNs * ns_def ;
00041 xmlNode *xml_node ;
00042 };
00043
00044 enum {
00045 NAMESPACE_ADDED,
00046 NAMESPACE_PREFIX_CHANGED,
00047 NAMESPACE_URI_CHANGED,
00048 NAMESPACE_CHANGED,
00049 NAMESPACE_DELETED,
00050 NUMBER_OF_SIGNALS
00051 };
00052
00053 enum {
00054 NS_PREFIX_COLUMN,
00055 NS_URI_COLUMN,
00056 } ;
00057
00058 #define PRIVATE(editor) (editor->private)
00059
00060 static GtkVBoxClass * parent_class=NULL ;
00061 static guint mlview_namespace_editor_signals[NUMBER_OF_SIGNALS]={0} ;
00062
00063 static void mlview_namespace_editor_class_init(MlViewNamespaceEditorClass *a_klass) ;
00064 static void mlview_namespace_editor_init(MlViewNamespaceEditor *a_editor) ;
00065 static void mlview_namespace_editor_destroy(GtkObject *a_object) ;
00066
00067 static MlViewNamespaceDesc * mlview_namespace_desc_new(xmlNs *a_xml_ns, xmlNode *a_xml_node) ;
00068 static xmlNs * mlview_namespace_desc_get_ns(MlViewNamespaceDesc *a_desc) ;
00069 static xmlNode * mlview_namespace_desc_get_xml_node(MlViewNamespaceDesc *a_desc) ;
00070 static void mlview_namespace_desc_destroy(MlViewNamespaceDesc *a_desc) ;
00071
00072 static gint mlview_namespace_editor_edit_namespace (MlViewNamespaceEditor *a_editor, xmlNs * a_ns, xmlNode *a_xml_node, gboolean a_selectable) ;
00073 static MlViewNamespaceDesc * mlview_namespace_editor_get_current_selected_ns_desc(MlViewNamespaceEditor *a_editor) ;
00074 static void namespace_desc_destroy_on_ns_editor_destroy(gpointer a_data) ;
00075
00076 static xmlNs * mlview_namespace_editor_ask_namespace_to_user_and_add_it(MlViewNamespaceEditor *a_editor) ;
00077
00078
00079 static void row_selected_cb(GtkCList *a_clist, gint a_row, gint a_column,
00080 GdkEventButton *a_event, MlViewNamespaceEditor *a_editor) ;
00081
00082 static void ns_prefix_edit_entry_changed_cb(GtkEntry *a_entry, MlViewNamespaceEditor *a_editor) ;
00083 static void ns_uri_edit_entry_changed_cb(GtkEntry *a_entry, MlViewNamespaceEditor *a_editor) ;
00084 static void add_namespace_button_clicked_cb(GtkButton *a_add_namespace_button, MlViewNamespaceEditor *a_editor) ;
00085 static void remove_namespace_button_clicked_cb(GtkButton *a_remove_namespace_button, MlViewNamespaceEditor *a_editor) ;
00086
00087
00088
00089
00090
00091
00095 static void
00096 mlview_namespace_editor_class_init(MlViewNamespaceEditorClass *a_klass)
00097 {
00098 GtkObjectClass *object_class = GTK_OBJECT_CLASS(a_klass) ;
00099 parent_class = gtk_type_class(gtk_vbox_get_type()) ;
00100 g_return_if_fail(a_klass != NULL) ;
00101
00102 object_class->destroy=mlview_namespace_editor_destroy ;
00103
00104 mlview_namespace_editor_signals[NAMESPACE_ADDED] = gtk_signal_new("namespace-added",
00105 GTK_RUN_FIRST,
00106 object_class->type,
00107 GTK_SIGNAL_OFFSET(MlViewNamespaceEditorClass, namespace_added),
00108 gtk_marshal_NONE__NONE,
00109 GTK_TYPE_NONE,0) ;
00110
00111 mlview_namespace_editor_signals[NAMESPACE_PREFIX_CHANGED] = gtk_signal_new("namespace-prefix-changed",
00112 GTK_RUN_FIRST,
00113 object_class->type,
00114 GTK_SIGNAL_OFFSET(MlViewNamespaceEditorClass, namespace_prefix_changed),
00115 gtk_marshal_NONE__NONE,
00116 GTK_TYPE_NONE,0) ;
00117
00118 mlview_namespace_editor_signals[NAMESPACE_URI_CHANGED] = gtk_signal_new("namespace-uri-changed",
00119 GTK_RUN_FIRST,
00120 object_class->type,
00121 GTK_SIGNAL_OFFSET(MlViewNamespaceEditorClass, namespace_uri_changed),
00122 gtk_marshal_NONE__NONE,
00123 GTK_TYPE_NONE,0) ;
00124
00125 mlview_namespace_editor_signals[NAMESPACE_CHANGED] = gtk_signal_new("namespace-changed",
00126 GTK_RUN_FIRST,
00127 object_class->type,
00128 GTK_SIGNAL_OFFSET(MlViewNamespaceEditorClass, namespace_changed),
00129 gtk_marshal_NONE__NONE,
00130 GTK_TYPE_NONE,0) ;
00131
00132 mlview_namespace_editor_signals[NAMESPACE_DELETED] = gtk_signal_new("namespace-deleted",
00133 GTK_RUN_FIRST,
00134 object_class->type,
00135 GTK_SIGNAL_OFFSET(MlViewNamespaceEditorClass, namespace_deleted),
00136 gtk_marshal_NONE__NONE,
00137 GTK_TYPE_NONE,0) ;
00138
00139 a_klass->namespace_added = NULL ;
00140 a_klass->namespace_prefix_changed = NULL ;
00141 a_klass->namespace_uri_changed = NULL ;
00142 a_klass->namespace_changed = NULL ;
00143 a_klass->namespace_deleted = NULL ;
00144 }
00145
00150 static void
00151 mlview_namespace_editor_init(MlViewNamespaceEditor *a_editor)
00152 {
00153 MlViewNamespaceEditorPrivate *private ;
00154 GtkWidget *table, *scrolled_window;
00155 gchar * titles[2] = {_("namespace prefixes"),_("namespace uris")} ;
00156 g_return_if_fail(a_editor != NULL) ;
00157 g_return_if_fail(PRIVATE(a_editor) == NULL) ;
00158
00159
00160 PRIVATE(a_editor) = g_malloc0(sizeof(MlViewNamespaceEditorPrivate)) ;
00161 private = PRIVATE(a_editor) ;
00162
00163
00164 private->namespaces = GTK_CLIST(gtk_clist_new_with_titles(2,titles)) ;
00165 gtk_clist_column_titles_passive(private->namespaces) ;
00166 gtk_signal_connect(GTK_OBJECT(private->namespaces),
00167 "select_row",
00168 GTK_SIGNAL_FUNC(row_selected_cb),
00169 a_editor) ;
00170 scrolled_window = gtk_scrolled_window_new(NULL, NULL) ;
00171 gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(private->namespaces)) ;
00172 gtk_box_pack_start(GTK_BOX(a_editor),scrolled_window,
00173 TRUE,TRUE,0) ;
00174
00175
00176 private->ns_prefix_edit_entry = GTK_ENTRY(gtk_entry_new()) ;
00177 private->ns_prefix_edit_entry_changed_handler_id = gtk_signal_connect(GTK_OBJECT(private->ns_prefix_edit_entry),
00178 "changed",
00179 GTK_SIGNAL_FUNC(ns_prefix_edit_entry_changed_cb),
00180 a_editor) ;
00181 private->ns_uri_edit_entry = GTK_ENTRY(gtk_entry_new()) ;
00182 private->ns_uri_edit_entry_changed_handler_id = gtk_signal_connect(GTK_OBJECT(private->ns_uri_edit_entry),
00183 "changed",
00184 GTK_SIGNAL_FUNC(ns_uri_edit_entry_changed_cb),
00185 a_editor) ;
00186 table = gtk_table_new(1,2,TRUE) ;
00187 gtk_table_attach_defaults(GTK_TABLE(table),GTK_WIDGET(private->ns_prefix_edit_entry),
00188 0,1,0,1) ;
00189 gtk_table_attach_defaults(GTK_TABLE(table),GTK_WIDGET(private->ns_uri_edit_entry),
00190 1,2,0,1) ;
00191 gtk_box_pack_start(GTK_BOX(a_editor),table,FALSE,TRUE,0) ;
00192
00193
00194
00195 private->add_ns_button = GTK_BUTTON(gtk_button_new_with_label(_("add"))) ;
00196 gtk_signal_connect(GTK_OBJECT(private->add_ns_button),
00197 "clicked",
00198 GTK_SIGNAL_FUNC(add_namespace_button_clicked_cb),
00199 a_editor) ;
00200 private->remove_ns_button = GTK_BUTTON(gtk_button_new_with_label(_("remove"))) ;
00201 gtk_signal_connect(GTK_OBJECT(private->remove_ns_button),
00202 "clicked",
00203 GTK_SIGNAL_FUNC(remove_namespace_button_clicked_cb),
00204 a_editor) ;
00205
00206 table = gtk_table_new(1,2,TRUE) ;
00207 gtk_table_attach_defaults(GTK_TABLE(table),GTK_WIDGET(private->add_ns_button),
00208 0,1,0,1) ;
00209 gtk_table_attach_defaults(GTK_TABLE(table),GTK_WIDGET(private->remove_ns_button),
00210 1,2,0,1) ;
00211 gtk_box_pack_start(GTK_BOX(a_editor),table,FALSE,TRUE,0) ;
00212
00213 PRIVATE(a_editor)->current_selected_row = -1 ;
00214 }
00215
00216
00217
00218
00219
00220
00221
00222
00223 static void
00224 mlview_namespace_editor_destroy(GtkObject *a_object)
00225 {
00226 MlViewNamespaceEditor *editor ;
00227
00228 g_return_if_fail(MLVIEW_IS_NAMESPACE_EDITOR(a_object)) ;
00229 editor = MLVIEW_NAMESPACE_EDITOR(a_object) ;
00230
00231 g_return_if_fail(PRIVATE(editor) != NULL) ;
00232
00233
00234
00235
00236 if(PRIVATE(editor) != NULL){
00237 g_free(PRIVATE(editor)) ;
00238 PRIVATE(editor) = NULL ;
00239 }
00240
00241 if(GTK_OBJECT_CLASS(parent_class)->destroy)
00242 GTK_OBJECT_CLASS(parent_class)->destroy(a_object) ;
00243 }
00244
00245
00246
00247
00248
00249
00253 static MlViewNamespaceDesc *
00254 mlview_namespace_desc_new(xmlNs *a_xml_ns, xmlNode *a_xml_node)
00255 {
00256 MlViewNamespaceDesc * result ;
00257 result = g_malloc0(sizeof(MlViewNamespaceDesc));
00258 result->ns_def = a_xml_ns ;
00259 result->xml_node = a_xml_node ;
00260 return result ;
00261 }
00262
00263
00269 static xmlNs *
00270 mlview_namespace_desc_get_ns(MlViewNamespaceDesc *a_desc)
00271 {
00272 g_return_val_if_fail(a_desc != NULL, NULL) ;
00273 return a_desc->ns_def ;
00274 }
00275
00279 static xmlNode *
00280 mlview_namespace_desc_get_xml_node(MlViewNamespaceDesc *a_desc)
00281 {
00282 g_return_val_if_fail(a_desc != NULL,NULL) ;
00283 return a_desc->xml_node ;
00284 }
00285
00291 static void
00292 mlview_namespace_desc_destroy(MlViewNamespaceDesc *a_desc)
00293 {
00294 g_return_if_fail( a_desc != NULL) ;
00295 g_free(a_desc) ;
00296 }
00297
00298
00304 static gint
00305 mlview_namespace_editor_edit_namespace (MlViewNamespaceEditor *a_editor, xmlNs * a_ns, xmlNode *a_xml_node, gboolean a_selectable)
00306 {
00307 gchar * ns_text[2]={0} ;
00308 gint row_num ;
00309 MlViewNamespaceDesc *ns_desc ;
00310
00311 g_return_val_if_fail(a_editor != NULL, -1) ;
00312 g_return_val_if_fail(PRIVATE(a_editor) != NULL, -1) ;
00313 g_return_val_if_fail(a_ns != NULL, -1) ;
00314 g_return_val_if_fail(a_xml_node != NULL, -1) ;
00315 g_return_val_if_fail(PRIVATE(a_editor)->namespaces != NULL, -1) ;
00316
00317 ns_desc = mlview_namespace_desc_new(a_ns, a_xml_node) ;
00318 g_return_val_if_fail(ns_desc != NULL, -1) ;
00319
00320 ns_text[NS_PREFIX_COLUMN] = (gchar*)a_ns->prefix ;
00321 ns_text[NS_URI_COLUMN] = (gchar*)a_ns->href ;
00322
00323 row_num = gtk_clist_append(PRIVATE(a_editor)->namespaces, ns_text) ;
00324 gtk_clist_set_row_data_full(PRIVATE(a_editor)->namespaces,
00325 row_num,ns_desc,
00326 (GtkDestroyNotify)namespace_desc_destroy_on_ns_editor_destroy) ;
00327 if(!a_selectable)
00328 gtk_clist_set_selectable(PRIVATE(a_editor)->namespaces, row_num, a_selectable) ;
00329 return row_num ;
00330 }
00331
00332
00333 static MlViewNamespaceDesc *
00334 mlview_namespace_editor_get_current_selected_ns_desc(MlViewNamespaceEditor *a_editor)
00335 {
00336 MlViewNamespaceDesc * result ;
00337
00338 g_return_val_if_fail(a_editor != NULL , NULL) ;
00339 g_return_val_if_fail(PRIVATE(a_editor) != NULL, NULL) ;
00340 g_return_val_if_fail(PRIVATE(a_editor)->current_selected_row >= 0, NULL) ;
00341 g_return_val_if_fail(PRIVATE(a_editor)->namespaces != NULL, NULL) ;
00342
00343 result = (MlViewNamespaceDesc *) gtk_clist_get_row_data(PRIVATE(a_editor)->namespaces, PRIVATE(a_editor)->current_selected_row) ;
00344 return result ;
00345 }
00346
00347
00354 static xmlNs *
00355 mlview_namespace_editor_ask_namespace_to_user_and_add_it (MlViewNamespaceEditor *a_editor)
00356 {
00357 static GtkWidget *table=NULL, *label=NULL, *message=NULL, *uri=NULL, *prefix=NULL, *p_namespace_picker=NULL ;
00358 xmlNs *result=NULL ;
00359 gchar *prefix_str, *uri_str ;
00360 gboolean loop=TRUE ;
00361 gint button ;
00362
00363 g_return_val_if_fail (a_editor != NULL, NULL) ;
00364 g_return_val_if_fail (PRIVATE (a_editor) != NULL, NULL) ;
00365 g_return_val_if_fail (PRIVATE (a_editor)->current_xml_node != NULL, NULL) ;
00366
00367 if (p_namespace_picker == NULL) {
00368 p_namespace_picker = gnome_dialog_new (_("add namespace:"),
00369 GNOME_STOCK_BUTTON_OK,
00370 GNOME_STOCK_BUTTON_CANCEL,NULL) ;
00371 gtk_window_set_modal (GTK_WINDOW (p_namespace_picker), TRUE) ;
00372
00373 gnome_dialog_close_hides (GNOME_DIALOG (p_namespace_picker), TRUE) ;
00374 message = gtk_label_new (_("enter namespace prefix and uri:")) ;
00375 gtk_box_pack_start (GTK_BOX(GNOME_DIALOG (p_namespace_picker)->vbox), message,
00376 TRUE, TRUE, 0) ;
00377
00378 label = gtk_label_new (_("prefix")) ;
00379 prefix = gtk_entry_new () ;
00380 table = gtk_table_new (1, 2, TRUE) ;
00381 gtk_table_attach_defaults (GTK_TABLE (table),label,
00382 0,1,0,1) ;
00383 gtk_table_attach_defaults (GTK_TABLE (table),prefix,
00384 1,2,0,1) ;
00385 gtk_box_pack_start (GTK_BOX(GNOME_DIALOG (p_namespace_picker)->vbox),table,
00386 FALSE,TRUE,0) ;
00387
00388 label = gtk_label_new (_("uri")) ;
00389 uri = gtk_entry_new () ;
00390 table = gtk_table_new (1,2,TRUE) ;
00391 gtk_table_attach_defaults (GTK_TABLE (table),label,
00392 0,1,0,1) ;
00393 gtk_table_attach_defaults (GTK_TABLE (table), uri,
00394 1,2,0,1) ;
00395 gtk_box_pack_start (GTK_BOX(GNOME_DIALOG (p_namespace_picker)->vbox), table,
00396 FALSE,TRUE,0) ;
00397 gtk_widget_show_all (GTK_WIDGET (GNOME_DIALOG (p_namespace_picker)->vbox)) ;
00398 }
00399
00400 gtk_widget_grab_focus (prefix) ;
00401 gnome_dialog_set_default (GNOME_DIALOG (p_namespace_picker), 0) ;
00402 uri_str = gtk_entry_get_text (GTK_ENTRY (prefix)) ;
00403
00404 if (!utils_is_white_string (uri_str))
00405 gtk_entry_select_region (GTK_ENTRY (uri),0,-1) ;
00406
00407 while (loop) {
00408 gtk_widget_realize (GTK_WIDGET (p_namespace_picker)) ;
00409 mlview_app_context_set_window_icon (PRIVATE (a_editor)->app_context, GTK_WIDGET (p_namespace_picker)) ;
00410 button = gnome_dialog_run (GNOME_DIALOG (p_namespace_picker)) ;
00411
00412 switch (button) {
00413 case 0:
00414 prefix_str = gtk_entry_get_text (GTK_ENTRY (prefix));
00415 uri_str = gtk_entry_get_text (GTK_ENTRY (uri)) ;
00416 result = mlview_namespace_editor_add_namespace_def (a_editor, prefix_str, uri_str,
00417 PRIVATE (a_editor)->current_xml_node) ;
00418 if (result != NULL) {
00419 loop = FALSE ;
00420 gnome_dialog_close (GNOME_DIALOG (p_namespace_picker)) ;
00421 }
00422 else
00423 gtk_label_set_text (GTK_LABEL (message), _("please enter an other namespace")) ;
00424 break ;
00425 case 1:
00426 result = NULL ;
00427 loop = FALSE ;
00428 gnome_dialog_close (GNOME_DIALOG (p_namespace_picker)) ;
00429 break ;
00430 case -1:
00431 result = FALSE ;
00432 loop = FALSE ;
00433 break ;
00434 default :
00435 gtk_label_set_text (GTK_LABEL (message), _("please enter a namespace again")) ;
00436 break ;
00437 }
00438 }
00439 return result ;
00440 }
00441
00442
00443
00444
00445
00452 guint
00453 mlview_namespace_editor_get_type(){
00454
00455 static guint mlview_namespace_editor_type=0 ;
00456
00457 if(!mlview_namespace_editor_type){
00458 const static GtkTypeInfo type_info={
00459 "MlViewNamespaceEditor",
00460 sizeof(MlViewNamespaceEditor),
00461 sizeof(MlViewNamespaceEditorClass),
00462 (GtkClassInitFunc)mlview_namespace_editor_class_init,
00463 (GtkObjectInitFunc)mlview_namespace_editor_init,
00464 NULL,NULL,(GtkClassInitFunc)NULL
00465 } ;
00466 mlview_namespace_editor_type = gtk_type_unique(gtk_vbox_get_type(), &type_info) ;
00467 }
00468 return mlview_namespace_editor_type ;
00469 }
00470
00471
00476 GtkWidget *
00477 mlview_namespace_editor_new (MlViewAppContext *a_app_context)
00478 {
00479 MlViewNamespaceEditor * result ;
00480 result = gtk_type_new(MLVIEW_TYPE_NAMESPACE_EDITOR) ;
00481
00482 PRIVATE (result)->app_context = a_app_context ;
00483
00484 return GTK_WIDGET(result) ;
00485 }
00486
00487
00488
00489
00499 void
00500 mlview_namespace_editor_edit_node_visible_namespaces(MlViewNamespaceEditor *a_editor, xmlNode *a_xml_node)
00501 {
00502 xmlNode * node = NULL ;
00503 xmlNs * ns_def = NULL ;
00504 gboolean selectable ;
00505
00506 g_return_if_fail(a_editor != NULL) ;
00507 g_return_if_fail(PRIVATE(a_editor) != NULL) ;
00508 g_return_if_fail(PRIVATE(a_editor)->namespaces != NULL) ;
00509 g_return_if_fail(a_xml_node != NULL) ;
00510
00511 PRIVATE(a_editor)->current_xml_node = a_xml_node ;
00512
00513 gtk_clist_freeze(PRIVATE(a_editor)->namespaces) ;
00514 node = a_xml_node ;
00515 while(node != NULL){
00516 selectable = (node == a_xml_node) ;
00517
00518 for(ns_def = node->nsDef ;ns_def != NULL ; ns_def=ns_def->next){
00519 mlview_namespace_editor_edit_namespace(a_editor, ns_def, node, selectable) ;
00520 }
00521 node = node->parent ;
00522 }
00523 gtk_clist_thaw(PRIVATE(a_editor)->namespaces) ;
00524 }
00525
00526
00534 void
00535 mlview_namespace_editor_clear(MlViewNamespaceEditor *a_editor)
00536 {
00537 g_return_if_fail(a_editor != NULL) ;
00538 g_return_if_fail(PRIVATE(a_editor) != NULL) ;
00539 g_return_if_fail(PRIVATE(a_editor)->namespaces != NULL) ;
00540
00541
00542 gtk_signal_handler_block(GTK_OBJECT(PRIVATE(a_editor)->ns_prefix_edit_entry),
00543 PRIVATE(a_editor)->ns_prefix_edit_entry_changed_handler_id) ;
00544 gtk_signal_handler_block(GTK_OBJECT(PRIVATE(a_editor)->ns_uri_edit_entry),
00545 PRIVATE(a_editor)->ns_uri_edit_entry_changed_handler_id) ;
00546
00547 gtk_entry_set_text(PRIVATE(a_editor)->ns_prefix_edit_entry, "") ;
00548 gtk_entry_set_text(PRIVATE(a_editor)->ns_uri_edit_entry, "") ;
00549
00550 gtk_clist_clear(PRIVATE(a_editor)->namespaces) ;
00551 PRIVATE(a_editor)->current_selected_row = -1 ;
00552 gtk_signal_handler_unblock(GTK_OBJECT(PRIVATE(a_editor)->ns_prefix_edit_entry),
00553 PRIVATE(a_editor)->ns_prefix_edit_entry_changed_handler_id) ;
00554 gtk_signal_handler_unblock(GTK_OBJECT(PRIVATE(a_editor)->ns_uri_edit_entry),
00555 PRIVATE(a_editor)->ns_uri_edit_entry_changed_handler_id) ;
00556 }
00557
00558
00567 xmlNs *
00568 mlview_namespace_editor_get_current_selected_ns(MlViewNamespaceEditor *a_editor)
00569 {
00570 MlViewNamespaceDesc *ns_desc=NULL ;
00571 xmlNs * result=NULL ;
00572 g_return_val_if_fail(a_editor != NULL, NULL) ;
00573 g_return_val_if_fail(PRIVATE(a_editor) != NULL, NULL) ;
00574 g_return_val_if_fail(PRIVATE(a_editor)->current_selected_row >=0, NULL) ;
00575
00576 ns_desc = (MlViewNamespaceDesc*) gtk_clist_get_row_data(PRIVATE(a_editor)->namespaces,
00577 PRIVATE(a_editor)->current_selected_row) ;
00578 if(ns_desc != NULL)
00579 result = mlview_namespace_desc_get_ns(ns_desc) ;
00580
00581 return result ;
00582 }
00583
00584
00591 xmlNode *
00592 mlview_namespace_editor_get_current_xml_node(MlViewNamespaceEditor *a_editor)
00593 {
00594 g_return_val_if_fail(a_editor != NULL, NULL) ;
00595 g_return_val_if_fail(PRIVATE(a_editor) != NULL, NULL) ;
00596
00597 return PRIVATE(a_editor)->current_xml_node ;
00598 }
00599
00600
00609 xmlNs *
00610 mlview_namespace_editor_add_namespace_def(MlViewNamespaceEditor *a_editor, gchar * a_ns_prefix, gchar *a_ns_uri, xmlNode *a_xml_node)
00611 {
00612 xmlNs * result ;
00613 g_return_val_if_fail(a_editor != NULL, NULL) ;
00614 g_return_val_if_fail(a_ns_uri != NULL, NULL) ;
00615 g_return_val_if_fail(a_xml_node != NULL, NULL) ;
00616
00617 result = xmlNewNs(a_xml_node, a_ns_uri, a_ns_prefix) ;
00618 if(result != NULL)
00619 mlview_namespace_editor_edit_namespace (a_editor, result, a_xml_node, TRUE) ;
00620 return result ;
00621 }
00622
00623
00631 void
00632 mlview_namespace_editor_remove_namespace_def(MlViewNamespaceEditor *a_editor, xmlNs *a_ns, xmlNode * a_xml_node)
00633 {
00634 xmlNs * unlinked_ns_def ;
00635 MlViewNamespaceDesc * ns_desc ;
00636 int i ;
00637
00638 g_return_if_fail(a_editor != NULL) ;
00639 g_return_if_fail(a_ns != NULL) ;
00640 g_return_if_fail(a_xml_node) ;
00641 g_return_if_fail(PRIVATE(a_editor) != NULL) ;
00642 g_return_if_fail(PRIVATE(a_editor)->namespaces != NULL) ;
00643
00644 unlinked_ns_def = xmlUnlinkNsDef(a_xml_node, a_ns) ;
00645
00646 if(unlinked_ns_def == NULL)
00647 return ;
00648
00649 if(a_xml_node == PRIVATE(a_editor)->current_xml_node){
00650
00651 for(i=0 ; i < PRIVATE(a_editor)->namespaces->rows ; i++){
00652 ns_desc = gtk_clist_get_row_data(PRIVATE(a_editor)->namespaces, i) ;
00653
00654 if(ns_desc == NULL) continue ;
00655
00656 if(ns_desc->ns_def == unlinked_ns_def){
00657 gtk_clist_remove(PRIVATE(a_editor)->namespaces, i) ;
00658
00659 gtk_signal_handler_block(GTK_OBJECT(PRIVATE(a_editor)->ns_prefix_edit_entry),
00660 PRIVATE(a_editor)->ns_prefix_edit_entry_changed_handler_id ) ;
00661 gtk_signal_handler_block(GTK_OBJECT(PRIVATE(a_editor)->ns_uri_edit_entry),
00662 PRIVATE(a_editor)->ns_uri_edit_entry_changed_handler_id ) ;
00663
00664 gtk_entry_set_text(PRIVATE(a_editor)->ns_prefix_edit_entry, "") ;
00665 gtk_entry_set_text(PRIVATE(a_editor)->ns_uri_edit_entry, "") ;
00666
00667 gtk_signal_handler_unblock(GTK_OBJECT(PRIVATE(a_editor)->ns_prefix_edit_entry),
00668 PRIVATE(a_editor)->ns_prefix_edit_entry_changed_handler_id ) ;
00669 gtk_signal_handler_unblock(GTK_OBJECT(PRIVATE(a_editor)->ns_uri_edit_entry),
00670 PRIVATE(a_editor)->ns_uri_edit_entry_changed_handler_id ) ;
00671 break ;
00672 }
00673 }
00674 }
00675 if(unlinked_ns_def != NULL){
00676 xmlFreeNs(unlinked_ns_def) ;
00677 unlinked_ns_def = NULL ;
00678 }
00679 }
00680
00681
00682
00683
00684
00685
00686
00697 static void
00698 row_selected_cb (GtkCList *a_clist, gint a_row, gint a_column,
00699 GdkEventButton *a_event, MlViewNamespaceEditor *a_editor)
00700 {
00701 gchar *ns_prefix=NULL, *ns_uri=NULL ;
00702 xmlNode *node=NULL ;
00703 gboolean is_local_ns = FALSE ;
00704 MlViewNamespaceDesc * ns_desc ;
00705
00706 g_return_if_fail(a_editor != NULL) ;
00707 g_return_if_fail(MLVIEW_IS_NAMESPACE_EDITOR(a_editor)) ;
00708 g_return_if_fail(PRIVATE(a_editor) != NULL) ;
00709
00710 PRIVATE(a_editor)->current_selected_row = a_row ;
00711
00712 gtk_signal_handler_block(GTK_OBJECT(PRIVATE(a_editor)->ns_prefix_edit_entry),
00713 PRIVATE(a_editor)->ns_prefix_edit_entry_changed_handler_id) ;
00714 gtk_signal_handler_block(GTK_OBJECT(PRIVATE(a_editor)->ns_uri_edit_entry),
00715 PRIVATE(a_editor)->ns_uri_edit_entry_changed_handler_id) ;
00716
00717 gtk_entry_set_text(PRIVATE(a_editor)->ns_prefix_edit_entry, "") ;
00718 gtk_entry_set_text(PRIVATE(a_editor)->ns_uri_edit_entry, "") ;
00719
00720
00721 ns_desc = mlview_namespace_editor_get_current_selected_ns_desc(a_editor) ;
00722 if(ns_desc != NULL){
00723 node = mlview_namespace_desc_get_xml_node(ns_desc) ;
00724 if(node == PRIVATE(a_editor)->current_xml_node)
00725 is_local_ns = TRUE ;
00726 else
00727 is_local_ns = FALSE ;
00728 }
00729
00730 if(is_local_ns){
00731 gtk_clist_get_text(PRIVATE(a_editor)->namespaces, a_row, NS_PREFIX_COLUMN, &ns_prefix) ;
00732 gtk_clist_get_text(PRIVATE(a_editor)->namespaces, a_row, NS_URI_COLUMN, &ns_uri) ;
00733
00734 gtk_entry_set_text(PRIVATE(a_editor)->ns_prefix_edit_entry, ns_prefix) ;
00735 gtk_entry_set_text(PRIVATE(a_editor)->ns_uri_edit_entry, ns_uri) ;
00736
00737 }else{
00738 PRIVATE(a_editor)->current_selected_row = -1 ;
00739 }
00740
00741 gtk_signal_handler_unblock(GTK_OBJECT(PRIVATE(a_editor)->ns_prefix_edit_entry),
00742 PRIVATE(a_editor)->ns_prefix_edit_entry_changed_handler_id) ;
00743 gtk_signal_handler_unblock(GTK_OBJECT(PRIVATE(a_editor)->ns_uri_edit_entry),
00744 PRIVATE(a_editor)->ns_uri_edit_entry_changed_handler_id) ;
00745 }
00746
00747
00757 static void
00758 ns_prefix_edit_entry_changed_cb(GtkEntry *a_entry, MlViewNamespaceEditor *a_editor)
00759 {
00760 xmlNs *curr_ns ;
00761 gchar * prefix ;
00762
00763 g_return_if_fail(a_editor != NULL) ;
00764 g_return_if_fail(MLVIEW_IS_NAMESPACE_EDITOR(a_editor)) ;
00765 g_return_if_fail(PRIVATE(a_editor) != NULL) ;
00766 g_return_if_fail(PRIVATE(a_editor)->namespaces != NULL) ;
00767 g_return_if_fail(PRIVATE(a_editor)->current_selected_row >= 0) ;
00768
00769 curr_ns = mlview_namespace_editor_get_current_selected_ns(a_editor) ;
00770
00771 if(curr_ns == NULL)
00772 return ;
00773 prefix = gtk_entry_get_text(a_entry) ;
00774 if(prefix != NULL){
00775 if(curr_ns->prefix != NULL)
00776 g_free((gchar*)curr_ns->prefix) ;
00777 curr_ns->prefix = g_strdup(prefix) ;
00778 gtk_clist_set_text(PRIVATE(a_editor)->namespaces, PRIVATE(a_editor)->current_selected_row,
00779 NS_PREFIX_COLUMN,curr_ns->prefix) ;
00780
00781 }
00782 gtk_signal_emit(GTK_OBJECT(a_editor), mlview_namespace_editor_signals[NAMESPACE_PREFIX_CHANGED]) ;
00783 gtk_signal_emit(GTK_OBJECT(a_editor), mlview_namespace_editor_signals[NAMESPACE_CHANGED]) ;
00784 }
00785
00793 static void
00794 ns_uri_edit_entry_changed_cb(GtkEntry *a_entry, MlViewNamespaceEditor *a_editor)
00795 {
00796 xmlNs *curr_ns ;
00797 gchar * uri ;
00798
00799 g_return_if_fail(a_editor != NULL) ;
00800 g_return_if_fail(MLVIEW_IS_NAMESPACE_EDITOR(a_editor)) ;
00801 g_return_if_fail(PRIVATE(a_editor) != NULL) ;
00802 g_return_if_fail(PRIVATE(a_editor)->current_selected_row >= 0) ;
00803
00804 curr_ns = mlview_namespace_editor_get_current_selected_ns(a_editor) ;
00805
00806 if(curr_ns == NULL)
00807 return ;
00808 uri = gtk_entry_get_text(a_entry) ;
00809 if(uri != NULL){
00810 if(curr_ns->href != NULL)
00811 g_free((gchar*)curr_ns->href) ;
00812 curr_ns->href = g_strdup(uri) ;
00813 gtk_clist_set_text(PRIVATE(a_editor)->namespaces, PRIVATE(a_editor)->current_selected_row,
00814 NS_URI_COLUMN,curr_ns->href) ;
00815 }
00816 gtk_signal_emit(GTK_OBJECT(a_editor), mlview_namespace_editor_signals[NAMESPACE_URI_CHANGED]) ;
00817 gtk_signal_emit(GTK_OBJECT(a_editor), mlview_namespace_editor_signals[NAMESPACE_CHANGED]) ;
00818 }
00819
00827 static void
00828 add_namespace_button_clicked_cb(GtkButton *a_add_namespace_button, MlViewNamespaceEditor *a_editor)
00829 {
00830 g_return_if_fail(a_editor != NULL) ;
00831 g_return_if_fail(MLVIEW_IS_NAMESPACE_EDITOR(a_editor)) ;
00832
00833 mlview_namespace_editor_ask_namespace_to_user_and_add_it(a_editor) ;
00834 }
00835
00843 static void
00844 remove_namespace_button_clicked_cb(GtkButton *a_remove_namespace_button, MlViewNamespaceEditor *a_editor)
00845 {
00846 MlViewNamespaceDesc *ns_desc ;
00847
00848 g_return_if_fail(a_editor != NULL) ;
00849 g_return_if_fail(MLVIEW_IS_NAMESPACE_EDITOR(a_editor)) ;
00850 g_return_if_fail(PRIVATE(a_editor) != NULL) ;
00851 g_return_if_fail(PRIVATE(a_editor)->namespaces != NULL) ;
00852 g_return_if_fail(PRIVATE(a_editor)->current_selected_row >=0 ) ;
00853
00854 ns_desc = gtk_clist_get_row_data(PRIVATE(a_editor)->namespaces, PRIVATE(a_editor)->current_selected_row) ;
00855 g_return_if_fail(ns_desc != NULL) ;
00856 g_return_if_fail(ns_desc->ns_def != NULL) ;
00857 g_return_if_fail(ns_desc->xml_node != NULL) ;
00858
00859 mlview_namespace_editor_remove_namespace_def(a_editor, ns_desc->ns_def, ns_desc->xml_node) ;
00860 }
00861
00865 static void
00866 namespace_desc_destroy_on_ns_editor_destroy(gpointer a_data)
00867 {
00868 MlViewNamespaceDesc * ns_desc ;
00869 ns_desc = (MlViewNamespaceDesc *) a_data ;
00870 mlview_namespace_desc_destroy(ns_desc) ;
00871 }