Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals  

mlview-namespace-editor.c

Go to the documentation of this file.
00001 /*This file is part of MlView.
00002  *
00003  *MlView is free software; you can redistribute it and/or modify it under the terms of 
00004  *the GNU General Public License as published by the Free Software Foundation; either version 2, 
00005  *or (at your option) any later version.
00006  *
00007  *MlView is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
00008  *without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00009  *See the GNU General Public License for more details.
00010  *
00011  *You should have received a copy of the GNU General Public License along with MlView; 
00012  *see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00013 *
00014 *
00015 *Copyright 2001 dodji seketeli
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 /*callbacks function definitions*/
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  *private gtk object framework methods
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 ; /*overload the destroy method of object*/
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         /*init the clist that shows the list of namespaces*/
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         /*init the prefix/uri edition entries*/
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         /*add/remove/show all/show local button*/
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  *mlview_namespace_editor_destroy:
00219  *@a_object: the object to destroy. This object must be instance of MlViewNamespaceEditor.
00220  *
00221  *destroyer of MlViewNamespaceEditor.
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         /*do not free the widgets. They will be freed when their container (the parent class) is freed*/
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  *private helper functions
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:/*OK*/
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:/*cancel*/
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  *MlViewNamespaceEditor public methods.
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                 /*loop over the namespaces defined on the current node*/
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         /*FIXME: add the clearing of the uri and prefix edition areas*/
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)/*the namespace is not on this xml node*/
00647                 return ;
00648         
00649         if(a_xml_node == PRIVATE(a_editor)->current_xml_node){
00650                 /*if the namespace unlinked_ns_def is on the xml node that we are currently  visualizing, delete the matching entry of the GtkCList*/
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  *private callbacks
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         /*see if the namespace has been defined on the current node*/
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 }

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